Search in sources :

Example 46 with GraphEdge

use of org.batfish.symbolic.GraphEdge 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)

Example 47 with GraphEdge

use of org.batfish.symbolic.GraphEdge in project batfish by batfish.

the class PatternUtils method findMatchingEdges.

public static List<GraphEdge> findMatchingEdges(Graph graph, Pattern p1, Pattern p2, Pattern p3, Pattern p4) {
    List<GraphEdge> acc = new ArrayList<>();
    for (Entry<String, List<GraphEdge>> entry : graph.getEdgeMap().entrySet()) {
        String router = entry.getKey();
        List<GraphEdge> edges = entry.getValue();
        Matcher m1 = p1.matcher(router);
        Matcher m2 = p2.matcher(router);
        if (m1.matches() && !m2.matches()) {
            for (GraphEdge edge : edges) {
                if (!edge.isAbstract()) {
                    Interface i = edge.getStart();
                    String ifaceName = i.getName();
                    Matcher m3 = p3.matcher(ifaceName);
                    Matcher m4 = p4.matcher(ifaceName);
                    if (m3.matches() && !m4.matches()) {
                        acc.add(edge);
                    }
                }
            }
        }
    }
    return acc;
}
Also used : Matcher(java.util.regex.Matcher) ArrayList(java.util.ArrayList) List(java.util.List) ArrayList(java.util.ArrayList) GraphEdge(org.batfish.symbolic.GraphEdge) Interface(org.batfish.datamodel.Interface)

Aggregations

GraphEdge (org.batfish.symbolic.GraphEdge)47 BoolExpr (com.microsoft.z3.BoolExpr)23 HashMap (java.util.HashMap)19 ArrayList (java.util.ArrayList)16 List (java.util.List)16 Graph (org.batfish.symbolic.Graph)14 TreeSet (java.util.TreeSet)13 Prefix (org.batfish.datamodel.Prefix)12 ArithExpr (com.microsoft.z3.ArithExpr)10 Configuration (org.batfish.datamodel.Configuration)10 Protocol (org.batfish.symbolic.Protocol)10 HashSet (java.util.HashSet)8 Interface (org.batfish.datamodel.Interface)8 Context (com.microsoft.z3.Context)7 Map (java.util.Map)7 Ip (org.batfish.datamodel.Ip)7 IpAccessList (org.batfish.datamodel.IpAccessList)7 TreeMap (java.util.TreeMap)6 IpProtocol (org.batfish.datamodel.IpProtocol)6 BitVecExpr (com.microsoft.z3.BitVecExpr)5