Skip to content

Commit

Permalink
NX-OS: extract SNMP community information
Browse files Browse the repository at this point in the history
  • Loading branch information
dhalperi committed Sep 18, 2020
1 parent e9fd145 commit a3b59a1
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,8 @@
import org.batfish.grammar.cisco_nxos.CiscoNxosParser.S_trackContext;
import org.batfish.grammar.cisco_nxos.CiscoNxosParser.S_vdcContext;
import org.batfish.grammar.cisco_nxos.CiscoNxosParser.S_vrf_contextContext;
import org.batfish.grammar.cisco_nxos.CiscoNxosParser.Snmp_communityContext;
import org.batfish.grammar.cisco_nxos.CiscoNxosParser.Snmps_communityContext;
import org.batfish.grammar.cisco_nxos.CiscoNxosParser.Snmps_community_use_aclContext;
import org.batfish.grammar.cisco_nxos.CiscoNxosParser.Snmps_community_use_ipv4aclContext;
import org.batfish.grammar.cisco_nxos.CiscoNxosParser.Snmps_community_use_ipv6aclContext;
Expand Down Expand Up @@ -788,6 +790,7 @@
import org.batfish.representation.cisco_nxos.RouteMapSetOrigin;
import org.batfish.representation.cisco_nxos.RouteMapSetTag;
import org.batfish.representation.cisco_nxos.RoutingProtocolInstance;
import org.batfish.representation.cisco_nxos.SnmpCommunity;
import org.batfish.representation.cisco_nxos.SnmpServer;
import org.batfish.representation.cisco_nxos.StaticRoute;
import org.batfish.representation.cisco_nxos.SwitchportMode;
Expand Down Expand Up @@ -936,6 +939,8 @@ public final class CiscoNxosControlPlaneExtractor extends CiscoNxosParserBaseLis
private static final IntegerSpace PROTOCOL_DISTANCE_RANGE = IntegerSpace.of(Range.closed(1, 255));
private static final IntegerSpace RIP_PROCESS_ID_LENGTH_RANGE =
IntegerSpace.of(Range.closed(1, 20));
private static final IntegerSpace SNMP_COMMUNITY_LENGTH_RANGE =
IntegerSpace.of(Range.closed(1, 32));

