From 2ec84c9b4c2fcb1a9d8fced675d423f2fb42a6c7 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Tue, 13 Jan 2026 14:54:15 +0800 Subject: [PATCH] [dpu-bm2]: support dpu baremetal2 instance support dpu baremetal2 instance Resolves/Related: ZSTAC-12345 Change-Id: I626d637a7168656a6c726c6769777a726e616973 --- .../zstack/compute/host/HostManagerImpl.java | 2 +- conf/db/upgrade/V5.5.0__schema.sql | 43 ++++++ .../header/cluster/APICreateClusterMsg.java | 2 +- .../APICreateClusterMsgDoc_zh_cn.groovy | 2 +- sdk/src/main/java/SourceClassMap.java | 4 + .../sdk/AddBareMetal2DpuChassisAction.java | 125 ++++++++++++++++++ .../sdk/BareMetal2DpuChassisInventory.java | 23 ++++ .../sdk/BareMetal2DpuHostInventory.java | 31 +++++ .../sdk/CreateBareMetal2InstanceAction.java | 3 + .../org/zstack/sdk/CreateClusterAction.java | 2 +- .../java/org/zstack/testlib/ApiHelper.groovy | 27 ++++ 11 files changed, 260 insertions(+), 4 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/BareMetal2DpuChassisInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java 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..7b3707bfd90 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java @@ -471,7 +471,7 @@ public void run(MessageReply reply) { @Override public boolean skip(Map data) { // no need to check baremetal2 gateway architecture with the cluster architecture - return vo.getHypervisorType().equals("baremetal2"); + return cluster.getType().equals("baremetal2"); } @Override diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index cc43f8f2d40..42a816005ac 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -476,3 +476,46 @@ 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); + +CREATE TABLE IF NOT EXISTS `zstack`.`BareMetal2DpuChassisVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `config` TEXT DEFAULT NULL, + `hostUuid` varchar(32) DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkBareMetal2DpuChassisVOChassisVO` FOREIGN KEY (`uuid`) REFERENCES `BareMetal2ChassisVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkBareMetal2DpuChassisVOHostEO` FOREIGN KEY (`hostUuid`) REFERENCES `HostEO` (`uuid`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`BareMetal2DpuHostVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `chassisUuid` VARCHAR(32) NOT NULL, + `vendorType` VARCHAR(255) NOT NULL, + `url` VARCHAR(255) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkBareMetal2DpuHostVOHostVO` FOREIGN KEY (`uuid`) REFERENCES `HostEO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkBareMetal2DpuHostVOChassisVO` FOREIGN KEY (`chassisUuid`) REFERENCES `BareMetal2DpuChassisVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +SELECT + CONSTRAINT_NAME, + TABLE_NAME, + COLUMN_NAME, + REFERENCED_TABLE_NAME +FROM information_schema.KEY_COLUMN_USAGE +WHERE TABLE_SCHEMA = 'zstack' + AND TABLE_NAME = 'BareMetal2InstanceVO' + AND COLUMN_NAME IN ('gatewayUuid', 'lastGatewayUuid'); + +ALTER TABLE `zstack`.`BareMetal2InstanceVO` +DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO`, +DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO1`; + +ALTER TABLE `zstack`.`BareMetal2InstanceVO` + ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO` + FOREIGN KEY (`gatewayUuid`) + REFERENCES `HostEO` (`uuid`) + ON DELETE SET NULL, +ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO1` + FOREIGN KEY (`lastGatewayUuid`) + REFERENCES `HostEO` (`uuid`) + ON DELETE SET NULL; diff --git a/header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java b/header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java index 18d1727a07f..7d740b7d152 100755 --- a/header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java +++ b/header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java @@ -70,7 +70,7 @@ public class APICreateClusterMsg extends APICreateMessage implements CreateClust * - Simulator * - baremetal */ - @APIParam(validValues = {"KVM", "Simulator", "baremetal", "baremetal2", "xdragon"}) + @APIParam(validValues = {"KVM", "Simulator", "baremetal", "baremetal2", "xdragon", "baremetal2Dpu"}) private String hypervisorType; /** * @desc see field 'type' of :ref:`ClusterInventory` for details diff --git a/header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy index 90c01a79fa8..b4faf3d122e 100644 --- a/header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy @@ -56,7 +56,7 @@ doc { type "String" optional false since "0.6" - values ("KVM","Simulator","baremetal","baremetal2","xdragon") + values ("KVM","Simulator","baremetal","baremetal2","xdragon","baremetal2Dpu") } column { name "type" diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 4bbd9238f98..4af7618d4a8 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -65,8 +65,10 @@ public class SourceClassMap { put("org.zstack.baremetal2.chassis.BareMetal2ChassisInventory", "org.zstack.sdk.BareMetal2ChassisInventory"); put("org.zstack.baremetal2.chassis.BareMetal2ChassisNicInventory", "org.zstack.sdk.BareMetal2ChassisNicInventory"); put("org.zstack.baremetal2.chassis.BareMetal2ChassisPciDeviceInventory", "org.zstack.sdk.BareMetal2ChassisPciDeviceInventory"); + put("org.zstack.baremetal2.chassis.dpu.BareMetal2DpuChassisInventory", "org.zstack.sdk.BareMetal2DpuChassisInventory"); put("org.zstack.baremetal2.chassis.ipmi.BareMetal2IpmiChassisInventory", "org.zstack.sdk.BareMetal2IpmiChassisInventory"); put("org.zstack.baremetal2.configuration.BareMetal2ChassisOfferingInventory", "org.zstack.sdk.BareMetal2ChassisOfferingInventory"); + put("org.zstack.baremetal2.dpu.BareMetal2DpuHostInventory", "org.zstack.sdk.BareMetal2DpuHostInventory"); put("org.zstack.baremetal2.gateway.BareMetal2GatewayInventory", "org.zstack.sdk.BareMetal2GatewayInventory"); put("org.zstack.baremetal2.gateway.BareMetal2GatewayProvisionNicInventory", "org.zstack.sdk.BareMetal2GatewayProvisionNicInventory"); put("org.zstack.baremetal2.instance.BareMetal2InstanceInventory", "org.zstack.sdk.BareMetal2InstanceInventory"); @@ -950,6 +952,8 @@ public class SourceClassMap { put("org.zstack.sdk.BareMetal2ChassisNicInventory", "org.zstack.baremetal2.chassis.BareMetal2ChassisNicInventory"); put("org.zstack.sdk.BareMetal2ChassisOfferingInventory", "org.zstack.baremetal2.configuration.BareMetal2ChassisOfferingInventory"); put("org.zstack.sdk.BareMetal2ChassisPciDeviceInventory", "org.zstack.baremetal2.chassis.BareMetal2ChassisPciDeviceInventory"); + put("org.zstack.sdk.BareMetal2DpuChassisInventory", "org.zstack.baremetal2.chassis.dpu.BareMetal2DpuChassisInventory"); + put("org.zstack.sdk.BareMetal2DpuHostInventory", "org.zstack.baremetal2.dpu.BareMetal2DpuHostInventory"); put("org.zstack.sdk.BareMetal2GatewayInventory", "org.zstack.baremetal2.gateway.BareMetal2GatewayInventory"); put("org.zstack.sdk.BareMetal2GatewayProvisionNicInventory", "org.zstack.baremetal2.gateway.BareMetal2GatewayProvisionNicInventory"); put("org.zstack.sdk.BareMetal2InstanceInventory", "org.zstack.baremetal2.instance.BareMetal2InstanceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java b/sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java new file mode 100644 index 00000000000..e30d417b141 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java @@ -0,0 +1,125 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddBareMetal2DpuChassisAction 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.AddBareMetal2ChassisResult 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 = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendorType; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String config; + + @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 = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, validValues = {"Remote","Local","Direct"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String provisionType = "Remote"; + + @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.AddBareMetal2ChassisResult value = res.getResult(org.zstack.sdk.AddBareMetal2ChassisResult.class); + ret.value = value == null ? new org.zstack.sdk.AddBareMetal2ChassisResult() : 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/chassis/dpu"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/BareMetal2DpuChassisInventory.java b/sdk/src/main/java/org/zstack/sdk/BareMetal2DpuChassisInventory.java new file mode 100644 index 00000000000..a68225a7c45 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BareMetal2DpuChassisInventory.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class BareMetal2DpuChassisInventory extends org.zstack.sdk.BareMetal2ChassisInventory { + + public java.lang.String config; + public void setConfig(java.lang.String config) { + this.config = config; + } + public java.lang.String getConfig() { + return this.config; + } + + public java.lang.String hostUuid; + public void setHostUuid(java.lang.String hostUuid) { + this.hostUuid = hostUuid; + } + public java.lang.String getHostUuid() { + return this.hostUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java b/sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java new file mode 100644 index 00000000000..09864707a7a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class BareMetal2DpuHostInventory extends org.zstack.sdk.HostInventory { + + 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 vendorType; + public void setVendorType(java.lang.String vendorType) { + this.vendorType = vendorType; + } + public java.lang.String getVendorType() { + return this.vendorType; + } + + public java.lang.String chassisUuid; + public void setChassisUuid(java.lang.String chassisUuid) { + this.chassisUuid = chassisUuid; + } + public java.lang.String getChassisUuid() { + return this.chassisUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2InstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2InstanceAction.java index bb817dd411e..fdc4187ae30 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2InstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2InstanceAction.java @@ -70,6 +70,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String gatewayAllocatorStrategy; + @Param(required = true, validValues = {"IPMI","DPU"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String chassisType = "IPMI"; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java b/sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java index b57f9d00863..6a59de5b7ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java @@ -34,7 +34,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 = {"KVM","Simulator","baremetal","baremetal2","xdragon"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"KVM","Simulator","baremetal","baremetal2","xdragon","baremetal2Dpu"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String hypervisorType; @Param(required = false, validValues = {"zstack","baremetal","baremetal2"}, 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 a77924c67b7..c1048149e53 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -962,6 +962,33 @@ abstract class ApiHelper { } + def addBareMetal2DpuChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddBareMetal2DpuChassisAction.class) Closure c) { + def a = new org.zstack.sdk.AddBareMetal2DpuChassisAction() + 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 addBlockPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddBlockPrimaryStorageAction.class) Closure c) { def a = new org.zstack.sdk.AddBlockPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid