Skip to content

Commit 1cebfcf

Browse files
committed
Address comments and fix conflicts
1 parent e0fac8b commit 1cebfcf

File tree

22 files changed

+228
-130
lines changed

22 files changed

+228
-130
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,9 @@ 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
47+
CAN_COPY_SNAPSHOT_BETWEEN_ZONES_AND_SAME_POOL_TYPE,
48+
/**
49+
* indicates that this driver supports the option to create a template from the back-end snapshot
50+
*/
51+
CAN_CREATE_TEMPLATE_FROM_SNAPSHOT
4852
}

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
import com.cloud.vm.dao.UserVmCloneSettingDao;
108108
import com.cloud.vm.dao.UserVmDao;
109109
import com.cloud.vm.dao.UserVmDetailsDao;
110+
110111
import org.apache.cloudstack.api.ApiCommandResourceType;
111112
import org.apache.cloudstack.api.ApiConstants.IoDriverPolicy;
112113
import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd;
@@ -151,10 +152,12 @@
151152
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
152153
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
153154
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
155+
154156
import org.apache.commons.collections.CollectionUtils;
155157
import org.apache.commons.collections.MapUtils;
156158
import org.apache.commons.lang3.ObjectUtils;
157159
import org.apache.commons.lang3.StringUtils;
160+
158161
import org.jetbrains.annotations.Nullable;
159162

160163
import javax.inject.Inject;
@@ -565,14 +568,10 @@ public VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot, Use
565568
SnapshotInfo snapInfo = snapshotFactory.getSnapshotWithRoleAndZone(snapshot.getId(), dataStoreRole, zoneId);
566569

567570
boolean kvmSnapshotOnlyInPrimaryStorage = snapshotHelper.isKvmSnapshotOnlyInPrimaryStorage(snapshot, dataStoreRole, volume.getDataCenterId());
568-
boolean skipCopyToSecondary = false;
569-
boolean keepOnPrimary = snapshotHelper.isStorPoolStorage(snapInfo);
571+
boolean keepOnPrimary = snapshotHelper.isStorageSupportSnapshotToTemplate(snapInfo);
570572