@VisibleForTesting
public static final IntegerSpace PACKET_LENGTH_RANGE = IntegerSpace.of(Range.closed(20, 9210));
Expand Down Expand Up @@ -1267,6 +1272,8 @@ private static long toLong(Uint32Context ctx) {
private RouteMapEntry _currentRouteMapEntry;
private Optional<String> _currentRouteMapName;

private SnmpCommunity _currentSnmpCommunity;

@SuppressWarnings("unused")
private SnmpServer _currentSnmpServer;

Expand Down Expand Up @@ -6003,13 +6010,27 @@ public void exitS_vrf_context(S_vrf_contextContext ctx) {
_currentVrf = _c.getDefaultVrf();
}

@Override
public void enterSnmps_community(Snmps_communityContext ctx) {
Optional<String> name = toString(ctx, ctx.community);
// dummy for invalid name
_currentSnmpCommunity =
name.map(s -> _c.getSnmpCommunities().computeIfAbsent(s, SnmpCommunity::new))
.orElseGet(() -> new SnmpCommunity("dummy"));
}

@Override
public void exitSnmps_community(Snmps_communityContext ctx) {
_currentSnmpCommunity = null;
}

@Override
public void exitSnmps_community_use_acl(Snmps_community_use_aclContext ctx) {
Optional<String> name = toString(ctx, ctx.name);
if (!name.isPresent()) {
return;
}
todo(ctx);
_currentSnmpCommunity.setAclName(name.get());
_c.referenceStructure(
IP_ACCESS_LIST_ABSTRACT_REF,
name.get(),
Expand All @@ -6023,7 +6044,7 @@ public void exitSnmps_community_use_ipv4acl(Snmps_community_use_ipv4aclContext c
if (!name.isPresent()) {
return;
}
todo(ctx);
_currentSnmpCommunity.setAclNameV4(name.get());
_c.referenceStructure(
IP_ACCESS_LIST,
name.get(),
Expand All @@ -6037,7 +6058,7 @@ public void exitSnmps_community_use_ipv6acl(Snmps_community_use_ipv6aclContext c
if (!name.isPresent()) {
return;
}
todo(ctx);
_currentSnmpCommunity.setAclNameV6(name.get());
_c.referenceStructure(
IPV6_ACCESS_LIST,
name.get(),
Expand Down Expand Up @@ -7045,6 +7066,12 @@ private int toInteger(Udp_port_numberContext ctx) {
return procName.map(name -> getPreferredName(name, ROUTER_RIP));
}

private @Nonnull Optional<String> toString(
ParserRuleContext messageCtx, Snmp_communityContext ctx) {
return toStringWithLengthInSpace(
messageCtx, ctx, SNMP_COMMUNITY_LENGTH_RANGE, "SNMP community");
}

private @Nullable String toString(ParserRuleContext messageCtx, Static_route_nameContext ctx) {
String name = ctx.getText();
if (name.length() > StaticRoute.MAX_NAME_LENGTH) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,7 @@ private static WithEnvironmentExpr bgpRedistributeWithEnvironmentExpr(
private transient Multimap<String, String> _portChannelMembers;
private @Nonnull IntegerSpace _reservedVlanRange;
private final @Nonnull Map<String, RouteMap> _routeMaps;
private final @Nonnull Map<String, SnmpCommunity> _snmpCommunities;
private final @Nonnull Map<String, SnmpServer> _snmpServers;
private @Nullable String _snmpSourceInterface;
private boolean _systemDefaultSwitchport;
Expand Down Expand Up @@ -444,6 +445,7 @@ public CiscoNxosConfiguration() {
_platform = NexusPlatform.UNKNOWN;
_reservedVlanRange = DEFAULT_RESERVED_VLAN_RANGE;
_routeMaps = new HashMap<>();
_snmpCommunities = new HashMap<>();
_snmpServers = new HashMap<>();
_tacacsServers = new HashMap<>();
_vlans = new HashMap<>();
Expand Down Expand Up @@ -1434,6 +1436,10 @@ public void setEvpn(@Nullable Evpn evpn) {
return _routeMaps;
}

public @Nonnull Map<String, SnmpCommunity> getSnmpCommunities() {
return _snmpCommunities;
}

public @Nonnull Map<String, SnmpServer> getSnmpServers() {
return _snmpServers;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.batfish.representation.cisco_nxos;

import java.io.Serializable;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

/** Configuration for an SNMP community. */
public final class SnmpCommunity implements Serializable {
public SnmpCommunity(String community) {
_community = community;
}

public @Nonnull String getCommunity() {
return _community;
}

public @Nullable String getAclName() {
return _aclName;
}

public void setAclName(@Nullable String aclName) {
_aclName = aclName;
}

public @Nullable String getAclNameV4() {
return _aclNameV4;
}

public void setAclNameV4(@Nullable String aclNameV4) {
_aclNameV4 = aclNameV4;
}

public @Nullable String getAclNameV6() {
return _aclNameV6;
}

public void setAclNameV6(@Nullable String aclNameV6) {
_aclNameV6 = aclNameV6;
}

private final @Nonnull String _community;
private @Nullable String _aclName;
private @Nullable String _aclNameV4;
private @Nullable String _aclNameV6;
}
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@
import org.batfish.representation.cisco_nxos.RouteMapSetOrigin;
import org.batfish.representation.cisco_nxos.RouteMapSetTag;
import org.batfish.representation.cisco_nxos.RoutingProtocolInstance;
import org.batfish.representation.cisco_nxos.SnmpCommunity;
import org.batfish.representation.cisco_nxos.StaticRoute;
import org.batfish.representation.cisco_nxos.SwitchportMode;
import org.batfish.representation.cisco_nxos.TcpOptions;
Expand Down Expand Up @@ -6835,6 +6836,16 @@ public void testSnmpServerExtraction() {

assertThat(vc.getSnmpServers(), hasKeys("192.0.2.1", "192.0.2.2"));
assertThat(vc.getSnmpSourceInterface(), equalTo("mgmt0"));

assertThat(vc.getSnmpCommunities(), hasKeys("SECRETcommunity1", "SECRETcommunity2"));
SnmpCommunity c1 = vc.getSnmpCommunities().get("SECRETcommunity1");
assertThat(c1.getAclName(), nullValue());
assertThat(c1.getAclNameV4(), nullValue());
assertThat(c1.getAclNameV6(), nullValue());
SnmpCommunity c2 = vc.getSnmpCommunities().get("SECRETcommunity2");
assertThat(c2.getAclName(), equalTo("snmp_acl1"));
assertThat(c2.getAclNameV4(), equalTo("snmp_acl4"));
assertThat(c2.getAclNameV6(), equalTo("snmp_acl6"));
}

@Test
Expand Down

0 comments on commit a3b59a1

Please sign in to comment.