You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2023/04/28 06:38:33 UTC

[camel-quarkus] branch main updated: Snmp: Extend coverage for supported versions #4843

This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/main by this push:
     new fbaae17701 Snmp: Extend coverage for supported versions #4843
fbaae17701 is described below

commit fbaae17701e622cd2e18f94bbbeadab4e22f3a34
Author: JiriOndrusek <on...@gmail.com>
AuthorDate: Thu Apr 27 14:57:13 2023 +0200

    Snmp: Extend coverage for supported versions #4843
---
 integration-tests-jvm/snmp/pom.xml                 |  5 ++
 .../quarkus/component/snmp/it/SnmpResource.java    | 89 ++++++++++++----------
 .../camel/quarkus/component/snmp/it/SnmpRoute.java | 34 +++++++--
 .../camel/quarkus/component/snmp/it/SnmpTest.java  | 38 +++++----
 .../component/snmp/it/SnmpTestResource.java        | 16 +++-
 5 files changed, 119 insertions(+), 63 deletions(-)

diff --git a/integration-tests-jvm/snmp/pom.xml b/integration-tests-jvm/snmp/pom.xml
index effa7b4291..655bbf0125 100644
--- a/integration-tests-jvm/snmp/pom.xml
+++ b/integration-tests-jvm/snmp/pom.xml
@@ -56,6 +56,11 @@
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-integration-test-support</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <profiles>
diff --git a/integration-tests-jvm/snmp/src/main/java/org/apache/camel/quarkus/component/snmp/it/SnmpResource.java b/integration-tests-jvm/snmp/src/main/java/org/apache/camel/quarkus/component/snmp/it/SnmpResource.java
index 5b573a6f1d..bb32f3cf73 100644
--- a/integration-tests-jvm/snmp/src/main/java/org/apache/camel/quarkus/component/snmp/it/SnmpResource.java
+++ b/integration-tests-jvm/snmp/src/main/java/org/apache/camel/quarkus/component/snmp/it/SnmpResource.java
@@ -27,6 +27,7 @@ import jakarta.inject.Named;
 import jakarta.ws.rs.GET;
 import jakarta.ws.rs.POST;
 import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