571-
if (kvmSnapshotOnlyInPrimaryStorage && keepOnPrimary) {
572-
skipCopyToSecondary = true;
573-
}
574573
try {
575-
if (!skipCopyToSecondary) {
574+
if (!keepOnPrimary) {
576575
snapInfo = snapshotHelper.backupSnapshotToSecondaryStorageIfNotExists(snapInfo, dataStoreRole, snapshot, kvmSnapshotOnlyInPrimaryStorage);
577576
}
578577
} catch (CloudRuntimeException e) {
@@ -581,7 +580,7 @@ public VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot, Use
581580
}
582581

583582
// don't try to perform a sync if the DataStoreRole of the snapshot is equal to DataStoreRole.Primary
584-
if (!DataStoreRole.Primary.equals(dataStoreRole) || (kvmSnapshotOnlyInPrimaryStorage && !skipCopyToSecondary)) {
583+
if (!DataStoreRole.Primary.equals(dataStoreRole) || !keepOnPrimary) {
585584
try {
586585
// sync snapshot to region store if necessary
587586
DataStore snapStore = snapInfo.getDataStore();

engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDaoImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,14 @@
2828
import com.cloud.utils.db.SearchCriteria;
2929
import com.cloud.utils.db.TransactionLegacy;
3030
import com.cloud.utils.db.UpdateBuilder;
31+
3132
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
3233
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
3334
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
3435
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
36+
3537
import org.apache.commons.collections.CollectionUtils;
38+
3639
import org.springframework.stereotype.Component;
3740

3841
import javax.inject.Inject;

engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.cloud.utils.db.TransactionStatus;
3636
import com.cloud.utils.exception.CloudRuntimeException;
3737
import com.cloud.utils.fsm.NoTransitionException;
38+
3839
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
3940
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
4041
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
@@ -71,6 +72,7 @@
7172
import org.apache.cloudstack.storage.heuristics.HeuristicRuleHelper;
7273
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
7374
import org.apache.cloudstack.storage.to.SnapshotObjectTO;
75+
7476
import org.apache.logging.log4j.LogManager;
7577
import org.apache.logging.log4j.Logger;
7678

plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@
1717
package com.cloud.hypervisor.kvm.storage;
1818

1919

20+
import com.cloud.agent.api.to.DiskTO;
21+
import com.cloud.storage.Storage;
22+
import com.cloud.storage.Storage.ImageFormat;
23+
import com.cloud.storage.Storage.ProvisioningType;
24+
import com.cloud.storage.Storage.StoragePoolType;
25+
import com.cloud.utils.exception.CloudRuntimeException;
26+
import com.cloud.utils.script.OutputInterpreter;
27+
import com.cloud.utils.script.Script;
28+
import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
29+
import org.apache.logging.log4j.LogManager;
30+
import org.apache.logging.log4j.Logger;
31+
2032
import java.io.BufferedWriter;
2133
import java.io.File;
2234
import java.io.FileWriter;
@@ -27,19 +39,6 @@
2739
import java.util.List;
2840
import java.util.Map;
2941

30-
import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
31-
import org.apache.logging.log4j.Logger;
32-
import org.apache.logging.log4j.LogManager;
33-
34-
import com.cloud.agent.api.to.DiskTO;
35-
import com.cloud.storage.Storage;
36-
import com.cloud.storage.Storage.ImageFormat;
37-
import com.cloud.storage.Storage.ProvisioningType;
38-
import com.cloud.storage.Storage.StoragePoolType;
39-
import com.cloud.utils.exception.CloudRuntimeException;
40-
import com.cloud.utils.script.OutputInterpreter;
41-
import com.cloud.utils.script.Script;
42-
4342
public class StorPoolStorageAdaptor implements StorageAdaptor {
4443
public static void SP_LOG(String fmt, Object... args) {
4544
try (PrintWriter spLogFile = new PrintWriter(new BufferedWriter(new FileWriter("/var/log/cloudstack/agent/storpool-agent.log", true)))) {
@@ -139,6 +138,9 @@ private static boolean waitForDeviceSymlink(String devPath) {
139138
}
140139

141140
public static String getVolumeNameFromPath(final String volumeUuid, boolean tildeNeeded) {
141+
if (volumeUuid == null) {
142+
return null;
143+
}
142144
if (volumeUuid.startsWith("/dev/storpool/")) {
143145
return volumeUuid.split("/")[3];
144146
} else if (volumeUuid.startsWith("/dev/storpool-byid/")) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,21 @@
2020
package org.apache.cloudstack.storage.collector;
2121

2222
import com.cloud.dc.dao.ClusterDao;
23+
2324
import com.cloud.storage.dao.SnapshotDetailsDao;
2425
import com.cloud.storage.dao.SnapshotDetailsVO;
26+
2527
import com.cloud.utils.component.ManagerBase;
2628
import com.cloud.utils.concurrency.NamedThreadFactory;
2729
import com.cloud.utils.db.DB;
2830
import com.cloud.utils.db.Transaction;
2931
import com.cloud.utils.db.TransactionCallbackNoReturn;
3032
import com.cloud.utils.db.TransactionLegacy;
3133
import com.cloud.utils.db.TransactionStatus;
34+
3235
import com.google.gson.JsonArray;
3336
import com.google.gson.JsonObject;
37+
3438
import org.apache.cloudstack.framework.config.ConfigKey;
3539
import org.apache.cloudstack.framework.config.Configurable;
3640
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
@@ -41,6 +45,7 @@
4145
import org.apache.cloudstack.storage.datastore.util.StorPoolUtil;
4246
import org.apache.cloudstack.storage.datastore.util.StorPoolUtil.SpApiResponse;
4347
import org.apache.cloudstack.storage.datastore.util.StorPoolUtil.SpConnectionDesc;
48+
4449
import org.apache.commons.collections.CollectionUtils;
4550

4651
import javax.inject.Inject;

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

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,25 @@
1919
package org.apache.cloudstack.storage.datastore.driver;
2020

2121
import com.cloud.storage.dao.SnapshotDetailsVO;
22+
2223
import java.util.HashMap;
2324
import java.util.List;
2425
import java.util.Map;
2526

2627
import javax.inject.Inject;
2728

29+
import com.cloud.storage.dao.StoragePoolHostDao;
30+
import com.cloud.storage.dao.VMTemplateDetailsDao;
31+
import com.cloud.storage.dao.VolumeDao;
32+
import com.cloud.storage.dao.VolumeDetailsDao;
33+
import com.cloud.tags.dao.ResourceTagDao;
34+
import com.cloud.utils.Pair;
35+
import com.cloud.utils.exception.CloudRuntimeException;
36+
import com.cloud.vm.VMInstanceVO;
37+
import com.cloud.vm.VirtualMachine.State;
38+
import com.cloud.vm.VirtualMachineManager;
39+
import com.cloud.vm.dao.VMInstanceDao;
40+
2841
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
2942
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
3043
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
@@ -68,6 +81,7 @@
6881
import org.apache.cloudstack.storage.to.TemplateObjectTO;
6982
import org.apache.cloudstack.storage.to.VolumeObjectTO;
7083
import org.apache.cloudstack.storage.volume.VolumeObject;
84+
7185
import org.apache.commons.collections4.CollectionUtils;
7286
import org.apache.commons.collections4.MapUtils;
7387

@@ -112,17 +126,6 @@
112126
import com.cloud.storage.VolumeVO;
113127
import com.cloud.storage.dao.SnapshotDao;
114128
import com.cloud.storage.dao.SnapshotDetailsDao;
115-
import com.cloud.storage.dao.StoragePoolHostDao;
116-
import com.cloud.storage.dao.VMTemplateDetailsDao;
117-
import com.cloud.storage.dao.VolumeDao;
118-
import com.cloud.storage.dao.VolumeDetailsDao;
119-
import com.cloud.tags.dao.ResourceTagDao;
120-
import com.cloud.utils.Pair;
121-
import com.cloud.utils.exception.CloudRuntimeException;
122-
import com.cloud.vm.VMInstanceVO;
123-
import com.cloud.vm.VirtualMachine.State;
124-
import com.cloud.vm.VirtualMachineManager;
125-
import com.cloud.vm.dao.VMInstanceDao;
126129

127130
import org.apache.logging.log4j.LogManager;
128131
import org.apache.logging.log4j.Logger;
@@ -188,6 +191,7 @@ private SnapshotDataStoreVO getSnapshotImageStoreRef(long snapshotId, long zoneI
188191
public Map<String, String> getCapabilities() {
189192
Map<String, String> mapCapabilities = new HashMap<>();
190193
mapCapabilities.put(DataStoreCapabilities.CAN_COPY_SNAPSHOT_BETWEEN_ZONES_AND_SAME_POOL_TYPE.toString(), Boolean.TRUE.toString());
194+
mapCapabilities.put(DataStoreCapabilities.CAN_CREATE_TEMPLATE_FROM_SNAPSHOT.toString(), Boolean.TRUE.toString());
191195
return mapCapabilities;
192196
}
193197

@@ -519,14 +523,7 @@ public void deleteAsync(DataStore dataStore, DataObject data, AsyncCompletionCal
519523
err = String.format("Could not delete volume due to %s", e.getMessage());
520524
}
521525
} else if (data.getType() == DataObjectType.SNAPSHOT) {
522-
SnapshotInfo snapshot = (SnapshotInfo) data;
523-
SpConnectionDesc conn = StorPoolUtil.getSpConnection(snapshot.getDataStore().getUuid(), snapshot.getDataStore().getId(), storagePoolDetailsDao, primaryStoreDao);
524-
String name = StorPoolStorageAdaptor.getVolumeNameFromPath(snapshot.getPath(), true);
525-
SpApiResponse resp = StorPoolUtil.snapshotDelete(name, conn);
526-
if (resp.getError() != null) {
527-
err = String.format("Failed to clean-up Storpool snapshot %s. Error: %s", name, resp.getError());
528-
StorPoolUtil.spLog(err);
529-
}
526+
err = deleteSnapshot((SnapshotInfo) data, err);
530527
} else {
531528
err = String.format("Invalid DataObjectType \"%s\" passed to deleteAsync", data.getType());
532529
}
@@ -541,6 +538,18 @@ public void deleteAsync(DataStore dataStore, DataObject data, AsyncCompletionCal
541538
callback.complete(res);
542539
}
543540

541+
private String deleteSnapshot(SnapshotInfo data, String err) {
542+
SnapshotInfo snapshot = data;
543+
SpConnectionDesc conn = StorPoolUtil.getSpConnection(snapshot.getDataStore().getUuid(), snapshot.getDataStore().getId(), storagePoolDetailsDao, primaryStoreDao);
544+
String name = StorPoolStorageAdaptor.getVolumeNameFromPath(snapshot.getPath(), true);
545+
SpApiResponse resp = StorPoolUtil.snapshotDelete(name, conn);
546+
if (resp.getError() != null) {
547+
err = String.format("Failed to clean-up Storpool snapshot %s. Error: %s", name, resp.getError());
548+
StorPoolUtil.spLog(err);
549+
}
550+
return err;
551+
}
552+
544553
private void tryToSnapshotVolumeBeforeDelete(VolumeInfo vinfo, DataStore dataStore, String name, SpConnectionDesc conn) {
545554
Integer deleteAfter = StorPoolConfigurationManager.DeleteAfterInterval.valueIn(dataStore.getId());
546555
if (deleteAfter != null && deleteAfter > 0 && vinfo.getPassphraseId() == null) {

plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/util/StorPoolHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.cloud.utils.exception.CloudRuntimeException;
4646
import com.cloud.vm.VMInstanceVO;
4747
import com.cloud.vm.dao.VMInstanceDao;
48+
4849
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
4950
import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
5051
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
@@ -56,6 +57,7 @@
5657
import org.apache.cloudstack.storage.datastore.util.StorPoolUtil.SpApiResponse;
5758
import org.apache.cloudstack.storage.snapshot.StorPoolConfigurationManager;
5859
import org.apache.cloudstack.storage.to.VolumeObjectTO;
60+
5961
import org.apache.commons.collections4.CollectionUtils;
6062
import org.apache.commons.lang3.StringUtils;
6163

plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/motion/StorPoolDataMotionStrategy.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.cloud.vm.VMInstanceVO;
5656
import com.cloud.vm.VirtualMachineManager;
5757
import com.cloud.vm.dao.VMInstanceDao;
58+
5859
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
5960
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
6061
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
@@ -86,9 +87,12 @@
8687
import org.apache.cloudstack.storage.datastore.util.StorPoolUtil.SpConnectionDesc;
8788
import org.apache.cloudstack.storage.to.SnapshotObjectTO;
8889
import org.apache.cloudstack.storage.to.TemplateObjectTO;
90+
8991
import org.apache.commons.collections.MapUtils;
92+
9093
import org.apache.logging.log4j.LogManager;
9194
import org.apache.logging.log4j.Logger;
95+
9296
import org.springframework.stereotype.Component;
9397

9498
import javax.inject.Inject;

0 commit comments

Comments
 (0)