Skip to content

Commit 023b98a

Browse files
authored
Merge pull request #586 from Dajeong-Park/dr-compress
[Mold] DR - 압축/중복제거 기능 제외, 모의시험 오류 수정
2 parents 1743713 + b7afa0e commit 023b98a

File tree

9 files changed

+428
-38
lines changed

9 files changed

+428
-38
lines changed

plugins/integrations/disaster-recovery/src/main/java/com/cloud/dr/cluster/DisasterRecoveryClusterEventTypes.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,6 @@ public class DisasterRecoveryClusterEventTypes {
3535
public static final String EVENT_DR_VM_STOP = "DR.VM.STOP";
3636
public static final String EVENT_DR_VM_PROMOTE = "DR.VM.PROMOTE";
3737
public static final String EVENT_DR_VM_DEMOTE = "DR.VM.DEMOTE";
38+
public static final String EVENT_DR_VM_SNAPSHOT = "DR.VM.SNAPSHOT";
3839

3940
}

plugins/integrations/disaster-recovery/src/main/java/com/cloud/dr/cluster/DisasterRecoveryClusterService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.cloudstack.api.command.admin.dr.ResyncDisasterRecoveryClusterCmd;
3232
import org.apache.cloudstack.api.command.admin.dr.StartDisasterRecoveryClusterVmCmd;
3333
import org.apache.cloudstack.api.command.admin.dr.StopDisasterRecoveryClusterVmCmd;
34+
import org.apache.cloudstack.api.command.admin.dr.TakeSnapshotDisasterRecoveryClusterVmCmd;
3435
import org.apache.cloudstack.api.command.admin.dr.DemoteDisasterRecoveryClusterCmd;
3536
import org.apache.cloudstack.api.command.admin.dr.DemoteDisasterRecoveryClusterVmCmd;
3637
import org.apache.cloudstack.api.command.admin.dr.CreateDisasterRecoveryClusterVmCmd;
@@ -95,4 +96,6 @@ public interface DisasterRecoveryClusterService extends PluggableService, Config
9596

9697
boolean demoteDisasterRecoveryClusterVm(DemoteDisasterRecoveryClusterVmCmd cmd) throws CloudRuntimeException;
9798

99+
boolean takeSnapshotDisasterRecoveryClusterVm(TakeSnapshotDisasterRecoveryClusterVmCmd cmd) throws CloudRuntimeException;
100+
98101
}

plugins/integrations/disaster-recovery/src/main/java/com/cloud/dr/cluster/DisasterRecoveryClusterServiceImpl.java

Lines changed: 233 additions & 10 deletions
Large diffs are not rendered by default.

