Pārlūkot izejas kodu

AMBARI-17012. Handle SNMP dispatch behavior if the reusable UDP transport goes away. (mpapirkovskyy)

Myroslav Papirkovskyi 9 gadi atpakaļ
vecāks
revīzija
0480c6becf

+ 5 - 0
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;
+  }
 }

+ 26 - 0
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;
@@ -54,6 +55,31 @@ public class SNMPDispatcherTest {
     verify(notification.Callback, never()).onSuccess(notification.CallbackIds);
   }
 
+  @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);