Maor Lipchuk has uploaded a new change for review.

Change subject: core: Introduce TryBackToAllCinderSnapshotsCommand
......................................................................

core: Introduce TryBackToAllCinderSnapshotsCommand

Introduce new command for previewing all Cinder disks in a VM.

Change-Id: I36d1c3278c4d251a15ee42b67d5c9fa8177c0e20
Bug-Url: https://bugzilla.redhat.com/1185826
Signed-off-by: Maor Lipchuk <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/TryBackToAllCinderSnapshotsCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
3 files changed, 151 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/42061/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
index 6130319..0d9a3f2 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
@@ -5,12 +5,16 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsManager;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
+import org.ovirt.engine.core.bll.storage.CINDERStorageHelper;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
 import org.ovirt.engine.core.bll.validator.VmValidator;
 import org.ovirt.engine.core.bll.validator.storage.DiskImagesValidator;
 import org.ovirt.engine.core.bll.validator.storage.DiskSnapshotsValidator;
@@ -19,6 +23,7 @@
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.CloneCinderDisksParameters;
 import org.ovirt.engine.core.common.action.ImagesContainterParametersBase;
 import org.ovirt.engine.core.common.action.LockProperties;
 import org.ovirt.engine.core.common.action.LockProperties.Scope;
@@ -29,7 +34,9 @@
 import org.ovirt.engine.core.common.businessentities.Snapshot;
 import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotStatus;
 import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType;
+import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
 import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType;
 import org.ovirt.engine.core.common.errors.VdcBLLException;
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
@@ -114,7 +121,7 @@
         setSucceeded(true);
     }
 
-    private void restoreVmConfigFromSnapshot() {
+    protected void restoreVmConfigFromSnapshot() {
         getSnapshotDao().updateStatus(getParameters().getDstSnapshotId(), 
SnapshotStatus.IN_PREVIEW);
         getSnapshotDao().updateStatus(getSnapshotDao().getId(getVm().getId(),
                 SnapshotType.PREVIEW,
@@ -130,6 +137,7 @@
 
     @Override
     protected void executeVmCommand() {
+        boolean returnValue = true;
         final boolean restoreMemory = getParameters().isRestoreMemory() &&
                 
FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion()) &&
                 FeatureSupported.isMemorySnapshotSupportedByArchitecture(
@@ -147,7 +155,7 @@
         // Images list without those that are excluded from preview
         final List<DiskImage> filteredImages = (List<DiskImage>) 
CollectionUtils.subtract(
                 images, getImagesExcludedFromPreview(images, 
previousActiveSnapshotId, newActiveSnapshotId));
-
+        final List<CinderDisk> cinderDisks = new ArrayList<>();
         TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
             @Override
             public Void runInTransaction() {
@@ -184,6 +192,10 @@
                 @Override
                 public Void runInTransaction() {
                     for (DiskImage image : filteredImages) {
+                        if (image.getDiskStorageType() == 
DiskStorageType.CINDER) {
+                            cinderDisks.add((CinderDisk)image);
+                            continue;
+                        }
                         VdcReturnValueBase vdcReturnValue =
                                 
runInternalActionWithTasksContext(VdcActionType.TryBackToSnapshot,
                                         
buildTryBackToSnapshotParameters(newActiveSnapshotId, image));
@@ -198,6 +210,10 @@
                             log.error("Cannot create snapshot");
                             throw new 
VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL);
                         }
+                    }
+                    if (!cinderDisks.isEmpty() &&
+                            !tryBackAllCinderDisks(cinderDisks, 
snapshotToBePreviewed.getId())) {
+                        throw new VdcBLLException(VdcBllErrors.CINDER_ERROR);
                     }
                     return null;
                 }
@@ -214,15 +230,46 @@
                 }
             });
         }
