package org.ovirt.engine.core.bll.storage.disk;
import java.io.File;
import javax.inject.Inject;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.bll.VmOperationCommandBase;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.storage.domain.IsoDomainListSynchronizer;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.ChangeDiskCommandParameters;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.utils.ValidationUtils;
import org.ovirt.engine.core.common.utils.VmDeviceCommonUtils;
import org.ovirt.engine.core.common.vdscommands.ChangeDiskVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.compat.Version;
public class ChangeDiskCommand<T extends ChangeDiskCommandParameters> extends VmOperationCommandBase<T> {
@Inject
private IsoDomainListSynchronizer isoDomainListSynchronizer;
private String cdImagePath;
public ChangeDiskCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
cdImagePath = getParameters().getCdImagePath();
}
public String getDiskName() {
return new File(cdImagePath).getName();
}
@Override
protected void setActionMessageParameters() {
// An empty 'cdImagePath' means eject CD
if (!StringUtils.isEmpty(cdImagePath)) {
addValidationMessage(EngineMessage.VAR__ACTION__CHANGE_CD);
} else {
addValidationMessage(EngineMessage.VAR__ACTION__EJECT_CD);
}
addValidationMessage(EngineMessage.VAR__TYPE__VM);
}
@Override
protected boolean validate() {
if (shouldSkipCommandExecutionCached()) {
return true;
}
if (getVm() == null) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_VM_NOT_FOUND);
}
if (!canRunActionOnNonManagedVm()) {
return false;
}
if (!getVm().isRunningOrPaused()) {
return failVmStatusIllegal();
}
if ((isoDomainListSynchronizer.findActiveISODomain(getVm().getStoragePoolId()) == null)
&& !StringUtils.isEmpty(cdImagePath)) {
return failValidation(EngineMessage.VM_CANNOT_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO);
}
if (StringUtils.isNotEmpty(cdImagePath) && !StringUtils.endsWithIgnoreCase(cdImagePath, ValidationUtils.ISO_SUFFIX)) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_INVALID_CDROM_DISK_FORMAT);
}
return true;
}
@Override
protected boolean shouldSkipCommandExecution() {
if (getVm() == null) {
return false;
}
return StringUtils.equals(getVm().getCurrentCd(), getParameters().getCdImagePath());
}
@Override
protected void perform() {
String iface = null;
int index = 0;
if (getVm().getCompatibilityVersion().greaterOrEquals(Version.v4_0)) {
iface = getVmDeviceUtils().getCdInterface(getVm());
index = VmDeviceCommonUtils.getCdDeviceIndex(iface);
}
cdImagePath = cdPathWindowsToLinux(
getParameters().getCdImagePath(),
getVm().getStoragePoolId(),
getVm().getRunOnVds());
setActionReturnValue(runVdsCommand(VDSCommandType.ChangeDisk,
new ChangeDiskVDSCommandParameters(getVdsId(), getVm().getId(), iface, index, cdImagePath))
.getReturnValue());
vmHandler.updateCurrentCd(getVm(), getParameters().getCdImagePath());
setSucceeded(true);
}
@Override
public AuditLogType getAuditLogTypeValue() {
if (shouldSkipCommandExecutionCached()) {
return "".equals(cdImagePath) ? AuditLogType.VM_DISK_ALREADY_EJECTED
: AuditLogType.VM_DISK_ALREADY_CHANGED;
}
if (!getSucceeded()) {
return AuditLogType.USER_FAILED_CHANGE_DISK_VM;
}
return "".equals(cdImagePath) ? AuditLogType.USER_EJECT_VM_DISK
: AuditLogType.USER_CHANGE_DISK_VM;
}
}