package org.openstack.atlas.api.validation.validators;
import org.openstack.atlas.docs.loadbalancers.api.v1.HealthMonitor;
import org.openstack.atlas.docs.loadbalancers.api.v1.HealthMonitorType;
import org.openstack.atlas.api.validation.verifiers.HealthMonitorTypeVerifier;
import org.openstack.atlas.api.validation.verifiers.HealthMonitorTypeVerifier;
import org.openstack.atlas.api.validation.verifiers.MustBeIntegerInRange;
import org.openstack.atlas.api.validation.Validator;
import org.openstack.atlas.api.validation.ValidatorBuilder;
import org.openstack.atlas.api.validation.results.ValidatorResult;
import org.openstack.atlas.api.validation.verifiers.MustBeIntegerInRange;
import static org.openstack.atlas.api.validation.context.HttpRequestType.PUT;
import static org.openstack.atlas.api.validation.ValidatorBuilder.build;
public class HealthMonitorValidator implements ResourceValidator<HealthMonitor> {
private final Validator<HealthMonitor> validator;
public static final Integer FLOOR = 1;
public static final Integer CEILING = 99999;
private final int[] MAX_DELAY_RANGE = new int[]{1, 3600};
private final int[] MAX_TIMEOUT_RANGE = new int[]{1, 300};
private final int[] MAX_ATTEMPTS_BEFORE_DEACTIVATION = new int[]{1, 10};
public HealthMonitorValidator() {
validator = build(new ValidatorBuilder<HealthMonitor>(HealthMonitor.class) {
{
// SHARED EXPECTATIONS
must().exist().withMessage("Must provide a health monitor.");
result(validationTarget().getType()).must().exist().withMessage("Must provide a type for the health monitor.");
result(validationTarget().getDelay()).if_().exist().then().must().adhereTo(new MustBeIntegerInRange(MAX_DELAY_RANGE[0], MAX_DELAY_RANGE[1])).withMessage("Must specify valid delay range.");
result(validationTarget().getTimeout()).if_().exist().then().must().adhereTo(new MustBeIntegerInRange(MAX_TIMEOUT_RANGE[0], MAX_TIMEOUT_RANGE[1])).withMessage("Must specify valid timeout range.");
result(validationTarget().getAttemptsBeforeDeactivation()).if_().exist().then().must().adhereTo(new MustBeIntegerInRange(MAX_ATTEMPTS_BEFORE_DEACTIVATION[0], MAX_ATTEMPTS_BEFORE_DEACTIVATION[1])).withMessage("Must specify valid attempts before deactivation range.");
// PUT EXPECTATIONS
if_().adhereTo(new HealthMonitorTypeVerifier(HealthMonitorType.CONNECT)).then().must().delegateTo(new ConnectHealthMonitorValidator().getValidator(), PUT).forContext(PUT);
if_().adhereTo(new HealthMonitorTypeVerifier(HealthMonitorType.HTTP)).then().must().delegateTo(new HttpHealthMonitorValidator().getValidator(), PUT).forContext(PUT);
if_().adhereTo(new HealthMonitorTypeVerifier(HealthMonitorType.HTTPS)).then().must().delegateTo(new HttpHealthMonitorValidator().getValidator(), PUT).forContext(PUT);
}
});
}
@Override
public ValidatorResult validate(HealthMonitor healthMonitor, Object ctx) {
return validator.validate(healthMonitor, ctx);
}
@Override
public Validator<HealthMonitor> getValidator() {
return validator;
}
}