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

albumenj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-samples.git


The following commit(s) were added to refs/heads/master by this push:
     new 947b7034 Support docker image sources (#657)
947b7034 is described below

commit 947b7034643cecc9c8e0782a0b5d9f8a0ddbf8be
Author: Albumen Kevin <[email protected]>
AuthorDate: Fri Dec 23 09:53:19 2022 +0800

    Support docker image sources (#657)
---
 .../dubbo-samples-zookeeper/case-configuration.yml |  36 +++++-
 ...ase-versions.conf => case-version-sources.conf} |   8 +-
 .../dubbo-samples-zookeeper/case-versions.conf     |   1 +
 test/dubbo-scenario-builder/pom.xml                |   6 +
 .../dubbo/scenario/builder/VersionMatcher.java     | 133 ++++++++++++---------
 5 files changed, 117 insertions(+), 67 deletions(-)

diff --git 
a/3-extensions/registry/dubbo-samples-zookeeper/case-configuration.yml 
b/3-extensions/registry/dubbo-samples-zookeeper/case-configuration.yml
index 7ae7162a..a6ac8022 100644
--- a/3-extensions/registry/dubbo-samples-zookeeper/case-configuration.yml
+++ b/3-extensions/registry/dubbo-samples-zookeeper/case-configuration.yml
@@ -14,13 +14,37 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from: app-external-zookeeper.yml
+services:
+  zookeeper:
+    image: zookeeper:${zookeeper-server.version}
 
-props:
-  project_name: dubbo-samples-zookeeper
-  main_class: org.apache.dubbo.samples.ProviderBootstrap
-  zookeeper_port: 2181
-  dubbo_port: 20880
+  dubbo-samples-zookeeper:
+    type: app
+    basedir: .
+    mainClass: org.apache.dubbo.samples.ProviderBootstrap
+    systemProps:
+      - zookeeper.address=zookeeper
+      - zookeeper.port=2181
+    waitPortsBeforeRun:
+      - zookeeper:2181
+    checkPorts:
+      - 20880
+    checkLog: "dubbo service started"
 
+  dubbo-samples-zookeeper-test:
+    type: test
+    basedir: .
+    tests:
+      - "**/*IT.class"
+    systemProps:
+      - zookeeper.address=zookeeper
+      - zookeeper.port=2181
+      - dubbo.address=dubbo-samples-zookeeper
+      - dubbo.port=20880
+    waitPortsBeforeRun:
+      - zookeeper:2181
+      - dubbo-samples-zookeeper:20880
+    depends_on:
+      - dubbo-samples-zookeeper
 
 
diff --git a/3-extensions/registry/dubbo-samples-zookeeper/case-versions.conf 
b/3-extensions/registry/dubbo-samples-zookeeper/case-version-sources.conf
similarity index 85%
copy from 3-extensions/registry/dubbo-samples-zookeeper/case-versions.conf
copy to 3-extensions/registry/dubbo-samples-zookeeper/case-version-sources.conf
index 20c45c86..afc924f8 100644
--- a/3-extensions/registry/dubbo-samples-zookeeper/case-versions.conf
+++ b/3-extensions/registry/dubbo-samples-zookeeper/case-version-sources.conf
@@ -16,10 +16,4 @@
 #   limitations under the License.
 #
 
-
-# Supported component versions of the test case
-
-# Spring app
-dubbo.version=2.7*, 3.*
-spring.version=4.*, 5.*
-java.version= [<= 11]
+zookeeper-server.version=https://hub.docker.com/v2/namespaces/library/repositories/zookeeper/tags
\ No newline at end of file
diff --git a/3-extensions/registry/dubbo-samples-zookeeper/case-versions.conf 
b/3-extensions/registry/dubbo-samples-zookeeper/case-versions.conf
index 20c45c86..ce7fbe6f 100644
--- a/3-extensions/registry/dubbo-samples-zookeeper/case-versions.conf
+++ b/3-extensions/registry/dubbo-samples-zookeeper/case-versions.conf
@@ -23,3 +23,4 @@
 dubbo.version=2.7*, 3.*
 spring.version=4.*, 5.*
 java.version= [<= 11]
+zookeeper-server.version=["!*-temurin", >= 3.6.0 ]
diff --git a/test/dubbo-scenario-builder/pom.xml 
b/test/dubbo-scenario-builder/pom.xml
index e53c6fb2..e4ec1465 100644
--- a/test/dubbo-scenario-builder/pom.xml
+++ b/test/dubbo-scenario-builder/pom.xml
@@ -65,6 +65,12 @@
             <version>${snakeyaml.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.21</version>
+        </dependency>
+
         <dependency>
             <groupId>org.dom4j</groupId>
             <artifactId>dom4j</artifactId>
diff --git 
a/test/dubbo-scenario-builder/src/main/java/org/apache/dubbo/scenario/builder/VersionMatcher.java
 
b/test/dubbo-scenario-builder/src/main/java/org/apache/dubbo/scenario/builder/VersionMatcher.java
index 6efad17d..f4f44b1e 100644
--- 
a/test/dubbo-scenario-builder/src/main/java/org/apache/dubbo/scenario/builder/VersionMatcher.java
+++ 
b/test/dubbo-scenario-builder/src/main/java/org/apache/dubbo/scenario/builder/VersionMatcher.java
@@ -17,6 +17,9 @@
 
 package org.apache.dubbo.scenario.builder;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 import org.apache.commons.lang3.StringUtils;
 import org.asynchttpclient.AsyncHttpClient;
 import org.asynchttpclient.DefaultAsyncHttpClient;
@@ -54,7 +57,7 @@ public class VersionMatcher {
     private static final Logger logger = 
LoggerFactory.getLogger(VersionMatcher.class);
 
     /**
-     * Java Property names 
+     * Java Property names
      */
     public static final String CASE_VERSIONS_FILE = "caseVersionsFile";
     public static final String CASE_VERSION_SOURCES_FILE = 
"caseVersionSourcesFile";
@@ -110,8 +113,9 @@ public class VersionMatcher {
 
         Map<String, List<String>> candidateVersionFromRemoteMap = 
parseVersionSources(caseVersionSourcesFile);
 
-        candidateVersionFromRemoteMap.forEach((k, v)->
-                candidateVersionMap.computeIfAbsent(k, i -> new ArrayList<>())
+        // remote version first
+        candidateVersionMap.forEach((k, v) ->
+                candidateVersionFromRemoteMap.computeIfAbsent(k, i -> new 
ArrayList<>())
                         .addAll(v));
 
         // parse case version match rules
@@ -119,34 +123,34 @@ public class VersionMatcher {
 
         // Filter caseVersionMatchRules
         chooseActiveDubboVersionRule(caseVersionMatchRules);
-        
+
         Map<String, List<String>> matchedVersionMap = new LinkedHashMap<>();
 
-        candidateVersionMap.forEach((component, candidateVersionList) -> {
+        candidateVersionFromRemoteMap.forEach((component, 
candidateVersionList) -> {
             Map<String, List<MatchRule>> matchRulesMap;
-            if (Constants.DUBBO_VERSION_KEY.equals(component) && 
-                !caseVersionMatchRules.containsKey(Constants.DUBBO_VERSION_KEY)
+            if (Constants.DUBBO_VERSION_KEY.equals(component) &&
+                    
!caseVersionMatchRules.containsKey(Constants.DUBBO_VERSION_KEY)
             ) {
                 matchRulesMap = caseVersionMatchRules.keySet().stream()
-                    .filter(key -> !extractDubboServiceName(key).isEmpty())
-                    .collect(Collectors.toMap(
-                            key -> key,
-                            key -> caseVersionMatchRules.get(key)
-                    ));
+                        .filter(key -> !extractDubboServiceName(key).isEmpty())
+                        .collect(Collectors.toMap(
+                                key -> key,
+                                key -> caseVersionMatchRules.get(key)
+                        ));
             } else {
                 matchRulesMap = new HashMap<>();
                 if (caseVersionMatchRules.get(component) != null) {
                     matchRulesMap.put(component, 
caseVersionMatchRules.get(component));
                 }
             }
-            
+
             if (matchRulesMap.isEmpty()) {
                 return;
             }
 
             for (String matchRulesKey : matchRulesMap.keySet()) {
                 List<MatchRule> matchRules = matchRulesMap.get(matchRulesKey);
-                
+
                 // matching rules
                 List<String> matchedVersionList = new ArrayList<>();
                 for (String version : candidateVersionList) {
@@ -188,11 +192,13 @@ public class VersionMatcher {
         if (versionProfiles.isEmpty()) {
             errorAndExit(Constants.EXIT_UNMATCHED, "Version matrix is empty");
         }
+        boolean onlyLatest = 
!Boolean.parseBoolean(System.getenv(ALL_REMOTE_VERSION));
+
         try (FileOutputStream fos = new FileOutputStream(outputFile);
              PrintWriter pw = new PrintWriter(fos)) {
             StringBuilder sb = new StringBuilder();
             int size = versionProfiles.size();
-            for (int i = 0; i < size; i++) {
+            for (int i = 0; i < (onlyLatest ? 1 : size); i++) {
                 List<String> profile = versionProfiles.get(i);
                 for (String version : profile) {
                     //-Dxxx.version=1.0.0
@@ -208,11 +214,12 @@ public class VersionMatcher {
     }
 
     /**
-     * Choose only one final active Dubbo version rule from following case: 
+     * Choose only one final active Dubbo version rule from following case:
      * <br>
      * 1. dubbo.version - original usage
      * <br>
      * 2. dubbo.{service}.version - different services can have different 
dubbo version for supporting compatibility-test
+     *
      * @param caseVersionMatchRules
      */
     private static void chooseActiveDubboVersionRule(Map<String, 
List<MatchRule>> caseVersionMatchRules) {
@@ -225,6 +232,7 @@ public class VersionMatcher {
 
     /**
      * Extract service name from the given key
+     *
      * @return the key or empty string when not matched.
      */
     public static String extractDubboServiceName(String key) {
@@ -232,15 +240,15 @@ public class VersionMatcher {
         if (matcher.matches()) {
             return matcher.group(1);
         }
-        
+
         return "";
     }
-    
+
     private static boolean hasIncludeVersion(List<MatchRule> matchRules, 
String version) {
         boolean included = false;
-        version = trimVersion(version);
+        String trimVersion = trimVersion(version);
         for (MatchRule matchRule : matchRules) {
-            if (matchRule.match(version)) {
+            if (matchRule.match(matchRule instanceof WildcardMatchRule ? 
version : trimVersion)) {
                 // excluded rule has higher priority than included rule
                 if (matchRule.isExcluded()) {
                     return false;
@@ -342,10 +350,10 @@ public class VersionMatcher {
     private String trimRule(String rule, String begin, String end) {
         rule = rule.trim();
         if (rule.startsWith(begin)) {
-            if (rule.endsWith(end)){
-                return rule.substring(1, rule.length()-1);
+            if (rule.endsWith(end)) {
+                return rule.substring(1, rule.length() - 1);
             } else {
-                throw new IllegalArgumentException("Version match rule is 
invalid: "+rule);
+                throw new IllegalArgumentException("Version match rule is 
invalid: " + rule);
             }
         }
         return rule;
@@ -398,26 +406,18 @@ public class VersionMatcher {
             errorAndExit(Constants.EXIT_FAILED, "Parse case versions sources 
failed: {}", caseVersionSourcesFile, e);
         }
 
-        boolean onlyLatest = 
!Boolean.parseBoolean(System.getenv(ALL_REMOTE_VERSION));
-
         try (AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient()) {
             for (Map.Entry<String, String> entry : sources.entrySet()) {
                 String component = entry.getKey();
                 String source = entry.getValue();
-                Future<Response> f = 
asyncHttpClient.prepareGet(source).execute();
-                Response r = f.get();
-                if (r.hasResponseBody()) {
-                    SAXReader reader = new SAXReader();
-                    Document document = 
reader.read(r.getResponseBodyAsStream());
-
-                    if (onlyLatest) {
-                        String latest = document.getRootElement()
-                                .element("versioning")
-                                .elementText("release");
-                        List<String> result = new ArrayList<>();
-                        result.add(latest);
-                        versionMap.put(component, result);
-                    } else {
+                if (source.contains("repo1.maven.org")) {
+                    // maven
+                    Future<Response> f = 
asyncHttpClient.prepareGet(source).execute();
+                    Response r = f.get();
+                    if (r.hasResponseBody()) {
+                        SAXReader reader = new SAXReader();
+                        Document document = 
reader.read(r.getResponseBodyAsStream());
+
                         List<String> result = document.getRootElement()
                                 .element("versioning")
                                 .element("versions")
@@ -426,7 +426,29 @@ public class VersionMatcher {
                                 .map(Element::getText)
                                 .collect(Collectors.toList());
                         versionMap.put(component, result);
+                    } else {
+                        errorAndExit(Constants.EXIT_FAILED, "Request remote 
versions failed: {}", r);
+                    }
+                } else if (source.contains("hub")) {
+                    // Dockerhub
+                    while (source != null) {
+                        Future<Response> f = 
asyncHttpClient.prepareGet(source).execute();
+                        Response r = f.get();
+                        if (r.hasResponseBody() && r.getStatusCode() == 200) {
+                            JSONObject root = 
JSON.parseObject(r.getResponseBody());
+                            source = root.getString("next");
+                            JSONArray results = root.getJSONArray("results");
+                            for (int i = 0; i < results.size(); i++) {
+                                JSONObject jsonObject = 
results.getJSONObject(i);
+                                String tag = jsonObject.getString("name");
+                                versionMap.computeIfAbsent(component, k -> new 
ArrayList<>()).add(tag);
+                            }
+                        } else {
+                            errorAndExit(Constants.EXIT_FAILED, "Request 
remote versions failed: {}", r);
+                        }
                     }
+                } else {
+                    errorAndExit(Constants.EXIT_FAILED, "Not supported remote 
type: {}", source);
                 }
             }
         } catch (IOException | InterruptedException | ExecutionException | 
DocumentException e) {
@@ -453,6 +475,7 @@ public class VersionMatcher {
 
         /**
          * Get service the MatchRule bind to
+         *
          * @return
          */
         default String getServiceName() {
@@ -460,7 +483,7 @@ public class VersionMatcher {
         }
     }
 
-    private static abstract class ExcludableMatchRule implements MatchRule {
+    private static abstract class ExcludableMatchRule implements 
VersionMatcher.MatchRule {
         boolean excluded;
         protected String serviceName;
 
@@ -499,7 +522,7 @@ public class VersionMatcher {
 
         @Override
         public String toString() {
-            return (excluded?"!":"")+version;
+            return (excluded ? "!" : "") + version;
         }
     }
 
@@ -518,13 +541,14 @@ public class VersionMatcher {
         public boolean match(String version) {
             return this.versionPattern.matcher(version).matches();
         }
+
         @Override
         public String toString() {
-            return (excluded?"!":"")+versionWildcard;
+            return (excluded ? "!" : "") + versionWildcard;
         }
     }
 
-    private static class RangeMatchRule implements MatchRule {
+    private static class RangeMatchRule implements VersionMatcher.MatchRule {
         private VersionComparator comparator;
         private String operator;
         private String version;
@@ -550,14 +574,14 @@ public class VersionMatcher {
 
         @Override
         public String toString() {
-            return operator+version;
+            return operator + version;
         }
     }
 
-    private static class CombineMatchRule implements MatchRule {
-        List<MatchRule> matchRules = new ArrayList<>();
+    private static class CombineMatchRule implements VersionMatcher.MatchRule {
+        List<VersionMatcher.MatchRule> matchRules = new ArrayList<>();
 
-        public CombineMatchRule(List<MatchRule> matchRules) {
+        public CombineMatchRule(List<VersionMatcher.MatchRule> matchRules) {
             this.matchRules.addAll(matchRules);
         }
 
@@ -568,7 +592,7 @@ public class VersionMatcher {
 
         @Override
         public boolean match(String version) {
-            for (MatchRule matchRule : matchRules) {
+            for (VersionMatcher.MatchRule matchRule : matchRules) {
                 if (!matchRule.match(version)) {
                     return false;
                 }
@@ -579,7 +603,7 @@ public class VersionMatcher {
         @Override
         public String toString() {
             StringBuilder sb = new StringBuilder();
-            for (MatchRule rule : matchRules) {
+            for (VersionMatcher.MatchRule rule : matchRules) {
                 sb.append(rule.toString()).append(' ');
             }
             return sb.toString();
@@ -622,20 +646,21 @@ public class VersionMatcher {
         } else if (operator.startsWith("<")) {
             return lessThanComparator;
         }
-        throw new IllegalArgumentException("Comparison operator is invalid: 
"+operator);
+        throw new IllegalArgumentException("Comparison operator is invalid: " 
+ operator);
     }
 
     private Pattern cmpExprPattern = Pattern.compile("<=|>=|<|>|[\\d\\.]+");
+
     private MatchRule parseRangeMatchRule(String versionPattern) {
         List<MatchRule> matchRules = new ArrayList<>();
         Matcher matcher = cmpExprPattern.matcher(versionPattern);
         while (matcher.find()) {
             if (matchRules.size() == 2) {
-                throw new IllegalArgumentException("Invalid range match rule: 
"+versionPattern);
+                throw new IllegalArgumentException("Invalid range match rule: 
" + versionPattern);
             }
             String operator = matcher.group();
-            if(!matcher.find()){
-                throw new IllegalArgumentException("Parse range match rule 
failed, unexpected EOF: "+versionPattern);
+            if (!matcher.find()) {
+                throw new IllegalArgumentException("Parse range match rule 
failed, unexpected EOF: " + versionPattern);
             }
             String version = matcher.group();
             matchRules.add(new RangeMatchRule(operator, version));
@@ -646,7 +671,7 @@ public class VersionMatcher {
         } else if (matchRules.size() == 2) {
             return new CombineMatchRule(matchRules);
         }
-        throw new IllegalArgumentException("Parse range match rule failed: 
"+versionPattern);
+        throw new IllegalArgumentException("Parse range match rule failed: " + 
versionPattern);
     }
 
     private interface VersionComparator {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to