package org.openstack.atlas.api.mgmt.validation.validators;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.BlacklistItem;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.BlacklistType;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.IpVersion;
import org.openstack.atlas.docs.loadbalancers.api.v1.VipType;
import org.openstack.atlas.api.validation.validators.ResourceValidator;
import org.openstack.atlas.api.validation.validators.ValidatorUtilities;
import org.openstack.atlas.api.validation.verifiers.MustBeInArray;
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.MustBeInArray;
import org.openstack.atlas.api.validation.verifiers.Verifier;
import org.openstack.atlas.api.validation.verifiers.VerifierResult;
import static org.openstack.atlas.util.ip.IPUtils.isValidIpv4Subnet;
import static org.openstack.atlas.util.ip.IPUtils.isValidIpv6Subnet;
import static org.openstack.atlas.api.validation.ValidatorBuilder.build;
public class BlacklistItemValidator implements ResourceValidator<BlacklistItem> {
private final Validator<BlacklistItem> validator;
public BlacklistItemValidator() {
validator = build(new ValidatorBuilder<BlacklistItem>(
BlacklistItem.class) {
{
// SHARED EXPECTATIONS
//ipv6 validation here..
result(validationTarget().getId()).must().not().exist().withMessage("Must not provide an id for this request.");
result(validationTarget().getType()).if_().exist().then().must().adhereTo(new MustBeInArray(BlacklistType.values())).withMessage("Blacklist type is invalid. Please specify a valid type.");
result(validationTarget().getIpVersion()).must().exist().then().must().adhereTo(new MustBeInArray(IpVersion.values())).withMessage("Blacklist ip version is invalid. Please specify a valid version.");
result(validationTarget().getCidrBlock()).must().exist().withMessage("Must provide an ip address to blacklist");
must().adhereTo(new Verifier<BlacklistItem>() {
@Override
public VerifierResult verify(BlacklistItem bli) {
String ip;
ip = bli.getCidrBlock();
if(bli == null || ip == null) return new VerifierResult(true); // Its some other validators job to reject null;
switch(bli.getIpVersion()) {
case IPV4:
return new VerifierResult(isValidIpv4Subnet(ip));
case IPV6:
return new VerifierResult(isValidIpv6Subnet(ip));
default:
return new VerifierResult(true); // Again the IpVersion is validated in another expectation
}
}
}).withMessage("Ip address must be a valid Cidr for the given ip version");
}
});
}
@Override
public ValidatorResult validate(BlacklistItem blitem, Object httpRequestType) {
ValidatorResult result = validator.validate(blitem, httpRequestType);
return ValidatorUtilities.removeEmptyMessages(result);
}
@Override
public Validator<BlacklistItem> getValidator() {
return validator;
}
}