package org.openstack.atlas.api.validation.validators;
import org.openstack.atlas.docs.loadbalancers.api.v1.IpVersion;
import org.openstack.atlas.docs.loadbalancers.api.v1.VirtualIp;
import org.openstack.atlas.api.validation.verifiers.Ipv6VipVersionVerifier;
import org.openstack.atlas.api.validation.verifiers.MustBeInArray;
import org.openstack.atlas.api.validation.verifiers.PublicVipTypeVerifier;
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.ServicenetVip6TypeVerifier;
import org.openstack.atlas.api.validation.verifiers.Verifier;
import org.openstack.atlas.api.validation.verifiers.VerifierResult;
import static org.openstack.atlas.api.validation.context.HttpRequestType.POST;
import static org.openstack.atlas.api.validation.context.VirtualIpContext.POST_IPV6;
import static org.openstack.atlas.api.validation.ValidatorBuilder.build;
public class VirtualIpValidator implements ResourceValidator<VirtualIp> {
private final Validator<VirtualIp> validator;
public VirtualIpValidator() {
validator = build(new ValidatorBuilder<VirtualIp>(VirtualIp.class) {
{
// SHARED EXPECTATIONS
result(validationTarget().getAddress()).must().not().exist().withMessage("Virtual ip address field cannot be modified.");
must().adhereTo(new Verifier<VirtualIp>() {
@Override
public VerifierResult verify(VirtualIp virtualIp) {
return new VerifierResult(virtualIp.getId() != null || virtualIp.getType() != null || virtualIp.getIpVersion() != null);
}
}).withMessage("The virtual ip must have at least one of the following specified: id, type, ipVersion.");
// POST CONTEXT (LOADBALANCER CREATE)
must().adhereTo(new ServicenetVip6TypeVerifier()).forContext(POST).withMessage("Must specify a valid IP type. IPv6 supports the 'PUBLIC' type only.");
must().adhereTo(new Verifier<VirtualIp>() {
@Override
public VerifierResult verify(VirtualIp virtualIp) {
if (virtualIp.getId() != null && (virtualIp.getType() != null || virtualIp.getIpVersion() != null)) {
return new VerifierResult(false);
}
return new VerifierResult(true);
}
}).forContext(POST).withMessage("If sharing a virtual ip please only specify the id.");
must().adhereTo(new Verifier<VirtualIp>() {
@Override
public VerifierResult verify(VirtualIp virtualIp) {
if (virtualIp.getId() != null && (virtualIp.getType() != null || virtualIp.getIpVersion() != null)) {
return new VerifierResult(false);
}
return new VerifierResult(true);
}
}).forContext(POST_IPV6).withMessage("If sharing a virtual ip please only specify the id.");
must().adhereTo(new Verifier<VirtualIp>() {
@Override
public VerifierResult verify(VirtualIp virtualIp) {
if (virtualIp.getId() == null && virtualIp.getType() == null) {
return new VerifierResult(false);
}
return new VerifierResult(true);
}
}).forContext(POST_IPV6).withMessage("Must specify a valid ip type");
result(validationTarget().getIpVersion()).if_().exist().then().must().adhereTo(new MustBeInArray(IpVersion.values())).withMessage("Must specify a valid IP version.");
// VIRTUAL IP POST CONTEXT (PUBLIC ADD VIP)
result(validationTarget().getId()).must().not().exist().forContext(POST_IPV6).withMessage("Cannot add a shared virtual ip.");
must().adhereTo(new Verifier<VirtualIp>() {
@Override
public VerifierResult verify(VirtualIp virtualIp) {
if (virtualIp.getId() == null && (virtualIp.getType() == null || virtualIp.getIpVersion() == null)) {
return new VerifierResult(false);
}
return new VerifierResult(true);
}
}).forContext(POST_IPV6).withMessage("Must specify a valid ip type and a valid ip version.");
result(validationTarget().getType()).if_().exist().then().must().adhereTo(new PublicVipTypeVerifier()).forContext(POST_IPV6).withMessage("Must specify a valid IP type. IPv6 supports the 'PUBLIC' type only.");
result(validationTarget().getIpVersion()).if_().exist().then().must().adhereTo(new Ipv6VipVersionVerifier()).forContext(POST_IPV6).withMessage("Must specify a valid IP version, currently only IPv6 is supported for this operation.");
}
});
}
@Override
public ValidatorResult validate(VirtualIp virtualIp, Object httpRequestType) {
ValidatorResult result = validator.validate(virtualIp, httpRequestType);
return ValidatorUtilities.removeEmptyMessages(result);
}
@Override
public Validator<VirtualIp> getValidator() {
return validator;
}
}