Leonardo Bianconi has uploaded a new change for review.

Change subject: core, engine: Prevent snapshot in ppc64
......................................................................

core, engine: Prevent snapshot in ppc64

This change disables memory snapshot in the back end for clusters
with architecture that doesn't support it.
All logic was added in conjunction with the snapshot validation from
the class FeatureSupported.

Change-Id: I4f201b63ddf441a9bc76a37fda33f54fa766d937
Signed-off-by: Leonardo Bianconi <leonardo.bianc...@eldorado.org.br>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/architecture/IsSnapshotSupported.java
5 files changed, 65 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/57/21657/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
index 5011bcd..6da505b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
@@ -150,7 +150,8 @@
     }
 
     private MemoryImageBuilder createMemoryImageBuilder() {
-        if 
(!FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion())) {
+        boolean archSupportSnapshot = 
isSnapshotSupportedByArchitecture(getVm().getClusterArch(), 
getVm().getVdsGroupCompatibilityVersion());
+        if 
(!FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion()) || 
archSupportSnapshot) {
             return new NullableMemoryImageBuilder();
         }
 
@@ -248,6 +249,12 @@
             }
         }
 
+        boolean archSupportSnapshot = 
isSnapshotSupportedByArchitecture(getVm().getClusterArch(), 
getVm().getVdsGroupCompatibilityVersion());
+        if (getParameters().isSaveMemory()
+                && (archSupportSnapshot || 
!FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion()))) {
+            log.warnFormat("A memory snapshot was required but not created, 
since VM architecture does not support it.", getVmId());
+        }
+
         incrementVmGeneration();
 
         endActionOnDisks();
@@ -326,7 +333,8 @@
     private SnapshotVDSCommandParameters buildLiveSnapshotParameters(Snapshot 
snapshot) {
         List<Disk> pluggedDisks = getDiskDao().getAllForVm(getVm().getId(), 
true);
         List<DiskImage> filteredPluggedDisks = 
ImagesHandler.filterImageDisks(pluggedDisks, false, true, true);
-        if 
(FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion())) {
+        boolean archSupportSnapshot = 
isSnapshotSupportedByArchitecture(getVm().getClusterArch(), 
getVm().getVdsGroupCompatibilityVersion());
+        if 
(FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion()) && 
archSupportSnapshot) {
             return new SnapshotVDSCommandParameters(getVm().getRunOnVds(),
                     getVm().getId(),
                     filteredPluggedDisks,
@@ -384,7 +392,6 @@
 
     @Override
     protected boolean canDoAction() {
-
         if (getVm() == null) {
             
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_NOT_EXIST);
             return false;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
index 2aeff5f..ca2161b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
@@ -143,7 +143,8 @@
             VmHandler.updateDisksForVm(getVm(), 
getDiskDao().getAllForVm(getVm().getId()));
 
             if (getVm().getStatus() != VMStatus.Suspended) {
-                memorySnapshotSupported = 
FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion());
+                boolean archSupportSnapshot = 
isSnapshotSupportedByArchitecture(getVm().getClusterArch(), 
getVm().getVdsGroupCompatibilityVersion());
+                memorySnapshotSupported = 
FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion()) && 
archSupportSnapshot;
                 // If the VM is not hibernated, save the hibernation volume 
from the baseline snapshot
                 memoryVolumeFromSnapshot = 
getActiveSnapshot().getMemoryVolume();
             }
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 485d486..311b9c6 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
@@ -124,8 +124,9 @@
                 .getInstance()
                 .getDiskImageDao()
                 .getAllSnapshotsForVmSnapshot(snapshotToBePreviewed.getId());
+        boolean archSupportSnapshot = 
isSnapshotSupportedByArchitecture(getVm().getClusterArch(), 
getVm().getVdsGroupCompatibilityVersion());
         final boolean restoreMemory = getParameters().isRestoreMemory() &&
-                
FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion());
+                
FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion()) && 
archSupportSnapshot;
 
         TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
             @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
index a5dca79..ca92735 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
@@ -4,6 +4,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.ovirt.engine.core.bll.architecture.IsSnapshotSupported;
 import org.ovirt.engine.core.bll.network.MacPoolManager;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsManager;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
@@ -11,7 +12,9 @@
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VmOperationParameterBase;
+import org.ovirt.engine.core.common.archstrategy.ArchStrategyFactory;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.businessentities.ArchitectureType;
 import org.ovirt.engine.core.common.businessentities.Disk;
 import org.ovirt.engine.core.common.businessentities.DiskInterface;
 import org.ovirt.engine.core.common.businessentities.TagsVmMap;
@@ -32,6 +35,7 @@
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.core.dao.DiskDao;
 import org.ovirt.engine.core.dao.DiskImageDAO;
 import org.ovirt.engine.core.dao.ImageDao;
@@ -158,6 +162,19 @@
         return result;
     }
 
+    /**
+     * Check if architecture supports snapshot
+     * @return
+     */
+    public boolean isSnapshotSupportedByArchitecture (ArchitectureType 
architecture, Version compatibilityVersion) {
+        boolean supported = false;
+        if (architecture != ArchitectureType.undefined) {
+            supported = ArchStrategyFactory.getStrategy(architecture).run(new 
IsSnapshotSupported(compatibilityVersion)).returnValue();
+        }
+
+        return supported;
+    }
+
     protected void removeVmStatic() {
         getVmStaticDAO().remove(getVmId());
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/architecture/IsSnapshotSupported.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/architecture/IsSnapshotSupported.java
new file mode 100644
index 0000000..a43148a
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/architecture/IsSnapshotSupported.java
@@ -0,0 +1,34 @@
+package org.ovirt.engine.core.bll.architecture;
+
+import org.ovirt.engine.core.common.archstrategy.ArchCommand;
+import org.ovirt.engine.core.compat.Version;
+
+public class IsSnapshotSupported implements ArchCommand {
+
+    // This is reserved for future use, currently there is not a
+    // class that handles architecture specific capabilities, so
+    // this class will check if the cluster version supports
+    // snapshot
+    @SuppressWarnings("unused")
+    private Version version;
+
+    public IsSnapshotSupported(Version version) {
+        this.version = version;
+    }
+
+    private boolean value;
+
+    @Override
+    public void runForX86_64() {
+        value = true;
+    }
+
+    @Override
+    public void runForPPC64() {
+        value = false;
+    }
+
+    public boolean returnValue() {
+        return this.value;
+    }
+}


-- 
To view, visit http://gerrit.ovirt.org/21657
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4f201b63ddf441a9bc76a37fda33f54fa766d937
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Leonardo Bianconi <leonardo.bianc...@eldorado.org.br>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to