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 <ondrusek.j...@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