This is an automated email from the ASF dual-hosted git repository.
hefengen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 376841a58b [type:feat]add rocketmq logging e2e test (#5439)
376841a58b is described below
commit 376841a58b8c4df348b89d13784a53b62ee12983
Author: NanMu <[email protected]>
AuthorDate: Tue Apr 2 17:41:17 2024 +0800
[type:feat]add rocketmq logging e2e test (#5439)
* test
* test
* test
* ci
* ci
* ci
* test
* trigger ci
* add rocket logging e2e
* fix
* add rocketmq e2e
* fix
* fix
* trigger ci
* trigger ci
* test rocket.yml
* test rocket.yml
* test rocket.yml
* fix
* fix
* debug
* trigger ci
* trigger ci
* fix
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* trigger ci
* 1
* test host mode
* fix
* fix
* fix
* fix websocket sync
* to ci
* optimize
* optimize
* trigger ci
* optimize yml
* optimize yml
* optimize
---------
Co-authored-by: ‘xcsnx’ <‘[email protected]’>
Co-authored-by: moremind <[email protected]>
Co-authored-by: loongs-zhang <[email protected]>
---
.github/workflows/e2e-k8s.yml | 1 +
.../k8s/script/e2e-http-sync.sh | 4 +
.../shenyu-e2e-case-http/k8s/shenyu-rocketmq.yml | 108 +++++++++++++++++++++
.../shenyu-e2e-case/shenyu-e2e-case-http/pom.xml | 8 ++
.../e2e/testcase/http/DividePluginCases.java | 96 +++++++++++++++++-
.../shenyu/e2e/testcase/http/DividePluginTest.java | 60 +++++++++++-
6 files changed, 272 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/e2e-k8s.yml b/.github/workflows/e2e-k8s.yml
index 061b889b2f..dd161a6167 100644
--- a/.github/workflows/e2e-k8s.yml
+++ b/.github/workflows/e2e-k8s.yml
@@ -281,6 +281,7 @@ jobs:
sudo k3s ctr images import /tmp/shenyu/apache-shenyu-admin.tar
sudo k3s ctr images import /tmp/shenyu/apache-shenyu-bootstrap.tar
+
# - name: Setup Debug Session
# uses: mxschmitt/action-tmate@v3
# timeout-minutes: 15
diff --git
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/k8s/script/e2e-http-sync.sh
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/k8s/script/e2e-http-sync.sh
index 3c20a2c70a..8329491111 100644
---
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/k8s/script/e2e-http-sync.sh
+++
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/k8s/script/e2e-http-sync.sh
@@ -34,6 +34,9 @@ MIDDLEWARE_SYNC_ARRAY=("zookeeper" "etcd" "nacos")
for sync in ${SYNC_ARRAY[@]}; do
echo -e "------------------\n"
kubectl apply -f "$SHENYU_TESTCASE_DIR"/k8s/shenyu-mysql.yml
+
+ kubectl apply -f "${PRGDIR}"/shenyu-rocketmq.yml
+
sleep 30s
echo "[Start ${sync} synchronous] create shenyu-admin-${sync}.yml
shenyu-bootstrap-${sync}.yml shenyu-examples-springcloud.yml"
# shellcheck disable=SC2199
@@ -69,6 +72,7 @@ for sync in ${SYNC_ARRAY[@]}; do
kubectl delete -f
"${SHENYU_TESTCASE_DIR}"/k8s/sync/shenyu-admin-"${sync}".yml
kubectl delete -f
"${SHENYU_TESTCASE_DIR}"/k8s/sync/shenyu-bootstrap-"${sync}".yml
kubectl delete -f "${PRGDIR}"/shenyu-examples-http.yml
+ kubectl delete -f "${PRGDIR}"/shenyu-rocketmq.yml
# shellcheck disable=SC2199
# shellcheck disable=SC2076
if [[ "${MIDDLEWARE_SYNC_ARRAY[@]}" =~ "${sync}" ]]; then
diff --git
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/k8s/shenyu-rocketmq.yml
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/k8s/shenyu-rocketmq.yml
new file mode 100644
index 0000000000..1d7e80d4e8
--- /dev/null
+++ b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/k8s/shenyu-rocketmq.yml
@@ -0,0 +1,108 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app: rocketmq-broker
+ name: rocketmq-broker
+ namespace: default
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: rocketmq-broker
+ template:
+ metadata:
+ labels:
+ app: rocketmq-broker
+ spec:
+ containers:
+ - name: broker
+ env:
+ - name: NAMESRV_ADDR
+ value: rocketmq-dialevoneid:9876
+ image: rocketmqinc/rocketmq:4.4.0
+ command: [ "/bin/sh", "mqbroker" ]
+ ports:
+ - containerPort: 10909
+ hostPort: 10909
+ name: tcp-10909
+ protocol: TCP
+ - containerPort: 10911
+ hostPort: 10911
+ name: tcp-10911
+ protocol: TCP
+ - containerPort: 10912
+ hostPort: 10912
+ name: tcp-10912
+ protocol: TCP
+
+status: {}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app: rocketmq-namesrv
+ name: rocketmq-namesrv
+ namespace: default
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: rocketmq-namesrv
+ template:
+ metadata:
+ labels:
+ app: rocketmq-namesrv
+ spec:
+ containers:
+ - name: namesrv
+ image: rocketmqinc/rocketmq:4.4.0
+ command: [ "/bin/sh", "mqnamesrv" ]
+ ports:
+ - containerPort: 9876
+ hostPort: 9876
+ name: tcp-9876
+ protocol: TCP
+ resources:
+ limits:
+ memory: 600Mi
+ requests:
+ memory: 600Mi
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: rocketmq-dialevoneid
+ name: rocketmq-dialevoneid
+ namespace: default
+spec:
+ type: NodePort
+ ports:
+ - name: tcp-9876
+ port: 9876
+ protocol: TCP
+ targetPort: 9876
+ nodePort: 31876
+ selector:
+ app: rocketmq-namesrv
+status:
+ loadBalancer: {}
\ No newline at end of file
diff --git a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/pom.xml
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/pom.xml
index f326c86009..2a3141908e 100644
--- a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/pom.xml
+++ b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/pom.xml
@@ -25,4 +25,12 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shenyu-e2e-case-http</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.rocketmq</groupId>
+ <artifactId>rocketmq-client</artifactId>
+ <version>4.9.3</version>
+ </dependency>
+ </dependencies>
</project>
diff --git
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/src/test/java/org/apache/shenyu/e2e/testcase/http/DividePluginCases.java
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/src/test/java/org/apache/shenyu/e2e/testcase/http/DividePluginCases.java
index 25b469bdda..256aca6f11 100644
---
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/src/test/java/org/apache/shenyu/e2e/testcase/http/DividePluginCases.java
+++
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/src/test/java/org/apache/shenyu/e2e/testcase/http/DividePluginCases.java
@@ -18,26 +18,56 @@
package org.apache.shenyu.e2e.testcase.http;
import com.google.common.collect.Lists;
+import io.restassured.http.Method;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
+import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
+import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
+import
org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
+import org.apache.rocketmq.common.message.MessageExt;
import org.apache.shenyu.e2e.engine.scenario.ShenYuScenarioProvider;
import org.apache.shenyu.e2e.engine.scenario.specification.ScenarioSpec;
import
org.apache.shenyu.e2e.engine.scenario.specification.ShenYuBeforeEachSpec;
import org.apache.shenyu.e2e.engine.scenario.specification.ShenYuCaseSpec;
import org.apache.shenyu.e2e.engine.scenario.specification.ShenYuScenarioSpec;
+import org.apache.shenyu.e2e.model.MatchMode;
+import org.apache.shenyu.e2e.model.Plugin;
+import org.apache.shenyu.e2e.model.data.Condition;
+import org.junit.jupiter.api.Assertions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import static
org.apache.shenyu.e2e.engine.scenario.function.HttpCheckers.exists;
+import static
org.apache.shenyu.e2e.template.ResourceDataTemplate.newConditions;
+import static
org.apache.shenyu.e2e.template.ResourceDataTemplate.newRuleBuilder;
+import static
org.apache.shenyu.e2e.template.ResourceDataTemplate.newSelectorBuilder;
public class DividePluginCases implements ShenYuScenarioProvider {
+
+ private static final String NAMESERVER = "http://localhost:31876";
+
+ private static final String CONSUMERGROUP =
"shenyu-plugin-logging-rocketmq";
+
+ private static final String TOPIC = "shenyu-access-logging";
+
+ private static final String TEST = "/http/order/findById?id=123";
+
+ private static final Logger LOG =
LoggerFactory.getLogger(DividePluginCases.class);
+
@Override
public List<ScenarioSpec> get() {
return Lists.newArrayList(
- testDivideHello()
+ testDivideHello(),
+ testRocketMQHello()
);
}
-
+
private ShenYuScenarioSpec testDivideHello() {
return ShenYuScenarioSpec.builder()
- .name("http client hello")
+ .name("http client hello1")
.beforeEachSpec(ShenYuBeforeEachSpec.builder()
.checker(exists("/http/order/findById?id=123"))
.build())
@@ -46,4 +76,64 @@ public class DividePluginCases implements
ShenYuScenarioProvider {
.build())
.build();
}
+
+ private ShenYuScenarioSpec testRocketMQHello() {
+ return ShenYuScenarioSpec.builder()
+ .name("testRocketMQHello")
+ .beforeEachSpec(
+ ShenYuBeforeEachSpec.builder()
+ .addSelectorAndRule(
+ newSelectorBuilder("selector",
Plugin.LOGGING_ROCKETMQ)
+ .name("1")
+ .matchMode(MatchMode.OR)
+
.conditionList(newConditions(Condition.ParamType.URI,
Condition.Operator.STARTS_WITH, "/http"))
+ .build(),
+ newRuleBuilder("rule")
+ .name("1")
+ .matchMode(MatchMode.OR)
+
.conditionList(newConditions(Condition.ParamType.URI,
Condition.Operator.STARTS_WITH, "/http"))
+ .build()
+ )
+ .checker(exists(TEST))
+ .build()
+ )
+ .caseSpec(
+ ShenYuCaseSpec.builder()
+ .add(request -> {
+ AtomicBoolean isLog = new
AtomicBoolean(false);
+ try {
+ Thread.sleep(1000 * 30);
+ request.request(Method.GET,
"/http/order/findById?id=23");
+ DefaultMQPushConsumer consumer = new
DefaultMQPushConsumer(CONSUMERGROUP);
+ consumer.setNamesrvAddr(NAMESERVER);
+ consumer.subscribe(TOPIC, "*");
+ consumer.registerMessageListener(new
MessageListenerConcurrently() {
+ public ConsumeConcurrentlyStatus
consumeMessage(final List<MessageExt> msgs, final ConsumeConcurrentlyContext
consumeConcurrentlyContext) {
+ LOG.info("Msg:{}", msgs);
+ if
(CollectionUtils.isNotEmpty(msgs)) {
+ msgs.forEach(e -> {
+ if (new
String(e.getBody()).contains("/http/order/findById?id=23")) {
+ isLog.set(true);
+ }
+ });
+ }
+ return
ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+ }
+ });
+ LOG.info("consumer.start ;
isLog.get():{}", isLog.get());
+ consumer.start();
+ Thread.sleep(1000 * 30);
+ LOG.info("isLog.get():{}",
isLog.get());
+ Assertions.assertTrue(isLog.get());
+ } catch (Exception e) {
+ LOG.error("error", e);
+ Assertions.assertTrue(isLog.get());
+ }
+ })
+ .build()
+ )
+// .afterEachSpec(ShenYuAfterEachSpec.builder()
+// .deleteWaiting(notExists(TEST)).build())
+ .build();
+ }
}
diff --git
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/src/test/java/org/apache/shenyu/e2e/testcase/http/DividePluginTest.java
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/src/test/java/org/apache/shenyu/e2e/testcase/http/DividePluginTest.java
index 8d810e8da6..309ff66bc5 100644
---
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/src/test/java/org/apache/shenyu/e2e/testcase/http/DividePluginTest.java
+++
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-http/src/test/java/org/apache/shenyu/e2e/testcase/http/DividePluginTest.java
@@ -17,14 +17,27 @@
package org.apache.shenyu.e2e.testcase.http;
+import com.google.common.collect.Lists;
import org.apache.shenyu.e2e.client.WaitDataSync;
import org.apache.shenyu.e2e.client.admin.AdminClient;
import org.apache.shenyu.e2e.client.gateway.GatewayClient;
import org.apache.shenyu.e2e.engine.annotation.ShenYuScenario;
import org.apache.shenyu.e2e.engine.annotation.ShenYuTest;
+import org.apache.shenyu.e2e.engine.scenario.specification.BeforeEachSpec;
import org.apache.shenyu.e2e.engine.scenario.specification.CaseSpec;
import org.apache.shenyu.e2e.enums.ServiceTypeEnum;
+import org.apache.shenyu.e2e.model.ResourcesData;
+import org.apache.shenyu.e2e.model.data.BindingData;
+import org.apache.shenyu.e2e.model.response.SelectorDTO;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+
+import java.util.List;
+import java.util.Objects;
@ShenYuTest(environments = {
@ShenYuTest.Environment(
@@ -47,15 +60,58 @@ import org.junit.jupiter.api.BeforeAll;
)
})
public class DividePluginTest {
-
+
+ private static final Logger LOG =
LoggerFactory.getLogger(DividePluginTest.class);
+
+ private List<String> selectorIds = Lists.newArrayList();
+
+ @BeforeEach
+ void before(final AdminClient client, final GatewayClient gateway, final
BeforeEachSpec spec) {
+ spec.getChecker().check(gateway);
+
+ ResourcesData resources = spec.getResources();
+ for (ResourcesData.Resource res : resources.getResources()) {
+ SelectorDTO dto = client.create(res.getSelector());
+ selectorIds.add(dto.getId());
+ res.getRules().forEach(rule -> {
+ rule.setSelectorId(dto.getId());
+ client.create(rule);
+ });
+ BindingData bindingData = res.getBindingData();
+ if (Objects.nonNull(bindingData)) {
+ bindingData.setSelectorId(dto.getId());
+ client.bindingData(bindingData);
+ }
+ }
+
+ spec.getWaiting().waitFor(gateway);
+ }
+
+// @AfterEach
+// void after(final AdminClient client, final GatewayClient gateway, final
AfterEachSpec spec) {
+// spec.getDeleter().delete(client, selectorIds);
+// spec.deleteWaiting().waitFor(gateway);
+// selectorIds = Lists.newArrayList();
+// }
+
@BeforeAll
void setup(final AdminClient adminClient, final GatewayClient
gatewayClient) throws Exception {
adminClient.login();
WaitDataSync.waitAdmin2GatewayDataSyncEquals(adminClient::listAllSelectors,
gatewayClient::getSelectorCache, adminClient);
WaitDataSync.waitAdmin2GatewayDataSyncEquals(adminClient::listAllMetaData,
gatewayClient::getMetaDataCache, adminClient);
WaitDataSync.waitAdmin2GatewayDataSyncEquals(adminClient::listAllRules,
gatewayClient::getRuleCache, adminClient);
+ LOG.info("start loggingRocketMQ plugin");
+ MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
+ formData.add("id", "29");
+ formData.add("name", "loggingRocketMQ");
+ formData.add("enabled", "true");
+ formData.add("role", "Logging");
+ formData.add("sort", "170");
+ formData.add("config", "{\"topic\":\"shenyu-access-logging\",
\"namesrvAddr\":
\"rocketmq-dialevoneid:9876\",\"producerGroup\":\"shenyu-plugin-logging-rocketmq\"}");
+ adminClient.changePluginStatus("29", formData);
+ WaitDataSync.waitGatewayPluginUse(gatewayClient,
"org.apache.shenyu.plugin.logging.rocketmq");
}
-
+
@ShenYuScenario(provider = DividePluginCases.class)
void testDivide(final GatewayClient gateway, final CaseSpec spec) {
spec.getVerifiers().forEach(verifier ->
verifier.verify(gateway.getHttpRequesterSupplier().get()));