Skip to content
Closed
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
191 changes: 191 additions & 0 deletions conf/db/upgrade/V5.5.12__schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
-- ZSTAC-75319: Add normalizedModelName column for GPU spec dedup
CALL ADD_COLUMN('GpuDeviceSpecVO', 'normalizedModelName', 'VARCHAR(255)', 1, NULL);
CALL CREATE_INDEX('GpuDeviceSpecVO', 'idx_gpu_spec_normalized_model', 'normalizedModelName');

-- Add totalScore and endTime columns to ModelEvaluationTaskVO for ZQL sorting support
-- Previously these values were only stored inside the opaque JSON TEXT field,
-- making them invisible to ZQL ORDER BY queries.
CALL ADD_COLUMN('ModelEvaluationTaskVO', 'totalScore', 'DOUBLE', 1, NULL);
CALL ADD_COLUMN('ModelEvaluationTaskVO', 'endTime', 'DATETIME', 1, NULL);

-- Add indexes to support efficient sorting
CALL CREATE_INDEX('ModelEvaluationTaskVO', 'idx_ModelEvaluationTaskVO_totalScore', 'totalScore');
CALL CREATE_INDEX('ModelEvaluationTaskVO', 'idx_ModelEvaluationTaskVO_endTime', 'endTime');

-- Backfill totalScore from opaque JSON for existing completed tasks
-- Uses Json_getKeyValue defined in beforeMigrate.sql for MySQL 5.5+ compatibility
UPDATE `zstack`.`ModelEvaluationTaskVO`
SET `totalScore` = CAST(Json_getKeyValue(`opaque`, 'total_score') AS DECIMAL(20,6))
WHERE `opaque` IS NOT NULL
AND `totalScore` IS NULL
AND Json_getKeyValue(`opaque`, 'total_score') IS NOT NULL
AND Json_getKeyValue(`opaque`, 'total_score') != '';

-- Backfill endTime from opaque JSON for existing completed/failed tasks
-- end_time format from Python agent: "MMM dd, yyyy hh:mm:ss a" (e.g. "Jan 01, 2025 10:30:00 AM")
UPDATE `zstack`.`ModelEvaluationTaskVO`
SET `endTime` = STR_TO_DATE(
Json_getKeyValue(`opaque`, 'end_time'),
'%b %d, %Y %h:%i:%s %p'
)
WHERE `opaque` IS NOT NULL
AND `endTime` IS NULL
AND Json_getKeyValue(`opaque`, 'end_time') IS NOT NULL
AND Json_getKeyValue(`opaque`, 'end_time') != '';

-- PCI virtualization capability metadata

CREATE TABLE IF NOT EXISTS `zstack`.`PciDeviceVirtCapabilityVO` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`pciDeviceUuid` VARCHAR(32) NOT NULL,
`capability` VARCHAR(32) NOT NULL,
`createDate` TIMESTAMP NOT NULL,
`lastOpDate` TIMESTAMP NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_pci_device_virt_capability` (`pciDeviceUuid`, `capability`),
KEY `idx_pci_device_virt_capability_pci` (`pciDeviceUuid`),
CONSTRAINT `fk_pci_device_virt_capability_pci`
FOREIGN KEY (`pciDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO`(`uuid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CALL ADD_COLUMN('PciDeviceVO', 'virtState', 'varchar(32)', 1, NULL);

UPDATE `zstack`.`PciDeviceVO`
SET `virtState` =
CASE
WHEN `virtStatus` IN ('SRIOV_VIRTUALIZABLE', 'VFIO_MDEV_VIRTUALIZABLE', 'TENSORFUSION_VIRTUALIZABLE') THEN 'VIRTUALIZABLE'
WHEN `virtStatus` IN ('SRIOV_VIRTUALIZED', 'VFIO_MDEV_VIRTUALIZED', 'VIRTUALIZED_BYPASS_ZSTACK',
'HAMI_VIRTUALIZED', 'TENSORFUSION_VIRTUALIZED') THEN 'VIRTUALIZED'
WHEN `virtStatus` = 'SRIOV_VIRTUAL' THEN 'VIRTUAL'
ELSE 'UNVIRTUALIZABLE'
END
WHERE `virtState` IS NULL;

INSERT IGNORE INTO `zstack`.`PciDeviceVirtCapabilityVO`
(`pciDeviceUuid`, `capability`, `createDate`, `lastOpDate`)
SELECT `uuid`, 'SRIOV', NOW(), NOW()
FROM `zstack`.`PciDeviceVO`
WHERE `virtStatus` IN ('SRIOV_VIRTUALIZABLE', 'SRIOV_VIRTUALIZED');

