Liron Ar has uploaded a new change for review. Change subject: core: introudcing domain ovf handling commands ......................................................................
core: introudcing domain ovf handling commands *CreateOvfVolumeForStorageDomainCommand *ProccessOvfUpdateForStorageDomainCommand Change-Id: Ifea111e6732ec0b6953d54ef03c29eb0dff6f837 Signed-off-by: Liron Aravot <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProccessOvfUpdateForStorageDomainCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateOvfForStorageDomainParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.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 8 files changed, 285 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/29/23529/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java new file mode 100644 index 0000000..f391a96 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java @@ -0,0 +1,125 @@ +package org.ovirt.engine.core.bll; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; + +import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.action.AddDiskParameters; +import org.ovirt.engine.core.common.action.AddImageFromScratchParameters; +import org.ovirt.engine.core.common.action.StorageDomainParametersBase; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.DiskInterface; +import org.ovirt.engine.core.common.businessentities.StorageDomainOvfInfo; +import org.ovirt.engine.core.common.businessentities.VolumeFormat; +import org.ovirt.engine.core.common.businessentities.VolumeType; +import org.ovirt.engine.core.common.utils.SizeConverter; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; +import org.ovirt.engine.core.dao.StorageDomainOvfInfoDao; + +@InternalCommandAttribute +@NonTransactiveCommandAttribute +public class CreateOvfVolumeForStorageDomainCommand<T extends StorageDomainParametersBase> extends StorageDomainCommandBase<T> { + public CreateOvfVolumeForStorageDomainCommand(T parameters) { + super(parameters); + setStorageDomainId(getParameters().getStorageDomainId()); + setStoragePoolId(getParameters().getStoragePoolId()); + } + + public CreateOvfVolumeForStorageDomainCommand(Guid commandId) { + super(commandId); + } + + @Override + + protected void executeCommand() { + DiskImage createdDisk = createDisk(getStorageDomainId()); + AddDiskParameters diskParameters = new AddDiskParameters(null, createDisk(getStorageDomainId())); + diskParameters.setStorageDomainId(getStorageDomainId()); + diskParameters.setParentCommand(VdcActionType.CreateOvfVolumeForStorageDomain); + diskParameters.setParentParameters(getParameters()); + diskParameters.setShouldRemainIllegalOnFailedExecution(true); + VdcReturnValueBase vdcReturnValueBase = Backend.getInstance().runInternalAction(VdcActionType.AddDisk, diskParameters, + ExecutionHandler.createDefaultContexForTasks(getExecutionContext())); + Guid createdId = (Guid)vdcReturnValueBase.getActionReturnValue(); + + if (createdId != null) { + addStorageDomainOvfInfoToDbIfNeeded(createdId); + } + + if (!vdcReturnValueBase.getSucceeded()) { + addCustomValue("DiskAlias", createdDisk.getDiskAlias()); + if (createdId != null) { + AuditLogDirector.log(this, AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED); + } else { + AuditLogDirector.log(this, AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED); + } + setSucceeded(false); + } + + setSucceeded(true); + } + + public DiskImage createDisk(Guid domainId) { + DiskImage mNewCreatedDiskImage = new DiskImage(); + mNewCreatedDiskImage.setDiskInterface(DiskInterface.IDE); + mNewCreatedDiskImage.setWipeAfterDelete(true); + mNewCreatedDiskImage.setDiskAlias("OVF_STORE"); + mNewCreatedDiskImage.setDiskDescription("OVF_STORE_FOR_DOMAIN " + domainId); + mNewCreatedDiskImage.setShareable(true); + mNewCreatedDiskImage.setStorageIds(new ArrayList<>(Arrays.asList(domainId))); + mNewCreatedDiskImage.setSize(SizeConverter.BYTES_IN_GB); + mNewCreatedDiskImage.setvolumeFormat(VolumeFormat.RAW); + mNewCreatedDiskImage.setVolumeType(VolumeType.Sparse); + mNewCreatedDiskImage.setDescription("OVF_DISK_FOR_DOMAIN " + domainId); + mNewCreatedDiskImage.setCreationDate(new Date()); + mNewCreatedDiskImage.setLastModified(new Date()); + return mNewCreatedDiskImage; + } + + private void addStorageDomainOvfInfoToDbIfNeeded(Guid diskId) { + StorageDomainOvfInfo storageDomainOvfInfoDb = + getStorageDomainOvfInfoDao() + .loadStorageDomainsInfoByDomainId(getStorageDomainId()); + + if (storageDomainOvfInfoDb == null) { + StorageDomainOvfInfo storageDomainOvfInfo = + new StorageDomainOvfInfo(getStorageDomainId(), null, diskId, getStorageDomain().getStoragePoolId(), false); + getStorageDomainOvfInfoDao().save(storageDomainOvfInfo); + + } + } + + @Override + protected void endSuccessfully() { + endChildCommands(); + // TODO: replace + addStorageDomainOvfInfoToDbIfNeeded(((AddImageFromScratchParameters) getParameters().getImagesParameters() + .get(0)).getDiskInfo().getId()); + Backend.getInstance().runInternalAction(VdcActionType.ProccessOvfUpdateForStorageDomain, getParameters()); + setSucceeded(true); + } + + protected StorageDomainOvfInfoDao getStorageDomainOvfInfoDao() { + return getDbFacade().getStorageDomainOvfInfoDao(); + } + + private void endChildCommands() { + for (VdcActionParametersBase p : getParameters().getImagesParameters()) { + getBackend().endAction(p.getCommandType(), p); + } + } + + @Override + protected void endWithFailure() { + endChildCommands(); + AuditLogDirector.log(this, AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED); + setSucceeded(true); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProccessOvfUpdateForStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProccessOvfUpdateForStorageDomainCommand.java new file mode 100644 index 0000000..a56466d --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProccessOvfUpdateForStorageDomainCommand.java @@ -0,0 +1,144 @@ +package org.ovirt.engine.core.bll; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.action.StorageDomainParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.ImageStatus; +import org.ovirt.engine.core.common.businessentities.StorageDomainOvfInfo; +import org.ovirt.engine.core.common.constants.StorageConstants; +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.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.StorageDomainOvfInfoDao; +import org.ovirt.engine.core.dao.VmAndTemplatesGenerationsDAO; +import org.ovirt.engine.core.utils.archivers.tar.InMemoryTar; + +@InternalCommandAttribute +@NonTransactiveCommandAttribute +@LockIdNameAttribute +public class ProccessOvfUpdateForStorageDomainCommand<T extends StorageDomainParametersBase> extends StorageDomainCommandBase<T> { + private StorageDomainOvfInfo storageDomainOvfInfo; + + public ProccessOvfUpdateForStorageDomainCommand(T parameters) { + super(parameters); + setStorageDomainId(parameters.getStorageDomainId()); + setStoragePoolId(parameters.getStoragePoolId()); + } + + protected ProccessOvfUpdateForStorageDomainCommand(Guid commandId) { + super(commandId); + } + + private StorageDomainOvfInfo getStorageDomainOvfData() { + if (storageDomainOvfInfo == null) { + storageDomainOvfInfo = DbFacade.getInstance() + .getStorageDomainOvfInfoDao() + .loadStorageDomainsInfoByDomainId(getStorageDomainId()); + } + return storageDomainOvfInfo; + } + + protected void updateOvfStoreContent() { + if (storageDomainOvfInfo.getOvfDiskId() != null) { + DiskImage image = (DiskImage)getDbFacade().getDiskDao().get(storageDomainOvfInfo.getOvfDiskId()); + if (image.getImageStatus() == ImageStatus.OK) { + List<Guid> vmAndTemplatesIds = + getStorageDomainDAO().getVmAndTemplatesIdsByStorageDomainId(getParameters().getStorageDomainId()); + int i = 0; + ByteArrayOutputStream bufferedOutputStream = new ByteArrayOutputStream(); + InMemoryTar inMemoryTar = new InMemoryTar(bufferedOutputStream); + while (i < vmAndTemplatesIds.size()) { + int size = + Math.min(StorageConstants.OVF_MAX_ITEMS_PER_SQL_STATEMENT, vmAndTemplatesIds.size() - i); + List<Guid> idsToProcess = vmAndTemplatesIds.subList(i, i + size); + i += size; + + List<Pair<Guid, String>> ovfs = + getVmAndTemplatesGenerationsDao().loadOvfDataForIds(idsToProcess); + if (!ovfs.isEmpty()) { + buildFilesForOvfs(ovfs, inMemoryTar); + } + inMemoryTar.closeTar(); + } + + ByteArrayInputStream byteArrayInputStream = + new ByteArrayInputStream(bufferedOutputStream.toByteArray()); + UploadStreamParameters uploadStreamParameters = new UploadStreamParameters(image.getStoragePoolId(), image.getStorageIds().get(0), + image.getId(), image.getImageId(), byteArrayInputStream, "", + Long.valueOf(bufferedOutputStream.size())); + uploadStreamParameters.setParentCommand(getActionType()); + uploadStreamParameters.setParentParameters(getParameters()); + if (Backend.getInstance().runInternalAction(VdcActionType.UploadStream, uploadStreamParameters + ).getSucceeded()) { + getStorageDomainOvfInfoDao().updateOvfUpdatedInfo(Arrays.asList(getParameters().getStorageDomainId()), + true); + setSucceeded(true); + } + } + } + } + + @Override + protected void executeCommand() { + StorageDomainOvfInfo storageDomainOvfInfo = getStorageDomainOvfData(); + + if (storageDomainOvfInfo != null) { + updateOvfStoreContent(); + } else { + LinkedList<Guid> list = new LinkedList<>(); + list.add(getParameters().getStorageDomainId()); + Backend.getInstance().runInternalAction(VdcActionType.CreateOvfVolumeForStorageDomain, + getParameters()); + } + } + + protected Guid getImageId() { + return null; + } + + protected void buildFilesForOvfs(List<Pair<Guid, String>> ovfs, InMemoryTar inMemoryTar) { + for (Pair<Guid, String> pair : ovfs) { + inMemoryTar.addTarEntry(pair.getSecond().getBytes(), pair.getFirst() + ".ovf"); + } + } + + protected VmAndTemplatesGenerationsDAO getVmAndTemplatesGenerationsDao() { + return DbFacade.getInstance().getVmAndTemplatesGenerationsDao(); + } + + protected StorageDomainOvfInfoDao getStorageDomainOvfInfoDao() { + return DbFacade.getInstance().getStorageDomainOvfInfoDao(); + } + + @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)); StorageDomainOvfInfo domainOvfInfo = getStorageDomainOvfData(); + if (domainOvfInfo != null && domainOvfInfo.getOvfDiskId() != null) { + lockMap.put(domainOvfInfo.getOvfDiskId().toString(), LockMessagesMatchUtil.makeLockingPair(LockingGroup.DISK, VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED)); + } + return lockMap; + } + + @Override + public AuditLogType getAuditLogTypeValue() { + if (getActionState() == CommandActionState.EXECUTE && !getSucceeded()) { + return AuditLogType.UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED; + } + + return super.getAuditLogTypeValue(); + } +} 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 71d5865..609d5b1 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 @@ -715,6 +715,10 @@ RELOAD_CONFIGURATIONS_SUCCESS(1010), RELOAD_CONFIGURATIONS_FAILURE(1011), + UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED(1012), + CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED(1013), + CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED(1014), + // Authentication USER_ACCOUNT_DISABLED_OR_LOCKED(1100, AuditLogTimeInterval.HOUR.getValue()), USER_ACCOUNT_PASSWORD_EXPIRED(1101, AuditLogTimeInterval.HOUR.getValue()), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateOvfForStorageDomainParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateOvfForStorageDomainParameters.java new file mode 100644 index 0000000..06b2044 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateOvfForStorageDomainParameters.java @@ -0,0 +1,4 @@ +package org.ovirt.engine.core.common.action; + +public class UpdateOvfForStorageDomainParameters extends StoragePoolParametersBase { +} 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 19c7b2f..089ffb0 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 @@ -305,6 +305,8 @@ UpdateMomPolicy(1900, ActionGroup.MANIPUTLATE_HOST, false, QuotaDependency.NONE), UploadStream(1901, QuotaDependency.NONE), + ProccessOvfUpdateForStorageDomain(1902, QuotaDependency.NONE), + CreateOvfVolumeForStorageDomain(1902, QuotaDependency.NONE); private int intValue; private ActionGroup actionGroup; diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.java index 4d1c694..58c1932 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.java @@ -3,5 +3,4 @@ public class StorageConstants { public static final int SIZE_IS_NOT_AVAILABLE = -1; public static final int OVF_MAX_ITEMS_PER_SQL_STATEMENT = 100; - public static final int UPLOAD_SOCKET_TIMEOUT = 60; } 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 fca7342..5b1f0ee 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 @@ -456,6 +456,9 @@ severities.put(AuditLogType.USER_ACTIVATE_STORAGE_DOMAIN_FAILED_ASYNC, AuditLogSeverity.WARNING); severities.put(AuditLogType.STORAGE_DOMAIN_TASKS_ERROR, AuditLogSeverity.WARNING); severities.put(AuditLogType.UPDATE_OVF_FOR_STORAGE_POOL_FAILED, AuditLogSeverity.WARNING); + 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.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 7f44182..ea195a8 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties @@ -576,6 +576,9 @@ VDS_HIGH_SWAP_USE=Used swap memory of host ${HostName} [${UsedSwap}%] exceeded defined threshold [${Threshold}%]. VDS_LOW_SWAP=Available swap memory of host ${HostName} [${AvailableSwapMemory} MB] is under defined threshold [${Threshold} MB]. UPDATE_OVF_FOR_STORAGE_POOL_FAILED=Failed to update VMs/Templates OVF data in Data Center ${StoragePoolName}. +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. 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/23529 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ifea111e6732ec0b6953d54ef03c29eb0dff6f837 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
