package org.ovirt.engine.core.bll;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
import org.ovirt.engine.core.common.action.MoveOrCopyParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.CopyVolumeType;
import org.ovirt.engine.core.common.businessentities.DiskImage;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.utils.transaction.TransactionMethod;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
public class ExportVmTemplateCommand<T extends MoveOrCopyParameters> extends MoveOrCopyTemplateCommand<T> {
public ExportVmTemplateCommand(T parameters) {
super(parameters);
setVmTemplateId(parameters.getContainerId());
setStoragePoolId(getVmTemplate().getstorage_pool_id());
}
protected ExportVmTemplateCommand(Guid commandId) {
super(commandId);
}
@Override
protected void MoveOrCopyAllImageGroups(final Guid containerID, final Iterable<DiskImage> disks) {
TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() {
@Override
public Void runInTransaction() {
for (DiskImage disk : disks) {
// we force export template image to COW+Sparse but we don't update
// the ovf so the import
// will set the original format
MoveOrCopyImageGroupParameters tempVar = new MoveOrCopyImageGroupParameters(containerID, disk
.getimage_group_id().getValue(), disk.getId(), getParameters().getStorageDomainId(),
getMoveOrCopyImageOperation());
tempVar.setParentCommand(getActionType());
tempVar.setParentParemeters(getParameters());
tempVar.setEntityId(getParameters().getEntityId());
tempVar.setUseCopyCollapse(true);
tempVar.setCopyVolumeType(CopyVolumeType.SharedVol);
tempVar.setVolumeFormat(disk.getvolume_format());
tempVar.setVolumeType(disk.getvolume_type());
tempVar.setPostZero(disk.getwipe_after_delete());
tempVar.setForceOverride(getParameters().getForceOverride());
MoveOrCopyImageGroupParameters p = tempVar;
if (getSourceDomain() != null) {
p.setSourceDomainId(getSourceDomain().getid());
}
VdcReturnValueBase vdcRetValue = Backend.getInstance().runInternalAction(
VdcActionType.MoveOrCopyImageGroup, p);
getParameters().getImagesParameters().add(p);
getReturnValue().getTaskIdList().addAll(vdcRetValue.getInternalTaskIdList());
}
return null;
}
});
}
@Override
protected boolean canDoAction() {
if (getVmTemplate() != null) {
setDescription(getVmTemplateName());
}
boolean retVal = ImportExportCommon.CheckStorageDomain(getParameters().getStorageDomainId(), getReturnValue()
.getCanDoActionMessages());
if (retVal) {
// export must be to export domain
if (getStorageDomain().getstorage_domain_type() != StorageDomainType.ImportExport) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_SPECIFY_DOMAIN_IS_NOT_EXPORT_DOMAIN);
retVal = false;
}
}
if (retVal) {
retVal = super.canDoAction();
}
// check destination storage
if (retVal) {
retVal = IsDomainActive(getStorageDomain().getid(), getVmTemplate().getstorage_pool_id().getValue());
}
if (retVal) {
// check that we have at least one disk
if (getParameters().getDiskInfoList() != null) {
if (getParameters().getDiskInfoList().size() > 0) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_ILLEGAL);
retVal = false;
}
}
}
// check if template (with no override option)
if (retVal && !getParameters().getForceOverride()) {
retVal = !ExportVmCommand.CheckTemplateInStorageDomain(getVmTemplate().getstorage_pool_id().getValue(),
getParameters().getStorageDomainId(), getVmTemplateId());
if (!retVal) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_TEMPLATE_NAME_ALREADY_EXISTS);
}
}
// set source storage
if (retVal) {
DiskImage image = getTemplateDisks().get(0);
if (image == null) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_HAS_NO_DISKS);
retVal = false;
}
if (retVal) {
if (getSourceDomain() == null) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST);
retVal = false;
}
}
}
// check that source domain is leagal
if (retVal) {
retVal = IsDomainActive(getSourceDomain().getid(), getVmTemplate().getstorage_pool_id());
}
// check that source domain is not ISO or Export domain
if (retVal) {
if (getSourceDomain().getstorage_domain_type() == StorageDomainType.ISO
|| getSourceDomain().getstorage_domain_type() == StorageDomainType.ImportExport) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_ILLEGAL);
retVal = false;
}
}
if (!retVal) {
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__EXPORT);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM);
}
return retVal;
}
@Override
public AuditLogType getAuditLogTypeValue() {
switch (getActionState()) {
case EXECUTE:
return getSucceeded() ? AuditLogType.IMPORTEXPORT_STARTING_EXPORT_TEMPLATE
: AuditLogType.IMPORTEXPORT_EXPORT_TEMPLATE_FAILED;
case END_SUCCESS:
return getSucceeded() ? AuditLogType.IMPORTEXPORT_EXPORT_TEMPLATE
: AuditLogType.IMPORTEXPORT_EXPORT_TEMPLATE_FAILED;
}
return super.getAuditLogTypeValue();
}
@Override
protected void UpdateTemplateInSpm() {
// update the target (export) domain
VmTemplateCommand.UpdateTemplateInSpm(getVmTemplate().getstorage_pool_id().getValue(),
new java.util.ArrayList<VmTemplate>(java.util.Arrays.asList(new VmTemplate[] { getVmTemplate() })),
getParameters().getStorageDomainId(), null);
}
}