Skip to content

Commit e8e117d

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 d590879 commit e8e117d

6 files changed

Lines changed: 183 additions & 7 deletions

File tree

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

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,79 @@ ALTER TABLE `GuestVmScriptExecutedRecordDetailVO`
22
MODIFY `stdout` MEDIUMTEXT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;
33

44
ALTER TABLE `GuestVmScriptExecutedRecordDetailVO`
5-
MODIFY `stderr` MEDIUMTEXT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;
5+
MODIFY `stderr` MEDIUMTEXT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;
6+
7+
DELIMITER $$
8+
9+
CREATE PROCEDURE UpdateBareMetal2InstanceProvisionNicVO()
10+
BEGIN
11+
DECLARE instanceUuid_exists INT;
12+
DECLARE isPrimaryProvisionNic_exists_in_ProvisionNicVO INT;
13+
DECLARE isPrimaryProvisionNic_exists_in_ChassisNicVO INT;
14+
15+
DECLARE EXIT HANDLER FOR SQLEXCEPTION
16+
BEGIN
17+
ROLLBACK;
18+
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred during the update process.';
19+
END;
20+
21+
START TRANSACTION;
22+
23+
SELECT COUNT(*)
24+
INTO instanceUuid_exists
25+
FROM INFORMATION_SCHEMA.COLUMNS
26+
WHERE TABLE_SCHEMA = 'zstack'
27+
AND TABLE_NAME = 'BareMetal2InstanceProvisionNicVO'
28+
AND COLUMN_NAME = 'instanceUuid';
29+
30+
IF instanceUuid_exists = 0 THEN
31+
CALL ADD_COLUMN('BareMetal2InstanceProvisionNicVO', 'instanceUuid', 'VARCHAR(32)', FALSE, '');
32+
33+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
34+
SET `instanceUuid` = `uuid`;
35+
36+
ALTER TABLE `zstack`.`BareMetal2InstanceProvisionNicVO`
37+
DROP FOREIGN KEY `fkBareMetal2InstanceProvisionNicVOInstanceVO`;
38+
39+
CALL ADD_CONSTRAINT('BareMetal2InstanceProvisionNicVO', 'fkBareMetal2InstanceProvisionNicVOInstanceVO',
40+
'instanceUuid', 'BareMetal2InstanceVO', 'uuid', 'CASCADE');
41+
42+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
43+
SET `uuid` = REPLACE(UUID(), '-', '');
44+
END IF;
45+
46+
SELECT COUNT(*)
47+
INTO isPrimaryProvisionNic_exists_in_ProvisionNicVO
48+
FROM INFORMATION_SCHEMA.COLUMNS
49+
WHERE TABLE_SCHEMA = 'zstack'
50+
AND TABLE_NAME = 'BareMetal2InstanceProvisionNicVO'
51+
AND COLUMN_NAME = 'isPrimaryProvisionNic';
52+
53+
IF isPrimaryProvisionNic_exists_in_ProvisionNicVO = 0 THEN
54+
CALL ADD_COLUMN('BareMetal2InstanceProvisionNicVO', 'isPrimaryProvisionNic', 'BOOLEAN', FALSE, FALSE);
55+
56+
UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO`
57+
SET `isPrimaryProvisionNic` = TRUE;
58+
END IF;
59+
60+
SELECT COUNT(*)
61+
INTO isPrimaryProvisionNic_exists_in_ChassisNicVO
62+
FROM INFORMATION_SCHEMA.COLUMNS
63+
WHERE TABLE_SCHEMA = 'zstack'
64+
AND TABLE_NAME = 'BareMetal2ChassisNicVO'
65+
AND COLUMN_NAME = 'isPrimaryProvisionNic';
66+
67+
IF isPrimaryProvisionNic_exists_in_ChassisNicVO = 0 THEN
68+
CALL ADD_COLUMN('BareMetal2ChassisNicVO', 'isPrimaryProvisionNic', 'BOOLEAN', FALSE, FALSE);
69+
70+
UPDATE `zstack`.`BareMetal2ChassisNicVO`
71+
SET `isPrimaryProvisionNic` = TRUE
72+
WHERE `isProvisionNic` = TRUE;
73+
END IF;
74+
75+
COMMIT;
76+
END$$
77+
78+
DELIMITER ;
79+
CALL UpdateBareMetal2InstanceProvisionNicVO();
80+
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;
@@ -485,6 +489,8 @@ public static class CloneRsp extends AgentResponse {
485489
public Long size;
486490
public Long actualSize;
487491
public String installPath;
492+
public String volumeId;
493+
public String volumeStatus;
488494

489495
public String getInstallPath() {
490496
return installPath;
@@ -493,6 +499,22 @@ public String getInstallPath() {
493499
public void setInstallPath(String installPath) {
494500
this.installPath = installPath;
495501
}
502+
503+
public String getVolumeId() {
504+
return volumeId;
505+
}
506+
507+
public void setVolumeId(String volumeId) {
508+
this.volumeId = volumeId;
509+
}
510+
511+
public String getVolumeStatus() {
512+
return volumeStatus;
513+
}
514+
515+
public void setVolumeStatus(String volumeStatus) {
516+
this.volumeStatus = volumeStatus;
517+
}
496518
}
497519

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

26402696
httpCall(CLONE_PATH, cmd, CloneRsp.class, new ReturnValueCompletion<CloneRsp>(trigger) {
26412697
@Override
@@ -2646,6 +2702,14 @@ public void fail(ErrorCode err) {
26462702
@Override
26472703
public void success(CloneRsp ret) {
26482704
actualSize = ret.actualSize;
2705+
List<CephPrimaryStorageCheckInstanceTypeExtensionPoint> exts = pluginRgty.getExtensionList(CephPrimaryStorageCheckInstanceTypeExtensionPoint.class);
2706+
for (CephPrimaryStorageCheckInstanceTypeExtensionPoint ext : exts) {
2707+
if (!ext.isBlockVolume(msg.getVolume().getUuid())) {
2708+
break;
2709+
}
2710+
volumePath = ret.installPath == null ? volumePath : makeVolumeInstallPathByTargetPool(ret.installPath, targetCephPoolName);
2711+
ext.populateBlockVolumeDetails(msg.getVolume().getUuid(), ret.volumeId, ret.volumeStatus);
2712+
}
26492713
trigger.next();
26502714
}
26512715
});
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)