Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
43 changes: 43 additions & 0 deletions conf/db/upgrade/V5.5.0__schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Comment on lines +499 to +507
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

移除诊断性 SELECT 查询

此 SELECT 语句是调试/诊断代码,在生产环境升级脚本中执行时会输出数据但不产生任何功能性效果。建议移除,或如需检查约束存在性,应将其整合到存储过程的条件判断中。

🔧 建议修改
-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');
-
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
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');
🤖 Prompt for AI Agents
In @conf/db/upgrade/V5.5.0__schema.sql around lines 499 - 507, Remove the
diagnostic SELECT that queries information_schema.KEY_COLUMN_USAGE for
BareMetal2InstanceVO (the SELECT returning CONSTRAINT_NAME, TABLE_NAME,
COLUMN_NAME, REFERENCED_TABLE_NAME filtering COLUMN_NAME IN
('gatewayUuid','lastGatewayUuid')) from the upgrade script; if you need to check
constraint existence as part of the upgrade, convert that logic into a
conditional check inside the migration procedure (e.g., a EXISTS/select INTO
boolean and then conditional ALTER/DROP) instead of emitting a standalone
SELECT.


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;
Comment on lines +509 to +521
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

外键操作缺乏幂等性保护,升级脚本重复执行将失败。

直接执行 DROP FOREIGN KEY 而不检查约束是否存在,如果升级脚本重复执行,将因外键已被删除而报错。根据项目经验,应通过 information_schema 检查约束存在性后再执行 DDL 操作。

🔧 建议使用存储过程确保幂等性
-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;
+DELIMITER $$
+DROP PROCEDURE IF EXISTS UpdateBareMetal2InstanceVOForeignKeys$$
+CREATE PROCEDURE UpdateBareMetal2InstanceVOForeignKeys()
+BEGIN
+    -- Drop old FK if exists
+    IF EXISTS (
+        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
+        WHERE TABLE_SCHEMA = 'zstack'
+          AND TABLE_NAME = 'BareMetal2InstanceVO'
+          AND CONSTRAINT_NAME = 'fkBareMetal2InstanceVOGatewayVO'
+    ) THEN
+        ALTER TABLE `zstack`.`BareMetal2InstanceVO` DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO`;
+    END IF;
+
+    IF EXISTS (
+        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
+        WHERE TABLE_SCHEMA = 'zstack'
+          AND TABLE_NAME = 'BareMetal2InstanceVO'
+          AND CONSTRAINT_NAME = 'fkBareMetal2InstanceVOGatewayVO1'
+    ) THEN
+        ALTER TABLE `zstack`.`BareMetal2InstanceVO` DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO1`;
+    END IF;
+
+    -- Add new FK if not exists
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
+        WHERE TABLE_SCHEMA = 'zstack'
+          AND TABLE_NAME = 'BareMetal2InstanceVO'
+          AND CONSTRAINT_NAME = 'fkBareMetal2InstanceVOGatewayVO'
+    ) THEN
+        ALTER TABLE `zstack`.`BareMetal2InstanceVO`
+            ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO`
+            FOREIGN KEY (`gatewayUuid`) REFERENCES `HostEO` (`uuid`) ON DELETE SET NULL;
+    END IF;
+
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
+        WHERE TABLE_SCHEMA = 'zstack'
+          AND TABLE_NAME = 'BareMetal2InstanceVO'
+          AND CONSTRAINT_NAME = 'fkBareMetal2InstanceVOGatewayVO1'
+    ) THEN
+        ALTER TABLE `zstack`.`BareMetal2InstanceVO`
+            ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO1`
+            FOREIGN KEY (`lastGatewayUuid`) REFERENCES `HostEO` (`uuid`) ON DELETE SET NULL;
+    END IF;
+END$$
+DELIMITER ;
+
+CALL UpdateBareMetal2InstanceVOForeignKeys();
+DROP PROCEDURE IF EXISTS UpdateBareMetal2InstanceVOForeignKeys;

Based on learnings,ZStack 升级脚本需要通过 information_schema 检查约束的存在性来确保脚本可以安全重复执行。

🤖 Prompt for AI Agents
In @conf/db/upgrade/V5.5.0__schema.sql around lines 509 - 521, The ALTER TABLE
statements on BareMetal2InstanceVO unconditionally drop and re-add foreign keys
fkBareMetal2InstanceVOGatewayVO and fkBareMetal2InstanceVOGatewayVO1 which
breaks idempotency; modify the script to query
information_schema.key_column_usage / information_schema.table_constraints to
check whether each constraint (fkBareMetal2InstanceVOGatewayVO on gatewayUuid
and fkBareMetal2InstanceVOGatewayVO1 on lastGatewayUuid referencing
HostEO(uuid)) exists before issuing DROP or ADD, wrapping the conditional DDL in
a stored procedure or dynamic SQL so repeated runs skip non-existent drops and
avoid duplicate adds.

Original file line number Diff line number Diff line change
Expand Up @@ -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;
Comment on lines +73 to 74
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# 搜索 baremetal2Dpu 的所有引用
echo "=== 搜索 baremetal2Dpu 引用 ==="
rg -i "baremetal2Dpu" --type java -n

echo ""
echo "=== 搜索 HypervisorType 枚举定义 ==="
fd -e java -x grep -l "enum HypervisorType" {} \;

echo ""
echo "=== 搜索 ClusterFactory 实现 ==="
fd -e java -x grep -l "ClusterFactory" {} \; | head -10

echo ""
echo "=== 搜索 baremetal 相关处理器 ==="
rg "class.*Baremetal.*Handler|class.*Baremetal.*Factory" --type java -n

