Skip to content

Commit

Permalink
F5: add parsing and conversion tests based on #5721, fix inheritance …
Browse files Browse the repository at this point in the history
…bug (#5726)

Add missing grammar so they pass, some simple tests, and fix a bug in BGP
inheritance
  • Loading branch information
dhalperi committed Apr 25, 2020
1 parent 0d93382 commit 9b21aa3
Show file tree
Hide file tree
Showing 9 changed files with 360 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ AREA
'area'
;

AS_PATH
:
'as-path'
;

AS_SET
:
'as-set'
Expand Down Expand Up @@ -95,6 +100,11 @@ CONFEDERATION
'confederation'
;

DEFAULT_ORIGINATE
:
'default-originate'
;

DENY
:
'deny'
Expand Down Expand Up @@ -305,6 +315,11 @@ REMOTE_AS
'remote-as'
;

ROUTE
:
'route'
;

ROUTE_MAP
:
'route-map'
Expand Down Expand Up @@ -340,6 +355,11 @@ SOFT_RECONFIGURATION
'soft-reconfiguration'
;

STATIC
:
'static'
;

SUMMARY_ONLY
:
'summary-only'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,36 @@ s_end
END NEWLINE
;

s_ip
:
IP
(
s_ip_as_path
| s_ip_prefix_list
| s_ip_route
)
;

s_ip_as_path
:
AS_PATH ACCESS_LIST name = word (PERMIT | DENY) value = word NEWLINE
;

s_ip_prefix_list
:
IP PREFIX_LIST name = word SEQ num = uint32 action = line_action prefix =
PREFIX_LIST name = word SEQ num = uint32 action = line_action prefix =
ip_prefix
(
LE le = ip_prefix_length
| GE ge = ip_prefix_length
)* NEWLINE
;

s_ip_route
:
ROUTE prefix = ip_prefix nhip = ip_address NEWLINE
;

s_line
:
LINE
Expand Down Expand Up @@ -78,7 +98,7 @@ statement
| s_interface
| s_line
| s_null
| s_ip_prefix_list
| s_ip
| s_route_map
| s_router
| s_end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ rb_neighbor_peer_group
rbn_common
:
(
rbn_description
rbn_default_originate
| rbn_description
| rbn_next_hop_self
| rbn_null
| rbn_soft_reconfiguration
Expand All @@ -70,6 +71,11 @@ rbn_common
)
;

rbn_default_originate
:
DEFAULT_ORIGINATE ROUTE_MAP name = word NEWLINE
;

rbn_description
:
DESCRIPTION text = DESCRIPTION_LINE NEWLINE
Expand Down Expand Up @@ -149,6 +155,7 @@ rb_redistribute
(
rbr_kernel
| rbr_connected
| rbr_static
)
;

Expand All @@ -170,6 +177,15 @@ rbr_connected
NEWLINE
;

rbr_static
:
STATIC
(
ROUTE_MAP rm = word
)?
NEWLINE
;

router_bgp
:
BGP localas = uint32 NEWLINE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,17 @@ rm_match
:
MATCH
(
rmm_ip_address
rmm_as_path
| rmm_ip_address
| rmm_ip_address_prefix_list
)
;

rmm_as_path
:
AS_PATH name = word NEWLINE
;

rmm_ip_address
:
IP ADDRESS name = word NEWLINE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rb_neighbor_peer_groupContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbbc_identifierContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbbc_peersContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbn_default_originateContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbn_descriptionContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbn_next_hop_selfContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbn_passwordContext;
Expand All @@ -55,6 +56,8 @@
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbn_update_source_ipContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbr_connectedContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbr_kernelContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rbr_staticContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rmm_as_pathContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rmm_ip_addressContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rmm_ip_address_prefix_listContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Rms_communityContext;
Expand All @@ -69,7 +72,9 @@
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Router_ospfContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.S_access_listContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.S_interfaceContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.S_ip_as_pathContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.S_ip_prefix_listContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.S_ip_routeContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.S_route_mapContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Standard_communityContext;
import org.batfish.grammar.f5_bigip_imish.F5BigipImishParser.Uint32Context;
Expand Down Expand Up @@ -423,6 +428,16 @@ public void exitRbr_connected(Rbr_connectedContext ctx) {
.setRouteMap(routeMapName);
}

@Override
public void exitRbr_static(Rbr_staticContext ctx) {
todo(ctx);
}

@Override
public void exitRbn_default_originate(Rbn_default_originateContext ctx) {
todo(ctx);
}

@Override
public void exitRbn_description(Rbn_descriptionContext ctx) {
if (_currentAbstractNeighbor == null) {
Expand Down Expand Up @@ -599,6 +614,11 @@ public void exitRbn_update_source_interface(Rbn_update_source_interfaceContext c
ctx.name.getStart().getLine());
}

@Override
public void exitRmm_as_path(Rmm_as_pathContext ctx) {
todo(ctx);
}

@Override
public void exitRmm_ip_address(Rmm_ip_addressContext ctx) {
String name = ctx.name.getText();
Expand Down Expand Up @@ -665,6 +685,11 @@ public void exitS_access_list(S_access_listContext ctx) {
.add(new AccessListLine(toLineAction(ctx.action), prefix, getFullText(ctx)));
}

@Override
public void exitS_ip_as_path(S_ip_as_pathContext ctx) {
todo(ctx);
}

@Override
public void exitS_ip_prefix_list(S_ip_prefix_listContext ctx) {
String name = ctx.name.getText();
Expand All @@ -685,7 +710,7 @@ public void exitS_ip_prefix_list(S_ip_prefix_listContext ctx) {
_w.redFlag(
String.format(
"ge (min) arg '%d' less than prefix-length '%d' in: %s",
ge, prefixLength, getFullText(ctx)));
ge, prefixLength, getFullText(ctx.getParent())));
} else {
low = ge;
}
Expand All @@ -696,14 +721,14 @@ public void exitS_ip_prefix_list(S_ip_prefix_listContext ctx) {
_w.redFlag(
String.format(
"le (max) arg '%d' less than prefix-length '%d' in: %s",
le, prefixLength, getFullText(ctx)));
le, prefixLength, getFullText(ctx.getParent())));
return;
} else if (ge != null && le < ge) {
// Invalid and cannot match anything, so warn and do not add
_w.redFlag(
String.format(
"le (max) arg '%d' less than ge (min) arg '%d' in: %s",
le, ge, getFullText(ctx)));
le, ge, getFullText(ctx.getParent())));
return;
} else {
high = le;
Expand All @@ -719,6 +744,11 @@ public void exitS_ip_prefix_list(S_ip_prefix_listContext ctx) {
_c.getPrefixLists().computeIfAbsent(name, PrefixList::new).getEntries().put(num, entry);
}

@Override
public void exitS_ip_route(S_ip_routeContext ctx) {
todo(ctx);
}

@Override
public void exitS_route_map(S_route_mapContext ctx) {
_currentRouteMapEntry = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,19 @@ public BgpNeighbor(String name) {

private void applyIpv4AddressFamily(BgpNeighborIpv4AddressFamily parent) {
BgpNeighborIpv4AddressFamily af = getIpv4AddressFamily();
if (af.getRouteMapIn() == null) {
af.setRouteMapIn(parent.getRouteMapIn());
}
if (af.getRouteMapOut() == null) {
af.setRouteMapOut(parent.getRouteMapOut());
}
}

private void applyIpv6AddressFamily(BgpNeighborIpv6AddressFamily parent) {
BgpNeighborIpv6AddressFamily af = getIpv6AddressFamily();
if (af.getRouteMapIn() == null) {
af.setRouteMapIn(parent.getRouteMapIn());
}
if (af.getRouteMapOut() == null) {
af.setRouteMapOut(parent.getRouteMapOut());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,15 @@
import org.batfish.datamodel.BgpSessionProperties;
import org.batfish.datamodel.Bgpv4Route;
import org.batfish.datamodel.Configuration;
import org.batfish.datamodel.ConfigurationFormat;
import org.batfish.datamodel.ConnectedRoute;
import org.batfish.datamodel.DataPlane;
import org.batfish.datamodel.HeaderSpace;
import org.batfish.datamodel.Ip;
import org.batfish.datamodel.IpAccessList;
import org.batfish.datamodel.KernelRoute;
import org.batfish.datamodel.LineAction;
import org.batfish.datamodel.LongSpace;
import org.batfish.datamodel.OriginType;
import org.batfish.datamodel.Prefix;
import org.batfish.datamodel.PrefixRange;
Expand All @@ -107,6 +109,9 @@
import org.batfish.main.BatfishTestUtils;
import org.batfish.main.TestrigText;
import org.batfish.representation.f5_bigip.AggregateAddress;
import org.batfish.representation.f5_bigip.BgpNeighbor;
import org.batfish.representation.f5_bigip.BgpNeighborIpv4AddressFamily;
import org.batfish.representation.f5_bigip.BgpPeerGroup;
import org.batfish.representation.f5_bigip.F5BigipConfiguration;
import org.batfish.representation.f5_bigip.ImishInterface;
import org.batfish.representation.f5_bigip.OspfInterface;
Expand Down Expand Up @@ -179,7 +184,11 @@ private Bgpv4Route.Builder makeBgpOutputRouteBuilder() {
}

private Configuration parseConfig(String hostname) throws IOException {
return parseTextConfigs(hostname).get(hostname.toLowerCase());
Map<String, Configuration> configs = parseTextConfigs(hostname);
assertThat(configs, hasKey(hostname.toLowerCase()));
Configuration c = configs.get(hostname.toLowerCase());
assertThat(c.getConfigurationFormat(), equalTo(ConfigurationFormat.F5_BIGIP_STRUCTURED));
return c;
}

private Map<String, Configuration> parseTextConfigs(String... configurationNames)
Expand Down Expand Up @@ -640,6 +649,63 @@ public void testBgpNextHopSelfExtraction() {
nullValue());
}

@Test
public void testBgpProcessExtractionGh5721() {
String hostname = "f5_bigip_imish_bgp_gh_5721";
F5BigipConfiguration c = parseVendorConfig(hostname);
assertThat(c.getBgpProcesses(), hasKey("11111"));
org.batfish.representation.f5_bigip.BgpProcess p = c.getBgpProcesses().get("11111");
assertThat(p.getPeerGroups().keySet(), containsInAnyOrder("spines"));
BgpPeerGroup spines = p.getPeerGroups().get("spines");
assertThat(spines.getRemoteAs(), equalTo(22222L));
BgpNeighborIpv4AddressFamily spinesv4 = spines.getIpv4AddressFamily();
assertThat(spinesv4.getRouteMapIn(), equalTo("V4-SPINE-TO-EBIGIP"));
assertThat(spinesv4.getRouteMapOut(), equalTo("V4-EBIGIP-TO-SPINE"));
assertThat(
p.getNeighbors().keySet(),
containsInAnyOrder(
"10.10.13.16", "10.10.106.36", "10.10.106.100", "10.10.106.164", "10.10.106.228"));
BgpNeighbor neighbor16 = p.getNeighbors().get("10.10.13.16");
assertThat(neighbor16.getAddress(), equalTo(Ip.parse("10.10.13.16")));
assertThat(neighbor16.getPeerGroup(), nullValue());
assertThat(neighbor16.getIpv4AddressFamily().getRouteMapIn(), nullValue());
assertThat(neighbor16.getIpv4AddressFamily().getRouteMapOut(), equalTo("ebigip-to-agg"));
BgpNeighbor neighbor36 = p.getNeighbors().get("10.10.106.36");
assertThat(neighbor36.getAddress(), equalTo(Ip.parse("10.10.106.36")));
assertThat(neighbor36.getPeerGroup(), equalTo("spines"));
assertThat(neighbor36.getIpv4AddressFamily().getRouteMapIn(), nullValue());
assertThat(neighbor36.getIpv4AddressFamily().getRouteMapOut(), nullValue());
}

@Test
public void testBgpProcessConversionGh5721() throws IOException {
String hostname = "f5_bigip_imish_bgp_gh_5721";
Configuration c = parseConfig(hostname);
BgpProcess p = c.getDefaultVrf().getBgpProcess();
assertThat(p, notNullValue());
assertThat(
p.getActiveNeighbors(),
hasKeys(
Prefix.parse("10.10.13.16/32"),
Prefix.parse("10.10.106.36/32"),
Prefix.parse("10.10.106.100/32"),
Prefix.parse("10.10.106.164/32"),
Prefix.parse("10.10.106.228/32")));
BgpActivePeerConfig neighbor16 = p.getActiveNeighbors().get(Prefix.parse("10.10.13.16/32"));
assertThat(neighbor16.getRemoteAsns(), equalTo(LongSpace.of(33333)));
assertThat(neighbor16.getDescription(), equalTo("agg1-dc1"));
assertThat(neighbor16.getIpv4UnicastAddressFamily(), notNullValue());
assertThat(neighbor16.getIpv4UnicastAddressFamily().getImportPolicy(), nullValue());
assertThat(neighbor16.getIpv4UnicastAddressFamily().getExportPolicy(), notNullValue());
BgpActivePeerConfig neighbor36 = p.getActiveNeighbors().get(Prefix.parse("10.10.106.36/32"));
assertThat(neighbor36.getRemoteAsns(), equalTo(LongSpace.of(22222)));
assertThat(neighbor36.getDescription(), equalTo("spine5-dc1"));
assertThat(neighbor36.getIpv4UnicastAddressFamily(), notNullValue());
assertThat(
neighbor36.getIpv4UnicastAddressFamily().getImportPolicy(), equalTo("V4-SPINE-TO-EBIGIP"));
assertThat(neighbor36.getIpv4UnicastAddressFamily().getExportPolicy(), notNullValue());
}

@Test
public void testBgpProcessConversion() throws IOException {
String hostname = "f5_bigip_imish_bgp";
Expand Down
Loading

0 comments on commit 9b21aa3

Please sign in to comment.