Liron Ar has uploaded a new change for review.

Change subject: core: remove ovf store when detaching storage domain
......................................................................

core: remove ovf store when detaching storage domain

When detaching a storage domain the engine should attempt to remove it's
ovf disk.

Change-Id: Icde56b54bd11c617056c819fcdbacac71753e264
Signed-off-by: Liron Aravot <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
M 
backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
5 files changed, 97 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/80/24180/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
index 78b1ea9..62eb7a4 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
@@ -1,27 +1,44 @@
 package org.ovirt.engine.core.bll.storage;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.ovirt.engine.core.bll.Backend;
+import org.ovirt.engine.core.bll.LockMessagesMatchUtil;
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
 import org.ovirt.engine.core.common.AuditLogType;
 import 
org.ovirt.engine.core.common.action.DetachStorageDomainFromPoolParameters;
+import org.ovirt.engine.core.common.action.RemoveImageParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomainType;
-import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId;
 import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
+import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.locks.LockingGroup;
+import org.ovirt.engine.core.common.utils.Pair;
 import 
org.ovirt.engine.core.common.vdscommands.DetachStorageDomainVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters;
 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.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
 @NonTransactiveCommandAttribute(forceCompensation=true)
 public class DetachStorageDomainFromPoolCommand<T extends 
