package org.ovirt.engine.core.bll.validator;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.VmRngDevice;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Version;
import org.ovirt.engine.core.utils.RngUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class VirtIoRngValidator {
private final Logger log = LoggerFactory.getLogger(VirtIoRngValidator.class);
/**
* If {@code cluster} compatibility level matches {@code effectiveVersion} or {@code effectiveVersion} is null, it
* checks whether the rng device source is among cluster required sources.
*
* <p>Otherwise {@link VmRngDevice.Source.URANDOM} and {@link VmRngDevice.Source.RANDOM} rng sources are considered
* valid even if not present in {@link Cluster#getRequiredRngSources()}. This exception allows to change rng source
* according to custom compatibility level. Warning is printed in this case.</p>
*
* @param effectiveVersion of vm-like entity the rng device will be assigned to
*/
public ValidationResult canAddRngDevice(Cluster cluster, VmRngDevice rngDevice, Version effectiveVersion) {
final RngUtils.RngValidationResult rngValidationResult = RngUtils.validate(cluster, rngDevice, effectiveVersion);
switch (rngValidationResult) {
case VALID:
return ValidationResult.VALID;
case UNSUPPORTED_URANDOM_OR_RANDOM:
log.warn("Random number source {} is not supported in cluster '{}' compatibility version {}.",
rngDevice.getSource(),
cluster.getName(),
cluster.getCompatibilityVersion());
return ValidationResult.VALID;
case INVALID:
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_GENERATOR_NOT_SUPPORTED_BY_CLUSTER);
default:
throw new RuntimeException("Unknown enum constant " + rngValidationResult);
}
}
}