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
