Search in sources :

Example 26 with BDD

use of net.sf.javabdd.BDD 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);
}
Also used : BDD(net.sf.javabdd.BDD) SortedSet(java.util.SortedSet) TreeSet(java.util.TreeSet) HashSet(java.util.HashSet) Set(java.util.Set) HashMap(java.util.HashMap) Matcher(java.util.regex.Matcher) SortedSet(java.util.SortedSet) BDDRoute(org.batfish.symbolic.bdd.BDDRoute) TreeSet(java.util.TreeSet) BDDAcl(org.batfish.symbolic.bdd.BDDAcl) ArrayList(java.util.ArrayList) List(java.util.List) HashSet(java.util.HashSet) GraphEdge(org.batfish.symbolic.GraphEdge) Tuple(org.batfish.symbolic.utils.Tuple)

Aggregations

BDD (net.sf.javabdd.BDD)26 BatfishException (org.batfish.common.BatfishException)7 ArrayList (java.util.ArrayList)5 Prefix (org.batfish.datamodel.Prefix)4 SubRange (org.batfish.datamodel.SubRange)3 CommunityVar (org.batfish.symbolic.CommunityVar)3 HashSet (java.util.HashSet)2 Set (java.util.Set)2 BDDException (net.sf.javabdd.BDDException)2 PrefixRange (org.batfish.datamodel.PrefixRange)2 ExplicitPrefixSet (org.batfish.datamodel.routing_policy.expr.ExplicitPrefixSet)2 InlineCommunitySet (org.batfish.datamodel.routing_policy.expr.InlineCommunitySet)2 MatchCommunitySet (org.batfish.datamodel.routing_policy.expr.MatchCommunitySet)2 MatchPrefix6Set (org.batfish.datamodel.routing_policy.expr.MatchPrefix6Set)2 MatchPrefixSet (org.batfish.datamodel.routing_policy.expr.MatchPrefixSet)2 NamedCommunitySet (org.batfish.datamodel.routing_policy.expr.NamedCommunitySet)2 NamedPrefixSet (org.batfish.datamodel.routing_policy.expr.NamedPrefixSet)2 TransferResult (org.batfish.symbolic.TransferResult)2 HashMap (java.util.HashMap)1 List (java.util.List)1