package org.openstack.atlas.api.validation.validators;
import org.openstack.atlas.docs.loadbalancers.api.v1.Node;
import org.openstack.atlas.lb.helpers.ipstring.IPv4ToolSet;
import org.openstack.atlas.api.validation.context.NetworkItemContext;
import org.openstack.atlas.api.validation.util.IPString.IPUtils;
import org.openstack.atlas.docs.loadbalancers.api.v1.NetworkItem;
import org.openstack.atlas.docs.loadbalancers.api.v1.NetworkItemType;
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.api.validation.context.NetworkItemContext.FULL;
import static org.openstack.atlas.api.validation.ValidatorBuilder.build;
public class NetworkItemValidator implements ResourceValidator<NetworkItem> {
private final Validator<NetworkItem> validator;
public NetworkItemValidator() {
validator = build(new ValidatorBuilder<NetworkItem>(NetworkItem.class) {
{
// SHARED EXPECTATIONS
result(validationTarget().getId()).must().not().exist().withMessage("Network item id field cannot be modified.");
result(validationTarget().getType()).if_().exist().then().must().adhereTo(new MustBeInArray(NetworkItemType.values())).withMessage("Network item type is invalid. Please specify a valid network item type.");
must().adhereTo(new Verifier<NetworkItem>() {
@Override
public VerifierResult verify(NetworkItem ni) {
String ipStr = ni.getAddress();
VerifierResult passed = new VerifierResult(true);
VerifierResult failed = new VerifierResult(false);
if (ipStr == null) {
return passed;
}
if(IPUtils.isValidIpv4String(ipStr)) {
return passed;
}
if(IPUtils.isValidIpv4Subnet(ipStr)) {
return passed;
}
if(IPUtils.isValidIpv6String(ipStr)) {
return passed;
}
if(IPUtils.isValidIpv6Subnet(ipStr)) {
return passed;
}
return failed;
}
}).withMessage("Network Address must be valid Ip Address");
must().adhereTo(new Verifier<NetworkItem>() {
@Override
public VerifierResult verify(NetworkItem nwi) {
String address = nwi.getAddress();
if(address == null) {
return new VerifierResult(true);
}
if(IPv4ToolSet.rejectUnwantedIps(address)) {
return new VerifierResult(false);
}
return new VerifierResult(true);
}
}).withMessage("Please specify a valid network item address.");
// FULL EXPECTATIONS
result(validationTarget().getAddress()).must().exist().forContext(FULL).withMessage("Must provide an address for the network item.");
result(validationTarget().getIpVersion()).must().not().exist().forContext(FULL).withMessage("The ip version field cannot be modified.");
result(validationTarget().getType()).must().exist().forContext(FULL).withMessage("Must provide a valid type for the network item.");
// PARTIAL EXPECTATIONS
must().adhereTo(new Verifier<NetworkItem>() {
@Override
public VerifierResult verify(NetworkItem ni) {
return new VerifierResult((ni.getAddress() != null || ni.getType() != null));
}
}).forContext(NetworkItemContext.PARTIAL).withMessage("The network item must have at least one of the following to update: ip address and/or type.");
}
});
}
@Override
public ValidatorResult validate(NetworkItem objectToValidate, Object context) {
ValidatorResult result = validator.validate(objectToValidate, context);
return ValidatorUtilities.removeEmptyMessages(result);
}
@Override
public Validator<NetworkItem> getValidator() {
return validator;
}
}