@Override public Set<Location> resolve(SpecifierContext ctxt) { return _nodeSpecifier.resolve(ctxt).stream() .map(n -> ctxt.getConfigs().get(n).getAllInterfaces().values()) .flatMap(Collection::stream) .map(iface -> new InterfaceLocation(iface.getOwner().getHostname(), iface.getName())) .collect(Collectors.toSet()); } }
private Multimap<String, String> getSpecifiedAcls(SearchFiltersQuestion question) { SortedMap<String, Configuration> configs = _batfish.loadConfigurations(); FilterSpecifier filterSpecifier = question.getFilterSpecifier(); SpecifierContext specifierContext = _batfish.specifierContext(); ImmutableMultimap.Builder<String, String> acls = ImmutableMultimap.builder(); question.getNodesSpecifier().resolve(_batfish.specifierContext()).stream() .map(configs::get) .forEach( config -> filterSpecifier .resolve(config.getHostname(), specifierContext) .forEach(acl -> acls.put(config.getHostname(), acl.getName()))); return acls.build(); }
/** * Collects the list of specified filters that we need to process, based on the nodes desired, the * filters desired, and whether generated filters are ignored */ static Map<String, Set<IpAccessList>> getSpecifiedFilters( FilterLineReachabilityQuestion question, SpecifierContext ctxt) { Set<String> specifiedNodes = question.nodeSpecifier().resolve(ctxt); FilterSpecifier filterSpecifier = question.filterSpecifier(); return CommonUtil.toImmutableMap( specifiedNodes, Function.identity(), node -> filterSpecifier.resolve(node, ctxt).stream() .filter(f -> !(question.getIgnoreComposites() && f.isComposite())) .collect(ImmutableSet.toImmutableSet())); }
@Override public AnswerElement answer() { MlagPropertiesQuestion question = (MlagPropertiesQuestion) _question; Set<String> nodes = question.getNodeSpecifier().resolve(_batfish.specifierContext()); Pattern mlagPattern = Pattern.compile(question.getMlagIdRegex()); SortedMap<String, Configuration> configs = _batfish.loadConfigurations(); return computeAnswer(nodes, mlagPattern, configs); }
@VisibleForTesting static TableAnswerElement resolveNode(SpecifiersQuestion question, SpecifierContext context) { List<ColumnMetadata> columns = ImmutableList.of(new ColumnMetadata(COL_NODE, Schema.NODE, "Node", false, false)); TableAnswerElement table = new TableAnswerElement(new TableMetadata(columns)); Map<String, ColumnMetadata> columnMap = table.getMetadata().toColumnMap(); Set<String> nodes = question.getNodeSpecifier().resolve(context); for (String node : nodes) { table.addRow(Row.of(columnMap, COL_NODE, new Node(node))); } return table; } }
@VisibleForTesting static TableAnswerElement resolveInterface( SpecifiersQuestion question, SpecifierContext context) { List<ColumnMetadata> columns = ImmutableList.of( new ColumnMetadata(COL_INTERFACE, Schema.INTERFACE, "Interface", false, false)); TableAnswerElement table = new TableAnswerElement(new TableMetadata(columns)); Map<String, ColumnMetadata> columnMap = table.getMetadata().toColumnMap(); InterfaceSpecifier interfaceSpecifier = question.getInterfaceSpecifier(); Set<String> nodes = question.getNodeSpecifier().resolve(context); Set<Interface> interfaces = interfaceSpecifier.resolve(nodes, context); for (Interface iface : interfaces) { table.addRow(Row.of(columnMap, COL_INTERFACE, new NodeInterfacePair(iface))); } return table; }
Set<String> forbiddenTransitNodes = pathConstraints.getForbiddenLocations().resolve(ctxt); Set<String> requiredTransitNodes = pathConstraints.getTransitLocations().resolve(ctxt); Set<Location> startLocations = pathConstraints.getStartLocation().resolve(ctxt); Set<String> finalNodes = pathConstraints.getEndLocation().resolve(ctxt);
@VisibleForTesting static TableAnswerElement resolveFilter(SpecifiersQuestion question, SpecifierContext context) { List<ColumnMetadata> columns = ImmutableList.of( new ColumnMetadata(COL_NODE, Schema.NODE, "Node", false, false), new ColumnMetadata(COL_FILTER_NAME, Schema.STRING, "Filter name", false, false)); TableAnswerElement table = new TableAnswerElement(new TableMetadata(columns)); Map<String, ColumnMetadata> columnMap = table.getMetadata().toColumnMap(); FilterSpecifier filterSpecifier = question.getFilterSpecifier(); Set<String> nodes = question.getNodeSpecifier().resolve(context); for (String node : nodes) { Set<IpAccessList> nodeFilters = filterSpecifier.resolve(node, context); for (IpAccessList filter : nodeFilters) { table.addRow( Row.of( columnMap, COL_NODE, new Node(node), COL_FILTER_NAME, Objects.toString(filter.getName()))); } } return table; }
@Override public TableAnswerElement answer() { VxlanVniPropertiesQuestion question = (VxlanVniPropertiesQuestion) _question; Map<String, Configuration> configurations = _batfish.loadConfigurations(); Set<String> nodes = question.getNodeSpecifier().resolve(_batfish.specifierContext()); TableMetadata tableMetadata = createTableMetadata(question); TableAnswerElement answer = new TableAnswerElement(tableMetadata); Multiset<Row> propertyRows = getProperties(question.getProperties(), configurations, nodes, tableMetadata.toColumnMap()); answer.postProcessAnswer(question, propertyRows); return answer; }
@Override public AnswerElement answer() { BgpPeerConfigurationQuestion question = (BgpPeerConfigurationQuestion) _question; Map<String, Configuration> configurations = _batfish.loadConfigurations(); Set<String> nodes = question.getNodesSpecifier().resolve(_batfish.specifierContext()); TableMetadata tableMetadata = createTableMetadata(question); TableAnswerElement answer = new TableAnswerElement(tableMetadata); Multiset<Row> propertyRows = getAnswerRows(configurations, nodes, tableMetadata.toColumnMap(), question.getProperties()); answer.postProcessAnswer(question, propertyRows); return answer; }
Set<String> forbiddenTransitNodes = pathConstraints.getForbiddenLocations().resolve(ctxt); Set<String> requiredTransitNodes = pathConstraints.getTransitLocations().resolve(ctxt); Set<Location> startLocations = pathConstraints.getStartLocation().resolve(ctxt); Set<String> finalNodes = pathConstraints.getEndLocation().resolve(ctxt);
@Test public void testReachFilterNodeSpecifierDefault() { SearchFiltersQuestion q = new SearchFiltersQuestion(); Set<String> nodes = q.getNodesSpecifier().resolve(_batfish.specifierContext()); assertThat(nodes, contains(_config.getHostname())); q = SearchFiltersQuestion.builder() .setFilterSpecifier(ACL.getName()) .setAction("permit") .setNodeSpecifier("UNMATCHABLE") .build(); nodes = q.getNodesSpecifier().resolve(_batfish.specifierContext()); assertThat(nodes, emptyIterable()); }
Set<String> finalNodes = params.getFinalNodesSpecifier().resolve(context); if (finalNodes.isEmpty()) { throw new InvalidReachabilityParametersException("No final nodes"); Set<String> forbiddenTransitNodes = params.getForbiddenTransitNodesSpecifier().resolve(context); Set<String> requiredTransitNodes = params.getRequiredTransitNodesSpecifier().resolve(context); if (!requiredTransitNodes.isEmpty() && forbiddenTransitNodes.containsAll(requiredTransitNodes)) {
@Override public TableAnswerElement answer() { SwitchedVlanPropertiesQuestion question = (SwitchedVlanPropertiesQuestion) _question; Map<String, Configuration> configurations = _batfish.loadConfigurations(); Set<String> nodes = question.getNodesSpecifier().resolve(_batfish.specifierContext()); TableMetadata tableMetadata = createTableMetadata(question); TableAnswerElement answer = new TableAnswerElement(tableMetadata); Multiset<Row> propertyRows = getProperties( _batfish.specifierContext(), configurations, nodes, question.getInterfacesSpecifier(), question.getExcludeShutInterfaces(), question.getVlans(), tableMetadata.toColumnMap()); answer.postProcessAnswer(question, propertyRows); return answer; } }