diff --git a/conf/db/upgrade/V6.0.0.1__gpu_add_scope.sql b/conf/db/upgrade/V6.0.0.1__gpu_add_scope.sql new file mode 100644 index 0000000000..6626e773d4 --- /dev/null +++ b/conf/db/upgrade/V6.0.0.1__gpu_add_scope.sql @@ -0,0 +1,38 @@ +-- V6.0.0.1: Add scope and chassisUuid to GpuDeviceVO for unified GPU management + +DELIMITER $$ +DROP PROCEDURE IF EXISTS add_gpu_scope_columns$$ +CREATE PROCEDURE add_gpu_scope_columns() +BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'GpuDeviceVO' + AND COLUMN_NAME = 'scope') THEN + ALTER TABLE `GpuDeviceVO` ADD COLUMN `scope` VARCHAR(32) DEFAULT 'VM' NOT NULL; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'GpuDeviceVO' + AND COLUMN_NAME = 'chassisUuid') THEN + ALTER TABLE `GpuDeviceVO` ADD COLUMN `chassisUuid` VARCHAR(32) DEFAULT NULL; + END IF; + + -- Mark HAMI-virtualized GPUs as CONTAINER scope + UPDATE `GpuDeviceVO` g + JOIN `PciDeviceVO` p ON g.`uuid` = p.`uuid` + SET g.`scope` = 'CONTAINER' + WHERE p.`virtStatus` = 'HAMI_VIRTUALIZED'; + + -- Index for scope-based queries + IF NOT EXISTS (SELECT 1 FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'GpuDeviceVO' + AND INDEX_NAME = 'idxGpuDeviceVOScope') THEN + CREATE INDEX `idxGpuDeviceVOScope` ON `GpuDeviceVO` (`scope`); + END IF; +END$$ +DELIMITER ; + +CALL add_gpu_scope_columns(); +DROP PROCEDURE IF EXISTS add_gpu_scope_columns; diff --git a/conf/db/upgrade/V6.0.0.2__bm2_gpu_migrate.sql b/conf/db/upgrade/V6.0.0.2__bm2_gpu_migrate.sql new file mode 100644 index 0000000000..0aa772b9bf --- /dev/null +++ b/conf/db/upgrade/V6.0.0.2__bm2_gpu_migrate.sql @@ -0,0 +1,88 @@ +-- V6.0.0.2: Migrate BareMetal2 GPU devices to unified GpuDeviceVO via phantom hosts +-- Conditional: only runs if BareMetal2 tables exist (skipped in non-BM2 deployments) + +DELIMITER $$ +DROP PROCEDURE IF EXISTS bm2_gpu_migrate$$ +CREATE PROCEDURE bm2_gpu_migrate() +BEGIN + IF (SELECT COUNT(*) FROM information_schema.TABLES + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'BareMetal2ChassisGpuDeviceVO') > 0 THEN + +-- Step 1: Create phantom hosts for each BM2 chassis that has GPU devices +INSERT INTO `HostEO` ( + `uuid`, `name`, `description`, + `zoneUuid`, `clusterUuid`, + `managementIp`, `hypervisorType`, `state`, `status`, + `createDate`, `lastOpDate` +) +SELECT + CONCAT('ph-', SUBSTRING(c.`uuid`, 1, 29)), + CONCAT('[BM2] ', c.`name`), + CONCAT('Phantom host for BareMetal2 chassis ', c.`uuid`), + c.`zoneUuid`, + c.`clusterUuid`, + '', + 'BareMetal2', + 'Enabled', + 'Connected', + c.`createDate`, + NOW() +FROM `BareMetal2ChassisVO` c +WHERE c.`uuid` IN ( + SELECT DISTINCT bm.`chassisUuid` + FROM `BareMetal2ChassisPciDeviceVO` bm + WHERE bm.`uuid` IN (SELECT `uuid` FROM `BareMetal2ChassisGpuDeviceVO`) +) +AND NOT EXISTS ( + SELECT 1 FROM `HostEO` h WHERE h.`uuid` = CONCAT('ph-', SUBSTRING(c.`uuid`, 1, 29)) +); + +-- Step 2: Migrate PCI base data to PciDeviceVO +INSERT INTO `PciDeviceVO` ( + `uuid`, `name`, `description`, + `hostUuid`, + `type`, `state`, `status`, `virtStatus`, + `vendorId`, `deviceId`, `subvendorId`, `subdeviceId`, + `pciDeviceAddress`, `iommuGroup`, + `vendor`, `device`, + `createDate`, `lastOpDate` +) +SELECT + bm.`uuid`, bm.`name`, bm.`description`, + CONCAT('ph-', SUBSTRING(bm.`chassisUuid`, 1, 29)), + bm.`type`, 'Enabled', 'Active', 'UNVIRTUALIZABLE', + bm.`vendorId`, bm.`deviceId`, bm.`subvendorId`, bm.`subdeviceId`, + bm.`pciDeviceAddress`, bm.`iommuGroup`, + bm.`vendor`, bm.`device`, + bm.`createDate`, bm.`lastOpDate` +FROM `BareMetal2ChassisPciDeviceVO` bm +WHERE bm.`uuid` IN (SELECT `uuid` FROM `BareMetal2ChassisGpuDeviceVO`) +AND NOT EXISTS ( + SELECT 1 FROM `PciDeviceVO` p WHERE p.`uuid` = bm.`uuid` +); + +-- Step 3: Migrate GPU extension data to GpuDeviceVO +INSERT INTO `GpuDeviceVO` ( + `uuid`, `serialNumber`, `memory`, `power`, `isDriverLoaded`, + `scope`, `chassisUuid` +) +SELECT + bg.`uuid`, bg.`serialNumber`, bg.`memory`, bg.`power`, bg.`isDriverLoaded`, + 'BARE_METAL', bm.`chassisUuid` +FROM `BareMetal2ChassisGpuDeviceVO` bg +JOIN `BareMetal2ChassisPciDeviceVO` bm ON bg.`uuid` = bm.`uuid` +WHERE NOT EXISTS ( + SELECT 1 FROM `GpuDeviceVO` g WHERE g.`uuid` = bg.`uuid` +); + +-- Step 4: Mark old table as migrated (preserve for 1 version) +ALTER TABLE `BareMetal2ChassisPciDeviceVO` ADD COLUMN IF NOT EXISTS `_migrated` TINYINT(1) DEFAULT 0; +UPDATE `BareMetal2ChassisPciDeviceVO` SET `_migrated` = 1 + WHERE `uuid` IN (SELECT `uuid` FROM `BareMetal2ChassisGpuDeviceVO`); + + END IF; +END$$ +DELIMITER ; + +CALL bm2_gpu_migrate(); +DROP PROCEDURE IF EXISTS bm2_gpu_migrate; diff --git a/conf/db/upgrade/V6.0.0.3__mdev_subtable.sql b/conf/db/upgrade/V6.0.0.3__mdev_subtable.sql new file mode 100644 index 0000000000..276918cbbf --- /dev/null +++ b/conf/db/upgrade/V6.0.0.3__mdev_subtable.sql @@ -0,0 +1,104 @@ +-- V6.0.0.3: Convert MdevDeviceVO from standalone to PciDeviceVO subtable + +DELIMITER $$ +DROP PROCEDURE IF EXISTS migrate_mdev_subtable$$ +CREATE PROCEDURE migrate_mdev_subtable() +BEGIN + -- Only proceed if old MdevDeviceVO exists and is NOT yet a subtable of PciDeviceVO + IF EXISTS (SELECT 1 FROM information_schema.TABLES + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'MdevDeviceVO') + AND NOT EXISTS (SELECT 1 FROM information_schema.TABLE_CONSTRAINTS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'MdevDeviceVO' + AND CONSTRAINT_NAME = 'fkMdevDeviceVOPciDeviceVO') THEN + + -- Step 1: Migrate MdevDeviceVO shared fields into PciDeviceVO + INSERT INTO `PciDeviceVO` ( + `uuid`, `name`, `description`, + `hostUuid`, `parentUuid`, `vmInstanceUuid`, + `type`, `state`, `status`, `virtStatus`, `chooser`, + `vendor`, + `vendorId`, `deviceId`, `subvendorId`, `subdeviceId`, + `pciDeviceAddress`, + `createDate`, `lastOpDate` + ) + SELECT + m.`uuid`, m.`name`, m.`description`, + m.`hostUuid`, m.`parentUuid`, m.`vmInstanceUuid`, + m.`type`, + m.`state`, + m.`status`, + 'VFIO_MDEV_VIRTUAL', + m.`chooser`, + m.`vendor`, + p.`vendorId`, p.`deviceId`, p.`subvendorId`, p.`subdeviceId`, + m.`mdevDeviceAddress`, + m.`createDate`, m.`lastOpDate` + FROM `MdevDeviceVO` m + LEFT JOIN `PciDeviceVO` p ON m.`parentUuid` = p.`uuid` + WHERE NOT EXISTS ( + SELECT 1 FROM `PciDeviceVO` pci WHERE pci.`uuid` = m.`uuid` + ); + + -- Step 2: Rename old MdevDeviceVO table + RENAME TABLE `MdevDeviceVO` TO `MdevDeviceVO_old`; + + -- Step 3: Create new MdevDeviceVO as subtable of PciDeviceVO + CREATE TABLE `MdevDeviceVO` ( + `uuid` VARCHAR(32) NOT NULL UNIQUE, + `mdevSpecUuid` VARCHAR(32) DEFAULT NULL, + `mttyUuid` VARCHAR(32) DEFAULT NULL, + `mdevDeviceAddress` VARCHAR(128) DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkMdevDeviceVOPciDeviceVO` + FOREIGN KEY (`uuid`) REFERENCES `PciDeviceVO`(`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkMdevDeviceVOMdevSpecVO` + FOREIGN KEY (`mdevSpecUuid`) REFERENCES `MdevDeviceSpecVO`(`uuid`) ON DELETE SET NULL, + CONSTRAINT `fkMdevDeviceVOMttyDeviceVO` + FOREIGN KEY (`mttyUuid`) REFERENCES `MttyDeviceVO`(`uuid`) ON DELETE CASCADE + ) ENGINE=InnoDB; + + -- Step 4: Migrate mdev-specific data to new subtable + INSERT IGNORE INTO `MdevDeviceVO` (`uuid`, `mdevSpecUuid`, `mttyUuid`, `mdevDeviceAddress`) + SELECT `uuid`, `mdevSpecUuid`, `mttyUuid`, `mdevDeviceAddress` + FROM `MdevDeviceVO_old`; + + END IF; + + -- Only run AccountResourceRefVO migration if MdevDeviceVO table exists + IF EXISTS (SELECT 1 FROM information_schema.TABLES + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'MdevDeviceVO') THEN + + -- Step 5: Migrate AccountResourceRefVO references (safe to re-run) + INSERT IGNORE INTO `AccountResourceRefVO` ( + `uuid`, `accountUuid`, `ownerAccountUuid`, `resourceUuid`, + `resourceType`, `concreteResourceType`, `createDate`, `lastOpDate` + ) + SELECT + REPLACE(UUID(), '-', ''), + ar.`accountUuid`, ar.`ownerAccountUuid`, + ar.`resourceUuid`, + 'PciDeviceVO', + 'org.zstack.pciDevice.PciDeviceVO', + NOW(), NOW() + FROM `AccountResourceRefVO` ar + WHERE ar.`resourceType` = 'MdevDeviceVO' + AND ar.`resourceUuid` IN (SELECT `uuid` FROM `MdevDeviceVO`) + AND NOT EXISTS ( + SELECT 1 FROM `AccountResourceRefVO` a2 + WHERE a2.`resourceUuid` = ar.`resourceUuid` AND a2.`resourceType` = 'PciDeviceVO' + ); + + -- Step 6: Remove old MdevDeviceVO AccountResourceRefVO entries + DELETE FROM `AccountResourceRefVO` + WHERE `resourceType` = 'MdevDeviceVO' + AND `resourceUuid` IN (SELECT `uuid` FROM `MdevDeviceVO`); + + END IF; + + -- MdevDeviceVO_old preserved for rollback verification (drop in next version) +END$$ +DELIMITER ; + +CALL migrate_mdev_subtable(); +DROP PROCEDURE IF EXISTS migrate_mdev_subtable;