Repository: MatheMatrix/zstack

Length of output: 1525


🏁 Script executed:

#!/bin/bash
# 检查 ClusterType 定义
echo "=== ClusterType.java 内容 ==="
cat header/src/main/java/org/zstack/header/cluster/ClusterType.java

echo ""
echo "=== 搜索所有集群工厂实现 ==="
rg "implements ClusterFactory" --type java -A 5

echo ""
echo "=== 搜索 baremetal2Dpu 字符串在整个代码库 ==="
rg -i "baremetal2dpu" --type java -l

Repository: MatheMatrix/zstack

Length of output: 2187


🏁 Script executed:

#!/bin/bash
# 搜索所有实现 ClusterFactory 的类
echo "=== 所有 ClusterFactory 实现类 ==="
fd -e java -x grep -l "implements ClusterFactory" {} \;

echo ""
echo "=== baremetal 相关的工厂/类定义 ==="
fd -e java -path "*baremetal*" | head -20

echo ""
echo "=== 搜索 baremetal2Dpu 在工厂中的注册 ==="
rg "baremetal2Dpu|baremetal2Dpu" --type java -B 3 -A 3

echo ""
echo "=== 检查 baremetal2 工厂是否存在 ==="
fd -e java -path "*baremetal2*Factory*"

Repository: MatheMatrix/zstack

Length of output: 148


🏁 Script executed:

#!/bin/bash
# 搜索所有 Factory 实现类
echo "=== 搜索 ClusterFactory 实现 ==="
rg "implements ClusterFactory" --type java -l

echo ""
echo "=== 搜索 baremetal 相关目录 ==="
find . -type d -name "*baremetal*" 2>/dev/null | head -10

echo ""
echo "=== 检查是否存在 baremetal2Dpu 工厂类 ==="
find . -type f -name "*BareMetal2Dpu*Factory*.java" 2>/dev/null

Repository: MatheMatrix/zstack

Length of output: 224


🏁 Script executed:

#!/bin/bash
# 搜索 BareMetal2DpuChassisInventory 类
echo "=== 搜索 BareMetal2DpuChassisInventory 类 ==="
find . -type f -name "*BareMetal2DpuChassisInventory*" 2>/dev/null

echo ""
echo "=== 搜索 BareMetal2DpuHostInventory 类 ==="
find . -type f -name "*BareMetal2DpuHostInventory*" 2>/dev/null

echo ""
echo "=== 查看 BaseClusterFactory 完整实现 ==="
cat compute/src/main/java/org/zstack/compute/cluster/BaseClusterFactory.java

echo ""
echo "=== 搜索是否有其他模块注册 baremetal2Dpu ==="
rg "new ClusterType" --type java -B 2 -A 2

Repository: MatheMatrix/zstack

Length of output: 1773


baremetal2Dpu hypervisor 类型缺少完整的后端实现支持。

新增的 baremetal2Dpu hypervisor 类型已添加到 APICreateClusterMsgvalidValues 中,但在代码库中没有对应的后端实现:

  • 不存在 baremetal2DpuClusterFactory 实现和 ClusterType 注册
  • SourceClassMap.java 中引用的 BareMetal2DpuChassisInventoryBareMetal2DpuHostInventory 类不存在
  • 调用 API 创建此类型集群时,会在 ClusterType.valueOf("baremetal2Dpu") 处抛出 IllegalArgumentException

需要补全相应的工厂类、类型注册、库存类定义和处理逻辑。

/**
* @desc see field 'type' of :ref:`ClusterInventory` for details
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

命名不一致:文档使用 baremetal2Dpu,但 API 代码使用 dpuBaremetal2

APICreateClusterMsg.java 中定义的有效值是 "dpuBaremetal2",而此处文档写的是 "baremetal2Dpu"。用户按照文档传入 baremetal2Dpu 将导致参数校验失败。

建议修复
-				values ("KVM","Simulator","baremetal","baremetal2","xdragon","baremetal2Dpu")
+				values ("KVM","Simulator","baremetal","baremetal2","xdragon","dpuBaremetal2")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
values ("KVM","Simulator","baremetal","baremetal2","xdragon","baremetal2Dpu")
values ("KVM","Simulator","baremetal","baremetal2","xdragon","dpuBaremetal2")
🤖 Prompt for AI Agents
In
@header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
at line 59, 文档中的枚举值与 API 定义不一致:在 APICreateClusterMsgDoc_zh_cn.groovy 的 values
列表将 "baremetal2Dpu" 改为与 APICreateClusterMsg.java 中的合法值一致,即使用
"dpuBaremetal2"(或相反,若决定改 API 则更新 APICreateClusterMsg.java 的枚举和值),确保值在
APICreateClusterMsg(参数校验处)与 APICreateClusterMsgDoc_zh_cn.groovy 的 values
列表完全一致以避免校验失败。

}
column {
name "type"
Expand Down
4 changes: 4 additions & 0 deletions sdk/src/main/java/SourceClassMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down
125 changes: 125 additions & 0 deletions sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java
Original file line number Diff line number Diff line change
@@ -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<String, Parameter> parameterMap = new HashMap<>();

private static final HashMap<String, Parameter> 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<Result> completion) {
ZSClient.call(this, new InternalCompletion() {
@Override
public void complete(ApiResult res) {
completion.complete(makeResult(res));
}
});
}

protected Map<String, Parameter> getParameterMap() {
return parameterMap;
}

protected Map<String, Parameter> 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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}
31 changes: 31 additions & 0 deletions sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
27 changes: 27 additions & 0 deletions testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down