Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JUNOS: Add and fix VNI/VxLan properties #8542

Open
wants to merge 17 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4296,6 +4296,11 @@ M_VrfTarget_DEC
F_Digit+ -> type ( DEC )
;

M_VrfTarget_AUTO
:
'auto' -> type ( AUTO )
;

M_VrfTarget_EXPORT
:
'export' -> type ( EXPORT )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,11 @@ vlt_l3_interface

vlt_vlan_id
:
VLAN_ID id = vlan_number
VLAN_ID
(
NONE
| id = vlan_number
)
;

vlt_vlan_id_list
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,17 +71,17 @@ evovt_auto

evovt_community
:
comm = vt_community
extended_community
;

evovt_export
:
EXPORT vt_community
EXPORT extended_community
;

evovt_import
:
IMPORT vt_community
IMPORT extended_community
;

p_evpn
Expand All @@ -95,8 +95,3 @@ p_evpn
| e_duplicate_mac_detection_null
)
;

vt_community
:
TARGET COLON x = dec COLON y = dec
;
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,20 @@ s_switch_options
:
SWITCH_OPTIONS
(
so_vtep_source_interface
| so_route_distinguisher
so_route_distinguisher
| so_vrf_target
| so_vrf_export
| so_vrf_import
)
| so_vtep_source_interface
)
;

so_vrf_target:
VRF_TARGET
(
sovt_auto
| sovt_community
| sovt_export
| sovt_import
)
;

so_vtep_source_interface
Expand All @@ -28,17 +36,22 @@ so_route_distinguisher
ROUTE_DISTINGUISHER route_distinguisher
;

so_vrf_target
sovt_auto
:
AUTO
;

sovt_community
:
VRF_TARGET null_filler
extended_community
;

so_vrf_export
sovt_export
:
VRF_EXPORT null_filler
EXPORT extended_community
;

so_vrf_import
sovt_import
:
VRF_IMPORT null_filler
IMPORT extended_community
;
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@
import org.batfish.grammar.flatjuniper.FlatJuniperParser.B_enableContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.B_enforce_first_asContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.B_exportContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.B_familyContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.B_groupContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.B_importContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.B_local_addressContext;
Expand All @@ -255,6 +256,7 @@
import org.batfish.grammar.flatjuniper.FlatJuniperParser.BandwidthContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Bd_routing_interfaceContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Bd_vlan_idContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Bf_evpnContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Bfiu_add_pathContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Bfiu_loopsContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Bfiu_rib_groupContext;
Expand Down Expand Up @@ -283,7 +285,11 @@
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Encryption_algorithmContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Eo8023ad_interfaceContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Eo_redundant_parentContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Evo_vrf_targetContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Evovt_autoContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Evovt_communityContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Evovt_exportContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Evovt_importContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Extended_communityContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.F_familyContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.F_filterContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Ff_termContext;
Expand Down Expand Up @@ -535,6 +541,7 @@
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Ro_resolutionContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Ro_ribContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Ro_rib_groupsContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Ro_route_distinguisher_idContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Ro_router_idContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Ro_staticContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Roa_activeContext;
Expand Down Expand Up @@ -600,7 +607,6 @@
import org.batfish.grammar.flatjuniper.FlatJuniperParser.S_logical_systemsContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.S_routing_optionsContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.S_snmpContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.S_switch_optionsContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.S_vlans_namedContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Sc_literalContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Sc_namedContext;
Expand Down Expand Up @@ -698,6 +704,10 @@
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Snmptg_targetsContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.So_route_distinguisherContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.So_vtep_source_interfaceContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Sovt_autoContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Sovt_communityContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Sovt_exportContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Sovt_importContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Standard_communityContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.SubrangeContext;
import org.batfish.grammar.flatjuniper.FlatJuniperParser.Sy_authentication_methodContext;
Expand Down Expand Up @@ -771,6 +781,7 @@
import org.batfish.representation.juniper.DscpUtil;
import org.batfish.representation.juniper.Evpn;
import org.batfish.representation.juniper.EvpnEncapsulation;
import org.batfish.representation.juniper.ExtendedCommunityOrAuto;
import org.batfish.representation.juniper.Family;
import org.batfish.representation.juniper.FirewallFilter;
import org.batfish.representation.juniper.FwFrom;
Expand Down Expand Up @@ -963,6 +974,7 @@
import org.batfish.representation.juniper.Vlan;
import org.batfish.representation.juniper.VlanRange;
import org.batfish.representation.juniper.VlanReference;
import org.batfish.representation.juniper.VniOptions;
import org.batfish.representation.juniper.VrrpGroup;
import org.batfish.representation.juniper.Zone;

