use of org.batfish.datamodel.Topology in project batfish by batfish.
the class OspfTest method getOspfRoutes.
/*
* Int:1/2 2/1 2/3 3/2 3/4 4/3
* R1 <=========> R2 <=========> R3 <=========> R4
* A B C D E F G
*
* Areas:
* A: R1 Loopback0
* B: R1 E1/2, R2 E2/1
* C: R2 Loopback0
* D: R2 E2/3, R3 E3/2
* E: R3 Loopback0
* F: R3 E3/4, R4 E4/3
* G: R4 Loopback0
*/
private SortedMap<String, SortedMap<String, SortedSet<AbstractRoute>>> getOspfRoutes(long areaA, long areaB, long areaC, long areaD, long areaE, long areaF, long areaG, Long maxMetricExternalNetworks, Long maxMetricStubNetworks, Long maxMetricSummaryNetworks, Long maxMetricTransitLinks) {
String l0Name = "Loopback0";
String l1Name = "Loopback1";
String c1E1To2Name = "Ethernet1/2";
String c2E2To1Name = "Ethernet2/1";
String c2E2To3Name = "Ethernet2/3";
String c3E3To2Name = "Ethernet3/2";
String c3E3To4Name = "Ethernet3/4";
String c4E4To3Name = "Ethernet4/3";
RoutingPolicy.Builder rpb = _nf.routingPolicyBuilder();
OspfArea.Builder oaba = _nf.ospfAreaBuilder().setNumber(areaA);
OspfArea.Builder oabb = _nf.ospfAreaBuilder().setNumber(areaB);
OspfArea.Builder oabc = _nf.ospfAreaBuilder().setNumber(areaC);
OspfArea.Builder oabd = _nf.ospfAreaBuilder().setNumber(areaD);
OspfArea.Builder oabe = _nf.ospfAreaBuilder().setNumber(areaE);
OspfArea.Builder oabf = _nf.ospfAreaBuilder().setNumber(areaF);
OspfArea.Builder oabg = _nf.ospfAreaBuilder().setNumber(areaG);
Configuration c1 = _cb.setHostname(C1_NAME).build();
Vrf v1 = _vb.setOwner(c1).build();
RoutingPolicy c1ExportPolicy = rpb.setOwner(c1).setStatements(getExportPolicyStatements(C1_L1_ADDRESS)).build();
OspfProcess op1 = _opb.setVrf(v1).setExportPolicy(c1ExportPolicy).build();
OspfArea oa1a = oaba.setOspfProcess(op1).build();
OspfArea oa1b = areaA == areaB ? oa1a : oabb.setOspfProcess(op1).build();
_ib.setOwner(c1).setVrf(v1).setOspfArea(oa1a);
_ib.setOspfPassive(true).setName(l0Name).setAddress(C1_L0_ADDRESS).build();
_ib.setOspfEnabled(false).setOspfPassive(false).setOspfArea(null).setName(l1Name).setAddress(C1_L1_ADDRESS).build();
_ib.setOspfEnabled(true).setOspfArea(oa1b);
_ib.setName(c1E1To2Name).setAddress(C1_E1_2_ADDRESS).build();
Configuration c2 = _cb.setHostname(C2_NAME).build();
Vrf v2 = _vb.setOwner(c2).build();
RoutingPolicy c2ExportPolicy = rpb.setOwner(c2).setStatements(getExportPolicyStatements(C2_L1_ADDRESS)).build();
OspfProcess op2 = _opb.setVrf(v2).setMaxMetricExternalNetworks(maxMetricExternalNetworks).setMaxMetricStubNetworks(maxMetricStubNetworks).setMaxMetricSummaryNetworks(maxMetricSummaryNetworks).setMaxMetricTransitLinks(maxMetricTransitLinks).setExportPolicy(c2ExportPolicy).build();
_opb.setMaxMetricExternalNetworks(null).setMaxMetricStubNetworks(null).setMaxMetricSummaryNetworks(null).setMaxMetricTransitLinks(null);
OspfArea oa2b = oabb.setOspfProcess(op2).build();
OspfArea oa2c = areaB == areaC ? oa2b : oabc.setOspfProcess(op2).build();
OspfArea oa2d = areaB == areaD ? oa2b : areaC == areaD ? oa2c : oabd.setOspfProcess(op2).build();
_ib.setOwner(c2).setVrf(v2).setOspfArea(oa2c);
_ib.setOspfPassive(true).setName(l0Name).setAddress(C2_L0_ADDRESS).build();
_ib.setOspfEnabled(false).setOspfPassive(false).setOspfArea(null).setName(l1Name).setAddress(C2_L1_ADDRESS).build();
_ib.setOspfEnabled(true).setOspfArea(oa2b);
_ib.setName(c2E2To1Name).setAddress(C2_E2_1_ADDRESS).setOspfPointToPoint(true).build();
_ib.setOspfPointToPoint(false).setOspfArea(oa2d);
_ib.setName(c2E2To3Name).setAddress(C2_E2_3_ADDRESS).build();
Configuration c3 = _cb.setHostname(C3_NAME).build();
Vrf v3 = _vb.setOwner(c3).build();
RoutingPolicy c3ExportPolicy = rpb.setOwner(c3).setStatements(getExportPolicyStatements(C3_L1_ADDRESS)).build();
OspfProcess op3 = _opb.setVrf(v3).setExportPolicy(c3ExportPolicy).build();
OspfArea oa3d = oabd.setOspfProcess(op3).build();
OspfArea oa3e = areaD == areaE ? oa3d : oabe.setOspfProcess(op3).build();
OspfArea oa3f = areaD == areaF ? oa3d : areaE == areaF ? oa3e : oabf.setOspfProcess(op3).build();
_ib.setOwner(c3).setVrf(v3).setOspfArea(oa3e);
_ib.setOspfPassive(true).setName(l0Name).setAddress(C3_L0_ADDRESS).build();
_ib.setOspfEnabled(false).setOspfPassive(false).setOspfArea(null).setName(l1Name).setAddress(C3_L1_ADDRESS).build();
_ib.setOspfEnabled(true).setOspfArea(oa3d);
_ib.setName(c3E3To2Name).setAddress(C3_E3_2_ADDRESS).build();
_ib.setName(c3E3To4Name).setAddress(C3_E3_4_ADDRESS).setOspfArea(oa3f).build();
Configuration c4 = _cb.setHostname(C4_NAME).build();
Vrf v4 = _vb.setOwner(c4).build();
RoutingPolicy c4ExportPolicy = rpb.setOwner(c4).setStatements(getExportPolicyStatements(C4_L1_ADDRESS)).build();
OspfProcess op4 = _opb.setVrf(v4).setExportPolicy(c4ExportPolicy).build();
OspfArea oa4f = oabf.setOspfProcess(op4).build();
OspfArea oa4g = areaF == areaG ? oa4f : oabg.setOspfProcess(op4).build();
_ib.setOwner(c4).setVrf(v4).setOspfArea(oa4g);
_ib.setOspfPassive(true).setName(l0Name).setAddress(C4_L0_ADDRESS).build();
_ib.setOspfEnabled(false).setOspfPassive(false).setOspfArea(null).setName(l1Name).setAddress(C4_L1_ADDRESS).build();
_ib.setOspfEnabled(true).setOspfArea(oa4f);
_ib.setName(c4E4To3Name).setAddress(C4_E4_3_ADDRESS).build();
SortedMap<String, Configuration> configurations = new ImmutableSortedMap.Builder<String, Configuration>(String::compareTo).put(c1.getName(), c1).put(c2.getName(), c2).put(c3.getName(), c3).put(c4.getName(), c4).build();
BdpEngine engine = new BdpEngine(new MockBdpSettings(), new BatfishLogger(BatfishLogger.LEVELSTR_OUTPUT, false), (s, i) -> new AtomicInteger());
Topology topology = CommonUtil.synthesizeTopology(configurations);
BdpDataPlane dp = engine.computeDataPlane(false, configurations, topology, Collections.emptySet(), new BdpAnswerElement());
return engine.getRoutes(dp);
}
use of org.batfish.datamodel.Topology in project batfish by batfish.
the class OspfTest method testOspfNonDefaultVrfAdjacency.
@Test
public void testOspfNonDefaultVrfAdjacency() {
OspfArea.Builder oab = _nf.ospfAreaBuilder().setNumber(1L);
Prefix adjacencyPrefix = Prefix.parse("1.0.0.0/31");
InterfaceAddress i1Address = new InterfaceAddress(adjacencyPrefix.getStartIp(), adjacencyPrefix.getPrefixLength());
InterfaceAddress i2Address = new InterfaceAddress(adjacencyPrefix.getEndIp(), adjacencyPrefix.getPrefixLength());
Configuration c1 = _cb.build();
Vrf v1 = _vb.setOwner(c1).build();
OspfProcess o1 = _opb.setVrf(v1).build();
OspfArea oa1 = oab.setOspfProcess(o1).build();
// Interface in default VRF on c1
_ib.setOwner(c1).setVrf(v1).setAddress(i1Address).setOspfArea(oa1).build();
Configuration c2 = _cb.build();
// default vrf
Vrf v2Default = _vb.setOwner(c2).build();
// default OSPF process
_opb.setVrf(v2Default).build();
Vrf v2Other = _vb.setName("v2Other").build();
OspfProcess o2Other = _opb.setVrf(v2Other).build();
OspfArea oa2 = oab.setOspfProcess(o2Other).build();
// Interface in VRF v2Other on c2
_ib.setOwner(c2).setVrf(v2Other).setAddress(i2Address).setOspfArea(oa2).build();
Map<String, Configuration> configurations = ImmutableMap.of(c1.getName(), c1, c2.getName(), c2);
Map<Ip, Set<String>> ipOwners = CommonUtil.computeIpOwners(configurations, true);
Topology topology = CommonUtil.synthesizeTopology(configurations);
CommonUtil.initRemoteOspfNeighbors(configurations, ipOwners, topology);
IpLink expectedIpEdge1 = new IpLink(i1Address.getIp(), i2Address.getIp());
IpLink expectedIpEdge2 = new IpLink(i2Address.getIp(), i1Address.getIp());
assertThat(o1, hasOspfNeighbors(hasKey(expectedIpEdge1)));
OspfNeighbor on1 = o1.getOspfNeighbors().get(expectedIpEdge1);
assertThat(o2Other, hasOspfNeighbors(hasKey(expectedIpEdge2)));
OspfNeighbor on2 = o2Other.getOspfNeighbors().get(expectedIpEdge2);
assertThat(on1, hasRemoteOspfNeighbor(sameInstance(on2)));
assertThat(on2, hasRemoteOspfNeighbor(sameInstance(on1)));
}
use of org.batfish.datamodel.Topology in project batfish by batfish.
the class RouteReflectionTest method generateRoutesOneReflector.
/*
* See documentation of calling functions for information description of produced network
*/
private SortedMap<String, SortedMap<String, SortedSet<AbstractRoute>>> generateRoutesOneReflector(boolean edge1RouteReflectorClient, boolean edge2RouteReflectorClient) {
Ip as1PeeringIp = new Ip("10.12.11.1");
Ip edge1EbgpIfaceIp = new Ip("10.12.11.2");
Ip edge1IbgpIfaceIp = new Ip("10.1.12.1");
Ip edge1LoopbackIp = new Ip("2.0.0.1");
Ip rrEdge1IfaceIp = new Ip("10.1.12.2");
Ip rrEdge2IfaceIp = new Ip("10.1.23.2");
Ip rrLoopbackIp = new Ip("2.0.0.2");
Ip as3PeeringIp = new Ip("10.23.31.3");
Ip edge2EbgpIfaceIp = new Ip("10.23.31.2");
Ip edge2IbgpIfaceIp = new Ip("10.1.23.3");
Ip edge2LoopbackIp = new Ip("2.0.0.3");
Configuration edge1 = _cb.setHostname(EDGE1_NAME).build();
Vrf vEdge1 = _vb.setOwner(edge1).build();
_ib.setOwner(edge1).setVrf(vEdge1);
_ib.setAddress(new InterfaceAddress(edge1EbgpIfaceIp, EDGE_PREFIX_LENGTH)).build();
_ib.setAddress(new InterfaceAddress(edge1LoopbackIp, Prefix.MAX_PREFIX_LENGTH)).build();
_ib.setAddress(new InterfaceAddress(edge1IbgpIfaceIp, EDGE_PREFIX_LENGTH)).build();
StaticRoute.Builder sb = StaticRoute.builder();
vEdge1.setStaticRoutes(ImmutableSortedSet.of(sb.setNextHopIp(rrEdge1IfaceIp).setNetwork(new Prefix(rrLoopbackIp, Prefix.MAX_PREFIX_LENGTH)).build()));
BgpProcess edge1Proc = _pb.setRouterId(edge1LoopbackIp).setVrf(vEdge1).build();
RoutingPolicy edge1EbgpExportPolicy = _nullExportPolicyBuilder.setOwner(edge1).build();
_nb.setOwner(edge1).setVrf(vEdge1).setBgpProcess(edge1Proc).setClusterId(edge1LoopbackIp.asLong()).setRemoteAs(1).setLocalIp(edge1EbgpIfaceIp).setPeerAddress(as1PeeringIp).setExportPolicy(edge1EbgpExportPolicy.getName()).build();
RoutingPolicy edge1IbgpExportPolicy = _defaultExportPolicyBuilder.setOwner(edge1).build();
_nb.setRemoteAs(2).setLocalIp(edge1LoopbackIp).setPeerAddress(rrLoopbackIp).setExportPolicy(edge1IbgpExportPolicy.getName()).build();
Configuration rr = _cb.setHostname(RR_NAME).build();
Vrf vRr = _vb.setOwner(rr).build();
_ib.setOwner(rr).setVrf(vRr);
_ib.setAddress(new InterfaceAddress(rrEdge1IfaceIp, EDGE_PREFIX_LENGTH)).build();
_ib.setAddress(new InterfaceAddress(rrLoopbackIp, Prefix.MAX_PREFIX_LENGTH)).build();
_ib.setAddress(new InterfaceAddress(rrEdge2IfaceIp, EDGE_PREFIX_LENGTH)).build();
vRr.setStaticRoutes(ImmutableSortedSet.of(sb.setNextHopIp(edge1IbgpIfaceIp).setNetwork(new Prefix(edge1LoopbackIp, Prefix.MAX_PREFIX_LENGTH)).build(), sb.setNextHopIp(edge2IbgpIfaceIp).setNetwork(new Prefix(edge2LoopbackIp, Prefix.MAX_PREFIX_LENGTH)).build()));
BgpProcess rrProc = _pb.setRouterId(rrLoopbackIp).setVrf(vRr).build();
RoutingPolicy rrExportPolicy = _defaultExportPolicyBuilder.setOwner(rr).build();
_nb.setOwner(rr).setVrf(vRr).setBgpProcess(rrProc).setClusterId(rrLoopbackIp.asLong()).setRemoteAs(2).setLocalIp(rrLoopbackIp).setExportPolicy(rrExportPolicy.getName());
if (edge1RouteReflectorClient) {
_nb.setRouteReflectorClient(true);
}
_nb.setPeerAddress(edge1LoopbackIp).build();
_nb.setRouteReflectorClient(false);
if (edge2RouteReflectorClient) {
_nb.setRouteReflectorClient(true);
}
_nb.setPeerAddress(edge2LoopbackIp).build();
_nb.setRouteReflectorClient(false);
Configuration edge2 = _cb.setHostname(EDGE2_NAME).build();
Vrf vEdge2 = _vb.setOwner(edge2).build();
_ib.setOwner(edge2).setVrf(vEdge2);
_ib.setAddress(new InterfaceAddress(edge2EbgpIfaceIp, EDGE_PREFIX_LENGTH)).build();
_ib.setAddress(new InterfaceAddress(edge2LoopbackIp, Prefix.MAX_PREFIX_LENGTH)).build();
_ib.setAddress(new InterfaceAddress(edge2IbgpIfaceIp, EDGE_PREFIX_LENGTH)).build();
vEdge2.setStaticRoutes(ImmutableSortedSet.of(sb.setNextHopIp(rrEdge2IfaceIp).setNetwork(new Prefix(rrLoopbackIp, Prefix.MAX_PREFIX_LENGTH)).build()));
BgpProcess edge2Proc = _pb.setRouterId(edge2LoopbackIp).setVrf(vEdge2).build();
RoutingPolicy edge2EbgpExportPolicy = _nullExportPolicyBuilder.setOwner(edge2).build();
_nb.setOwner(edge2).setVrf(vEdge2).setBgpProcess(edge2Proc).setClusterId(edge2LoopbackIp.asLong()).setRemoteAs(3).setLocalIp(edge2EbgpIfaceIp).setPeerAddress(as3PeeringIp).setExportPolicy(edge2EbgpExportPolicy.getName()).build();
RoutingPolicy edge2IbgpExportPolicy = _defaultExportPolicyBuilder.setOwner(edge2).build();
_nb.setRemoteAs(2).setLocalIp(edge2LoopbackIp).setPeerAddress(rrLoopbackIp).setExportPolicy(edge2IbgpExportPolicy.getName()).build();
SortedMap<String, Configuration> configurations = new ImmutableSortedMap.Builder<String, Configuration>(String::compareTo).put(edge1.getName(), edge1).put(rr.getName(), rr).put(edge2.getName(), edge2).build();
BdpEngine engine = new BdpEngine(new MockBdpSettings(), new BatfishLogger(BatfishLogger.LEVELSTR_OUTPUT, false), (s, i) -> new AtomicInteger());
Topology topology = CommonUtil.synthesizeTopology(configurations);
BdpDataPlane dp = engine.computeDataPlane(false, configurations, topology, ImmutableSet.of(_ab.setAsPath(AsPath.ofSingletonAsSets(1)).setDstIp(edge1EbgpIfaceIp).setDstNode(edge1.getName()).setNetwork(AS1_PREFIX).setNextHopIp(as1PeeringIp).setOriginatorIp(as1PeeringIp).setSrcIp(as1PeeringIp).setSrcNode("as1Edge").build(), _ab.setAsPath(AsPath.ofSingletonAsSets(3)).setDstIp(edge2EbgpIfaceIp).setDstNode(edge2.getName()).setNetwork(AS3_PREFIX).setNextHopIp(as3PeeringIp).setOriginatorIp(as3PeeringIp).setSrcIp(as3PeeringIp).setSrcNode("as3Edge").build()), new BdpAnswerElement());
return engine.getRoutes(dp);
}
use of org.batfish.datamodel.Topology in project batfish by batfish.
the class NodJobTest method setupSynthesizer.
private void setupSynthesizer() {
Topology topology = new Topology(_dataPlane.getTopologyEdges());
SynthesizerInput input = SynthesizerInputImpl.builder().setConfigurations(_configs).setForwardingAnalysis(new ForwardingAnalysisImpl(_configs, _dataPlane.getRibs(), _dataPlane.getFibs(), topology)).setSimplify(false).setTopology(topology).build();
_synthesizer = new Synthesizer(input);
}
use of org.batfish.datamodel.Topology in project batfish by batfish.
the class SynthesizerInputImplTest method testComputeAclConditions.
@Test
public void testComputeAclConditions() {
Configuration c = _cb.build();
IpAccessList aclWithoutLines = _aclb.setOwner(c).build();
_acllb.setAction(LineAction.ACCEPT);
IpAccessList aclWithLines = _aclb.setLines(ImmutableList.<IpAccessListLine>of(_acllb.setDstIps(ImmutableSet.of(new IpWildcard(new Ip("1.2.3.4")))).build(), _acllb.setDstIps(ImmutableSet.of(new IpWildcard(new Ip("5.6.7.8")))).build())).build();
SynthesizerInput input = _inputBuilder.setConfigurations(ImmutableMap.of(c.getName(), c)).build();
assertThat(input, hasAclConditions(equalTo(ImmutableMap.of(c.getName(), ImmutableMap.of(aclWithoutLines.getName(), ImmutableList.of(), aclWithLines.getName(), ImmutableList.of(new HeaderSpaceMatchExpr(aclWithLines.getLines().get(0)), new HeaderSpaceMatchExpr(aclWithLines.getLines().get(1))))))));
Configuration srcNode = _cb.build();
Configuration nextHop = _cb.build();
Vrf srcVrf = _vb.setOwner(srcNode).build();
Vrf nextHopVrf = _vb.setOwner(nextHop).build();
Ip ip11 = new Ip("1.0.0.0");
Ip ip12 = new Ip("1.0.0.10");
Ip ip21 = new Ip("2.0.0.0");
Ip ip22 = new Ip("2.0.0.10");
IpAccessList sourceNat1Acl = _aclb.setLines(ImmutableList.of()).setOwner(srcNode).build();
IpAccessList sourceNat2Acl = _aclb.build();
SourceNat sourceNat1 = _snb.setPoolIpFirst(ip11).setPoolIpLast(ip12).setAcl(sourceNat1Acl).build();
SourceNat sourceNat2 = _snb.setPoolIpFirst(ip21).setPoolIpLast(ip22).setAcl(sourceNat2Acl).build();
Interface srcInterfaceZeroSourceNats = _ib.setOwner(srcNode).setVrf(srcVrf).setSourceNats(ImmutableList.of()).build();
Interface srcInterfaceOneSourceNat = _ib.setSourceNats(ImmutableList.of(sourceNat1)).build();
Interface srcInterfaceTwoSourceNats = _ib.setSourceNats(ImmutableList.of(sourceNat1, sourceNat2)).build();
Interface nextHopInterface = _ib.setOwner(nextHop).setVrf(nextHopVrf).setSourceNats(ImmutableList.of()).build();
Edge forwardEdge1 = new Edge(srcInterfaceZeroSourceNats, nextHopInterface);
Edge forwardEdge2 = new Edge(srcInterfaceOneSourceNat, nextHopInterface);
Edge forwardEdge3 = new Edge(srcInterfaceTwoSourceNats, nextHopInterface);
Edge backEdge1 = new Edge(nextHopInterface, srcInterfaceZeroSourceNats);
Edge backEdge2 = new Edge(nextHopInterface, srcInterfaceOneSourceNat);
Edge backEdge3 = new Edge(nextHopInterface, srcInterfaceTwoSourceNats);
SynthesizerInput inputWithDataPlane = _inputBuilder.setConfigurations(ImmutableMap.of(srcNode.getName(), srcNode, nextHop.getName(), nextHop)).setForwardingAnalysis(MockForwardingAnalysis.builder().build()).setTopology(new Topology(ImmutableSortedSet.of(forwardEdge1, forwardEdge2, forwardEdge3, backEdge1, backEdge2, backEdge3))).build();
assertThat(inputWithDataPlane, hasAclConditions(equalTo(ImmutableMap.of(srcNode.getName(), ImmutableMap.of(sourceNat1Acl.getName(), ImmutableList.of(), sourceNat2Acl.getName(), ImmutableList.of()), nextHop.getName(), ImmutableMap.of()))));
}
Aggregations