package org.ovirt.engine.core.bll;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.bll.validator.VmWatchdogValidator;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.WatchdogParameters;
import org.ovirt.engine.core.common.businessentities.VmDevice;
import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType;
import org.ovirt.engine.core.common.businessentities.VmWatchdog;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.dao.VmDeviceDao;
/**
* Abstract base-class for watchdog manipulation commands.
*/
public abstract class AbstractVmWatchdogCommand<T extends WatchdogParameters> extends CommandBase<T> {
@Inject
private VmDeviceDao vmDeviceDao;
public AbstractVmWatchdogCommand(T parameters, CommandContext commandContext) {
super(parameters, commandContext);
}
protected List<VmDevice> getWatchdogs() {
return vmDeviceDao.getVmDeviceByVmIdAndType(getParameters().getId(), VmDeviceGeneralType.WATCHDOG);
}
@Override
public List<PermissionSubject> getPermissionCheckSubjects() {
List<PermissionSubject> permissionList = new ArrayList<>();
permissionList.add(new PermissionSubject(getParameters().getId(),
getParameters().isVm() ? VdcObjectType.VM : VdcObjectType.VmTemplate,
getActionType().getActionGroup()));
return permissionList;
}
/**
* Create specParams from the parameters.
*/
protected HashMap<String, Object> getSpecParams() {
HashMap<String, Object> specParams = new HashMap<>();
specParams.put("action", getParameters().getAction().name().toLowerCase());
specParams.put("model", getParameters().getModel().name());
return specParams;
}
@Override
protected boolean validate() {
if (!entityExists()) {
return failValidation(getParameters().isVm() ? EngineMessage.ACTION_TYPE_FAILED_VM_NOT_FOUND
: EngineMessage.ACTION_TYPE_FAILED_TEMPLATE_DOES_NOT_EXIST);
}
return true;
}
protected boolean entityExists() {
if (getParameters().isVm()) {
setVmId(getParameters().getId());
return getVm() != null;
} else {
setVmTemplateId(getParameters().getId());
return getVmTemplate() != null;
}
}
protected VmWatchdogValidator getVmWatchdogValidator() {
VmWatchdogValidator vmWatchdogValidator = null;
VmWatchdog watchdog = createWatchdogFromParams();
if (getParameters().isVm()) {
vmWatchdogValidator = new VmWatchdogValidator(getVm().getOs(), watchdog,
getVm().getCompatibilityVersion());
} else {
if (getVmTemplate().getClusterId() != null) {
vmWatchdogValidator = new VmWatchdogValidator(getVmTemplate().getOsId(), watchdog,
getVmTemplate().getCompatibilityVersion());
}
}
return vmWatchdogValidator;
}
private VmWatchdog createWatchdogFromParams() {
VmWatchdog watchdog = new VmWatchdog();
watchdog.setAction(getParameters().getAction());
watchdog.setModel(getParameters().getModel());
watchdog.setVmId(getParameters().getId());
return watchdog;
}
protected ValidationResult validateWatchdog() {
if (!getParameters().isClusterIndependent()) {
VmWatchdogValidator validator = getVmWatchdogValidator();
if (validator != null) {
return validator.isValid();
} else {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_CLUSTER_CAN_NOT_BE_EMPTY);
}
} else {
return new VmWatchdogValidator.VmWatchdogClusterIndependentValidator(createWatchdogFromParams()).isValid();
}
}
}