@Override public InferRolesAnswerElement answer() { InferRolesQuestion question = (InferRolesQuestion) _question; InferRolesAnswerElement answerElement = new InferRolesAnswerElement(null, null); // collect relevant nodes in a list. Set<String> nodes = question.getNodeRegex().getMatchingNodes(_batfish); SortedSet<NodeRoleDimension> roleDimensions = new InferRoles(nodes, _batfish.getEnvironmentTopology(), question.getCaseSensitive()) .inferRoles(); answerElement.getRoleDimensions().addAll(roleDimensions); for (NodeRoleDimension dimension : roleDimensions) { SortedMap<String, SortedSet<String>> roleNodesMap = dimension.createRoleNodesMap(nodes); SortedSet<String> matchingNodes = new TreeSet<>(); for (SortedSet<String> nodeSet : roleNodesMap.values()) { matchingNodes.addAll(nodeSet); } answerElement.getMatchingNodesCount().put(dimension.getName(), matchingNodes.size()); } return answerElement; } }
@Override public RolesAnswerElement answer() { RolesQuestion question = (RolesQuestion) _question; // collect relevant nodes in a list. Set<String> nodes = question.getNodeRegex().getMatchingNodes(_batfish); NodeRoleDimension roleDimension = _batfish .getNodeRoleDimension(question.getRoleDimension()) .orElseThrow( () -> new BatfishException( "No role dimension found for " + question.getRoleDimension())); RolesAnswerElement answerElement = new RolesAnswerElement(roleDimension, roleDimension.createRoleNodesMap(nodes)); return answerElement; } }
roleDimension.createRoleNodesMap(includeNodes);
@Test public void inferRolesOnExampleTopology() throws JsonProcessingException { SortedSet<NodeRoleDimension> roles = new InferRoles(EXAMPLE_NODES, EXAMPLE_TOPOLOGY).inferRoles(); assertThat(BatfishObjectMapper.writePrettyString(roles), roles, hasSize(2)); NodeRoleDimension d1 = roles.first(); assertThat( d1.createRoleNodesMap(EXAMPLE_NODES), equalTo( ImmutableMap.of( "border", filterSet(EXAMPLE_NODES, s -> s.toLowerCase().contains("border")), "core", filterSet(EXAMPLE_NODES, s -> s.toLowerCase().contains("core")), "dept", filterSet(EXAMPLE_NODES, s -> s.toLowerCase().contains("dept")), "dist", filterSet(EXAMPLE_NODES, s -> s.toLowerCase().contains("dist"))))); NodeRoleDimension d2 = roles.last(); assertThat( d2.createRoleNodesMap(EXAMPLE_NODES), equalTo( ImmutableMap.of( "as", filterSet(EXAMPLE_NODES, s -> s.toLowerCase().startsWith("as"))))); }
expected1.put( "as3-core", filterSet(EXAMPLE_NODES, s -> s.contains("as3") && s.contains("core"))); assertThat(d1.createRoleNodesMap(EXAMPLE_NODES), equalTo(ImmutableMap.copyOf(expected1))); d2.createRoleNodesMap(EXAMPLE_NODES), equalTo(ImmutableMap.of("as", filterSet(EXAMPLE_NODES, s -> s.startsWith("as"))))); expected3.put("core", filterSet(EXAMPLE_NODES, s -> s.contains("core"))); expected3.put("dist", filterSet(EXAMPLE_NODES, s -> s.contains("dist"))); assertThat(d3.createRoleNodesMap(EXAMPLE_NODES), equalTo(ImmutableMap.copyOf(expected3)));
@Test public void inferRolesOnExampleTopology() throws JsonProcessingException { SortedSet<NodeRoleDimension> roles = new InferRoles(EXAMPLE_NODES, EXAMPLE_TOPOLOGY).inferRoles(); assertThat(BatfishObjectMapper.writePrettyString(roles), roles, hasSize(2)); // Note: currently we do not find a "host" role because it does not match the majority // tokenization. If we had as1host1, e.g., we would. NodeRoleDimension d1 = roles.first(); assertThat( d1.createRoleNodesMap(EXAMPLE_NODES), equalTo( ImmutableMap.of( "border", filterSet(EXAMPLE_NODES, s -> s.contains("border")), "core", filterSet(EXAMPLE_NODES, s -> s.contains("core")), "dept", filterSet(EXAMPLE_NODES, s -> s.contains("dept")), "dist", filterSet(EXAMPLE_NODES, s -> s.contains("dist"))))); NodeRoleDimension d2 = roles.last(); assertThat( d2.createRoleNodesMap(EXAMPLE_NODES), equalTo(ImmutableMap.of("as", filterSet(EXAMPLE_NODES, s -> s.startsWith("as"))))); } }