INSERT IGNORE INTO `zstack`.`PciDeviceVirtCapabilityVO`
(`pciDeviceUuid`, `capability`, `createDate`, `lastOpDate`)
SELECT `uuid`, 'VFIO_MDEV', NOW(), NOW()
FROM `zstack`.`PciDeviceVO`
WHERE `virtStatus` IN ('VFIO_MDEV_VIRTUALIZABLE', 'VFIO_MDEV_VIRTUALIZED', 'VIRTUALIZED_BYPASS_ZSTACK');

INSERT IGNORE INTO `zstack`.`PciDeviceVirtCapabilityVO`
(`pciDeviceUuid`, `capability`, `createDate`, `lastOpDate`)
SELECT `uuid`, 'TENSORFUSION', NOW(), NOW()
FROM `zstack`.`PciDeviceVO`
WHERE `virtStatus` IN ('TENSORFUSION_VIRTUALIZABLE', 'TENSORFUSION_VIRTUALIZED');

INSERT IGNORE INTO `zstack`.`PciDeviceVirtCapabilityVO`
(`pciDeviceUuid`, `capability`, `createDate`, `lastOpDate`)
SELECT `uuid`, 'HAMI', NOW(), NOW()
FROM `zstack`.`PciDeviceVO`
WHERE `virtStatus` = 'HAMI_VIRTUALIZED';

CALL ADD_COLUMN('PciDeviceVO', 'virtMode', 'varchar(32)', 1, NULL);

UPDATE `zstack`.`PciDeviceVO`
SET `virtMode` =
CASE
WHEN `virtStatus` IN ('SRIOV_VIRTUALIZED') THEN 'SRIOV'
WHEN `virtStatus` = 'SRIOV_VIRTUAL' THEN 'SRIOV'
WHEN `virtStatus` IN ('VFIO_MDEV_VIRTUALIZED', 'VIRTUALIZED_BYPASS_ZSTACK') THEN 'VFIO_MDEV'
WHEN `virtStatus` = 'TENSORFUSION_VIRTUALIZED' THEN 'TENSORFUSION'
WHEN `virtStatus` = 'HAMI_VIRTUALIZED' THEN 'HAMI'
ELSE `virtMode`
END
WHERE `virtStatus` IN (
'SRIOV_VIRTUALIZED', 'SRIOV_VIRTUAL',
'VFIO_MDEV_VIRTUALIZED', 'VIRTUALIZED_BYPASS_ZSTACK',
'TENSORFUSION_VIRTUALIZED', 'HAMI_VIRTUALIZED'
);

CALL ADD_COLUMN('GpuDeviceVO', 'mode', 'varchar(32)', 1, NULL);
CALL CREATE_INDEX('GpuDeviceVO', 'idx_gpu_device_mode', 'mode');

UPDATE `zstack`.`GpuDeviceVO` g
INNER JOIN `zstack`.`PciDeviceVO` p ON g.`uuid` = p.`uuid`
SET g.`mode` = CASE
WHEN p.`virtState` = 'VIRTUALIZED' AND p.`virtMode` = 'TENSORFUSION' THEN 'DGPU'
WHEN p.`virtState` = 'VIRTUALIZED' AND p.`virtMode` IN ('VFIO_MDEV', 'SRIOV') THEN 'VGPU'
ELSE 'PCI'
END;
Comment on lines +109 to +115
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

缺少 WHERE 条件,可能影响升级幂等性。

此 UPDATE 语句没有 WHERE 条件,每次执行升级脚本时都会覆盖 mode 列的值。如果应用程序已经设置了该值,或脚本重复执行,可能导致数据被意外覆盖。

建议修改
 UPDATE `zstack`.`GpuDeviceVO` g
 INNER JOIN `zstack`.`PciDeviceVO` p ON g.`uuid` = p.`uuid`
 SET g.`mode` = CASE
     WHEN p.`virtState` = 'VIRTUALIZED' AND p.`virtMode` = 'TENSORFUSION' THEN 'DGPU'
     WHEN p.`virtState` = 'VIRTUALIZED' AND p.`virtMode` IN ('VFIO_MDEV', 'SRIOV') THEN 'VGPU'
     ELSE 'PCI'
