package org.ovirt.engine.core.bll.storage.disk.image;
import java.util.Collections;
import java.util.Map;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.ImagesContainterParametersBase;
import org.ovirt.engine.core.common.action.LockProperties;
import org.ovirt.engine.core.common.action.LockProperties.Scope;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.VdsDynamic;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.locks.LockingGroup;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.VdsDynamicDao;
public abstract class ImageSpmCommand<T extends ImagesContainterParametersBase> extends BaseImagesCommand<T> {
private Guid cachedSpmId;
@Inject
private VdsDynamicDao vdsDynamicDao;
public ImageSpmCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
setStoragePoolId(getParameters().getStoragePoolId());
}
@Override
protected LockProperties applyLockProperties(LockProperties lockProperties) {
return lockProperties.withScope(Scope.Execution);
}
private Guid getPoolSpmId() {
if (cachedSpmId == null) {
cachedSpmId = getStoragePool().getSpmVdsId();
}
return cachedSpmId;
}
@Override
protected boolean validate() {
if (getPoolSpmId() == null) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_NO_SPM);
}
setStoragePool(null);
if (getStoragePool() == null) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST);
}
if (!getPoolSpmId().equals(getStoragePool().getSpmVdsId())) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_SPM_CHANGED);
}
VdsDynamic vdsDynamic = vdsDynamicDao.get(getPoolSpmId());
if (vdsDynamic == null || vdsDynamic.getStatus() != VDSStatus.Up) {
addValidationMessage(EngineMessage.VAR__HOST_STATUS__UP);
return failValidation(EngineMessage.ACTION_TYPE_FAILED_VDS_STATUS_ILLEGAL);
}
setVdsId(vdsDynamic.getId());
if (!commandSpecificValidate()) {
return false;
}
return true;
}
protected boolean commandSpecificValidate() {
return true;
}
protected abstract VDSReturnValue executeVdsCommand();
@Override
protected void executeCommand() {
VDSReturnValue vdsReturnValue = executeVdsCommand();
if (vdsReturnValue.getSucceeded()) {
Guid taskId = persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
getTaskIdList().add(createTask(taskId,
vdsReturnValue.getCreationInfo(),
getParameters().getParentCommand(),
VdcObjectType.Storage,
getParameters().getStorageDomainId(),
getParameters().getDestinationImageId()));
setSucceeded(true);
}
}
@Override
protected void endSuccessfully() {
setSucceeded(true);
}
@Override
protected void endWithFailure() {
setSucceeded(true);
}
@Override
protected Map<String, Pair<String, String>> getSharedLocks() {
if (getStoragePool() != null && getPoolSpmId() != null) {
return Collections.singletonMap(getPoolSpmId().toString(),
new Pair<>(LockingGroup.VDS_EXECUTION.toString(),
EngineMessage.ACTION_TYPE_FAILED_OBJECT_LOCKED.toString()));
}
return null;
}
}