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()));

Reply via email to