Expand Down Expand Up @@ -1914,6 +1926,11 @@
return toIntegerInSpace(messageCtx, ctx, VNI_NUMBER_RANGE, "vni");
}

private @Nonnull Optional<Integer> toInteger(
ParserRuleContext messageCtx, E_vni_optionsContext ctx) {
return toIntegerInSpace(messageCtx, ctx, VNI_NUMBER_RANGE, "vni");

Check warning on line 1931 in projects/batfish/src/main/java/org/batfish/grammar/flatjuniper/ConfigurationBuilder.java

View check run for this annotation

Codecov / codecov/patch

projects/batfish/src/main/java/org/batfish/grammar/flatjuniper/ConfigurationBuilder.java#L1931

Added line #L1931 was not covered by tests
}

private static @Nonnull IpOptions toIpOptions(Ip_optionContext ctx) {
if (ctx.LOOSE_SOURCE_ROUTE() != null) {
return IpOptions.LOOSE_SOURCE_ROUTE;
Expand Down Expand Up @@ -2037,6 +2054,22 @@
}
}

private static @Nonnull ExtendedCommunity toExtendedCommunity(Extended_communityContext ctx) {
// Parser is not strict, need to validate parsed token is valid and won't crash
// The acceptable patterns / values for extended communities in a Juniper Junos operating
// system are as follows:
//
// 4-octet AS number: 00000000-22222222
// 4-octet AS number followed by 4-octet value: 00000000-22222222:11111111-44444444
// 16-octet value: 11111111-22222222-33333333-44444444
// The first two patterns are used for standard extended communities, while the third
// pattern is used for large extended communities.

// The AS number in an extended community can be any value between 0 and 65535. The
// value in an extended community can be any value between 0 and 4294967295.
return ExtendedCommunity.parse(ctx.getText());
}

private @Nonnull Optional<SubRange> toSubRange(
ParserRuleContext messageCtx, Vlan_rangeContext ctx) {
Optional<Integer> rangeStart = toInteger(messageCtx, ctx.start);
Expand Down Expand Up @@ -2273,6 +2306,8 @@

private Vlan _currentNamedVlan;

private Integer _currentVni;

private Zone _currentZone;

private ConcreteFirewallFilter _currentZoneInboundFilter;
Expand Down Expand Up @@ -3429,11 +3464,6 @@
_currentSnmpServer = snmpServer;
}

@Override
public void enterS_switch_options(S_switch_optionsContext ctx) {
todo(ctx);
}

@Override
public void exitSo_route_distinguisher(So_route_distinguisherContext ctx) {
RouteDistinguisher rd = toRouteDistinguisher(ctx.route_distinguisher());
Expand All @@ -3447,6 +3477,37 @@
_currentLogicalSystem.getOrInitSwitchOptions().setVtepSourceInterface(ifaceName);
}

@Override
public void exitSovt_community(Sovt_communityContext ctx) {
if (ctx.extended_community() != null) {
_currentLogicalSystem
.getOrInitSwitchOptions()
.setVrfTargetCommunityorAuto(
ExtendedCommunityOrAuto.of(toExtendedCommunity(ctx.extended_community())));
}
}

@Override
public void exitSovt_auto(Sovt_autoContext ctx) {
_currentLogicalSystem
.getOrInitSwitchOptions()
.setVrfTargetCommunityorAuto(ExtendedCommunityOrAuto.auto());
}