-        setSucceeded(true);
+        setSucceeded(returnValue);
+    }
+
+    protected boolean tryBackAllCinderDisks( List<CinderDisk> cinderDisks, 
Guid snapshotToBePreviewedId) {
+        Future<VdcReturnValueBase> future = 
CommandCoordinatorUtil.executeAsyncCommand(
+                VdcActionType.TryBackToAllCinderSnapshots,
+                buildCinderChildCommandParameters(cinderDisks, 
snapshotToBePreviewedId),
+                cloneContextAndDetachFromParent(),
+                CINDERStorageHelper.getStorageEntities(cinderDisks));
+        try {
+            VdcReturnValueBase vdcReturnValueBase = future.get();
+            if (!vdcReturnValueBase.getSucceeded()) {
+                getReturnValue().setFault(vdcReturnValueBase.getFault());
+                log.error("Error cloning Cinder disks for template");
+                return false;
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            log.error("Error cloning Cinder disks for template", e);
+            return false;
+        }
+        return true;
+    }
+
+    private CloneCinderDisksParameters 
buildCinderChildCommandParameters(List<CinderDisk> cinderDisks, Guid 
vmSnapshotId) {
+        CloneCinderDisksParameters createParams = new 
CloneCinderDisksParameters();
+        createParams.setCinderDisks(cinderDisks);
+        createParams.setVmSnapshotId(vmSnapshotId);
+        
createParams.setParentHasTasks(!getReturnValue().getVdsmTaskIdList().isEmpty());
+        return withRootCommandInfo(createParams, getActionType());
     }
 
     private List<DiskImage> getImagesToPreview() {
         if (imagesToPreview == null) {
             imagesToPreview = getParameters().getDisks() != null ? 
getParameters().getDisks() :
                     
getDbFacade().getDiskImageDao().getAllSnapshotsForVmSnapshot(getDstSnapshot().getId());
+
             // Filter out shareable/nonsnapable disks
+            List<CinderDisk> CinderImagesToPreview = 
ImagesHandler.filterDisksBasedOnCinder(imagesToPreview);
             imagesToPreview = ImagesHandler.filterImageDisks(imagesToPreview, 
true, true, false);
+            imagesToPreview.addAll(CinderImagesToPreview);
         }
         return imagesToPreview;
     }
@@ -234,7 +281,8 @@
         List<DiskImage> excludedImages = new ArrayList<>();
 
         for (DiskImage image : images) {
-            if (image.getVmSnapshotId().equals(previousActiveSnapshotId)) {
+            if ((image.getDiskStorageType() == DiskStorageType.IMAGE)
+                    && 
image.getVmSnapshotId().equals(previousActiveSnapshotId)) {
                 // Image is already active, hence only update snapshot ID.
                 getImageDao().updateImageVmSnapshotId(image.getImageId(), 
newActiveSnapshotId);
                 excludedImages.add(image);
@@ -277,6 +325,7 @@
         updateVmDisksFromDb();
         List<DiskImage> diskImages =
                 ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), 
true, true, true);
+        
diskImages.addAll(ImagesHandler.filterDisksBasedOnCinder(getVm().getDiskMap().values(),
 true));
         if (!diskImages.isEmpty()) {
           if (!validate(new StoragePoolValidator(getStoragePool()).isUp())) {
               return false;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/TryBackToAllCinderSnapshotsCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/TryBackToAllCinderSnapshotsCommand.java
new file mode 100644
index 0000000..1e58799
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/TryBackToAllCinderSnapshotsCommand.java
@@ -0,0 +1,97 @@
+package org.ovirt.engine.core.bll.storage;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.ovirt.engine.core.bll.CommandBase;
+import org.ovirt.engine.core.bll.InternalCommandAttribute;
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.bll.snapshots.SnapshotsManager;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.common.action.CloneCinderDisksParameters;
+import org.ovirt.engine.core.common.action.ImagesContainterParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.SnapshotDao;
+
+@InternalCommandAttribute
+public class TryBackToAllCinderSnapshotsCommand<T extends 
CloneCinderDisksParameters> extends CommandBase<T> {
+
+    private final SnapshotsManager snapshotsManager = new SnapshotsManager();
+
+    public TryBackToAllCinderSnapshotsCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    public TryBackToAllCinderSnapshotsCommand(T parameters, CommandContext 
commandContext) {
+        super(parameters, commandContext);
+    }
+
+    @Override
+    protected void executeCommand() {
+        boolean isSucceeded = true;
+        for (CinderDisk disk : getParameters().getCinderDisks()) {
+            ImagesContainterParametersBase params = 
buildChildCommandParameters(disk);
+            Future<VdcReturnValueBase> future = 
CommandCoordinatorUtil.executeAsyncCommand(
+                    VdcActionType.TryBackToCinderSnapshot,
+                    params,
+                    cloneContextAndDetachFromParent());
+            try {
+                VdcReturnValueBase vdcReturnValueBase = future.get();
+                if (!vdcReturnValueBase.getSucceeded()) {
+                    log.error("Error cloning Cinder disk '{}': {}", 
disk.getDiskAlias());
+                    getReturnValue().setFault(vdcReturnValueBase.getFault());
+                    isSucceeded = false;
+                    break;
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                log.error("Error cloning Cinder disk '{}': {}", 
disk.getDiskAlias(), e.getMessage());
+                isSucceeded = false;
+            }
+
+        }
+        persistCommand(getParameters().getParentCommand(), true);
+        setSucceeded(isSucceeded);
+    }
+
+    private ImagesContainterParametersBase 
buildChildCommandParameters(CinderDisk cinderDisk) {
+        ImagesContainterParametersBase createParams = new 
ImagesContainterParametersBase(cinderDisk.getImageId());
+        createParams.setContainerId(cinderDisk.getId());
+        cinderDisk.setDiskAlias(cinderDisk.getDiskAlias());
+        cinderDisk.setVmSnapshotId(getParameters().getVmSnapshotId());
+        createParams.setStorageDomainId(cinderDisk.getStorageIds().get(0));
+        createParams.setEntityInfo(getParameters().getEntityInfo());
+        return withRootCommandInfo(createParams, 
getParameters().getParentCommand());
+    }
+
+    @Override
+    public CommandCallback getCallback() {
+        return new CloneCinderDisksCommandCallback();
+    }
+
+    @Override
+    protected void endSuccessfully() {
+        getVmStaticDAO().incrementDbGeneration(getVm().getId());
+        if (!getParameters().isParentHasTasks()) {
+            getBackend().endAction(getParameters().getParentCommand(),
+                    getParameters().getParentParameters(),
+                    
getContext().clone().withoutCompensationContext().withoutExecutionContext().withoutLock());
+        }
+        setSucceeded(true);
+    }
+
+    protected SnapshotDao getSnapshotDao() {
+        return DbFacade.getInstance().getSnapshotDao();
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        return Collections.emptyList();
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index 9334d19..c143803 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -456,6 +456,7 @@
     RegisterCinderDisk(3206, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.NONE),
     CreateCinderSnapshot(3207, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.STORAGE),
     RemoveCinderSnapshotDisk(3208, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.STORAGE),
+    TryBackToAllCinderSnapshots(3209, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.STORAGE),
 
     // Host Devices
     RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, 
QuotaDependency.NONE),


-- 
To view, visit https://gerrit.ovirt.org/42061
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I36d1c3278c4d251a15ee42b67d5c9fa8177c0e20
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Maor Lipchuk <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to