Maor Lipchuk has uploaded a new change for review.

Change subject: core: Remove image while VDSM returns not exist.
......................................................................

core: Remove image while VDSM returns not exist.

If image does not exists in the storage server, VDSM returns an
exception at the initiating stage of the task.
If engine encounter this exception it should avoid the exception print a
log message and remove the disk any how from the DB.

Signed-off-by: Maor Lipchuk <mlipc...@redhat.com>
Bug-Url: https://bugzilla.redhat.com/884635
Change-Id: I36915c44e65e20e3ce222683650a562603e4bb05
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
4 files changed, 72 insertions(+), 30 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/12077/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
index 7ba2c35..a8c0b87 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
@@ -294,8 +294,14 @@
             setLock(null);
             if (vdcReturnValue.getSucceeded()) {
                 getParameters().getImagesParameters().add(p);
-                
getReturnValue().getTaskIdList().addAll(vdcReturnValue.getInternalTaskIdList());
                 setSucceeded(vdcReturnValue.getSucceeded());
+                if (vdcReturnValue.getInternalTaskIdList().isEmpty()) {
+                    // We get here if we got imageDoesNotExistsInDomain for 
the disk image from VDSM.
+                    endCommand();
+                } else {
+                    
getReturnValue().getTaskIdList().addAll(vdcReturnValue.getInternalTaskIdList());
+                }
+
             }
         } else {
             removeLunDisk();
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
index 899ed9a..4923b2e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
@@ -18,6 +18,8 @@
 import org.ovirt.engine.core.common.businessentities.VmDeviceId;
 import org.ovirt.engine.core.common.businessentities.ImageStorageDomainMapId;
 import 
org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
+import org.ovirt.engine.core.common.errors.VdcBLLException;
+import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.common.utils.Pair;
 import 
org.ovirt.engine.core.common.vdscommands.DeleteImageGroupVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
@@ -73,12 +75,22 @@
     @Override
     protected void executeCommand() {
         if (getDiskImage() != null) {
-            VDSReturnValue vdsReturnValue = performImageVdsmOperation();
-            getReturnValue().getInternalTaskIdList().add(
-                    createTask(vdsReturnValue.getCreationInfo(),
-                            getParameters().getParentCommand(),
-                            VdcObjectType.Storage,
-                            getParameters().getStorageDomainId()));
+            try {
+                VDSReturnValue vdsReturnValue = performImageVdsmOperation();
+                getReturnValue().getInternalTaskIdList().add(
+                        createTask(vdsReturnValue.getCreationInfo(),
+                                getParameters().getParentCommand(),
+                                VdcObjectType.Storage,
+                                getParameters().getStorageDomainId()));
+            } catch (VdcBLLException e) {
+                if (e.getErrorCode() == 
VdcBllErrors.ImageDoesNotExistInDomainError) {
+                    log.errorFormat("Image {0} does not exists in domain {1}. 
Removing disk from DB only.",
+                            getDiskImage().getId(),
+                            getParameters().getStorageDomainId());
+                } else {
+                    throw e;
+                }
+            }
 
             if (getParameters().isRemoveDuringExecution()
                     && getParameters().getParentCommand() != 
VdcActionType.RemoveVmFromImportExport
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
index 2dd3caa..8e04bdd 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
@@ -4,6 +4,8 @@
 import org.ovirt.engine.core.common.action.ImagesContainterParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.errors.VdcBLLException;
+import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import 
org.ovirt.engine.core.common.vdscommands.DeleteImageGroupVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
@@ -19,23 +21,38 @@
 
     @Override
     protected void executeCommand() {
-        VDSReturnValue vdsReturnValue = Backend
-                .getInstance()
-                .getResourceManager()
-                .RunVdsCommand(
-                        VDSCommandType.DeleteImageGroup,
-                        new 
DeleteImageGroupVDSCommandParameters(getParameters().getStoragePoolId(), 
getParameters()
-                                .getStorageDomainId(), 
getParameters().getImageGroupID(), getParameters()
-                                .getWipeAfterDelete(), false, 
getStoragePool().getcompatibility_version().toString()));
+        try {
+            VDSReturnValue vdsReturnValue =
+                    Backend
+                            .getInstance()
+                            .getResourceManager()
+                            .RunVdsCommand(
+                                    VDSCommandType.DeleteImageGroup,
+                                    new 
DeleteImageGroupVDSCommandParameters(getParameters().getStoragePoolId(),
+                                            getParameters()
+                                                    .getStorageDomainId(),
+                                            getParameters().getImageGroupID(),
+                                            getParameters()
+                                                    .getWipeAfterDelete(),
+                                            false,
+                                            
getStoragePool().getcompatibility_version().toString()));
+            if (vdsReturnValue.getSucceeded()) {
+                getReturnValue().getInternalTaskIdList().add(
+                        createTask(vdsReturnValue.getCreationInfo(),
+                                VdcActionType.RemoveVmTemplate,
+                                VdcObjectType.Storage,
+                                getParameters().getStorageDomainId()));
 
-        if (vdsReturnValue.getSucceeded()) {
-            getReturnValue().getInternalTaskIdList().add(
-                    createTask(vdsReturnValue.getCreationInfo(),
-                            VdcActionType.RemoveVmTemplate,
-                            VdcObjectType.Storage,
-                            getParameters().getStorageDomainId()));
-
-            setSucceeded(true);
+                setSucceeded(true);
+            }
+        } catch (VdcBLLException e) {
+            if (e.getErrorCode() == 
VdcBllErrors.ImageDoesNotExistInDomainError) {
+                log.errorFormat("Image {0} does not exists in domain {1}. 
Removing disk from DB only.",
+                        getDiskImage().getId(),
+                        getParameters().getStorageDomainId());
+            } else {
+                throw e;
+            }
         }
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
index 3ef7b00..735a30d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
@@ -76,20 +76,27 @@
         if (getParameters().isRemoveDisks() && hasImages) {
             if (!removeVmImages(null)) {
                 return false;
+            // We get here if we got imageDoesNotExistsInDomain for all the VM 
disks from VDSM.
+            } else if (getReturnValue().getTaskIdList().isEmpty()) {
+                endCommandWithoutTasks();
             }
         }
         else {
-            TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
-                @Override
-                public Void runInTransaction() {
-                    removeVmFromDb();
-                    return null;
-                }
-            });
+            endCommandWithoutTasks();
         }
         return true;
     }
 
+    private void endCommandWithoutTasks() {
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                removeVmFromDb();
+                return null;
+            }
+        });
+    }
+
     @Override
     protected boolean canDoAction() {
         if (getVm() == null) {


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

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

Reply via email to