AMBARI-17012. Handle SNMP dispatch behavior if the reusable UDP transport goes away. (mpapirkovskyy)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/0480c6be Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/0480c6be Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/0480c6be Branch: refs/heads/branch-2.4 Commit: 0480c6becf2dfe62b1eb6c74f61ec444014f44b2 Parents: 5d9348c Author: Myroslav Papirkovskyi <[email protected]> Authored: Thu Jun 2 19:12:11 2016 +0300 Committer: Myroslav Papirkovskyi <[email protected]> Committed: Thu Jun 2 19:16:32 2016 +0300 ---------------------------------------------------------------------- .../dispatchers/SNMPDispatcher.java | 5 ++++ .../dispatchers/SNMPDispatcherTest.java | 26 ++++++++++++++++++++ 2 files changed, 31 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/0480c6be/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcher.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcher.java b/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcher.java index 24681d1..22a78ef 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcher.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcher.java @@ -160,6 +160,7 @@ public class SNMPDispatcher implements NotificationDispatcher { } catch (Exception ex) { LOG.error("Error occurred during SNMP trap dispatching.", ex); failureCallback(notification); + transportMapping = null; } } @@ -431,4 +432,8 @@ public class SNMPDispatcher implements NotificationDispatcher { public Integer getPort() { return port; } + + protected UdpTransportMapping getTransportMapping() { + return transportMapping; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/0480c6be/ambari-server/src/test/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcherTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcherTest.java b/ambari-server/src/test/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcherTest.java index e5ea0bf..bca0e8a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcherTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/notifications/dispatchers/SNMPDispatcherTest.java @@ -30,6 +30,7 @@ import org.snmp4j.Target; import org.snmp4j.mp.SnmpConstants; import org.snmp4j.smi.VariableBinding; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -55,6 +56,31 @@ public class SNMPDispatcherTest { } @Test + public void testDispatchUdpTransportMappingCrash() throws Exception { + SNMPDispatcher dispatcher = spy(new SNMPDispatcher(DEFAULT_SNMP_PORT)); + SNMPDispatcher.SnmpVersion snmpVersion = SNMPDispatcher.SnmpVersion.SNMPv1; + Notification notification = mock(Notification.class); + notification.Callback = mock(DispatchCallback.class); + notification.CallbackIds = mock(List.class); + Map<String, String> properties = new HashMap<String, String>(); + properties.put(SNMPDispatcher.SUBJECT_OID_PROPERTY, "1"); + properties.put(SNMPDispatcher.BODY_OID_PROPERTY, "2"); + properties.put(SNMPDispatcher.PORT_PROPERTY, "3"); + properties.put(SNMPDispatcher.COMMUNITY_PROPERTY, "4"); + properties.put(SNMPDispatcher.SNMP_VERSION_PROPERTY, "SNMPv1"); + properties.put(SNMPDispatcher.TRAP_OID_PROPERTY, "1.3.6.1.6.3.1.1.5.4"); + notification.DispatchProperties = properties; + notification.Body = "body"; + notification.Subject = "subject"; + notification.Recipients = Arrays.asList(new Recipient()); + doThrow(new IOException()).when(dispatcher).sendTraps(notification, snmpVersion); + dispatcher.dispatch(notification); + verify(notification.Callback).onFailure(notification.CallbackIds); + verify(notification.Callback, never()).onSuccess(notification.CallbackIds); + assertNull(dispatcher.getTransportMapping()); + } + + @Test public void testDispatch_notDefinedProperties() throws Exception { SNMPDispatcher dispatcher = new SNMPDispatcher(DEFAULT_SNMP_PORT); Notification notification = mock(Notification.class);
