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