package org.batfish.datamodel.routing_policy; import java.util.ArrayList; import java.util.List; import org.batfish.common.util.ComparableStructure; import org.batfish.datamodel.AbstractRoute; import org.batfish.datamodel.AbstractRouteBuilder; import org.batfish.datamodel.Configuration; import org.batfish.datamodel.Ip; import org.batfish.datamodel.routing_policy.statement.Statement; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaDescription; @JsonSchemaDescription("A procedural routing policy used to transform and accept/reject IPV4/IPV6 routes") public class RoutingPolicy extends ComparableStructure<String> { /** * */ private static final long serialVersionUID = 1L; private static final String STATEMENTS_VAR = "statements"; private Configuration _owner; private List<Statement> _statements; @JsonCreator private RoutingPolicy(@JsonProperty(NAME_VAR) String name) { super(name); _statements = new ArrayList<>(); } public RoutingPolicy(String name, Configuration owner) { this(name); _owner = owner; } public Result call(Environment environment) { for (Statement statement : _statements) { Result result = statement.execute(environment); if (result.getExit()) { return result; } if (result.getReturn()) { result.setReturn(false); return result; } } Result result = new Result(); result.setFallThrough(true); result.setBooleanValue(environment.getDefaultAction()); return result; } @Override public boolean equals(Object o) { if (this == o) { return true; } RoutingPolicy other = (RoutingPolicy) o; return _statements.equals(other._statements); } @JsonIgnore public Configuration getOwner() { return _owner; } @JsonProperty(STATEMENTS_VAR) @JsonPropertyDescription("The list of routing-policy statements to execute") public List<Statement> getStatements() { return _statements; } public boolean process(AbstractRoute inputRoute, AbstractRouteBuilder<?> outputRoute, Ip peerAddress, String vrf) { Environment environment = new Environment(_owner, vrf, inputRoute, null, outputRoute, peerAddress); Result result = call(environment); return result.getBooleanValue(); } @JsonProperty(STATEMENTS_VAR) public void setStatements(List<Statement> statements) { _statements = statements; } public RoutingPolicy simplify() { List<Statement> simpleStatements = new ArrayList<>(); for (Statement statement : _statements) { simpleStatements.addAll(statement.simplify()); } RoutingPolicy simple = new RoutingPolicy(_key, _owner); simple.setStatements(simpleStatements); return simple; } }