X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=ves-nf-oam-adopter%2Fves-nf-oam-adopter-snmp-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fo%2Fran%2Foam%2Fnf%2Foam%2Fadopter%2Fsnmp%2Fmanager%2FSnmpTrapListener.java;h=6c7568057060ee38575613ba98e6b25ef597945f;hb=516d663a767cb77a6e4dad6cba41fdb06edc25be;hp=eead114135b3a766d17786d857a91df200185031;hpb=0f9b22f340ee994a188627d17031196eef090fc2;p=oam%2Fnf-oam-adopter.git diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-snmp-manager/src/main/java/org/o/ran/oam/nf/oam/adopter/snmp/manager/SnmpTrapListener.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-snmp-manager/src/main/java/org/o/ran/oam/nf/oam/adopter/snmp/manager/SnmpTrapListener.java index eead114..6c75680 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-snmp-manager/src/main/java/org/o/ran/oam/nf/oam/adopter/snmp/manager/SnmpTrapListener.java +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-snmp-manager/src/main/java/org/o/ran/oam/nf/oam/adopter/snmp/manager/SnmpTrapListener.java @@ -19,22 +19,14 @@ package org.o.ran.oam.nf.oam.adopter.snmp.manager; -import com.google.gson.Gson; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.IOException; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Optional; import org.o.ran.oam.nf.oam.adopter.api.VesEventNotifier; import org.o.ran.oam.nf.oam.adopter.snmp.manager.api.TimeZoneOffsetService; import org.o.ran.oam.nf.oam.adopter.snmp.manager.mapper.SnmpMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.snmp4j.CommandResponder; -import org.snmp4j.CommandResponderEvent; import org.snmp4j.MessageDispatcher; import org.snmp4j.MessageDispatcherImpl; -import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.mp.MPv2c; import org.snmp4j.smi.UdpAddress; @@ -42,32 +34,25 @@ import org.snmp4j.transport.DefaultUdpTransportMapping; import org.snmp4j.util.MultiThreadedMessageDispatcher; import org.snmp4j.util.ThreadPool; -final class SnmpTrapListener implements CommandResponder, Runnable { +final class SnmpTrapListener implements Runnable { private static final Logger LOG = LoggerFactory.getLogger(SnmpTrapListener.class); private static final int THREADS_SIZE = 2; private final String hostPortAddress; - private final SnmpMapper mapper; - private final VesEventNotifier vesEventNotifier; - private final Gson gson = new Gson(); - private final TimeZoneOffsetService timeZoneOffsetService; + private final SnmpCommandResponder commandResponder; public SnmpTrapListener(final String host, final Integer port, final SnmpMapper mapper, final VesEventNotifier vesEventNotifier, final TimeZoneOffsetService timeZoneOffsetService) { LOG.info("SnmpTrapListener listening on {}:{}", host, port); this.hostPortAddress = host + "/" + port; - this.mapper = mapper; - this.vesEventNotifier = vesEventNotifier; - this.timeZoneOffsetService = timeZoneOffsetService; + this.commandResponder = new SnmpCommandResponder(timeZoneOffsetService, mapper, vesEventNotifier); } @Override public synchronized void run() { - try (final DefaultUdpTransportMapping snmpTarget = new DefaultUdpTransportMapping( - new UdpAddress(hostPortAddress))) { - final ThreadPool threadPool = ThreadPool.create("SNMP_V2_Listener", THREADS_SIZE); - final MessageDispatcher dispatcher = - new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl()); + try (final var snmpTarget = new DefaultUdpTransportMapping(new UdpAddress(hostPortAddress))) { + final var threadPool = ThreadPool.create("SNMP_V2_Listener", THREADS_SIZE); + final var dispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl()); dispatcher.addMessageProcessingModel(new MPv2c()); listenSnmp(dispatcher, snmpTarget); } catch (final IOException e) { @@ -75,42 +60,17 @@ final class SnmpTrapListener implements CommandResponder, Runnable { } } - @SuppressFBWarnings("WA_NOT_IN_LOOP") private synchronized void listenSnmp(final MessageDispatcher dispatcher, final DefaultUdpTransportMapping snmpTarget) { - try (final Snmp snmp = new Snmp(dispatcher, snmpTarget)) { - snmp.addCommandResponder(this); - snmpTarget.listen(); - LOG.debug("Listening on {}", snmpTarget); - wait(); - } catch (final InterruptedException | IOException ex) { - Thread.currentThread().interrupt(); - } - } - - /** - * This method will be called whenever a pdu is received on the given port - * specified in the listen() method. - */ - @Override - public synchronized void processPdu(final CommandResponderEvent cmdRespEvent) { - LOG.info("Received PDU"); - final PDU pdu = cmdRespEvent.getPDU(); - if (pdu == null) { - LOG.warn("Ignoring PDU."); - return; - } - - final UdpAddress address = (UdpAddress) cmdRespEvent.getPeerAddress(); - final ZoneId optZoneId = timeZoneOffsetService.getTimeZone(address.getInetAddress().getHostAddress()); - final String timeZone = Optional.ofNullable(optZoneId) - .map(zoneId -> "UTC" + LocalDateTime.now().atZone(zoneId).getOffset().toString()).orElse(null); - - mapper.toEvent(address, timeZone, pdu) - .flatMapCompletable(vesEventNotifier::notifyEvents) - .doOnSubscribe(result -> LOG.debug("SNMP Trap processing started")) - .doOnComplete(() -> LOG.debug("SNMP Trap processed successfully")) - .doOnError(error -> LOG.error("Failed to process SNMP Trap", error)) - .subscribe(); + do { + try (final var snmp = new Snmp(dispatcher, snmpTarget)) { + snmp.addCommandResponder(commandResponder); + snmpTarget.listen(); + LOG.debug("Listening on {}", snmpTarget); + wait(); + } catch (final InterruptedException | IOException ex) { + Thread.currentThread().interrupt(); + } + } while (snmpTarget.isListening()); } }