Skip to content

Commit 156654e

Browse files
committed
Address reviews
1 parent e19923c commit 156654e

File tree

11 files changed

+89
-108
lines changed

11 files changed

+89
-108
lines changed

engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreCapabilities.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,5 @@ public enum DataStoreCapabilities {
4444
/**
4545
* indicates that the driver supports copying snapshot between zones on pools of the same type
4646
*/
47-
CAN_COPY_SNAPSHOT_BETWEEN_ZONES_AND_SAME_POOL_TYPE,
48-
/**
49-
* indicates that the storage does not need to delete the snapshot when creating a volume/template from it
50-
* and the setting `snapshot.backup.to.secondary` is enabled
51-
*/
52-
KEEP_SNAPSHOT_ON_PRIMARY_AND_BACKUP
47+
CAN_COPY_SNAPSHOT_BETWEEN_ZONES_AND_SAME_POOL_TYPE
5348
}

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@
117117
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
118118
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
119119
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
120-
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
121120
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
122121
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
123122
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
@@ -567,8 +566,8 @@ public VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot, Use
567566

568567
boolean kvmSnapshotOnlyInPrimaryStorage = snapshotHelper.isKvmSnapshotOnlyInPrimaryStorage(snapshot, dataStoreRole, volume.getDataCenterId());
569568
boolean skipCopyToSecondary = false;
570-
Map<String, String> capabilities = snapInfo.getDataStore().getDriver().getCapabilities();
571-
boolean keepOnPrimary = MapUtils.isNotEmpty(capabilities) && capabilities.containsKey(DataStoreCapabilities.KEEP_SNAPSHOT_ON_PRIMARY_AND_BACKUP.toString());
569+
boolean keepOnPrimary = snapshotHelper.isStorPoolStorage(snapInfo);
570+
572571
if (kvmSnapshotOnlyInPrimaryStorage && keepOnPrimary) {
573572
skipCopyToSecondary = true;
574573
}

plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/collector/StorPoolAbandonObjectsCollector.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,11 +365,15 @@ protected void runInContext() {
365365
SpConnectionDesc conn = StorPoolUtil.getSpConnection(storagePool.getUuid(),
366366
storagePool.getId(), storagePoolDetailsDao, storagePoolDao);
367367
JsonArray arr = StorPoolUtil.snapshotsList(conn);
368-
List<String> snapshots = snapshotsForRcovery(arr);
368+
List<String> snapshots = snapshotsForRecovery(arr);
369369
if (snapshots.isEmpty()) {
370370
continue;
371371
}
372372
for (SnapshotDetailsVO snapshot : snapshotDetails) {
373+
String[] snapshotOnRemote = snapshot.getValue().split(";");
374+
if (snapshotOnRemote.length != 2) {
375+
continue;
376+
}
373377
String name = snapshot.getValue().split(";")[0];
374378
String location = snapshot.getValue().split(";")[1];
375379
if (name == null || location == null) {
@@ -398,7 +402,7 @@ protected void runInContext() {
398402
}
399403
}
400404

401-
private static List<String> snapshotsForRcovery(JsonArray arr) {
405+
private static List<String> snapshotsForRecovery(JsonArray arr) {
402406
List<String> snapshots = new ArrayList<>();
403407
for (int i = 0; i < arr.size(); i++) {
404408
boolean recoveringFromRemote = arr.get(i).getAsJsonObject().get("recoveringFromRemote").getAsBoolean();

plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolPrimaryDataStoreDriver.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,6 @@ private SnapshotDataStoreVO getSnapshotImageStoreRef(long snapshotId, long zoneI
186186
public Map<String, String> getCapabilities() {
187187
Map<String, String> mapCapabilities = new HashMap<>();
188188
mapCapabilities.put(DataStoreCapabilities.CAN_COPY_SNAPSHOT_BETWEEN_ZONES_AND_SAME_POOL_TYPE.toString(), Boolean.TRUE.toString());
189-
mapCapabilities.put(DataStoreCapabilities.KEEP_SNAPSHOT_ON_PRIMARY_AND_BACKUP.toString(), Boolean.TRUE.toString());
190189
return mapCapabilities;
191190
}
192191

server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java

Lines changed: 66 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -16,78 +16,11 @@
1616
// under the License.
1717
package com.cloud.storage.snapshot;
1818

19-
import java.util.ArrayList;
20-
import java.util.Collections;
21-
import java.util.Date;
22-
import java.util.HashMap;
23-
import java.util.List;
24-
import java.util.Map;
25-
import java.util.TimeZone;
26-
import java.util.concurrent.ExecutionException;
27-
import java.util.concurrent.Executors;
28-
import java.util.concurrent.ScheduledExecutorService;
29-
import java.util.concurrent.TimeUnit;
30-
import java.util.stream.Collectors;
31-
32-
import javax.inject.Inject;
33-
import javax.naming.ConfigurationException;
34-
35-
import org.apache.cloudstack.acl.SecurityChecker;
36-
import com.cloud.api.ApiDBUtils;
37-
import org.apache.cloudstack.annotation.AnnotationService;
38-
import org.apache.cloudstack.annotation.dao.AnnotationDao;
39-
import org.apache.cloudstack.api.ApiCommandResourceType;
40-
import org.apache.cloudstack.api.ApiConstants;
41-
import org.apache.cloudstack.api.command.user.snapshot.CopySnapshotCmd;
42-
import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd;
43-
import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
44-
import org.apache.cloudstack.api.command.user.snapshot.ExtractSnapshotCmd;
45-
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
46-
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotsCmd;
47-
import org.apache.cloudstack.api.command.user.snapshot.UpdateSnapshotPolicyCmd;
48-
import org.apache.cloudstack.context.CallContext;
49-
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
50-
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
51-
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
52-
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
53-
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
54-
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
55-
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
56-
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
57-
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult;
58-
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotService;
59-
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
60-
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
61-
import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
62-
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
63-
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
64-
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
65-
import org.apache.cloudstack.framework.async.AsyncCallFuture;
66-
import org.apache.cloudstack.framework.config.ConfigKey;
67-
import org.apache.cloudstack.framework.config.Configurable;
68-
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
69-
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
70-
import org.apache.cloudstack.resourcedetail.SnapshotPolicyDetailVO;
71-
import org.apache.cloudstack.resourcedetail.dao.SnapshotPolicyDetailsDao;
72-
import org.apache.cloudstack.snapshot.SnapshotHelper;
73-
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
74-
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
75-
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
76-
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
77-
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
78-
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
79-
import org.apache.commons.collections.CollectionUtils;
80-
import org.apache.commons.collections.MapUtils;
81-
import org.apache.commons.lang3.StringUtils;
82-
import org.apache.commons.lang3.ObjectUtils;
83-
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
84-
import org.apache.commons.lang3.builder.ToStringStyle;
85-
import org.springframework.stereotype.Component;
86-
8719
import com.cloud.agent.api.Answer;
8820
import com.cloud.agent.api.Command;
8921
import com.cloud.agent.api.DeleteSnapshotsDirCommand;
9022
import com.cloud.alert.AlertManager;
23+
import com.cloud.api.ApiDBUtils;
9124
import com.cloud.api.commands.ListRecurringSnapshotScheduleCmd;
9225
import com.cloud.api.query.MutualExclusiveIdsManagerBase;
9326
import com.cloud.configuration.Config;
@@ -175,8 +108,73 @@
175108
import com.cloud.vm.snapshot.VMSnapshotVO;
176109
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
177110
import com.cloud.vm.snapshot.dao.VMSnapshotDetailsDao;
111+
import org.apache.cloudstack.acl.SecurityChecker;
112+
import org.apache.cloudstack.annotation.AnnotationService;
113+
import org.apache.cloudstack.annotation.dao.AnnotationDao;
114+
import org.apache.cloudstack.api.ApiCommandResourceType;
115+
import org.apache.cloudstack.api.ApiConstants;
116+
import org.apache.cloudstack.api.command.user.snapshot.CopySnapshotCmd;
117+
import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd;
118+
import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
119+
import org.apache.cloudstack.api.command.user.snapshot.ExtractSnapshotCmd;
120+
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
121+
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotsCmd;
122+
import org.apache.cloudstack.api.command.user.snapshot.UpdateSnapshotPolicyCmd;
123+
import org.apache.cloudstack.context.CallContext;
124+
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
125+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
178126
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
127+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
128+
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
129+
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
130+
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
179131
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
132+
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
133+
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
134+
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult;
135+
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotService;
136+
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
137+
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
138+
import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
139+
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
140+
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
141+
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
142+
import org.apache.cloudstack.framework.async.AsyncCallFuture;
143+
import org.apache.cloudstack.framework.config.ConfigKey;
144+
import org.apache.cloudstack.framework.config.Configurable;
145+
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
146+
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
147+
import org.apache.cloudstack.resourcedetail.SnapshotPolicyDetailVO;
148+
import org.apache.cloudstack.resourcedetail.dao.SnapshotPolicyDetailsDao;
149+
import org.apache.cloudstack.snapshot.SnapshotHelper;
150+
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
151+
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
152+
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
153+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
154+
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
155+
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
156+
import org.apache.commons.collections.CollectionUtils;
157+
import org.apache.commons.collections.MapUtils;
158+
import org.apache.commons.lang3.ObjectUtils;
159+
import org.apache.commons.lang3.StringUtils;
160+
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
161+
import org.apache.commons.lang3.builder.ToStringStyle;
162+
import org.springframework.stereotype.Component;
163+
164+
import javax.inject.Inject;
165+
import javax.naming.ConfigurationException;
166+
import java.util.ArrayList;
167+
import java.util.Collections;
168+
import java.util.Date;
169+
import java.util.HashMap;
170+
import java.util.List;
171+
import java.util.Map;
172+
import java.util.TimeZone;
173+
import java.util.concurrent.ExecutionException;
174+
import java.util.concurrent.Executors;
175+
import java.util.concurrent.ScheduledExecutorService;
176+
import java.util.concurrent.TimeUnit;
177+
import java.util.stream.Collectors;
180178

181179
@Component
182180
public class SnapshotManagerImpl extends MutualExclusiveIdsManagerBase implements SnapshotManager, SnapshotApiService, Configurable {
@@ -1561,14 +1559,6 @@ private void copyNewSnapshotToZonesOnPrimary(CreateSnapshotPayload payload, Snap
15611559
private boolean copySnapshotOnPool(SnapshotInfo snapshot, SnapshotStrategy snapshotStrategy, Long storagePoolId) {
15621560
DataStore store = dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary);
15631561
SnapshotInfo snapshotOnStore = (SnapshotInfo) store.create(snapshot);
1564-
// if (snapshotOnStore.getStatus() == ObjectInDataStoreStateMachine.State.Allocated) {
1565-
// snapshotOnStore.processEvent(Event.CreateOnlyRequested);
1566-
// } else if (snapshotOnStore.getStatus() == ObjectInDataStoreStateMachine.State.Ready) {
1567-
// snapshotOnStore.processEvent(Event.CopyRequested);
1568-
// } else {
1569-
// logger.info(String.format("Cannot copy snapshot to another storage in different zone. It's not in the right state %s", snapshotOnStore.getStatus()));
1570-
// return false;
1571-
// }
15721562

15731563
try {
15741564
AsyncCallFuture<SnapshotResult> future = snapshotSrv.copySnapshot(snapshot, snapshotOnStore, snapshotStrategy);
@@ -1589,10 +1579,6 @@ private boolean copySnapshotOnPool(SnapshotInfo snapshot, SnapshotStrategy snaps
15891579
} catch (ExecutionException e) {
15901580
throw new RuntimeException(e);
15911581
}
1592-
// boolean copySuccessful = snapshotStrategy.copySnapshot(snapshot, snapshotOnStore, null);
1593-
// if (!copySuccessful) {
1594-
// snapshotOnStore.processEvent(Event.OperationFailed);
1595-
// }
15961582
return true;
15971583
}
15981584

server/src/main/java/com/cloud/template/TemplateManagerImpl.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@
154154
import org.apache.cloudstack.context.CallContext;
155155
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
156156
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
157-
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
158157
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
159158
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
160159
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
@@ -1677,13 +1676,11 @@ public VirtualMachineTemplate createPrivateTemplate(CreateTemplateCmd command) t
16771676

16781677
snapInfo = _snapshotFactory.getSnapshotWithRoleAndZone(snapshotId, dataStoreRole, zoneId);
16791678
boolean skipCopyToSecondary = false;
1680-
1681-
Map<String, String> capabilities = snapInfo.getDataStore().getDriver().getCapabilities();
1682-
boolean keepOnPrimary = MapUtils.isNotEmpty(capabilities) && capabilities.containsKey(DataStoreCapabilities.KEEP_SNAPSHOT_ON_PRIMARY_AND_BACKUP.toString());
1679+
boolean keepOnPrimary = snapshotHelper.isStorPoolStorage(snapInfo);
16831680
if (kvmSnapshotOnlyInPrimaryStorage && keepOnPrimary) {
16841681
skipCopyToSecondary = true;
16851682
}
1686-
if (dataStoreRole == DataStoreRole.Image) {
1683+
if (dataStoreRole == DataStoreRole.Image || !skipCopyToSecondary) {
16871684
snapInfo = snapshotHelper.backupSnapshotToSecondaryStorageIfNotExists(snapInfo, dataStoreRole, snapshot, kvmSnapshotOnlyInPrimaryStorage);
16881685
_accountMgr.checkAccess(caller, null, true, snapInfo);
16891686
DataStore snapStore = snapInfo.getDataStore();

server/src/main/java/org/apache/cloudstack/snapshot/SnapshotHelper.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,11 @@ public void expungeTemporarySnapshot(boolean kvmSnapshotOnlyInPrimaryStorage, Sn
100100
long storeId = snapInfo.getDataStore().getId();
101101
long zoneId = dataStorageManager.getStoreZoneId(storeId, snapInfo.getDataStore().getRole());
102102

103-
Map<String, String> capabilities = snapInfo.getDataStore().getDriver().getCapabilities();
104-
boolean keepOnPrimary = MapUtils.isNotEmpty(capabilities) && capabilities.containsKey(DataStoreCapabilities.KEEP_SNAPSHOT_ON_PRIMARY_AND_BACKUP.toString());
105-
if (keepOnPrimary) {
103+
if (isStorPoolStorage(snapInfo)) {
106104
logger.debug("The primary storage does not delete the snapshots even if there is a backup on secondary");
107105
return;
108106
}
107+
109108
List<SnapshotJoinVO> snapshots = snapshotJoinDao.listBySnapshotIdAndZoneId(zoneId, snapInfo.getSnapshotId());
110109
if (kvmSnapshotOnlyInPrimaryStorage || snapshots.size() <= 1) {
111110
if (snapInfo != null) {
@@ -141,6 +140,13 @@ public void expungeTemporarySnapshot(boolean kvmSnapshotOnlyInPrimaryStorage, Sn
141140
snapshotDataStoreDao.expungeReferenceBySnapshotIdAndDataStoreRole(snapInfo.getId(), storeId, DataStoreRole.Image);
142141
}
143142

143+
public boolean isStorPoolStorage(SnapshotInfo snapInfo) {
144+
if (DataStoreRole.Primary.equals(snapInfo.getDataStore().getRole())) {
145+
StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(snapInfo.getDataStore().getId());
146+
return storagePoolVO != null && StoragePoolType.StorPool.equals(storagePoolVO.getPoolType());
147+
}
148+
return false;
149+
}
144150
/**
145151
* Backup the snapshot to secondary storage if it should be backed up and was not yet or it is a temporary backup to create a volume.
146152
* @return The parameter snapInfo if the snapshot is not backupable, else backs up the snapshot to secondary storage and returns its info.

server/src/test/java/org/apache/cloudstack/snapshot/SnapshotHelperTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646

4747
import java.util.ArrayList;
4848
import java.util.Arrays;
49-
import java.util.HashMap;
5049
import java.util.HashSet;
5150
import java.util.List;
5251
import java.util.Set;
@@ -108,8 +107,6 @@ public void validateExpungeTemporarySnapshotNotAKvmSnapshotOnPrimaryStorageDoNot
108107
Mockito.when(snapshotInfoMock.getDataStore()).thenReturn(store);
109108
Mockito.when(snapshotInfoMock.getDataStore().getId()).thenReturn(1L);
110109
Mockito.when(snapshotInfoMock.getSnapshotId()).thenReturn(1L);
111-
Mockito.when(snapshotInfoMock.getDataStore().getDriver()).thenReturn(storeDriver);
112-
Mockito.when(snapshotInfoMock.getDataStore().getDriver().getCapabilities()).thenReturn(new HashMap<>());
113110
snapshotHelperSpy.expungeTemporarySnapshot(false, snapshotInfoMock);
114111
Mockito.verifyNoInteractions(snapshotServiceMock, snapshotDataStoreDaoMock);
115112
}
@@ -122,8 +119,6 @@ public void validateExpungeTemporarySnapshotKvmSnapshotOnPrimaryStorageExpungesS
122119
Mockito.when(store.getRole()).thenReturn(DataStoreRole.Image);
123120
Mockito.when(store.getId()).thenReturn(1L);
124121
Mockito.when(snapshotInfoMock.getDataStore()).thenReturn(store);
125-
Mockito.when(snapshotInfoMock.getDataStore().getDriver()).thenReturn(storeDriver);
126-
Mockito.when(snapshotInfoMock.getDataStore().getDriver().getCapabilities()).thenReturn(new HashMap<>());
127122
snapshotHelperSpy.expungeTemporarySnapshot(true, snapshotInfoMock);
128123
}
129124

ui/src/views/storage/FormSchedule.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ export default {
359359
const listStoragePools = json.liststoragepoolsresponse.storagepool
360360
if (listStoragePools) {
361361
this.storagePools = listStoragePools
362-
this.storagePools = this.storagePools.filter(pool => pool.storagecapabilities.CAN_COPY_SNAPSHOT_BETWEEN_ZONES && pool.zoneid !== this.resource.zoneid)
362+
this.storagePools = this.storagePools.filter(pool => pool.storagecapabilities.CAN_COPY_SNAPSHOT_BETWEEN_ZONES_AND_SAME_POOL_TYPE && pool.zoneid !== this.resource.zoneid)
363363
}
364364
}).finally(() => {
365365
this.storagePoolsLoading = false

0 commit comments

Comments
 (0)