-END;
+END
+WHERE g.`mode` IS NULL;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@conf/db/upgrade/V5.5.12__schema.sql` around lines 109 - 115, The UPDATE is
missing a WHERE clause and will overwrite g.`mode` every run; change the
statement that joins `GpuDeviceVO` and `PciDeviceVO` (referencing g.`mode`,
p.`virtState`, p.`virtMode`) to only set mode when it is unset or empty to make
the migration idempotent (for example add a WHERE such as g.`mode` IS NULL OR
g.`mode` = '' so only rows without a mode are updated).


UPDATE `zstack`.`GpuDeviceVO` g
INNER JOIN `zstack`.`PciDeviceVO` p ON g.`uuid` = p.`uuid`
SET g.`allocateStatus` = CASE
WHEN p.`vmInstanceUuid` IS NOT NULL THEN 'Allocated'
WHEN p.`virtState` = 'VIRTUALIZED' AND p.`virtMode` IS NOT NULL THEN 'Unallocatable'
ELSE 'Unallocated'
END;
Comment on lines +117 to +123
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

缺少 WHERE 条件,影响升级幂等性。

与上面的 mode 更新类似,此 UPDATE 语句没有 WHERE 条件,每次迁移都会覆盖 allocateStatus。如果应用程序运行时已修改过此值,迁移重跑会导致数据回退。

建议修改
 UPDATE `zstack`.`GpuDeviceVO` g
 INNER JOIN `zstack`.`PciDeviceVO` p ON g.`uuid` = p.`uuid`
 SET g.`allocateStatus` = CASE
     WHEN p.`vmInstanceUuid` IS NOT NULL THEN 'Allocated'
     WHEN p.`virtState` = 'VIRTUALIZED' AND p.`virtMode` IS NOT NULL THEN 'Unallocatable'
     ELSE 'Unallocated'
-END;
+END
+WHERE g.`allocateStatus` IS NULL;
📝 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
UPDATE `zstack`.`GpuDeviceVO` g
INNER JOIN `zstack`.`PciDeviceVO` p ON g.`uuid` = p.`uuid`
SET g.`allocateStatus` = CASE
WHEN p.`vmInstanceUuid` IS NOT NULL THEN 'Allocated'
WHEN p.`virtState` = 'VIRTUALIZED' AND p.`virtMode` IS NOT NULL THEN 'Unallocatable'
ELSE 'Unallocated'
END;
UPDATE `zstack`.`GpuDeviceVO` g
INNER JOIN `zstack`.`PciDeviceVO` p ON g.`uuid` = p.`uuid`
SET g.`allocateStatus` = CASE
WHEN p.`vmInstanceUuid` IS NOT NULL THEN 'Allocated'
WHEN p.`virtState` = 'VIRTUALIZED' AND p.`virtMode` IS NOT NULL THEN 'Unallocatable'
ELSE 'Unallocated'
END
WHERE g.`allocateStatus` IS NULL;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@conf/db/upgrade/V5.5.12__schema.sql` around lines 117 - 123, The UPDATE on
GpuDeviceVO/PciDeviceVO is missing a WHERE clause and will overwrite
allocateStatus on every migration run; restrict the update to only rows that
haven't been initialized by adding a WHERE g.`allocateStatus` IS NULL (or
g.`allocateStatus` = '' depending on existing conventions) so the CASE only sets
values for uninitialized records; reference the GpuDeviceVO and PciDeviceVO
tables and the columns g.`allocateStatus`, p.`vmInstanceUuid`, p.`virtState`,
p.`virtMode` when applying this change.


-- dGPU (TensorFusion) support tables

