Skip to content

Commit 9fb0ae3

Browse files
author
shenjin
committed
<fix>[ceph]: support thirdparty_ceph to bm root volume
support thirdparty_ceph to bm root volume Resolves: ZSTAC-73396 Change-Id: I6f6f616777677a6f74696c6c736c737a626f7863
1 parent ee9f20d commit 9fb0ae3

7 files changed

Lines changed: 255 additions & 6 deletions

File tree

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
DELIMITER $$
2+
3+
CREATE PROCEDURE UpdateBareMetal2InstanceProvisionNicVO()
4+
BEGIN
5+
DECLARE instanceUuid_exists INT;
6+
DECLARE isPrimaryProvisionNic_exists_in_ProvisionNicVO INT;
7+
DECLARE isPrimaryProvisionNic_exists_in_ChassisNicVO INT;
8+
9+
DECLARE EXIT HANDLER FOR SQLEXCEPTION
10+
BEGIN
11+
ROLLBACK;
12+
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred during the update process.';
13+
END;
14+
15+
START TRANSACTION;
16+
17+
SELECT COUNT(*)
18+
INTO instanceUuid_exists
19+
FROM INFORMATION_SCHEMA.COLUMNS
20+
WHERE TABLE_SCHEMA = 'zstack'
21+
AND TABLE_NAME = 'BareMetal2InstanceProvisionNicVO'
22+
AND COLUMN_NAME = 'instanceUuid';
23+
24+
IF instanceUuid_exists = 0 THEN
25+
CALL ADD_COLUMN('BareMetal2InstanceProvisionNicVO', 'instanceUuid', 'VARCHAR(32)', FALSE, '');
26+
27+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
28+
SET `instanceUuid` = `uuid`;
29+
30+
ALTER TABLE `zstack`.`BareMetal2InstanceProvisionNicVO`
31+
DROP FOREIGN KEY `fkBareMetal2InstanceProvisionNicVOInstanceVO`;
32+
33+
CALL ADD_CONSTRAINT('BareMetal2InstanceProvisionNicVO', 'fkBareMetal2InstanceProvisionNicVOInstanceVO',
34+
'instanceUuid', 'BareMetal2InstanceVO', 'uuid', 'CASCADE');
35+
36+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
37+
SET `uuid` = REPLACE(UUID(), '-', '');
38+
END IF;
39+
40+
SELECT COUNT(*)
41+
INTO isPrimaryProvisionNic_exists_in_ProvisionNicVO
42+
FROM INFORMATION_SCHEMA.COLUMNS
43+
WHERE TABLE_SCHEMA = 'zstack'
44+
AND TABLE_NAME = 'BareMetal2InstanceProvisionNicVO'
45+
AND COLUMN_NAME = 'isPrimaryProvisionNic';
46+
47+
IF isPrimaryProvisionNic_exists_in_ProvisionNicVO = 0 THEN
48+
CALL ADD_COLUMN('BareMetal2InstanceProvisionNicVO', 'isPrimaryProvisionNic', 'BOOLEAN', FALSE, FALSE);
49+
50+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
51+
SET `isPrimaryProvisionNic` = TRUE;
52+
END IF;
53+
54+
SELECT COUNT(*)
55+
INTO isPrimaryProvisionNic_exists_in_ChassisNicVO
56+
FROM INFORMATION_SCHEMA.COLUMNS
57+
WHERE TABLE_SCHEMA = 'zstack'
58+
AND TABLE_NAME = 'BareMetal2ChassisNicVO'
59+
AND COLUMN_NAME = 'isPrimaryProvisionNic';
60+
61+
IF isPrimaryProvisionNic_exists_in_ChassisNicVO = 0 THEN
62+
CALL ADD_COLUMN('BareMetal2ChassisNicVO', 'isPrimaryProvisionNic', 'BOOLEAN', FALSE, FALSE);
63+
64+
UPDATE `zstack`.`BareMetal2ChassisNicVO`
65+
SET `isPrimaryProvisionNic` = TRUE
66+
WHERE `isProvisionNic` = TRUE;
67+
END IF;
68+
69+
COMMIT;
70+
END$$
71+
72+
DELIMITER ;
73+
CALL UpdateBareMetal2InstanceProvisionNicVO();
74+
DROP PROCEDURE IF EXISTS UpdateBareMetal2InstanceProvisionNicVO;

