Arik Hadas has uploaded a new change for review.

Change subject: core: add template from snapshot
......................................................................

core: add template from snapshot

Introduce AddVmTemplateFromSnapshotCommand that creates a template from
a snapshot.

Change-Id: I4262e738110f868c9987f5bc4b87325acabb7ad3
Bug-Url: https://bugzilla.redhat.com/1003492
Signed-off-by: Arik Hadas <aha...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateFromSnapshotCommand.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateFromSnapshotParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
4 files changed, 148 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/58/41258/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
index 8ed73f0..9418c55 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
@@ -744,7 +744,7 @@
     }
 
     protected void addVmTemplateImages(Map<Guid, Guid> 
srcDeviceIdToTargetDeviceIdMapping) {
-        List<DiskImage> diskImages = ImagesHandler.filterImageDisks(mImages, 
true, false, true);
+        List<DiskImage> diskImages = filterDiskImages(mImages);
         for (DiskImage diskImage : diskImages) {
             // The return value of this action is the 'copyImage' task GUID:
             VdcReturnValueBase retValue = 
Backend.getInstance().runInternalAction(
@@ -762,6 +762,9 @@
         }
     }
 
+    protected List<DiskImage> filterDiskImages(Collection<DiskImage> 
diskImages) {
+        return ImagesHandler.filterImageDisks(diskImages, true, false, true);
+    }
 
     private Guid getVmIdFromImageParameters(){
         return getParameters().getMasterVm().getId();
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateFromSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateFromSnapshotCommand.java
new file mode 100644
index 0000000..23097b7
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateFromSnapshotCommand.java
@@ -0,0 +1,111 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
+import org.ovirt.engine.core.common.action.AddVmTemplateFromSnapshotParameters;
+import org.ovirt.engine.core.common.businessentities.Snapshot;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.DiskImageDAO;
+import org.ovirt.engine.core.utils.ovf.OvfReaderException;
+
+/**
+ * This class adds a template VM from a snapshot (disks are cloned).
+ */
+@DisableInPrepareMode
+@NonTransactiveCommandAttribute(forceCompensation = true)
+public class AddVmTemplateFromSnapshotCommand<T extends 
AddVmTemplateFromSnapshotParameters> extends AddVmTemplateCommand<T> {
+
+    private Snapshot cachedSnapshot;
+
+    public AddVmTemplateFromSnapshotCommand(Guid commandId) {
+        super(commandId);
+    }
+
+    public AddVmTemplateFromSnapshotCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    public AddVmTemplateFromSnapshotCommand(T parameters, CommandContext 
cmdContext) {
+        super(parameters, cmdContext);
+    }
+
+    @Override
+    protected void init() {
+        Snapshot snapshot = getSnapshot();
+        VM vm = readVmFromSnapshot(snapshot);
+        if (vm == null) {
+            return;
+        }
+        setVm(vm);
+        if (getParameters().getVm() == null) {
+            return;
+        }
+        vm.setVdsGroupId(getParameters().getVm().getVdsGroupId());
+        if (getVdsGroup() == null) {
+            return;
+        }
+        vm.setStoragePoolId(getVdsGroup().getStoragePoolId());
+        for (DiskImage diskImage : 
getDiskImageDao().getAllSnapshotsForVmSnapshot(snapshot.getId())) {
+            vm.getDiskMap().put(diskImage.getId(), diskImage);
+            vm.getDiskList().add(diskImage);
+        }
+        getParameters().setVm(vm);
+
+        super.init();
+    }
+
+    private VM readVmFromSnapshot(Snapshot snapshot) {
+        String ovf = snapshot.getVmConfiguration();
+        try {
+            return new OvfHelper().readVmFromOvf(ovf);
+        } catch (OvfReaderException e) {
+            log.debug("failed to parse a given ovf configuration: \n" + ovf, 
e);
+            return null;
+        }
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        SnapshotsValidator snapshotsValidator = createSnapshotsValidator();
+        // If snapshot does not exist, there is not point in checking any of 
the VM related checks
+        if (!validate(snapshotsValidator.snapshotExists(getSnapshot()))
+                || 
!validate(snapshotsValidator.vmNotDuringSnapshot(getSnapshot().getVmId()))) {
+            return false;
+        }
+
+        return super.canDoAction();
+    }
+
+    protected SnapshotsValidator createSnapshotsValidator() {
+        return new SnapshotsValidator();
+    }
+
+    @Override
+    protected List<DiskImage> getVmDisksFromDB() {
+        return getVm().getDiskList();
+    }
+
+    @Override
+    protected List<DiskImage> filterDiskImages(Collection<DiskImage> 
diskImages) {
+        return ImagesHandler.filterImageDisks(diskImages, true, false, false);
+    }
+
+    private Snapshot getSnapshot() {
+        if (cachedSnapshot == null) {
+            cachedSnapshot = 
getSnapshotDAO().get(getParameters().getSourceSnapshotId());
+            if (cachedSnapshot != null) {
+                setSnapshotName(cachedSnapshot.getDescription());
+            }
+        }
+        return cachedSnapshot;
+    }
+
+    protected DiskImageDAO getDiskImageDao() {
+        return getDbFacade().getDiskImageDao();
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateFromSnapshotParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateFromSnapshotParameters.java
new file mode 100644
index 0000000..a01b045
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateFromSnapshotParameters.java
@@ -0,0 +1,32 @@
+package org.ovirt.engine.core.common.action;
+
+import java.io.Serializable;
+
+import javax.validation.constraints.NotNull;
+
+import org.ovirt.engine.core.common.businessentities.VmStatic;
+import org.ovirt.engine.core.compat.Guid;
+
+public class AddVmTemplateFromSnapshotParameters extends 
AddVmTemplateParameters implements Serializable {
+    private static final long serialVersionUID = -486319959050997796L;
+
+  //Unique Identifier of Source Snapshot
+    @NotNull(message="VALIDATION.SOURCE_SNAPSHOT_ID.NOT_NULL")
+    private Guid sourceSnapshotId;
+
+    public AddVmTemplateFromSnapshotParameters() {
+    }
+
+    public AddVmTemplateFromSnapshotParameters(VmStatic vmStatic, String name, 
String description, Guid sourceSnapshotId) {
+        super(vmStatic, name, description);
+        this.sourceSnapshotId = sourceSnapshotId;
+    }
+
+    public Guid getSourceSnapshotId() {
+        return sourceSnapshotId;
+    }
+
+    public void setSourceSnapshotId(Guid sourceSnapshotId) {
+        this.sourceSnapshotId = sourceSnapshotId;
+    }
+}
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 845d419..b575666 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
@@ -138,6 +138,7 @@
     AddVmTemplateInterface(220, ActionGroup.CONFIGURE_TEMPLATE_NETWORK, false, 
QuotaDependency.NONE),
     RemoveVmTemplateInterface(221, ActionGroup.CONFIGURE_TEMPLATE_NETWORK, 
false, QuotaDependency.NONE),
     UpdateVmTemplateInterface(222, ActionGroup.CONFIGURE_TEMPLATE_NETWORK, 
false, QuotaDependency.NONE),
+    AddVmTemplateFromSnapshot(240, ActionGroup.CREATE_TEMPLATE, 
QuotaDependency.BOTH),
     // ImagesCommands
     TryBackToSnapshot(204, QuotaDependency.NONE),
     RestoreFromSnapshot(205, QuotaDependency.STORAGE),


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4262e738110f868c9987f5bc4b87325acabb7ad3
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Arik Hadas <aha...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to