Skip to content

Commit ab01358

Browse files
committed
Address comments and fix conflicts
1 parent 2c28f02 commit ab01358

File tree

22 files changed

+212
-109
lines changed

22 files changed

+212
-109
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: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import com.cloud.vm.VirtualMachine.State;
7272
import com.cloud.vm.VirtualMachineManager;
7373
import com.cloud.vm.dao.VMInstanceDao;
74+
7475
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
7576
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
7677
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
@@ -114,8 +115,10 @@
114115
import org.apache.cloudstack.storage.to.TemplateObjectTO;
115116
import org.apache.cloudstack.storage.to.VolumeObjectTO;
116117
import org.apache.cloudstack.storage.volume.VolumeObject;
118+
117119
import org.apache.commons.collections4.CollectionUtils;
118120
import org.apache.commons.collections4.MapUtils;
121+
119122
import org.apache.logging.log4j.LogManager;
120123
import org.apache.logging.log4j.Logger;
121124

@@ -186,6 +189,7 @@ private SnapshotDataStoreVO getSnapshotImageStoreRef(long snapshotId, long zoneI
186189
public Map<String, String> getCapabilities() {
187190
Map<String, String> mapCapabilities = new HashMap<>();
188191
mapCapabilities.put(DataStoreCapabilities.CAN_COPY_SNAPSHOT_BETWEEN_ZONES_AND_SAME_POOL_TYPE.toString(), Boolean.TRUE.toString());
192+
mapCapabilities.put(DataStoreCapabilities.CAN_CREATE_TEMPLATE_FROM_SNAPSHOT.toString(), Boolean.TRUE.toString());
189193
return mapCapabilities;
190194
}
191195

@@ -517,14 +521,7 @@ public void deleteAsync(DataStore dataStore, DataObject data, AsyncCompletionCal
517521
err = String.format("Could not delete volume due to %s", e.getMessage());
518522
}
519523
} else if (data.getType() == DataObjectType.SNAPSHOT) {
520-
SnapshotInfo snapshot = (SnapshotInfo) data;
521-
SpConnectionDesc conn = StorPoolUtil.getSpConnection(snapshot.getDataStore().getUuid(), snapshot.getDataStore().getId(), storagePoolDetailsDao, primaryStoreDao);
522-
String name = StorPoolStorageAdaptor.getVolumeNameFromPath(snapshot.getPath(), true);
523-
SpApiResponse resp = StorPoolUtil.snapshotDelete(name, conn);
524-
if (resp.getError() != null) {
525-
err = String.format("Failed to clean-up Storpool snapshot %s. Error: %s", name, resp.getError());
526-
StorPoolUtil.spLog(err);
527-
}
524+
err = deleteSnapshot((SnapshotInfo) data, err);
528525
} else {
529526
err = String.format("Invalid DataObjectType \"%s\" passed to deleteAsync", data.getType());
530527
}
@@ -539,6 +536,18 @@ public void deleteAsync(DataStore dataStore, DataObject data, AsyncCompletionCal
539536
callback.complete(res);
540537
}
541538

539+
private String deleteSnapshot(SnapshotInfo data, String err) {
540+
SnapshotInfo snapshot = data;
541+
SpConnectionDesc conn = StorPoolUtil.getSpConnection(snapshot.getDataStore().getUuid(), snapshot.getDataStore().getId(), storagePoolDetailsDao, primaryStoreDao);
542+
String name = StorPoolStorageAdaptor.getVolumeNameFromPath(snapshot.getPath(), true);
543+
SpApiResponse resp = StorPoolUtil.snapshotDelete(name, conn);
544+
if (resp.getError() != null) {
545+
err = String.format("Failed to clean-up Storpool snapshot %s. Error: %s", name, resp.getError());
546+
StorPoolUtil.spLog(err);
547+
}
548+
return err;
549+
}
550+
542551
private void tryToSnapshotVolumeBeforeDelete(VolumeInfo vinfo, DataStore dataStore, String name, SpConnectionDesc conn) {
543552
Integer deleteAfter = StorPoolConfigurationManager.DeleteAfterInterval.valueIn(dataStore.getId());
544553
if (deleteAfter != null && deleteAfter > 0 && vinfo.getPassphraseId() == null) {
@@ -648,9 +657,9 @@ public void copyAsync(DataObject srcData, DataObject dstData, AsyncCompletionCal
648657
final String volumeName = vinfo.getUuid();
649658
final Long size = vinfo.getSize();
650659
SpConnectionDesc conn = StorPoolUtil.getSpConnection(vinfo.getDataStore().getUuid(), vinfo.getDataStore().getId(), storagePoolDetailsDao, primaryStoreDao);
660+
String snapshotName = StorPoolStorageAdaptor.getVolumeNameFromPath(((SnapshotInfo) srcData).getPath(), true);
651661

652-
if (sinfo.getDataStore().getRole().equals(DataStoreRole.Primary)) {
653-
String snapshotName = StorPoolStorageAdaptor.getVolumeNameFromPath(((SnapshotInfo) srcData).getPath(), true);
662+
if (snapshotName != null) {
654663
SpApiResponse resp = StorPoolUtil.volumeCreate(volumeName, snapshotName, size, null, null, "volume", sinfo.getBaseVolume().getMaxIops(), conn);
655664
if (resp.getError() == null) {
656665
updateStoragePool(dstData.getDataStore().getId(), size);

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)