plugins/integrations/disaster-recovery/src/main/java/com/cloud/dr/cluster/DisasterRecoveryHelperImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,14 @@ public void checkVmCanBeStarted(long vmId) {
7474
TransactionLegacy txn = TransactionLegacy.currentTxn();
7575
PreparedStatement pstmt = null;
7676
try {
77-
pstmt = txn.prepareAutoCloseStatement("select * from `cloud`.`event` where type = 'DR.DEMOTE' and created > CURRENT_DATE()");
77+
pstmt = txn.prepareAutoCloseStatement("select * from `cloud`.`event` where type = 'DR.DEMOTE' and date_format(created, '%y-%m-%d') = CURRENT_DATE()");
7878
int numRows = 0;
7979
ResultSet rs = pstmt.executeQuery();
8080
if (rs.next()) {
8181
numRows = rs.getInt(1);
8282
}
8383
if (numRows > 0) {
84-
pstmt = txn.prepareAutoCloseStatement("select * from `cloud`.`event` where type = 'DR.DEMOTE' and state = 'Completed' and description = 'Successfully completed demoting disaster recovery cluster' and created > CURRENT_DATE()");
84+
pstmt = txn.prepareAutoCloseStatement("select * from `cloud`.`event` where type = 'DR.DEMOTE' and state = 'Completed' and description = 'Successfully completed demoting disaster recovery cluster' and date_format(created, '%y-%m-%d') = CURRENT_DATE()");
8585
numRows = 0;
8686
rs = pstmt.executeQuery();
8787
if (rs.next()) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
package org.apache.cloudstack.api.command.admin.dr;
18+
19+
import javax.inject.Inject;
20+
21+
import org.apache.cloudstack.acl.RoleType;
22+
import org.apache.cloudstack.api.APICommand;
23+
import org.apache.cloudstack.api.ApiConstants;
24+
import org.apache.cloudstack.api.ApiErrorCode;
25+
import org.apache.cloudstack.api.Parameter;
26+
import org.apache.cloudstack.api.BaseCmd;
27+
import org.apache.cloudstack.api.command.admin.AdminCmd;
28+
import org.apache.cloudstack.api.ServerApiException;
29+
import org.apache.cloudstack.api.response.SuccessResponse;
30+
import org.apache.cloudstack.api.response.UserVmResponse;
31+
import org.apache.cloudstack.context.CallContext;
32+
33+
import com.cloud.dr.cluster.DisasterRecoveryClusterService;
34+
import com.cloud.dr.cluster.dao.DisasterRecoveryClusterDao;
35+
import com.cloud.utils.exception.CloudRuntimeException;
36+
37+
@APICommand(name = TakeSnapshotDisasterRecoveryClusterVmCmd.APINAME,
38+
description = "Take snapshot a disaster recovery cluster virtual machine",
39+
responseObject = SuccessResponse.class,
40+
authorized = {RoleType.Admin})
41+
public class TakeSnapshotDisasterRecoveryClusterVmCmd extends BaseCmd implements AdminCmd {
42+
public static final String APINAME = "takeSnapshotDisasterRecoveryClusterVm";
43+
44+
@Inject
45+
public DisasterRecoveryClusterService disasterRecoveryClusterService;
46+
@Inject
47+
private DisasterRecoveryClusterDao disasterRecoveryClusterDao;
48+
49+
/////////////////////////////////////////////////////
50+
//////////////// API parameters /////////////////////
51+
/////////////////////////////////////////////////////
52+
53+
@Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID,
54+
type = CommandType.UUID,
55+
entityType = UserVmResponse.class,
56+
required = true,
57+
description = "the virtual machine ID used by disaster recovery cluster")
58+
private Long id;
59+
60+
/////////////////////////////////////////////////////
61+
/////////////////// Accessors ///////////////////////
62+
/////////////////////////////////////////////////////
63+
64+
public Long getId() {
65+
return id;
66+
}
67+
68+
/////////////////////////////////////////////////////
69+
/////////////// API Implementation///////////////////
70+
/////////////////////////////////////////////////////
71+
72+
@Override
73+
public void execute() throws ServerApiException {
74+
try {
75+
if (!disasterRecoveryClusterService.takeSnapshotDisasterRecoveryClusterVm(this)) {
76+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to take snapshot disaster recovery cluster virtual machine ID: %d", getId()));
77+
}
78+
SuccessResponse response = new SuccessResponse(getCommandName());
79+
setResponseObject(response);
80+
} catch (CloudRuntimeException ex) {
81+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage());
82+
}
83+
}
84+
85+
@Override
86+
public String getCommandName() {
87+
return APINAME.toLowerCase() + "response";
88+
}
89+
90+
@Override
91+
public long getEntityOwnerId() {
92+
return CallContext.current().getCallingAccount().getId();
93+
}
94+
}

ui/public/locales/en.json

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4644,6 +4644,7 @@
46444644
"dr.vm.stop": "DR.VM.STOP",
46454645
"dr.vm.promote": "DR.VM.PROMOTE",
46464646
"dr.vm.demote": "DR.VM.DEMOTE",
4647+
"dr.vm.snapshot": "DR.VM.SNAPSHOT",
46474648
"disaster.recovery.cluster": "DR",
46484649
"placeholder.disaster.recovery.cluster.ip": "Select a Disaster recovery cluster IP",
46494650
"placeholder.disaster.recovery.cluster.port": "Select a Disaster recovery cluster Port",
@@ -4708,12 +4709,13 @@
47084709
"message.waiting.dr.simulation.test": "Please wait until the mock exam is completed...",
47094710
"message.finish.dr.simulation.test": "The mirroring mock test was completed successfully.",
47104711
"message.dr.simulation.test.step1": "Simulation Test Level: 1 Stop virtualmachine and mirroring virtualmachine",
4711-
"message.dr.simulation.test.step2": "Simulation Test Level: 2 Image demote and mirroring image promote",
4712-
"message.dr.simulation.test.step3": "Simulation Test Level: 3 Start mirroring virtualmachine",
4713-
"message.dr.simulation.test.step4": "Simulation Test Level: 4 Virtualmachine status check",
4714-
"message.dr.simulation.test.step5": "Simulation Test Level: 5 Stop mirroirng virtualmachine",
4715-
"message.dr.simulation.test.step6": "Simulation Test Level: 6 Mirroing image demote and image promote",
4716-
"message.dr.simulation.test.step7": "Simulation Test Level: 7 Start virtualmachine",
4712+
"message.dr.simulation.test.step2": "Simulation Test Level: 2 Take a virtual machine mirroring snapshot",
4713+
"message.dr.simulation.test.step3": "Simulation Test Level: 3 Image demote and mirroring image promote",
4714+
"message.dr.simulation.test.step4": "Simulation Test Level: 4 Start mirroring virtualmachine",
4715+
"message.dr.simulation.test.step5": "Simulation Test Level: 5 Virtualmachine status check",
4716+
"message.dr.simulation.test.step6": "Simulation Test Level: 6 Stop mirroirng virtualmachine",
4717+
"message.dr.simulation.test.step7": "Simulation Test Level: 7 Mirroing image demote and image promote",
4718+
"message.dr.simulation.test.step8": "Simulation Test Level: 8 Start virtualmachine",
47174719
"message.add.dr.mirroring.vm": "For the DR backup of the virtual machine, replication is established to the pre-added secondary cluster. Mirrored virtual machines are created with the power turned off.",
47184720
"message.warning.dr.mirroring.test.vm.step.start": "During mirroring simulation, the virtual machine is automatically stopped.",
47194721
"message.success.update.disaster.recovery.cluster": "Recovery cluster information has been updated.",
@@ -4729,5 +4731,6 @@
47294731
"message.create.disaster.recovery.cluster.vm.processing": "creating mirroring virtualmachine...",
47304732
"message.error.create.disaster.recovery.cluster.vm": "There was an error creating mirroring virtualmachine",
47314733
"message.dr.mirrored.cluster.disable": "If you disable the selected disaster recovery cluster, all mirroring virtual machines in the secondary cluster will be deleted. If you wish to disable, please enter the phrase 'I would like to disable it'.",
4732-
"message.success.disable.disaster.recovery.cluster": "Successfully disabled disaster recovery cluster"
4734+
"message.success.disable.disaster.recovery.cluster": "Successfully disabled disaster recovery cluster",
4735+
"message.error.confirm.create.dr.mirroring.vm": "Mirroring virtual machines cannot be created if compression deduplication is enabled."
47334736
}