CREATE TABLE IF NOT EXISTS `zstack`.`DGpuProfileVO` (
`uuid` VARCHAR(32) NOT NULL,
`gpuSpecUuid` VARCHAR(32) NOT NULL,
`memorySize` BIGINT UNSIGNED NOT NULL,
`shmemSize` BIGINT UNSIGNED NOT NULL DEFAULT 268435456,
`createDate` TIMESTAMP NOT NULL,
`lastOpDate` TIMESTAMP NOT NULL,
PRIMARY KEY (`uuid`),
UNIQUE KEY `uk_dgpu_profile` (`gpuSpecUuid`, `memorySize`),
CONSTRAINT `fk_dgpu_profile_spec`
FOREIGN KEY (`gpuSpecUuid`) REFERENCES `zstack`.`GpuDeviceSpecVO`(`uuid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `zstack`.`DGpuDeviceVO` (
`uuid` VARCHAR(32) NOT NULL,
`name` VARCHAR(255) NOT NULL,
`parentGpuUuid` VARCHAR(32) NOT NULL,
`gpuSpecUuid` VARCHAR(32) NOT NULL,
`hostUuid` VARCHAR(32) NOT NULL,
`vmInstanceUuid` VARCHAR(32) DEFAULT NULL,
`allocatedMemory` BIGINT UNSIGNED NOT NULL,
`shmemSize` BIGINT UNSIGNED NOT NULL DEFAULT 268435456,
`smPercentLimit` INT NOT NULL DEFAULT 0,
`protocol` VARCHAR(16) NOT NULL DEFAULT 'shmem',
`status` VARCHAR(32) NOT NULL,
`vendorId` VARCHAR(64) DEFAULT NULL,
`vendor` VARCHAR(255) DEFAULT NULL,
`createDate` TIMESTAMP NOT NULL,
`lastOpDate` TIMESTAMP NOT NULL,
PRIMARY KEY (`uuid`),
INDEX `idx_dgpu_device_parent` (`parentGpuUuid`),
INDEX `idx_dgpu_device_spec` (`gpuSpecUuid`),
INDEX `idx_dgpu_device_host` (`hostUuid`),
INDEX `idx_dgpu_device_vm` (`vmInstanceUuid`),
CONSTRAINT `fk_dgpu_device_parent`
FOREIGN KEY (`parentGpuUuid`) REFERENCES `zstack`.`PciDeviceVO`(`uuid`) ON DELETE CASCADE,
CONSTRAINT `fk_dgpu_device_spec`
FOREIGN KEY (`gpuSpecUuid`) REFERENCES `zstack`.`GpuDeviceSpecVO`(`uuid`) ON DELETE RESTRICT,
CONSTRAINT `fk_dgpu_device_host`
FOREIGN KEY (`hostUuid`) REFERENCES `zstack`.`HostEO`(`uuid`) ON DELETE CASCADE,
CONSTRAINT `fk_dgpu_device_vm`
FOREIGN KEY (`vmInstanceUuid`) REFERENCES `zstack`.`VmInstanceEO`(`uuid`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `zstack`.`VmInstanceDGpuStrategyVO` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`vmInstanceUuid` VARCHAR(32) NOT NULL,
`gpuSpecUuid` VARCHAR(32) NOT NULL,
`memorySize` BIGINT UNSIGNED NOT NULL,
`shmemSize` BIGINT UNSIGNED NOT NULL DEFAULT 268435456,
`gpuDeviceUuid` VARCHAR(32) DEFAULT NULL,
`chooser` VARCHAR(16) NOT NULL,
`autoDetachOnStop` TINYINT(1) NOT NULL DEFAULT 1,
`createDate` TIMESTAMP NOT NULL,
`lastOpDate` TIMESTAMP NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_vm_dgpu_strategy` (`vmInstanceUuid`),
INDEX `idx_vm_dgpu_strategy_spec` (`gpuSpecUuid`),
CONSTRAINT `fk_vm_dgpu_strategy_vm`
FOREIGN KEY (`vmInstanceUuid`) REFERENCES `zstack`.`VmInstanceEO`(`uuid`) ON DELETE CASCADE,
CONSTRAINT `fk_vm_dgpu_strategy_spec`
FOREIGN KEY (`gpuSpecUuid`) REFERENCES `zstack`.`GpuDeviceSpecVO`(`uuid`) ON DELETE CASCADE,
CONSTRAINT `fk_vm_dgpu_strategy_device`
FOREIGN KEY (`gpuDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO`(`uuid`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7 changes: 5 additions & 2 deletions conf/i18n/globalErrorCodeMapping/global-error-en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -4714,5 +4714,8 @@
"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"
}
"ORG_ZSTACK_VPCFIREWALL_10035": "could not add firewall rule[%d] because of a %s error",
"ORG_ZSTACK_DGPU_10010": "Available License not found, please apply addon license for product dGPU.",
"ORG_ZSTACK_DGPU_10011": "Addon license for product dGPU has expired, please renew it.",
"ORG_ZSTACK_DGPU_10012": "Insufficient dGPU GPU number licensed. Your license permits %d GPU, there are %d GPU used, shared: %d, need: %d."
}
7 changes: 5 additions & 2 deletions conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -4714,5 +4714,8 @@
"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"
}
"ORG_ZSTACK_VPCFIREWALL_10035": "无法添加防火墙规则[%d]因为%s",
"ORG_ZSTACK_DGPU_10010": "未找到可用的 dGPU AddOn License,请为 dGPU 产品申请并上传对应授权。",
"ORG_ZSTACK_DGPU_10011": "dGPU 产品的 AddOn License 已过期,请及时续期。",
"ORG_ZSTACK_DGPU_10012": "dGPU 授权 GPU 数量不足。License 允许 %d 个 GPU,当前已使用 %d 个,其他节点共享使用 %d 个,本次还需要 %d 个。"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package org.zstack.header.zwatch;

import java.util.List;

public interface ResourceMetricBindingExtensionPoint {
class ResourceMetricBinding {
private Class<?> resourceType;
private String logicalMetricName;
private String sourceNamespace;
private String sourceMetricName;
private String resourceField;
private String sourceLabel;
private boolean requireUniqueSourceKey;

private static <T> T requireValue(String fieldName, T value) {
if (value == null) {
throw new IllegalStateException(String.format("ResourceMetricBinding.%s must not be null", fieldName));
}
return value;
}

private static String requireText(String fieldName, String value) {
requireValue(fieldName, value);
if (value.trim().isEmpty()) {
throw new IllegalStateException(String.format("ResourceMetricBinding.%s must not be empty", fieldName));
}
return value;
}

public Class<?> getResourceType() {
return requireValue("resourceType", resourceType);
}

public void setResourceType(Class<?> resourceType) {
this.resourceType = resourceType;
}

public String getLogicalMetricName() {
return requireText("logicalMetricName", logicalMetricName);
}

public void setLogicalMetricName(String logicalMetricName) {
this.logicalMetricName = logicalMetricName;
}

public String getSourceNamespace() {
return requireText("sourceNamespace", sourceNamespace);
}

public void setSourceNamespace(String sourceNamespace) {
this.sourceNamespace = sourceNamespace;
}

public String getSourceMetricName() {
return requireText("sourceMetricName", sourceMetricName);
}

public void setSourceMetricName(String sourceMetricName) {
this.sourceMetricName = sourceMetricName;
}

public String getResourceField() {
return requireText("resourceField", resourceField);
}

public void setResourceField(String resourceField) {
this.resourceField = resourceField;
}

public String getSourceLabel() {
return requireText("sourceLabel", sourceLabel);
}

public void setSourceLabel(String sourceLabel) {
this.sourceLabel = sourceLabel;
}

public boolean isRequireUniqueSourceKey() {
return requireUniqueSourceKey;
}

public void setRequireUniqueSourceKey(boolean requireUniqueSourceKey) {
this.requireUniqueSourceKey = requireUniqueSourceKey;
}
}

List<ResourceMetricBinding> getResourceMetricBindings();
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

请为接口方法补充 Javadoc(当前不满足接口规范)。

getResourceMetricBindings() 是扩展点核心入口,建议补充返回值语义和字段约束(如哪些字段必填、是否允许空列表)。

建议修改
+    /**
+     * Return metric bindings contributed by this extension.
+     * Each binding should provide all required fields in {`@link` ResourceMetricBinding}.
+     *
+     * `@return` resource metric bindings, empty list if no bindings are provided
+     */
     List<ResourceMetricBinding> getResourceMetricBindings();

As per coding guidelines "接口方法不应有多余的修饰符(例如 public),且必须配有有效的 Javadoc 注释。"

📝 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
List<ResourceMetricBinding> getResourceMetricBindings();
/**
* Return metric bindings contributed by this extension.
* Each binding should provide all required fields in {`@link` ResourceMetricBinding}.
*
* `@return` resource metric bindings, empty list if no bindings are provided
*/
List<ResourceMetricBinding> getResourceMetricBindings();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@header/src/main/java/org/zstack/header/zwatch/ResourceMetricBindingExtensionPoint.java`
at line 87, 在 ResourceMetricBindingExtensionPoint 接口的核心方法
getResourceMetricBindings() 上补充完整的 Javadoc,说明该方法的返回语义(返回项代表什么)、每个
ResourceMetricBinding 对象中哪些字段为必填/可选、是否允许返回 null 或空列表(建议明确为“不可为
null,可返回空列表”或反之),以及调用方对返回值的期望(是否需要做深拷贝或不可修改返回集合)。在文档中使用接口名
ResourceMetricBindingExtensionPoint 和方法名 getResourceMetricBindings()
以便定位,并遵守接口规范不添加多余修饰符。

}
14 changes: 14 additions & 0 deletions sdk/src/main/java/SourceClassMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -635,15 +635,22 @@ public class SourceClassMap {
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.GpuDeviceSpecCandidateInventory", "org.zstack.sdk.GpuDeviceSpecCandidateInventory");
put("org.zstack.pciDevice.gpu.GpuDeviceSpecInventory", "org.zstack.sdk.GpuDeviceSpecInventory");
put("org.zstack.pciDevice.gpu.GpuVendor", "org.zstack.sdk.GpuVendor");
put("org.zstack.pciDevice.gpu.dgpu.DGpuDeviceInventory", "org.zstack.sdk.DGpuDeviceInventory");
put("org.zstack.pciDevice.gpu.dgpu.DGpuProfileInventory", "org.zstack.sdk.DGpuProfileInventory");
put("org.zstack.pciDevice.gpu.dgpu.DGpuSpecStatsInventory", "org.zstack.sdk.DGpuSpecStatsInventory");
put("org.zstack.pciDevice.gpu.dgpu.DGpuStatus", "org.zstack.sdk.DGpuStatus");
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");
put("org.zstack.pciDevice.specification.mdev.VmInstanceMdevDeviceSpecRefInventory", "org.zstack.sdk.VmInstanceMdevDeviceSpecRefInventory");
put("org.zstack.pciDevice.specification.pci.PciDeviceSpecInventory", "org.zstack.sdk.PciDeviceSpecInventory");
put("org.zstack.pciDevice.specification.pci.PciDeviceSpecState", "org.zstack.sdk.PciDeviceSpecState");
put("org.zstack.pciDevice.specification.pci.VmInstancePciDeviceSpecRefInventory", "org.zstack.sdk.VmInstancePciDeviceSpecRefInventory");
put("org.zstack.pciDevice.virtual.PciDeviceVirtMode", "org.zstack.sdk.PciDeviceVirtMode");
put("org.zstack.pciDevice.virtual.PciDeviceVirtState", "org.zstack.sdk.PciDeviceVirtState");
put("org.zstack.pciDevice.virtual.PciDeviceVirtStatus", "org.zstack.sdk.PciDeviceVirtStatus");
put("org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceChooser", "org.zstack.sdk.MdevDeviceChooser");
put("org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceInventory", "org.zstack.sdk.MdevDeviceInventory");
Expand Down Expand Up @@ -1022,6 +1029,10 @@ public class SourceClassMap {
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");
put("org.zstack.sdk.DGpuDeviceInventory", "org.zstack.pciDevice.gpu.dgpu.DGpuDeviceInventory");
put("org.zstack.sdk.DGpuProfileInventory", "org.zstack.pciDevice.gpu.dgpu.DGpuProfileInventory");
put("org.zstack.sdk.DGpuSpecStatsInventory", "org.zstack.pciDevice.gpu.dgpu.DGpuSpecStatsInventory");
put("org.zstack.sdk.DGpuStatus", "org.zstack.pciDevice.gpu.dgpu.DGpuStatus");
put("org.zstack.sdk.DRSAdviceInventory", "org.zstack.drs.entity.DRSAdviceInventory");
put("org.zstack.sdk.DRSVmMigrationActivityInventory", "org.zstack.drs.entity.DRSVmMigrationActivityInventory");
put("org.zstack.sdk.DataCenterInventory", "org.zstack.header.datacenter.DataCenterInventory");
Expand Down Expand Up @@ -1083,6 +1094,7 @@ public class SourceClassMap {
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.GpuDeviceSpecCandidateInventory", "org.zstack.pciDevice.gpu.GpuDeviceSpecCandidateInventory");
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");
Expand Down Expand Up @@ -1327,6 +1339,8 @@ public class SourceClassMap {
put("org.zstack.sdk.PciDeviceState", "org.zstack.pciDevice.PciDeviceState");
put("org.zstack.sdk.PciDeviceStatus", "org.zstack.pciDevice.PciDeviceStatus");
put("org.zstack.sdk.PciDeviceType", "org.zstack.pciDevice.PciDeviceType");
put("org.zstack.sdk.PciDeviceVirtMode", "org.zstack.pciDevice.virtual.PciDeviceVirtMode");
put("org.zstack.sdk.PciDeviceVirtState", "org.zstack.pciDevice.virtual.PciDeviceVirtState");
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");
Expand Down
Loading