@Override
public void exitSovt_export(Sovt_exportContext ctx) {
_currentLogicalSystem
.getOrInitSwitchOptions()
.setVrfTargetExport(toExtendedCommunity(ctx.extended_community()));
}

@Override
public void exitSovt_import(Sovt_importContext ctx) {
_currentLogicalSystem
.getOrInitSwitchOptions()
.setVrfTargetImport(toExtendedCommunity(ctx.extended_community()));
}

@Override
public void enterSe_address_book(Se_address_bookContext ctx) {
String name = toString(ctx.name);
Expand Down Expand Up @@ -4265,6 +4326,11 @@
_currentBgpGroup.getExportPolicies().add(toComplexPolicyStatement(expr, BGP_EXPORT_POLICY));
}

@Override
public void enterB_family(B_familyContext ctx) {
_currentBgpGroup.setEvpnAf(false);
}

@Override
public void exitB_import(B_importContext ctx) {
Policy_expressionContext expr = ctx.expr;
Expand Down Expand Up @@ -4408,8 +4474,9 @@
}

@Override
public void exitE_vni_options(E_vni_optionsContext ctx) {
todo(ctx);
public void enterE_vni_options(E_vni_optionsContext ctx) {
_currentVni = toInt(ctx.id);
_currentLogicalSystem.getVniOptions().putIfAbsent(toInt(ctx.id), new VniOptions(toInt(ctx.id)));
}

@Override
Expand All @@ -4419,8 +4486,42 @@
}

@Override
public void exitEvo_vrf_target(Evo_vrf_targetContext ctx) {
todo(ctx);
public void exitEvovt_auto(Evovt_autoContext ctx) {
_currentLogicalSystem
.getVniOptions()
.get(_currentVni)
.setVrfTargetCommunityorAuto(ExtendedCommunityOrAuto.auto());
}

@Override
public void exitEvovt_community(Evovt_communityContext ctx) {
if (ctx.extended_community() != null) {
_currentLogicalSystem
.getVniOptions()
.get(_currentVni)
.setVrfTargetCommunityorAuto(
ExtendedCommunityOrAuto.of(toExtendedCommunity(ctx.extended_community())));
}
}

@Override
public void exitEvovt_export(Evovt_exportContext ctx) {
if (ctx.extended_community() != null) {
_currentLogicalSystem
.getVniOptions()
.get(_currentVni)
.setVrfTargetExport(toExtendedCommunity(ctx.extended_community()));
}
}

@Override
public void exitEvovt_import(Evovt_importContext ctx) {
if (ctx.extended_community() != null) {
_currentLogicalSystem
.getVniOptions()
.get(_currentVni)
.setVrfTargetImport(toExtendedCommunity(ctx.extended_community()));
}
}

@Override
Expand Down Expand Up @@ -6059,6 +6160,12 @@
todo(ctx);
}

@Override
public void enterRo_route_distinguisher_id(Ro_route_distinguisher_idContext ctx) {
Ip rdIp = toIp(ctx.ip_address());
_currentRoutingInstance.setRouteDistinguisherId(rdIp);
}

@Override
public void exitRo_autonomous_system(Ro_autonomous_systemContext ctx) {
if (ctx.asn != null) {
Expand Down Expand Up @@ -7094,8 +7201,12 @@

@Override
public void exitVlt_vlan_id(Vlt_vlan_idContext ctx) {
Optional<Integer> vlan = toInteger(ctx, ctx.id);
vlan.ifPresent(_currentNamedVlan::setVlanId);
if (ctx.NONE() != null) {
_currentNamedVlan.setVlanId(null);
} else if (ctx.id != null) {
Optional<Integer> vlan = toInteger(ctx, ctx.id);
vlan.ifPresent(_currentNamedVlan::setVlanId);
}
}

@Override
Expand Down Expand Up @@ -7233,6 +7344,11 @@
_currentBridgeDomain.setVlanId(vlanId);
}

@Override
public void exitBf_evpn(Bf_evpnContext ctx) {
_currentBgpGroup.setEvpnAf(true);
}

@Override
public void enterBfiu_add_path(Bfiu_add_pathContext ctx) {
todo(ctx);
Expand Down