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