ui/public/locales/ko_KR.json

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4639,6 +4639,7 @@
46394639
"dr.vm.stop": "DR.VM.\uc815\uc9c0",
46404640
"dr.vm.promote": "DR.VM.\ud504\ub85c\ubaa8\ud2b8",
46414641
"dr.vm.demote": "DR.VM.\ub514\ubaa8\ud2b8",
4642+
"dr.vm.snapshot": "DR.VM.\uc2a4\ub0c5\uc0f7",
46424643
"disaster.recovery.cluster": "DR",
46434644
"placeholder.disaster.recovery.cluster.ip": "\uc7ac\ud574 \ubcf5\uad6c \ud074\ub7ec\uc2a4\ud130 IP \uc120\ud0dd",
46444645
"placeholder.disaster.recovery.cluster.port": "\uc7ac\ud574 \ubcf5\uad6c \ud074\ub7ec\uc2a4\ud130 Port \uc120\ud0dd",
@@ -4703,12 +4704,13 @@
47034704
"message.waiting.dr.simulation.test": "\ubaa8\uc758\uc2dc\ud5d8\uc774 \uc644\ub8cc\ub420 \ub54c\uae4c\uc9c0 \uae30\ub2e4\ub824 \uc8fc\uc2ed\uc2dc\uc624...",
47044705
"message.finish.dr.simulation.test": "\ubbf8\ub7ec\ub9c1 \ubaa8\uc758\uc2dc\ud5d8\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
47054706
"message.dr.simulation.test.step1": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 1 \uac00\uc0c1\uba38\uc2e0 \ubc0f \ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0 \uc815\uc9c0",
4706-
"message.dr.simulation.test.step2": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 2 \uc774\ubbf8\uc9c0 \ub514\ubaa8\ud2b8 \ubc0f \ubbf8\ub7ec\ub9c1 \uc774\ubbf8\uc9c0 \ud504\ub85c\ubaa8\ud2b8",
4707-
"message.dr.simulation.test.step3": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 3 \ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0 \uc2dc\uc791",
4708-
"message.dr.simulation.test.step4": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 4 \uac00\uc0c1\uba38\uc2e0 \uc0c1\ud0dc \ud655\uc778",
4709-
"message.dr.simulation.test.step5": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 5 \ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0 \uc815\uc9c0",
4710-
"message.dr.simulation.test.step6": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 6 \ubbf8\ub7ec\ub9c1 \uc774\ubbf8\uc9c0 \ub514\ubaa8\ud2b8 \ubc0f \uc774\ubbf8\uc9c0 \ud504\ub85c\ubaa8\ud2b8",
4711-
"message.dr.simulation.test.step7": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 7 \uac00\uc0c1\uba38\uc2e0 \uc2dc\uc791",
4707+
"message.dr.simulation.test.step2": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 2 \uac00\uc0c1\uba38\uc2e0 \ubbf8\ub7ec\ub9c1 \uc2a4\ub0c5\uc0f7 \uc0dd\uc131",
4708+
"message.dr.simulation.test.step3": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 3 \uc774\ubbf8\uc9c0 \ub514\ubaa8\ud2b8 \ubc0f \ubbf8\ub7ec\ub9c1 \uc774\ubbf8\uc9c0 \ud504\ub85c\ubaa8\ud2b8",
4709+
"message.dr.simulation.test.step4": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 4 \ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0 \uc2dc\uc791",
4710+
"message.dr.simulation.test.step5": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 5 \uac00\uc0c1\uba38\uc2e0 \uc0c1\ud0dc \ud655\uc778",
4711+
"message.dr.simulation.test.step6": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 6 \ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0 \uc815\uc9c0",
4712+
"message.dr.simulation.test.step7": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 7 \ubbf8\ub7ec\ub9c1 \uc774\ubbf8\uc9c0 \ub514\ubaa8\ud2b8 \ubc0f \uc774\ubbf8\uc9c0 \ud504\ub85c\ubaa8\ud2b8",
4713+
"message.dr.simulation.test.step8": "\ubaa8\uc758\uc2dc\ud5d8 \ub2e8\uacc4: 8 \uac00\uc0c1\uba38\uc2e0 \uc2dc\uc791",
47124714
"message.add.dr.mirroring.vm": "\ud574\ub2f9 \uac00\uc0c1\uba38\uc2e0\uc758 DR \ubc31\uc5c5\uc744 \uc704\ud574 \uc0ac\uc804\uc5d0 \ucd94\uac00\ub41c secondary \ud074\ub7ec\uc2a4\ud130\ub85c \ubcf5\uc81c \uc0dd\uc131\ud569\ub2c8\ub2e4. \ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0\uc740 \uc804\uc6d0\uc774 \uc885\ub8cc\ub41c \uc0c1\ud0dc\ub85c \uc0dd\uc131\ub429\ub2c8\ub2e4.",
47134715
"message.warning.dr.mirroring.test.vm.step.start": "\ubbf8\ub7ec\ub9c1 \ubaa8\uc758\uc2dc\ud5d8 \uc2dc, \uac00\uc0c1\uba38\uc2e0\uc774 \uc790\ub3d9\uc73c\ub85c \uc815\uc9c0\ub429\ub2c8\ub2e4.",
47144716
"message.success.update.disaster.recovery.cluster": "\uc7ac\ub09c \ubcf5\uad6c \ud074\ub7ec\uc2a4\ud130 \uc815\ubcf4\ub97c \uc5c5\ub370\uc774\ud2b8 \ud588\uc2b5\ub2c8\ub2e4.",
@@ -4724,5 +4726,6 @@
47244726
"message.create.disaster.recovery.cluster.vm.processing": "\ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0 \uc0dd\uc131\uc911...",
47254727
"message.error.create.disaster.recovery.cluster.vm": "\ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0\uc744 \uc0dd\uc131\ud558\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.",
47264728
"message.dr.mirrored.cluster.disable": "\uc120\ud0dd\ud55c \uc7ac\ub09c \ubcf5\uad6c \ud074\ub7ec\uc2a4\ud130\ub97c \ube44\ud65c\uc131\ud654\ud558\ub294 \uacbd\uc6b0 Secondary \ud074\ub7ec\uc2a4\ud130\uc758 \ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0\uc774 \uc804\ubd80 \uc0ad\uc81c\ub429\ub2c8\ub2e4. \ube44\ud65c\uc131\ud654\ub97c \uc6d0\ud558\uc2dc\uba74 '\ube44\ud65c\uc131\ud654\ud558\uaca0\uc2b5\ub2c8\ub2e4' \ubb38\uad6c\ub97c \uc785\ub825\ud558\uc2ed\uc2dc\uc624.",
4727-
"message.success.disable.disaster.recovery.cluster": "\uc7ac\ud574 \ubcf5\uad6c \ud074\ub7ec\uc2a4\ud130\ub97c \uc131\uacf5\uc801\uc73c\ub85c \ube44\ud65c\uc131\ud654\ud588\uc2b5\ub2c8\ub2e4."
4729+
"message.success.disable.disaster.recovery.cluster": "\uc7ac\ud574 \ubcf5\uad6c \ud074\ub7ec\uc2a4\ud130\ub97c \uc131\uacf5\uc801\uc73c\ub85c \ube44\ud65c\uc131\ud654\ud588\uc2b5\ub2c8\ub2e4.",
4730+
"message.error.confirm.create.dr.mirroring.vm": "\uc555\ucd95/\uc911\ubcf5\uc81c\uac70 \uae30\ub2a5\uc774 \ud65c\uc131\ud654\ub418\uc5b4\uc788\ub294 \uacbd\uc6b0 \ubbf8\ub7ec\ub9c1 \uac00\uc0c1\uba38\uc2e0\uc744 \uc0dd\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4."
47284731
}