DetachStorageDomainFromPoolParameters> extends
         StorageDomainCommandBase<T> {
+
+    private Disk ovfDisk;
+
     public DetachStorageDomainFromPoolCommand(T parameters) {
         super(parameters);
+        ovfDisk = loadStorageDomainOvfDisk();
     }
 
     /**
@@ -36,6 +53,23 @@
 
     @Override
     protected void executeCommand() {
+        if (ovfDisk != null) {
+            log.info("Attempting to remove the domain ovf store");
+            DiskImage diskImage = (DiskImage)ovfDisk;
+            RemoveImageParameters removeImageParameters = new 
RemoveImageParameters();
+            removeImageParameters.setDiskImage(diskImage);
+            VdcReturnValueBase vdcReturnValue = 
Backend.getInstance().runInternalAction(VdcActionType.RemoveImage, 
removeImageParameters);
+            if (vdcReturnValue.getSucceeded()) {
+                
startPollingAsyncTasks(vdcReturnValue.getInternalVdsmTaskIdList());
+            } else {
+                log.info("Failed to remove the domain disk ovf store, please 
remove it and try again");
+                addCustomValue("DiskAlias", ovfDisk.getDiskAlias());
+                AuditLogDirector.log(this, 
AuditLogType.DELETE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED);
+                setSucceeded(false);
+                return;
+            }
+        }
+
         log.info("Start detach storage domain");
         
changeStorageDomainStatusInTransaction(getStorageDomain().getStoragePoolIsoMapData(),
                 StorageDomainStatus.Locked);
@@ -93,4 +127,18 @@
         addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__DOMAIN);
         addCanDoActionMessage(VdcBllMessages.VAR__ACTION__DETACH);
     }
+
+    @Override
+    protected Map<String, Pair<String, String>> getExclusiveLocks() {
+        Map<String, Pair<String, String>> lockMap = new HashMap<>();
+        lockMap.put(getParameters().getStorageDomainId().toString(),
+                LockMessagesMatchUtil.makeLockingPair(LockingGroup.STORAGE,
+                        VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED));
+        if (ovfDisk != null) {
+            lockMap.put(ovfDisk.getId().toString(),
+                    LockMessagesMatchUtil.makeLockingPair(LockingGroup.DISK,
+                            VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED));
+        }
+        return lockMap;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
index ed51ebb..c6f6b52 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
@@ -14,10 +14,12 @@
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.StorageDomainParametersBase;
+import org.ovirt.engine.core.common.businessentities.Disk;
 import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map;
 import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map_id;
 import org.ovirt.engine.core.common.businessentities.LUNs;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StorageDomainOvfInfo;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomainType;
 import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
@@ -30,12 +32,14 @@
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.dao.BaseDiskDao;
+import org.ovirt.engine.core.dao.DiskDao;
 import org.ovirt.engine.core.dao.DiskImageDAO;
 import org.ovirt.engine.core.dao.DiskImageDynamicDAO;
 import org.ovirt.engine.core.dao.ImageDao;
 import org.ovirt.engine.core.dao.ImageStorageDomainMapDao;
 import org.ovirt.engine.core.dao.LunDAO;
 import org.ovirt.engine.core.dao.SnapshotDao;
+import org.ovirt.engine.core.dao.StorageDomainOvfInfoDao;
 import org.ovirt.engine.core.dao.StorageServerConnectionDAO;
 import org.ovirt.engine.core.utils.linq.LinqUtils;
 import org.ovirt.engine.core.utils.linq.Predicate;
@@ -44,6 +48,8 @@
 
 public abstract class StorageDomainCommandBase<T extends 
StorageDomainParametersBase> extends
         StorageHandlingCommandBase<T> {
+
+    private StorageDomainOvfInfo ovfInfo;
 
     public StorageDomainCommandBase(T parameters) {
         super(parameters);
@@ -118,10 +124,39 @@
     }
 
     private boolean hasImages() {
+        int allowedDisksNum = 0;
+        if (loadStorageDomainOvfDiskId()  != null) {
+            allowedDisksNum = 1;
+        }
         return getDiskImageDao()
                 .getAllSnapshotsForStorageDomain(getStorageDomain().getId())
-                .size() != 0
-                || 
getImageStorageDomainMapDao().getAllByStorageDomainId(getStorageDomain().getId()).size()
 != 0;
+                .size() > allowedDisksNum
+                || 
getImageStorageDomainMapDao().getAllByStorageDomainId(getStorageDomain().getId()).size()
 > allowedDisksNum;
+    }
+
+    protected Guid loadStorageDomainOvfDiskId() {
+        StorageDomainOvfInfo info = getOvfInfo();
+        if (info != null) {
+            return info.getOvfDiskId();
+        }
+
+        return null;
+    }
+
+    protected Disk loadStorageDomainOvfDisk() {
+        Guid ovfDiskId = loadStorageDomainOvfDiskId();
+        if (ovfDiskId != null) {
+            return getDbFacade().getDiskDao().get(ovfDiskId);
+        }
+
+        return null;
+    }
+
+    public StorageDomainOvfInfo getOvfInfo() {
+        if (ovfInfo == null) {
+            ovfInfo = 
getStorageDomainOvfInfoDao().get(getStorageDomain().getId());
+        }
+        return ovfInfo;
     }
 
     private StoragePoolIsoMap getStoragePoolIsoMap() {
@@ -388,6 +423,10 @@
         return getDbFacade().getBaseDiskDao();
     }
 
+    protected DiskDao getDiskDao() {
+        return getDbFacade().getDiskDao();
+    }
+
     protected ImageDao getImageDao() {
         return getDbFacade().getImageDao();
     }
@@ -396,6 +435,10 @@
         return getDbFacade().getDiskImageDao();
     }
 
+    protected StorageDomainOvfInfoDao getStorageDomainOvfInfoDao() {
+        return getDbFacade().getStorageDomainOvfInfoDao();
+    }
+
     protected DiskImageDynamicDAO getDiskImageDynamicDAO() {
         return getDbFacade().getDiskImageDynamicDao();
     }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
index 609d5b1..5d69547 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
@@ -718,6 +718,7 @@
     UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED(1012),
     CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED(1013),
     CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED(1014),
+    DELETE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED(1015),
 
     // Authentication
     USER_ACCOUNT_DISABLED_OR_LOCKED(1100, 
AuditLogTimeInterval.HOUR.getValue()),
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
index 5b1f0ee..acd4207 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
@@ -459,6 +459,7 @@
         severities.put(AuditLogType.UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED, 
AuditLogSeverity.WARNING);
         
severities.put(AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED, 
AuditLogSeverity.WARNING);
         
severities.put(AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED,
 AuditLogSeverity.WARNING);
+        
severities.put(AuditLogType.DELETE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED, 
AuditLogSeverity.WARNING);
         severities.put(AuditLogType.UPGRADE_STORAGE_POOL_ENCOUNTERED_PROBLEMS, 
AuditLogSeverity.WARNING);
         severities.put(AuditLogType.DISK_ALIGNMENT_SCAN_START, 
AuditLogSeverity.NORMAL);
         severities.put(AuditLogType.DISK_ALIGNMENT_SCAN_FAILURE, 
AuditLogSeverity.WARNING);
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
index fa3b536..9d3c45b 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
@@ -579,6 +579,7 @@
 UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED=Failed to update VMs/Templates OVF data 
for Storage Domain ${StorageDomainName} in Data Center ${StoragePoolName}.
 CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED=Failed to create OVF store disk for 
Storage Domain ${StorageDomainName}.\n The Disk with the alias ${DiskAlias} 
might be removed manually for automatic attempt to create new one. \n OVF 
updates won't be attempted on the created disk.
 CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED=Failed to create OVF store 
disk for Storage Domain ${StorageDomainName}. \n OVF data won't be updated 
meanwhile for that domain.
+DELETE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED=Failed to delete the OVF store disk 
for Storage Domain ${StorageDomainName}.\n In order to detach the domain please 
remove it manually or try to detach the domain again for another attempt.
 IMPORTEXPORT_FAILED_TO_IMPORT_VM=Failed to read VM '${ImportedVmName}' OVF, it 
may be corrupted
 IMPORTEXPORT_FAILED_TO_IMPORT_TEMPLATE=Failed to read Template '${Template}' 
OVF, it may be corrupted
 CANNOT_HIBERNATE_RUNNING_VMS_AFTER_CLUSTER_CPU_UPGRADE=Hibernation of VMs 
after CPU upgrade of Cluster ${VdsGroup} is not supported. Please stop and 
restart those VMs in case you wish to hibernate them


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

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

Reply via email to