use of org.batfish.symbolic.bdd.BDDRoute in project batfish by batfish.
the class Roles method computeRoles.
/*
* Compute all the devices/interfaces configured with the
* equivalent policies.
*/
private void computeRoles(List<Prefix> prefixes) {
Map<BDDRoute, SortedSet<String>> importBgpEcs = new HashMap<>();
Map<BDDRoute, SortedSet<String>> exportBgpEcs = new HashMap<>();
Map<BDD, SortedSet<String>> incomingAclEcs = new HashMap<>();
Map<BDD, SortedSet<String>> outgoingAclEcs = new HashMap<>();
Map<Tuple<InterfacePolicy, InterfacePolicy>, SortedSet<String>> interfaceEcs = new HashMap<>();
Map<Set<Tuple<InterfacePolicy, InterfacePolicy>>, SortedSet<String>> nodeEcs = new HashMap<>();
SortedSet<String> importBgpNull = new TreeSet<>();
SortedSet<String> exportBgpNull = new TreeSet<>();
SortedSet<String> incomingAclNull = new TreeSet<>();
SortedSet<String> outgoingAclNull = new TreeSet<>();
for (Entry<String, List<GraphEdge>> entry : _graph.getEdgeMap().entrySet()) {
String router = entry.getKey();
Matcher m = _nodeSpecifier.getRegex().matcher(router);
if (!m.matches()) {
continue;
}
List<GraphEdge> ges = entry.getValue();
Set<Tuple<InterfacePolicy, InterfacePolicy>> nodeEc = new HashSet<>();
for (GraphEdge ge : ges) {
String s = ge.toString();
BDDRoute x1 = _network.getImportBgpPolicies().get(ge);
if (x1 == null) {
importBgpNull.add(s);
} else {
x1 = (prefixes == null ? x1 : x1.restrict(prefixes));
SortedSet<String> ec = importBgpEcs.computeIfAbsent(x1, k -> new TreeSet<>());
ec.add(s);
}
BDDRoute x2 = _network.getExportBgpPolicies().get(ge);
if (x2 == null) {
exportBgpNull.add(s);
} else {
x2 = (prefixes == null ? x2 : x2.restrict(prefixes));
SortedSet<String> ec = exportBgpEcs.computeIfAbsent(x2, k -> new TreeSet<>());
ec.add(s);
}
BDDAcl x4 = _network.getInAcls().get(ge);
if (x4 == null) {
incomingAclNull.add(s);
} else {
x4 = (prefixes == null ? x4 : x4.restrict(prefixes));
SortedSet<String> ec = incomingAclEcs.computeIfAbsent(x4.getBdd(), k -> new TreeSet<>());
ec.add(s);
}
BDDAcl x5 = _network.getOutAcls().get(ge);
if (x5 == null) {
outgoingAclNull.add(s);
} else {
x5 = (prefixes == null ? x5 : x5.restrict(prefixes));
SortedSet<String> ec = outgoingAclEcs.computeIfAbsent(x5.getBdd(), k -> new TreeSet<>());
ec.add(s);
}
InterfacePolicy x6 = _network.getImportPolicyMap().get(ge);
InterfacePolicy x7 = _network.getExportPolicyMap().get(ge);
x6 = (x6 == null || prefixes == null ? x6 : x6.restrict(prefixes));
x7 = (x7 == null || prefixes == null ? x7 : x7.restrict(prefixes));
Tuple<InterfacePolicy, InterfacePolicy> tup = new Tuple<>(x6, x7);
SortedSet<String> ec = interfaceEcs.computeIfAbsent(tup, k -> new TreeSet<>());
ec.add(s);
nodeEc.add(tup);
}
SortedSet<String> ec = nodeEcs.computeIfAbsent(nodeEc, k -> new TreeSet<>());
ec.add(router);
}
Comparator<SortedSet<String>> c = comparator();
_bgpInEcs = new ArrayList<>(importBgpEcs.values());
if (!importBgpNull.isEmpty()) {
_bgpInEcs.add(importBgpNull);
}
_bgpInEcs.sort(c);
_bgpOutEcs = new ArrayList<>(exportBgpEcs.values());
if (!exportBgpNull.isEmpty()) {
_bgpOutEcs.add(exportBgpNull);
}
_bgpOutEcs.sort(c);
_aclInEcs = new ArrayList<>(incomingAclEcs.values());
if (!incomingAclNull.isEmpty()) {
_aclInEcs.add(incomingAclNull);
}
_aclInEcs.sort(c);
_aclOutEcs = new ArrayList<>(outgoingAclEcs.values());
if (!outgoingAclNull.isEmpty()) {
_aclOutEcs.add(outgoingAclNull);
}
_aclOutEcs.sort(c);
_interfaceEcs = new ArrayList<>(interfaceEcs.values());
_interfaceEcs.sort(c);
_nodeEcs = new ArrayList<>(nodeEcs.values());
_nodeEcs.sort(c);
}
Aggregations