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
38 changes: 38 additions & 0 deletions conf/db/upgrade/V6.0.0.1__gpu_add_scope.sql
Original file line number Diff line number Diff line change
@@ -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;
88 changes: 88 additions & 0 deletions conf/db/upgrade/V6.0.0.2__bm2_gpu_migrate.sql
Original file line number Diff line number Diff line change
@@ -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;
104 changes: 104 additions & 0 deletions conf/db/upgrade/V6.0.0.3__mdev_subtable.sql
Original file line number Diff line number Diff line change
@@ -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;