ui/src/views/compute/dr/DRMirroringVMAdd.vue

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,9 @@ export default {
270270
if (this.form.drCluster != null) {
271271
this.secDrClusterOfferings = this.drCluster[0].serviceofferingdetails || []
272272
this.secDrClusterOfferings = this.secDrClusterOfferings.filter(off => {
273-
return off.kvdoenable === this.resource.kvdoenable
273+
// kvdo 오퍼링 필터링 임시 주석처리
274+
// return off.kvdoenable === this.resource.kvdoenable
275+
return off.kvdoenable === false
274276
})
275277
this.form.secDrClusterOfferings = this.secDrClusterOfferings.length > 0 ? this.secDrClusterOfferings[0].name : null
276278
if (this.secDrClusterOfferings[0].serviceofferingdetails && this.secDrClusterOfferings[0].iscustomized === true) {
@@ -300,7 +302,9 @@ export default {
300302
const cluster = clusters[0]
301303
this.secDrClusterOfferings = cluster.serviceofferingdetails || []
302304
this.secDrClusterOfferings = this.secDrClusterOfferings.filter(off => {
303-
return off.kvdoenable === this.resource.kvdoenable
305+
// kvdo 오퍼링 필터링 임시 주석처리
306+
// return off.kvdoenable === this.resource.kvdoenable
307+
return off.kvdoenable === false
304308
})
305309
this.form.secDrClusterOfferings = this.secDrClusterOfferings.length > 0 ? this.secDrClusterOfferings[0].name : ''
306310
if (this.secDrClusterOfferings[0].serviceofferingdetails && this.secDrClusterOfferings[0].iscustomized === true) {
@@ -409,7 +413,9 @@ export default {
409413
const cluster = clusters[0]
410414
this.secDrClusterOfferings = cluster.serviceofferingdetails || []
411415
this.secDrClusterOfferings = this.secDrClusterOfferings.filter(off => {
412-
return off.kvdoenable === this.resource.kvdoenable
416+
// kvdo 오퍼링 필터링 임시 주석처리
417+
// return off.kvdoenable === this.resource.kvdoenable
418+
return off.kvdoenable === false
413419
})
414420
for (const offering of this.secDrClusterOfferings) {
415421
if (offering.name === selectOff && offering.serviceofferingdetails && offering.iscustomized === true) {
@@ -438,6 +444,13 @@ export default {
438444
if (this.loading) return
439445
this.formRef.value.validate().then(() => {
440446
const values = toRaw(this.form)
447+
if (this.resource.kvdoenable) {
448+
this.$notification.error({
449+
message: this.$t('message.request.failed'),
450+
description: this.$t('message.error.confirm.create.dr.mirroring.vm')
451+
})
452+
return
453+
}
441454
this.loading = true
442455
const params = {
443456
virtualmachineid: this.resource.id,

0 commit comments

Comments
 (0)