package org.ovirt.engine.core.bll.validator;
import java.util.Set;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.VmWatchdog;
import org.ovirt.engine.core.common.businessentities.VmWatchdogType;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.osinfo.OsRepository;
import org.ovirt.engine.core.common.utils.SimpleDependencyInjector;
import org.ovirt.engine.core.compat.Version;
/**
* A class that can validate a {@link VmWatchdog} is valid from certain aspects.
*/
public class VmWatchdogValidator {
private VmWatchdogClusterIndependentValidator clusterIndependentPart;
private VmWatchdogClusterDependentValidator clusterDependentPart;
public VmWatchdogValidator(int osId, VmWatchdog vmWatchdog, Version version) {
this.clusterIndependentPart = new VmWatchdogClusterIndependentValidator(vmWatchdog);
this.clusterDependentPart = new VmWatchdogClusterDependentValidator(osId, vmWatchdog, version);
}
public ValidationResult isValid() {
ValidationResult properlyFilledResult = clusterIndependentPart.isValid();
if (!properlyFilledResult.isValid()) {
return properlyFilledResult;
}
return clusterDependentPart.isValid();
}
public static class VmWatchdogClusterDependentValidator {
private int osId;
private Version version;
private VmWatchdog vmWatchdog;
public VmWatchdogClusterDependentValidator(int osId, VmWatchdog vmWatchdog, Version version) {
this.osId = osId;
this.version = version;
this.vmWatchdog = vmWatchdog;
}
/**
* Check if the watchdog model is supported (as per the configuration), taking into account the
* OS type.
*
* @return An error if the watchdog model is not compatible with the selected operating system,
* otherwise it's OK.
*/
public ValidationResult isValid() {
Set<VmWatchdogType> vmWatchdogTypes = getOsRepository().getVmWatchdogTypes(osId, version);
return !vmWatchdogTypes.contains(vmWatchdog.getModel())
? new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_ILLEGAL_WATCHDOG_MODEL_IS_NOT_SUPPORTED_BY_OS)
: ValidationResult.VALID;
}
public OsRepository getOsRepository() {
return SimpleDependencyInjector.getInstance().get(OsRepository.class);
}
}
public static class VmWatchdogClusterIndependentValidator {
private VmWatchdog vmWatchdog;
public VmWatchdogClusterIndependentValidator(VmWatchdog vmWatchdog) {
this.vmWatchdog = vmWatchdog;
}
public ValidationResult isValid() {
if (vmWatchdog.getAction() == null) {
return new ValidationResult(EngineMessage.WATCHDOG_ACTION_REQUIRED);
}
if (vmWatchdog.getModel() == null) {
return new ValidationResult(EngineMessage.WATCHDOG_MODEL_REQUIRED);
}
return ValidationResult.VALID;
}
}
}