@Test public void testDefaults() { PathConstraintsInput pci = PathConstraintsInput.unconstrained(); assertThat(pci.getStartLocation(), nullValue()); assertThat(pci.getEndLocation(), nullValue()); assertThat(pci.getTransitLocations(), nullValue()); assertThat(pci.getForbiddenLocations(), nullValue()); } }
public PathConstraintsInput build() { PathConstraintsInput pathConstraintsInput = new PathConstraintsInput(null, null, null, null); pathConstraintsInput._startLocation = this._startLocation; pathConstraintsInput._forbiddenLocations = this._forbiddenLocations; pathConstraintsInput._transitLocations = this._transitLocations; pathConstraintsInput._endLocation = this._endLocation; return pathConstraintsInput; } }
@JsonCreator public MultipathConsistencyQuestion( @Nullable @JsonProperty(PROP_HEADERS) PacketHeaderConstraints headerConstraints, @Nullable @JsonProperty(PROP_MAX_TRACES) Integer maxTraces, @Nullable @JsonProperty(PROP_PATH_CONSTRAINTS) PathConstraintsInput pathConstraints) { setDifferential(false); _headerConstraints = firstNonNull(headerConstraints, PacketHeaderConstraints.unconstrained()); _maxTraces = firstNonNull(maxTraces, DEFAULT_MAX_TRACES); _pathConstraints = firstNonNull(pathConstraints, PathConstraintsInput.unconstrained()); }
/** * Test that the results we get with the default source IpSpace specifier ({@link * org.batfish.specifier.InferFromLocationIpSpaceSpecifier}) are correct for the network. */ @Test public void testInferSrcIpFromLocation() { SpecifiersReachabilityQuestion question = SpecifiersReachabilityQuestion.builder() .setPathConstraints( PathConstraintsInput.builder() .setStartLocation(String.format("%s[%s]", NODE1, LOOPBACK)) .build()) .build(); AnswerElement answer = new SpecifiersReachabilityAnswerer(question, _batfish).answer(); assertThat(answer, instanceOf(TableAnswerElement.class)); TableAnswerElement tableAnswerElement = (TableAnswerElement) answer; assertThat(tableAnswerElement.getRowsList().size(), equalTo(1)); assertThat( tableAnswerElement, hasRows( hasItem( hasColumn( COL_FLOW, allOf(hasIngressNode(NODE1), hasSrcIp(NODE1_LOOPBACK_IP)), FLOW)))); }
@JsonCreator public DifferentialReachabilityQuestion( @Nullable @JsonProperty(PROP_ACTIONS) DispositionSpecifier actions, @Nullable @JsonProperty(PROP_HEADERS) PacketHeaderConstraints headerConstraints, @Nullable @JsonProperty(PROP_IGNORE_FILTERS) Boolean ignoreFilters, @Nullable @JsonProperty(PROP_INVERT_SEARCH) Boolean invertSearch, @Nullable @JsonProperty(PROP_MAX_TRACES) Integer maxTraces, @Nullable @JsonProperty(PROP_PATH_CONSTRAINTS) PathConstraintsInput pathConstraints) { setDifferential(true); _actions = firstNonNull(actions, SUCCESS_SPECIFIER); _headerConstraints = firstNonNull(headerConstraints, PacketHeaderConstraints.unconstrained()); _ignoreFilters = firstNonNull(ignoreFilters, false); _invertSearch = firstNonNull(invertSearch, false); _maxTraces = firstNonNull(maxTraces, DEFAULT_MAX_TRACES); _pathConstraints = firstNonNull(pathConstraints, PathConstraintsInput.unconstrained()); }
SpecifiersReachabilityQuestion.builder() .setPathConstraints( PathConstraintsInput.builder() .setStartLocation(".*") .setForbiddenLocations(".*")
Optional.ofNullable(input.getForbiddenLocations()) .map(nodeSpecifierFactory::buildNodeSpecifier) .orElse(NoNodesNodeSpecifier.INSTANCE); NodeSpecifier requiredTransitNodes = Optional.ofNullable(input.getTransitLocations()) .map(nodeSpecifierFactory::buildNodeSpecifier) .orElse(NoNodesNodeSpecifier.INSTANCE); return PathConstraints.builder() .withStartLocation( new FlexibleLocationSpecifierFactory().buildLocationSpecifier(input.getStartLocation())) .withEndLocation(nodeSpecifierFactory.buildNodeSpecifier(input.getEndLocation())) .avoid(forbiddenTransitNodes) .through(requiredTransitNodes)
/** * Create a new reachability question. {@code null} values result in default parameter values. * * @param actions set of actions/flow dispositions to search for (default is {@code success}) * @param headerConstraints header constraints that constrain the search space of valid flows. * Default is unconstrained. * @param ignoreFilters whether to ignore ingress and egress ACLs. * @param pathConstraints path constraints dictating where a flow can originate/terminate/transit. * Default is unconstrained. */ @JsonCreator public SpecifiersReachabilityQuestion( @Nullable @JsonProperty(PROP_ACTIONS) DispositionSpecifier actions, @Nullable @JsonProperty(PROP_HEADER_CONSTRAINT) PacketHeaderConstraints headerConstraints, @Nullable @JsonProperty(PROP_IGNORE_FILTERS) Boolean ignoreFilters, @Nullable @JsonProperty(PROP_INVERT_SEARCH) Boolean invertSearch, @Nullable @JsonProperty(PROP_MAX_TRACES) Integer maxTraces, @Nullable @JsonProperty(PROP_PATH_CONSTRAINT) PathConstraintsInput pathConstraints) { _actions = firstNonNull(actions, DispositionSpecifier.SUCCESS_SPECIFIER); _headerConstraints = firstNonNull(headerConstraints, PacketHeaderConstraints.unconstrained()); _ignoreFilters = firstNonNull(ignoreFilters, false); _invertSearch = firstNonNull(invertSearch, false); _maxTraces = firstNonNull(maxTraces, TracePruner.DEFAULT_MAX_TRACES); _pathConstraints = firstNonNull(pathConstraints, PathConstraintsInput.unconstrained()); }
SpecifiersReachabilityQuestion.builder() .setPathConstraints( PathConstraintsInput.builder() .setStartLocation(String.format("%s[%s]", NODE1, LOOPBACK)) .build())
public static PathConstraintsInput unconstrained() { return new PathConstraintsInput(null, null, null, null); }
@Test public void testHeaderSpaceConstraint2() throws IOException { Question question = new DifferentialReachabilityQuestion( new DispositionSpecifier(ImmutableSet.of(FlowDisposition.ACCEPTED)), PacketHeaderConstraints.builder().setDstIp("5.5.5.5").build(), false, false, TracePruner.DEFAULT_MAX_TRACES, PathConstraintsInput.unconstrained()); Batfish batfish = initBatfish(); TableAnswerElement answer = new DifferentialReachabilityAnswerer(question, batfish).answer(); assertThat(answer.getRows().size(), equalTo(0)); } }
SpecifiersReachabilityQuestion.builder() .setPathConstraints( PathConstraintsInput.builder() .setStartLocation(String.format("%s[%s]", ".*", LOOPBACK)) .setTransitLocations(".*")
false, TracePruner.DEFAULT_MAX_TRACES, PathConstraintsInput.unconstrained()); Batfish batfish = initBatfish(); TableAnswerElement answer = new DifferentialReachabilityAnswerer(question, batfish).answer();
@Test public void testTransitAndForbiddenNodesSpecification() { SpecifiersReachabilityQuestion question = SpecifiersReachabilityQuestion.builder() .setPathConstraints( PathConstraintsInput.builder() .setTransitLocations("foo") .setForbiddenLocations("bar") .build()) .build(); assertThat( question.getReachabilityParameters().getRequiredTransitNodesSpecifier(), equalTo( NodeSpecifierFactory.load(FlexibleNodeSpecifierFactory.NAME) .buildNodeSpecifier("foo"))); assertThat( question.getReachabilityParameters().getForbiddenTransitNodesSpecifier(), equalTo( NodeSpecifierFactory.load(FlexibleNodeSpecifierFactory.NAME) .buildNodeSpecifier("bar"))); }
false, TracePruner.DEFAULT_MAX_TRACES, PathConstraintsInput.unconstrained());