@Nonnull private static IpSpace resolveIpSpaceSpecifier(IpSpaceSpecifier specifier, SpecifierContext ctx) { return firstNonNull( AclIpSpace.union( specifier.resolve(ImmutableSet.of(), ctx).getEntries().stream() .map(Entry::getIpSpace) .collect(ImmutableList.toImmutableList())), EmptyIpSpace.INSTANCE); }
@VisibleForTesting IpSpace resolveDestinationIpSpace() throws InvalidReachabilityParametersException { IpSpace destinationIpSpace = AclIpSpace.union( _params.getDestinationIpSpaceSpecifier().resolve(ImmutableSet.of(), _context) .getEntries().stream() .map(Entry::getIpSpace) .collect(ImmutableList.toImmutableList())); /* * Make sure the destinationIpSpace is non-empty. Otherwise, we'll get no results and no * explanation why. */ if (!_ipSpaceRepresentative.getRepresentative(destinationIpSpace).isPresent()) { throw new InvalidReachabilityParametersException("Empty destination IpSpace"); } return destinationIpSpace; }
private void setDstIp(PacketHeaderConstraints constraints, Flow.Builder builder) { String headerDstIp = constraints.getDstIps(); checkArgument( constraints.getDstIps() != null, "Cannot perform traceroute without a destination"); IpSpaceSpecifier dstIpSpecifier = IpSpaceSpecifierFactory.load(IP_SPECIFIER_FACTORY).buildIpSpaceSpecifier(headerDstIp); IpSpaceAssignment dstIps = dstIpSpecifier.resolve(ImmutableSet.of(), _specifierContext); checkArgument( dstIps.getEntries().size() == 1, "Specified destination: %s, resolves to more than one IP", headerDstIp); IpSpace space = dstIps.getEntries().iterator().next().getIpSpace(); Optional<Ip> dstIp = _ipSpaceRepresentative.getRepresentative(space); checkArgument(dstIp.isPresent(), "At least one destination IP is required"); builder.setDstIp(dstIp.get()); }
@VisibleForTesting static IpSpaceAssignment initSourceIpAssignment( String sourceLocation, String sourceIps, SpecifierContext specifierContext) { /* construct specifiers */ LocationSpecifier sourceLocationSpecifier = LocationSpecifierFactory.load(SRC_LOCATION_SPECIFIER_FACTORY) .buildLocationSpecifier(sourceLocation); IpSpaceSpecifier sourceIpSpaceSpecifier = IpSpaceSpecifierFactory.load(IP_SPECIFIER_FACTORY).buildIpSpaceSpecifier(sourceIps); /* resolve specifiers */ Set<Location> sourceLocations = sourceLocationSpecifier.resolve(specifierContext); return sourceIpSpaceSpecifier.resolve(sourceLocations, specifierContext); }
IpSpaceSpecifierFactory.load(IP_SPECIFIER_FACTORY).buildIpSpaceSpecifier(headerSrcIp); IpSpaceAssignment srcIps = srcIpSpecifier.resolve(ImmutableSet.of(), _specifierContext);
@VisibleForTesting IpSpaceAssignment resolveSourceIpSpaceAssignment() throws InvalidReachabilityParametersException { Set<Location> sourceLocations = _params.getSourceLocationSpecifier().resolve(_context).stream() .filter(l -> isActive(l, _configs)) .collect(ImmutableSet.toImmutableSet()); if (sourceLocations.isEmpty()) { throw new InvalidReachabilityParametersException("No matching source locations"); } // resolve the IpSpaceSpecifier, and filter out entries with empty IpSpaces IpSpaceAssignment sourceIpSpaceAssignment = IpSpaceAssignment.of( _params.getSourceIpSpaceSpecifier().resolve(sourceLocations, _context).getEntries() .stream() .filter( entry -> _ipSpaceRepresentative.getRepresentative(entry.getIpSpace()).isPresent()) .collect(ImmutableList.toImmutableList())); if (sourceIpSpaceAssignment.getEntries().isEmpty()) { throw new InvalidReachabilityParametersException("All sources have empty source IpSpaces"); } return sourceIpSpaceAssignment; }
private void setDstIp(PacketHeaderConstraints constraints, Builder builder) { String headerDstIp = constraints.getDstIps(); if (headerDstIp != null) { IpSpaceSpecifier dstIpSpecifier = IpSpaceSpecifierFactory.load(IP_SPECIFIER_FACTORY).buildIpSpaceSpecifier(headerDstIp); IpSpaceAssignment dstIps = dstIpSpecifier.resolve(ImmutableSet.of(), _batfish.specifierContext()); // Filter out empty IP assignments ImmutableList<Entry> nonEmptyIpSpaces = dstIps.getEntries().stream() .filter(e -> !e.getIpSpace().equals(EmptyIpSpace.INSTANCE)) .collect(ImmutableList.toImmutableList()); checkArgument( nonEmptyIpSpaces.size() > 0, "At least one destination IP is required, could not resolve any"); checkArgument( nonEmptyIpSpaces.size() == 1, "Specified destination: %s, resolves to more than one IP", headerDstIp); IpSpace space = nonEmptyIpSpaces.iterator().next().getIpSpace(); Optional<Ip> dstIp = _ipSpaceRepresentative.getRepresentative(space); checkArgument(dstIp.isPresent(), "Specified destination: %s has no IPs", headerDstIp); builder.setDstIp(dstIp.get()); } else { builder.setDstIp(DEFAULT_IP_ADDRESS); } }
@VisibleForTesting static IpSpaceAssignment initSourceIpAssignment( TestFiltersQuestion question, SpecifierContext ctxt) { /* construct specifiers */ LocationSpecifier sourceLocationSpecifier = question.getStartLocationSpecifier(); IpSpaceSpecifier sourceIpSpaceSpecifier = IpSpaceSpecifierFactory.load(IP_SPECIFIER_FACTORY) .buildIpSpaceSpecifier(question.getHeaders().getSrcIps()); /* resolve specifiers */ Set<Location> sourceLocations = sourceLocationSpecifier.resolve(ctxt); return sourceIpSpaceSpecifier.resolve(sourceLocations, ctxt); }
srcIpSpecifier.resolve(ImmutableSet.of(), _batfish.specifierContext());
@VisibleForTesting static TableAnswerElement resolveIpSpace(SpecifiersQuestion question, SpecifierContext context) { List<ColumnMetadata> columns = ImmutableList.of(new ColumnMetadata(COL_IP_SPACE, Schema.STRING, "IP space", false, false)); TableAnswerElement table = new TableAnswerElement(new TableMetadata(columns)); Map<String, ColumnMetadata> columnMap = table.getMetadata().toColumnMap(); // this will yield all default locations for the factory Set<Location> locations = question.getLocationSpecifier().resolve(context); IpSpaceAssignment ipSpaceAssignment = question.getIpSpaceSpecifier().resolve(locations, context); for (IpSpaceAssignment.Entry entry : ipSpaceAssignment.getEntries()) { table.addRow(Row.of(columnMap, COL_IP_SPACE, Objects.toString(entry.getIpSpace()))); } return table; }
@VisibleForTesting static TableAnswerElement resolveIpSpaceOfLocation( SpecifiersQuestion question, SpecifierContext context) { List<ColumnMetadata> columns = ImmutableList.of( new ColumnMetadata(COL_LOCATIONS, Schema.STRING, "Resolution", false, false), new ColumnMetadata(COL_IP_SPACE, Schema.STRING, "IP space", false, false)); TableAnswerElement table = new TableAnswerElement(new TableMetadata(columns)); Map<String, ColumnMetadata> columnMap = table.getMetadata().toColumnMap(); Set<Location> locations = question.getLocationSpecifier().resolve(context); IpSpaceAssignment ipSpaceAssignment = question.getIpSpaceSpecifier().resolve(locations, context); for (IpSpaceAssignment.Entry entry : ipSpaceAssignment.getEntries()) { table.addRow( Row.of( columnMap, COL_LOCATIONS, entry.getLocations().toString(), COL_IP_SPACE, Objects.toString(entry.getIpSpace()))); } return table; }
@Test public void testDeserializationDefaultValues() throws IOException { String serialized = String.format("{\"class\":\"%s\"}", SearchFiltersQuestion.class.getCanonicalName()); SearchFiltersQuestion q = BatfishObjectMapper.mapper().readValue(serialized, SearchFiltersQuestion.class); assertThat(q.getFilterSpecifier(), notNullValue()); assertThat(q.getType(), is(Type.PERMIT)); assertThat(q.getNodesSpecifier(), notNullValue()); assertThat(q.getDataPlane(), equalTo(false)); assertThat(q.getNodes(), nullValue()); // src/dst IPs NOT stored in headerspace at this stage assertThat(q.getHeaderSpace().getDstIps(), nullValue()); assertThat(q.getHeaderSpace().getSrcIps(), nullValue()); // src/dst IPs are in specifiers at this stage SearchFiltersParameters parameters = q.toSearchFiltersParameters(); for (IpSpaceSpecifier s : Arrays.asList( parameters.getSourceIpSpaceSpecifier(), parameters.getDestinationIpSpaceSpecifier())) { assertThat( s.resolve(ImmutableSet.of(), MockSpecifierContext.builder().build()).getEntries().stream() .map(Entry::getIpSpace) .collect(ImmutableList.toImmutableList()), hasItem(UniverseIpSpace.INSTANCE)); assertThat(q.getLineNumber(), nullValue()); } }
@Test public void testNoLocations() { MockSpecifierContext ctxt = MockSpecifierContext.builder().build(); IpSpaceSpecifier specifier = new LocationIpSpaceSpecifier(new MockLocationSpecifier(ImmutableSet.of())); _expectedException.expect(IllegalArgumentException.class); _expectedException.expectMessage("No such locations"); specifier.resolve(ImmutableSet.of(), ctxt); } }
flexibleIpSpaceSpecifierFactory .buildIpSpaceSpecifier(headerConstraints.getSrcIps()) .resolve(startLocations, ctxt); IpSpace dstIps = firstNonNull( AclIpSpace.union( flexibleIpSpaceSpecifierFactory.buildIpSpaceSpecifier(headerConstraints.getDstIps()) .resolve(ImmutableSet.of(), ctxt).getEntries().stream() .map(Entry::getIpSpace) .collect(ImmutableList.toImmutableList())),
flexibleIpSpaceSpecifierFactory .buildIpSpaceSpecifier(headerConstraints.getSrcIps()) .resolve(startLocations, ctxt); IpSpace dstIps = firstNonNull( AclIpSpace.union( flexibleIpSpaceSpecifierFactory.buildIpSpaceSpecifier(headerConstraints.getDstIps()) .resolve(ImmutableSet.of(), ctxt).getEntries().stream() .map(Entry::getIpSpace) .collect(ImmutableList.toImmutableList())),