conf/db/upgrade/V5.5.6__schema.sql

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
DELIMITER $$
2+
3+
CREATE PROCEDURE UpdateBareMetal2InstanceProvisionNicVO()
4+
BEGIN
5+
DECLARE instanceUuid_exists INT;
6+
DECLARE isPrimaryProvisionNic_exists_in_ProvisionNicVO INT;
7+
DECLARE isPrimaryProvisionNic_exists_in_ChassisNicVO INT;
8+
9+
DECLARE EXIT HANDLER FOR SQLEXCEPTION
10+
BEGIN
11+
ROLLBACK;
12+
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred during the update process.';
13+
END;
14+
15+
START TRANSACTION;
16+
17+
SELECT COUNT(*)
18+
INTO instanceUuid_exists
19+
FROM INFORMATION_SCHEMA.COLUMNS
20+
WHERE TABLE_SCHEMA = 'zstack'
21+
AND TABLE_NAME = 'BareMetal2InstanceProvisionNicVO'
22+
AND COLUMN_NAME = 'instanceUuid';
23+
24+
IF instanceUuid_exists = 0 THEN
25+
CALL ADD_COLUMN('BareMetal2InstanceProvisionNicVO', 'instanceUuid', 'VARCHAR(32)', FALSE, '');
26+
27+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
28+
SET `instanceUuid` = `uuid`;
29+
30+
ALTER TABLE `zstack`.`BareMetal2InstanceProvisionNicVO`
31+
DROP FOREIGN KEY `fkBareMetal2InstanceProvisionNicVOInstanceVO`;
32+
33+
CALL ADD_CONSTRAINT('BareMetal2InstanceProvisionNicVO', 'fkBareMetal2InstanceProvisionNicVOInstanceVO',
34+
'instanceUuid', 'BareMetal2InstanceVO', 'uuid', 'CASCADE');
35+
36+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
37+
SET `uuid` = REPLACE(UUID(), '-', '');
38+
END IF;
39+
40+
SELECT COUNT(*)
41+
INTO isPrimaryProvisionNic_exists_in_ProvisionNicVO
42+
FROM INFORMATION_SCHEMA.COLUMNS
43+
WHERE TABLE_SCHEMA = 'zstack'
44+
AND TABLE_NAME = 'BareMetal2InstanceProvisionNicVO'
45+
AND COLUMN_NAME = 'isPrimaryProvisionNic';
46+
47+
IF isPrimaryProvisionNic_exists_in_ProvisionNicVO = 0 THEN
48+
CALL ADD_COLUMN('BareMetal2InstanceProvisionNicVO', 'isPrimaryProvisionNic', 'BOOLEAN', FALSE, FALSE);
49+
50+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
51+
SET `isPrimaryProvisionNic` = TRUE;
52+
END IF;
53+
54+
SELECT COUNT(*)
55+
INTO isPrimaryProvisionNic_exists_in_ChassisNicVO
56+
FROM INFORMATION_SCHEMA.COLUMNS
57+
WHERE TABLE_SCHEMA = 'zstack'
58+
AND TABLE_NAME = 'BareMetal2ChassisNicVO'
59+
AND COLUMN_NAME = 'isPrimaryProvisionNic';
60+
61+
IF isPrimaryProvisionNic_exists_in_ChassisNicVO = 0 THEN
62+
CALL ADD_COLUMN('BareMetal2ChassisNicVO', 'isPrimaryProvisionNic', 'BOOLEAN', FALSE, FALSE);
63+
64+
UPDATE `zstack`.`BareMetal2ChassisNicVO`
65+
SET `isPrimaryProvisionNic` = TRUE
66+
WHERE `isProvisionNic` = TRUE;
67+
END IF;
68+
69+
COMMIT;
70+
END$$
71+
72+
DELIMITER ;
73+
CALL UpdateBareMetal2InstanceProvisionNicVO();
74+
DROP PROCEDURE IF EXISTS UpdateBareMetal2InstanceProvisionNicVO;

plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,12 @@
5454
import org.zstack.header.storage.primary.*;
5555
import org.zstack.header.storage.primary.VolumeSnapshotCapability.VolumeSnapshotArrangementType;
5656
import org.zstack.header.storage.snapshot.*;
57+
import org.zstack.header.tag.SystemTagVO;
58+
import org.zstack.header.tag.SystemTagVO_;
5759
import org.zstack.header.vm.VmInstanceSpec;
5860
import org.zstack.header.vm.VmInstanceSpec.ImageSpec;
61+
import org.zstack.header.vm.VmInstanceVO;
62+
import org.zstack.header.vm.VmInstanceVO_;
5963
import org.zstack.header.vo.ResourceVO;
6064
import org.zstack.header.volume.*;
6165
import org.zstack.identity.AccountManager;
@@ -484,6 +488,8 @@ public static class CloneRsp extends AgentResponse {
484488
public Long size;
485489
public Long actualSize;
486490
public String installPath;
491+
public String volumeId;
492+
public String volumeStatus;
487493

488494
public String getInstallPath() {
489495
return installPath;
@@ -492,6 +498,22 @@ public String getInstallPath() {
492498
public void setInstallPath(String installPath) {
493499
this.installPath = installPath;
494500
}
501+
502+
public String getVolumeId() {
503+
return volumeId;
504+
}
505+
506+
public void setVolumeId(String volumeId) {
507+
this.volumeId = volumeId;
508+
}
509+
510+
public String getVolumeStatus() {
511+
return volumeStatus;
512+
}
513+
514+
public void setVolumeStatus(String volumeStatus) {
515+
this.volumeStatus = volumeStatus;
516+
}
495517
}
496518

497519
public static class FlattenCmd extends AgentCommand implements HasThreadContext {
@@ -2635,6 +2657,40 @@ public void run(final FlowTrigger trigger, Map data) {
26352657
CloneCmd cmd = new CloneCmd();
26362658
cmd.srcPath = cloneInstallPath;
26372659
cmd.dstPath = volumePath;
2660+
List<CephPrimaryStorageCheckInstanceTypeExtensionPoint> exts = pluginRgty.getExtensionList(CephPrimaryStorageCheckInstanceTypeExtensionPoint.class);
2661+
for (CephPrimaryStorageCheckInstanceTypeExtensionPoint ext : exts) {
2662+
Boolean result = ext.isSupportCloneByThirdParty(msg.getVolume().getVmInstanceUuid());
2663+
if (!result) {
2664+
break;
2665+
}
2666+
boolean isRootVolume = Q.New(VolumeVO.class)
2667+
.eq(VolumeVO_.uuid, msg.getVolume().getUuid())
2668+
.eq(VolumeVO_.type, VolumeType.Root)
2669+
.isExists();
2670+
boolean isBareMetal2Instance = Q.New(VmInstanceVO.class)
2671+
.eq(VmInstanceVO_.uuid, msg.getVolume().getVmInstanceUuid())
2672+
.eq(VmInstanceVO_.type, "baremetal2")
2673+
.isExists();
2674+
boolean hasToken = CephSystemTags.THIRDPARTY_PLATFORM.hasTag(msg.getPrimaryStorageUuid());
2675+
if (isRootVolume && isBareMetal2Instance && hasToken) {
2676+
CephPrimaryStorageVO cephPrimaryStorageVO = dbf.findByUuid(msg.getPrimaryStorageUuid(), CephPrimaryStorageVO.class);
2677+
String monIp = cephPrimaryStorageVO.getMons()
2678+
.stream()
2679+
.filter(v -> v.getStatus() == MonStatus.Connected)
2680+
.map(CephPrimaryStorageMonVO::getHostname)
2681+
.findAny()
2682+
.orElseThrow(() -> new OperationFailureException(
2683+
operr("all ceph mons of primary storage[uuid:%s] are not in Connected state", cephPrimaryStorageVO.getUuid())
2684+
));
2685+
cmd.token = CephSystemTags.THIRDPARTY_PLATFORM.getTokenByResourceUuid(msg.getPrimaryStorageUuid(),
2686+
CephSystemTags.THIRDPARTY_PLATFORM_TOKEN);
2687+
cmd.monIp = monIp;
2688+
cmd.tpTimeout = CephGlobalConfig.THIRD_PARTY_SDK_TIMEOUT.value(String.class);
2689+
VolumeVO vo = Q.New(VolumeVO.class)
2690+
.eq(VolumeVO_.uuid, msg.getVolume().getUuid()).find();
2691+
ext.convertToBlockVolume(vo);
2692+
}
2693+
}
26382694

26392695
httpCall(CLONE_PATH, cmd, CloneRsp.class, new ReturnValueCompletion<CloneRsp>(trigger) {
26402696
@Override
@@ -2645,6 +2701,14 @@ public void fail(ErrorCode err) {
26452701
@Override
26462702
public void success(CloneRsp ret) {
26472703
actualSize = ret.actualSize;
2704+
List<CephPrimaryStorageCheckInstanceTypeExtensionPoint> exts = pluginRgty.getExtensionList(CephPrimaryStorageCheckInstanceTypeExtensionPoint.class);
2705+
for (CephPrimaryStorageCheckInstanceTypeExtensionPoint ext : exts) {
2706+
if (!ext.isBlockVolume(msg.getVolume().getUuid())) {
2707+
break;
2708+
}
2709+
volumePath = ret.installPath == null ? volumePath : makeVolumeInstallPathByTargetPool(ret.installPath, targetCephPoolName);
2710+
ext.populateBlockVolumeDetails(msg.getVolume().getUuid(), ret.volumeId, ret.volumeStatus);
2711+
}
26482712
trigger.next();
26492713
}
26502714
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.zstack.storage.ceph.primary;
2+
3+
import org.zstack.header.volume.VolumeVO;
4+
5+
public interface CephPrimaryStorageCheckInstanceTypeExtensionPoint {
6+
Boolean isSupportCloneByThirdParty(String uuid);
7+
8+
void convertToBlockVolume(VolumeVO vo);
9+
10+
Boolean isBlockVolume(String uuid);
11+
12+
void populateBlockVolumeDetails(String uuid, String volumeId, String volumeStatus);
13+
}

sdk/src/main/java/org/zstack/sdk/BareMetal2ChassisNicInventory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ public java.lang.Boolean getIsProvisionNic() {
5252
return this.isProvisionNic;
5353
}
5454

55+
public java.lang.Boolean isPrimaryProvisionNic;
56+
public void setIsPrimaryProvisionNic(java.lang.Boolean isPrimaryProvisionNic) {
57+
this.isPrimaryProvisionNic = isPrimaryProvisionNic;
58+
}
59+
public java.lang.Boolean getIsPrimaryProvisionNic() {
60+
return this.isPrimaryProvisionNic;
61+
}
62+
5563
public java.sql.Timestamp createDate;
5664
public void setCreateDate(java.sql.Timestamp createDate) {
5765
this.createDate = createDate;

sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceInventory.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.zstack.sdk;
22

3-
import org.zstack.sdk.BareMetal2InstanceProvisionNicInventory;
3+
44

55
public class BareMetal2InstanceInventory extends org.zstack.sdk.VmInstanceInventory {
66

@@ -84,12 +84,12 @@ public boolean getIsLatestAgent() {
8484
return this.isLatestAgent;
8585
}
8686

87-
public BareMetal2InstanceProvisionNicInventory provisionNic;
88-
public void setProvisionNic(BareMetal2InstanceProvisionNicInventory provisionNic) {
89-
this.provisionNic = provisionNic;
87+
public java.util.List provisionNics;
88+
public void setProvisionNics(java.util.List provisionNics) {
89+
this.provisionNics = provisionNics;
9090
}
91-
public BareMetal2InstanceProvisionNicInventory getProvisionNic() {
92-
return this.provisionNic;
91+
public java.util.List getProvisionNics() {
92+
return this.provisionNics;
9393
}
9494

9595
}

sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceProvisionNicInventory.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,22 @@ public java.lang.String getGateway() {
5252
return this.gateway;
5353
}
5454

55+
public java.lang.String instanceUuid;
56+
public void setInstanceUuid(java.lang.String instanceUuid) {
57+
this.instanceUuid = instanceUuid;
58+
}
59+
public java.lang.String getInstanceUuid() {
60+
return this.instanceUuid;
61+
}
62+
63+
public java.lang.Boolean isPrimaryProvisionNic;
64+
public void setIsPrimaryProvisionNic(java.lang.Boolean isPrimaryProvisionNic) {
65+
this.isPrimaryProvisionNic = isPrimaryProvisionNic;
66+
}
67+
public java.lang.Boolean getIsPrimaryProvisionNic() {
68+
return this.isPrimaryProvisionNic;
69+
}
70+
5571
public java.lang.String metadata;
5672
public void setMetadata(java.lang.String metadata) {
5773
this.metadata = metadata;

0 commit comments

Comments
 (0)