@@ -46,6 +47,12 @@ import org.snmp4j.smi.VariableBinding;
 @ApplicationScoped
 public class SnmpResource {
 
+    @ConfigProperty(name = SnmpRoute.TRAP_V0_PORT)
+    int trap0Port;
+
+    @ConfigProperty(name = SnmpRoute.TRAP_V1_PORT)
+    int trap1Port;
+
     @ConfigProperty(name = "snmpListenAddress")
     String snmpListenAddress;
 
@@ -56,12 +63,12 @@ public class SnmpResource {
     @Inject
     ProducerTemplate producerTemplate;
 
-    @Path("/producePDU")
+    @Path("/producePDU/{version}")
     @GET
     @Produces(MediaType.TEXT_PLAIN)
-    public Response producePDU() {
-        String url = String.format("snmp://%s?retries=1", snmpListenAddress);
-        SnmpMessage pdu = producerTemplate.requestBody(url, "", SnmpMessage.class);
+    public Response producePDU(@PathParam("version") int version) {
+        String url = String.format("snmp://%s?retries=1&snmpVersion=%d", snmpListenAddress, version);
+        SnmpMessage pdu = producerTemplate.requestBody(url, version, SnmpMessage.class);
 
         String response = pdu.getSnmpMessage().getVariableBindings().stream()
                 .filter(vb -> vb.getOid().equals(SnmpConstants.sysDescr))
@@ -71,26 +78,12 @@ public class SnmpResource {
         return Response.ok(response).build();
     }
 
-    @Path("/sendPoll")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response sendPoll() {
-        SnmpMessage pdu = producerTemplate.requestBody("direct:producePoll", "", SnmpMessage.class);
-
-        String response = pdu.getSnmpMessage().getVariableBindings().stream()
-                .filter(vb -> vb.getOid().equals(SnmpConstants.sysDescr))
-                .map(vb -> vb.getVariable().toString())
-                .collect(Collectors.joining());
-
-        return Response.ok(response).build();
-    }
-
-    @Path("/getNext")
+    @Path("/getNext/{version}")
     @POST
     @Produces(MediaType.TEXT_PLAIN)
-    public Response getNext(String payload) {
-        String url = String.format("snmp://%s?type=GET_NEXT&retries=1&protocol=udp&oids=%s", snmpListenAddress,
-                SnmpConstants.sysDescr);
+    public Response getNext(String payload, @PathParam("version") int version) {
+        String url = String.format("snmp://%s?type=GET_NEXT&retries=1&protocol=udp&oids=%s&snmpVersion=%d", snmpListenAddress,
+                SnmpConstants.sysDescr, version);
         List<SnmpMessage> pdu = producerTemplate.requestBody(url, "", List.class);
 
         String response = pdu.stream()
@@ -102,12 +95,13 @@ public class SnmpResource {
         return Response.ok(response).build();
     }
 
-    @Path("/produceTrap")
+    @Path("/produceTrap/{version}")
     @POST
     @Produces(MediaType.TEXT_PLAIN)
-    public Response sendTrap(String payload) {
-        String url = "snmp:127.0.0.1:1662?protocol=udp&type=TRAP&snmpVersion=0)";
-        PDU trap = createTrap(payload);
+    public Response produceTrap(String payload, @PathParam("version") int version) {
+        int port = new int[] { trap0Port, trap1Port, -1, -1 }[version];
+        String url = "snmp:127.0.0.1:" + port + "?protocol=udp&type=TRAP&snmpVersion=" + version;
+        PDU trap = createTrap(payload, version);
 
         producerTemplate.sendBody(url, trap);
 
@@ -118,27 +112,42 @@ public class SnmpResource {
     @POST
     @Produces(MediaType.TEXT_PLAIN)
     public Response results(String from) throws Exception {
-        OID oid = "trap".equals(from) ? new OID("1.2.3.4.5") : SnmpConstants.sysDescr;
+        OID oid = from.startsWith("trap") ? new OID("1.2.3.4.5") : SnmpConstants.sysDescr;
         String result = snmpResults.get(from).stream().map(m -> m.getSnmpMessage().getVariable(oid).toString())
                 .collect(Collectors.joining(","));
 
         return Response.ok(result).build();
     }
 
-    public PDU createTrap(String payload) {
-        PDUv1 trap = new PDUv1();
-        trap.setGenericTrap(PDUv1.ENTERPRISE_SPECIFIC);
-        trap.setSpecificTrap(1);
-
+    public PDU createTrap(String payload, int version) {
         OID oid = new OID("1.2.3.4.5");
-        trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
-        trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
-        trap.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
-        trap.setEnterprise(oid);
-
-        //Add Payload
         Variable var = new OctetString(payload);
-        trap.add(new VariableBinding(oid, var));
-        return trap;
+        switch (version) {
+        case 0:
+            PDUv1 trap0 = new PDUv1();
+            trap0.setGenericTrap(PDUv1.ENTERPRISE_SPECIFIC);
+            trap0.setSpecificTrap(1);
+
+            trap0.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
+            trap0.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
+            trap0.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
+            trap0.setEnterprise(oid);
+
+            //Add Payload
+            trap0.add(new VariableBinding(oid, var));
+            return trap0;
+        case 1:
+            PDU trap1 = new PDU();
+
+            trap1.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
+            trap1.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
+            trap1.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
+
+            //Add Payload
+            trap1.add(new VariableBinding(oid, var));
+            return trap1;
+        default:
+            return null;
+        }
     }
 }
diff --git a/integration-tests-jvm/snmp/src/main/java/org/apache/camel/quarkus/component/snmp/it/SnmpRoute.java b/integration-tests-jvm/snmp/src/main/java/org/apache/camel/quarkus/component/snmp/it/SnmpRoute.java
index 445d6a456f..134ecf6be4 100644
--- a/integration-tests-jvm/snmp/src/main/java/org/apache/camel/quarkus/component/snmp/it/SnmpRoute.java
+++ b/integration-tests-jvm/snmp/src/main/java/org/apache/camel/quarkus/component/snmp/it/SnmpRoute.java
@@ -32,6 +32,15 @@ import org.eclipse.microprofile.config.inject.ConfigProperty;
 @ApplicationScoped
 public class SnmpRoute extends RouteBuilder {
 
+    public static final String TRAP_V0_PORT = "SnmpRoute_trap_v0";
+    public static final String TRAP_V1_PORT = "SnmpRoute_trap_v1";
+
+    @ConfigProperty(name = TRAP_V0_PORT)
+    int trap0Port;
+
+    @ConfigProperty(name = "SnmpRoute_trap_v1")
+    int trap1Port;
+
     @ConfigProperty(name = "snmpListenAddress")
     String snmpListenAddress;
 
@@ -41,13 +50,20 @@ public class SnmpRoute extends RouteBuilder {
 
     @Override
     public void configure() {
-        //TRAP consumer
-        from("snmp:0.0.0.0:1662?protocol=udp&type=TRAP&snmpVersion=0")
-                .process(e -> snmpResults.get("trap").add(e.getIn().getBody(SnmpMessage.class)));
+        //TRAP consumer snmpVersion=0
+        from("snmp:0.0.0.0:" + trap0Port + "?protocol=udp&type=TRAP&snmpVersion=0")
+                .process(e -> snmpResults.get("trap0").add(e.getIn().getBody(SnmpMessage.class)));
+
+        //TRAP consumer snmpVersion=1
+        from("snmp:0.0.0.0:" + trap1Port + "?protocol=udp&type=TRAP&snmpVersion=1")
+                .process(e -> snmpResults.get("trap1").add(e.getIn().getBody(SnmpMessage.class)));
 
-        //POLL consumer
-        from("snmp://" + snmpListenAddress + "?protocol=udp&type=POLL&snmpVersion=0&oids=1.3.6.1.2.1.1.5.0")
-                .process(e -> snmpResults.get("poll").add(e.getIn().getBody(SnmpMessage.class)));
+        //POLL consumer snmpVersion=0
+        from("snmp://" + snmpListenAddress + "?protocol=udp&snmpVersion=0&securityName=aaa&type=POLL&oids=1.3.6.1.2.1.1.5.0")
+                .process(e -> snmpResults.get("poll0").add(e.getIn().getBody(SnmpMessage.class)));
+        //POLL consumer snmpVersion=1
+        from("snmp://" + snmpListenAddress + "?protocol=udp&snmpVersion=1&securityName=aaa&type=POLL&oids=1.3.6.1.2.1.1.5.0")
+                .process(e -> snmpResults.get("poll1").add(e.getIn().getBody(SnmpMessage.class)));
     }
 
     static class Producers {
@@ -56,8 +72,10 @@ public class SnmpRoute extends RouteBuilder {
         @Named("snmpTrapResults")
         Map<String, Deque<SnmpMessage>> snmpResults() {
             Map<String, Deque<SnmpMessage>> map = new ConcurrentHashMap<>();
-            map.put("trap", new ConcurrentLinkedDeque());
-            map.put("poll", new ConcurrentLinkedDeque());
+            map.put("trap0", new ConcurrentLinkedDeque());
+            map.put("trap1", new ConcurrentLinkedDeque());
+            map.put("poll0", new ConcurrentLinkedDeque());
+            map.put("poll1", new ConcurrentLinkedDeque());
             return map;
         }
     }
diff --git a/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTest.java b/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTest.java
index 83194f0a89..200fe0e948 100644
--- a/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTest.java
+++ b/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTest.java
@@ -17,12 +17,14 @@
 package org.apache.camel.quarkus.component.snmp.it;
 
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
 
 import io.quarkus.test.common.QuarkusTestResource;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import org.hamcrest.Matchers;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import static org.awaitility.Awaitility.await;
 
@@ -37,18 +39,23 @@ import static org.awaitility.Awaitility.await;
 @QuarkusTestResource(SnmpTestResource.class)
 class SnmpTest {
 
-    @Test
-    public void testSendReceiveTrap() throws Exception {
+    static Stream<Integer> supportedVersions() {
+        return Stream.of(0, 1/*, 3 not supported because of https://issues.apache.org/jira/browse/CAMEL-19298 */);
+    }
+
+    @ParameterizedTest
+    @MethodSource("supportedVersions")
+    public void testSendReceiveTrap(int version) throws Exception {
 
         RestAssured.given()
                 .body("TEXT")
-                .post("/snmp/produceTrap")
+                .post("/snmp/produceTrap/" + version)
                 .then()
                 .statusCode(200);
 
         await().atMost(10L, TimeUnit.SECONDS).pollDelay(100, TimeUnit.MILLISECONDS).until(() -> {
             String result = RestAssured.given()
-                    .body("trap")
+                    .body("trap" + version)
                     .post("/snmp/results")
                     .then()
                     .statusCode(200)
@@ -58,11 +65,12 @@ class SnmpTest {
         });
     }
 
-    @Test
-    public void testPoll() throws Exception {
+    @ParameterizedTest
+    @MethodSource("supportedVersions")
+    public void testPoll(int version) throws Exception {
         await().atMost(10L, TimeUnit.SECONDS).pollDelay(100, TimeUnit.MILLISECONDS).until(() -> {
             String result = RestAssured.given()
-                    .body("poll")
+                    .body("poll" + version)
                     .post("/snmp/results")
                     .then()
                     .statusCode(200)
@@ -72,22 +80,24 @@ class SnmpTest {
         });
     }
 
-    @Test
-    public void testProducePDU() {
+    @ParameterizedTest
+    @MethodSource("supportedVersions")
+    public void testProducePDU(int version) {
 
         RestAssured
-                .get("/snmp/producePDU")
+                .get("/snmp/producePDU/" + version)
                 .then()
                 .statusCode(200)
                 .body(Matchers.equalTo("Response from the test #1"));
     }
 
-    @Test
-    public void testGetNext() {
+    @ParameterizedTest
+    @MethodSource("supportedVersions")
+    public void testGetNext(int version) {
 
         RestAssured.given()
                 .body("TEXT")
-                .post("/snmp/getNext")
+                .post("/snmp/getNext/" + version)
                 .then()
                 .statusCode(200)
                 .body(Matchers.equalTo("Response from the test #1,Response from the test #2"));
diff --git a/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTestResource.java b/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTestResource.java
index 504e4f6250..9653a3dfb4 100644
--- a/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTestResource.java
+++ b/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTestResource.java
@@ -18,18 +18,21 @@ package org.apache.camel.quarkus.component.snmp.it;
 
 import java.io.IOException;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Vector;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
+import org.apache.camel.quarkus.test.AvailablePortFinder;
 import org.apache.camel.util.CollectionHelper;
 import org.junit.jupiter.api.Assertions;
 import org.snmp4j.CommandResponder;
 import org.snmp4j.CommandResponderEvent;
 import org.snmp4j.MessageException;
 import org.snmp4j.PDU;
+import org.snmp4j.PDUv1;
 import org.snmp4j.Snmp;
 import org.snmp4j.mp.SnmpConstants;
 import org.snmp4j.mp.StatusInformation;
@@ -61,7 +64,13 @@ public class SnmpTestResource implements QuarkusTestResourceLifecycleManager {
             throw new RuntimeException(e);
         }
 
-        return CollectionHelper.mapOf(LISTEN_ADDRESS, udpTransportMapping.getListenAddress().toString().replaceFirst("/", ":"));
+        Map<String, String> ports = AvailablePortFinder.reserveNetworkPorts(Objects::toString, SnmpRoute.TRAP_V0_PORT,
+                SnmpRoute.TRAP_V1_PORT);
+        Map<String, String> m = CollectionHelper.mergeMaps(
+                ports,
+                CollectionHelper.mapOf(LISTEN_ADDRESS,
+                        udpTransportMapping.getListenAddress().toString().replaceFirst("/", ":")));
+        return m;
     }
 
     @Override
@@ -89,6 +98,11 @@ public class SnmpTestResource implements QuarkusTestResourceLifecycleManager {
             PDU pdu = event.getPDU();
             Vector<? extends VariableBinding> vbs = Optional.ofNullable(pdu.getVariableBindings()).orElse(new Vector<>(0));
             String key = vbs.stream().sequential().map(vb -> vb.getOid().toString()).collect(Collectors.joining(","));
+
+            //differ snmp versions
+            if (pdu instanceof PDUv1) {
+                key = "v1" + key;
+            }
             int numberOfSent = counts.getOrDefault(key, 0);
 
             //if 3 responses were already sent for the OID, do not respond anymore