You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2018/10/09 13:56:26 UTC

svn commit: r1843285 - in /tomcat/trunk: TOMCAT-NEXT.txt build.properties.default build.xml java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java res/checkstyle/org-import-control.xml

Author: remm
Date: Tue Oct  9 13:56:25 2018
New Revision: 1843285

URL: http://svn.apache.org/viewvc?rev=1843285&view=rev
Log:
Switch from OpenJSON to Noggit.

Modified:
    tomcat/trunk/TOMCAT-NEXT.txt
    tomcat/trunk/build.properties.default
    tomcat/trunk/build.xml
    tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java
    tomcat/trunk/res/checkstyle/org-import-control.xml

Modified: tomcat/trunk/TOMCAT-NEXT.txt
URL: http://svn.apache.org/viewvc/tomcat/trunk/TOMCAT-NEXT.txt?rev=1843285&r1=1843284&r2=1843285&view=diff
==============================================================================
--- tomcat/trunk/TOMCAT-NEXT.txt (original)
+++ tomcat/trunk/TOMCAT-NEXT.txt Tue Oct  9 13:56:25 2018
@@ -38,6 +38,4 @@ New items for 10.0.x onwards:
 3.  Remove the ExtensionValidator and associated classes (assuming that the
     minimum Java version is Java 9 or later).
 
-4.  New builder style alternate embedded API (likely also for 9.x).
-
-5.  Cloud aware cluster membership provider(s) (likely also for 9.x).
+4.  New embedded APIs (likely also for 9.x).

Modified: tomcat/trunk/build.properties.default
URL: http://svn.apache.org/viewvc/tomcat/trunk/build.properties.default?rev=1843285&r1=1843284&r2=1843285&view=diff
==============================================================================
--- tomcat/trunk/build.properties.default (original)
+++ tomcat/trunk/build.properties.default Tue Oct  9 13:56:25 2018
@@ -283,14 +283,14 @@ saaj-api.home=${base.path}/saaj-api-${sa
 saaj-api.jar=${saaj-api.home}/saaj-api-${saaj-api.version}.jar
 saaj-api.loc=${base-maven.loc}/javax/xml/soap/saaj-api/${saaj-api.version}/saaj-api-${saaj-api.version}.jar
 
-# ----- OpenJSON, version 1.0.10 or later -----
-openjson.version=1.0.10
-openjson.checksum.enabled=true
-openjson.checksum.algorithm=MD5|SHA-1
-openjson.checksum.value=c7c4cb9266cacc0aab5dcbb59456720c|8dcccbcc8bbfa15162cd7ca77bcf2b9daa90e70a
-openjson.home=${base.path}/openjson-${openjson.version}
-openjson.jar=${openjson.home}/openjson-${openjson.version}.jar
-openjson.loc=${base-maven.loc}/com/github/openjson/openjson/${openjson.version}/openjson-${openjson.version}.jar
+# ----- Noggit, version 0.8 or later -----
+noggit.version=0.8
+noggit.checksum.enabled=true
+noggit.checksum.algorithm=MD5|SHA-1
+noggit.checksum.value=6856f2ceab2dd7128595e4659d22d581|ba4ad65a62d7dfcf97a8d42c82ae7d8824f9087f
+noggit.home=${base.path}/noggit-${noggit.version}
+noggit.jar=${noggit.home}/noggit-${noggit.version}.jar
+noggit.loc=${base-maven.loc}/org/noggit/noggit/${noggit.version}/noggit-${noggit.version}.jar
 
 # ----- bnd & bndlib, version 4.0.0 or later  -----
 # ----- provides OSGI metadata for JARs       -----

Modified: tomcat/trunk/build.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/build.xml?rev=1843285&r1=1843284&r2=1843285&view=diff
==============================================================================
--- tomcat/trunk/build.xml (original)
+++ tomcat/trunk/build.xml Tue Oct  9 13:56:25 2018
@@ -213,7 +213,7 @@
   <path id="compile.classpath">
     <pathelement location="${jdt.jar}"/>
     <pathelement location="${saaj-api.jar}"/>
-    <pathelement location="${openjson.jar}"/>
+    <pathelement location="${noggit.jar}"/>
   </path>
 
   <path id="tomcat.classpath">
@@ -2718,14 +2718,14 @@ skip.installer property in build.propert
       <param name="checksum.value" value="${saaj-api.checksum.value}"/>
     </antcall>
 
-    <!-- Download openjson -->
+    <!-- Download noggit -->
     <antcall target="downloadfile">
-      <param name="sourcefile" value="${openjson.loc}"/>
-      <param name="destfile" value="${openjson.jar}"/>
-      <param name="destdir" value="${openjson.home}"/>
-      <param name="checksum.enabled" value="${openjson.checksum.enabled}"/>
-      <param name="checksum.algorithm" value="${openjson.checksum.algorithm}"/>
-      <param name="checksum.value" value="${openjson.checksum.value}"/>
+      <param name="sourcefile" value="${noggit.loc}"/>
+      <param name="destfile" value="${noggit.jar}"/>
+      <param name="destdir" value="${noggit.home}"/>
+      <param name="checksum.enabled" value="${noggit.checksum.enabled}"/>
+      <param name="checksum.algorithm" value="${noggit.checksum.algorithm}"/>
+      <param name="checksum.value" value="${noggit.checksum.value}"/>
     </antcall>
 
  </target>

Modified: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java?rev=1843285&r1=1843284&r2=1843285&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java (original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java Tue Oct  9 13:56:25 2018
@@ -35,11 +35,7 @@ import org.apache.catalina.tribes.member
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.codec.binary.StringUtils;
-
-import com.github.openjson.JSONArray;
-import com.github.openjson.JSONException;
-import com.github.openjson.JSONObject;
-import com.github.openjson.JSONTokener;
+import org.noggit.JSONParser;
 
 
 public class KubernetesMembershipProvider extends CloudMembershipProvider {
@@ -145,58 +141,170 @@ public class KubernetesMembershipProvide
 
     protected void parsePods(Reader reader, List<MemberImpl> members)
             throws IOException{
-        JSONObject json = new JSONObject(new JSONTokener(reader));
 
-        JSONArray items = json.getJSONArray("items");
+        int event = 0;
+        JSONParser parser = new JSONParser(reader);
+        boolean parseItems = false;
+        for (;;) {
+            event = parser.nextEvent();
+            switch (event) {
+            case JSONParser.STRING:
+                String value = parser.getString();
+                if (parser.wasKey()) {
+                    if ("items".equals(value) && parser.nextEvent() == JSONParser.ARRAY_START) {
+                        parseItems = true;
+                    }
+                }
+                break;
+            case JSONParser.ARRAY_END:
+                parseItems = false;
+                break;
+            case JSONParser.OBJECT_START:
+                if (parseItems) {
+                    parseItem(parser, members);
+                }
+                break;
+            default:
+                break;
+            }
+
+            if (event == JSONParser.EOF)
+                break;
+        }
+
+    }
+
+    private void parseItem(JSONParser parser, List<MemberImpl> members)
+            throws IOException {
+        int event = 0;
+        String podIP = null;
+        // Name in first position, creation in second
+        String[] nameAndCreationTimestamp = null;
+        for (;;) {
+            event = parser.nextEvent();
+            switch (event) {
+            case JSONParser.STRING:
+                String value = parser.getString();
+                if (parser.wasKey()) {
+                    if ("kind".equals(value)) {
+                        // Verify the item is a pod
+                        if (parser.nextEvent() != JSONParser.STRING && (!"Pod".equals(parser.getString()))) {
+                            throw new IllegalStateException();
+                        }
+                    } else if ("status".equals(value)) {
+                        // Verify the status is Running and return the podIP
+                        podIP = parseStatus(parser);
+                    } else if ("metadata".equals(value)) {
+                        nameAndCreationTimestamp = parseMetadata(parser);
+                    }
+                }
+                break;
+            case JSONParser.OBJECT_END:
+                // Done
+                if (podIP == null || nameAndCreationTimestamp == null
+                    || nameAndCreationTimestamp[0] == null
+                    || nameAndCreationTimestamp[1] == null) {
+                    throw new IOException(sm.getString("kubernetesMembershipProvider.jsonError"));
+                } else {
+                    // We found ourselves, ignore
+                    if (nameAndCreationTimestamp[0].equals(hostName))
+                        return;
+
+                    // id = md5(hostname)
+                    byte[] id = md5.digest(nameAndCreationTimestamp[0].getBytes());
+                    long aliveTime = Duration.between(Instant.parse(nameAndCreationTimestamp[1]), startTime).getSeconds() * 1000; // aliveTime is in ms
+
+                    MemberImpl member = null;
+                    try {
+                        member = new MemberImpl(podIP, port, aliveTime);
+                    } catch (IOException e) {
+                        // Shouldn't happen:
+                        // an exception is thrown if hostname can't be resolved to IP, but we already provide an IP
+                        log.error(sm.getString("kubernetesMembershipProvider.memberError"), e);
+                        continue;
+                    }
+
+                    member.setUniqueId(id);
+                    members.add(member);
+                }
+                return;
+            default:
+                break;
+            }
+
+            if (event == JSONParser.EOF)
+                break;
+        }
+
+    }
+
+    private String parseStatus(JSONParser parser)
+            throws IOException {
+        String result = null;
+        int event = 0;
+        for (;;) {
+            event = parser.nextEvent();
+            switch (event) {
+            case JSONParser.STRING:
+                String value = parser.getString();
+                if (parser.wasKey()) {
+                    if ("phase".equals(value)) {
+                        // Verify the item is a pod
+                        if (parser.nextEvent() != JSONParser.STRING && (!"Running".equals(parser.getString()))) {
+                            return null;
+                        }
+                    } else if ("podIP".equals(value)) {
+                        if (parser.nextEvent() == JSONParser.STRING) {
+                            result = parser.getString();
+                        }
+                    }
+                }
+                break;
+            case JSONParser.OBJECT_END:
+                // Done
+                return result;
+            default:
+                break;
+            }
+
+            if (event == JSONParser.EOF)
+                break;
+        }
+        return result;
+    }
 
-        for (int i = 0; i < items.length(); i++) {
-            String phase;
-            String ip;
-            String name;
-            Instant creationTime;
-
-            try {
-                JSONObject item = items.getJSONObject(i);
-                JSONObject status = item.getJSONObject("status");
-                phase = status.getString("phase");
-
-                // Ignore shutdown pods
-                if (!phase.equals("Running"))
-                    continue;
-
-                ip = status.getString("podIP");
-
-                // Get name & start time
-                JSONObject metadata = item.getJSONObject("metadata");
-                name = metadata.getString("name");
-                String timestamp = metadata.getString("creationTimestamp");
-                creationTime = Instant.parse(timestamp);
-            } catch (JSONException e) {
-                log.error(sm.getString("kubernetesMembershipProvider.jsonError"), e);
-                continue;
-            }
-
-            // We found ourselves, ignore
-            if (name.equals(hostName))
-                continue;
-
-            // id = md5(hostname)
-            byte[] id = md5.digest(name.getBytes());
-            long aliveTime = Duration.between(creationTime, startTime).getSeconds() * 1000; // aliveTime is in ms
-
-            MemberImpl member = null;
-            try {
-                member = new MemberImpl(ip, port, aliveTime);
-            } catch (IOException e) {
-                // Shouldn't happen:
-                // an exception is thrown if hostname can't be resolved to IP, but we already provide an IP
-                log.error(sm.getString("kubernetesMembershipProvider.memberError"), e);
-                continue;
+    private String[] parseMetadata(JSONParser parser)
+            throws IOException {
+        String[] result = new String[2];
+        int event = 0;
+        for (;;) {
+            event = parser.nextEvent();
+            switch (event) {
+            case JSONParser.STRING:
+                String value = parser.getString();
+                if (parser.wasKey()) {
+                    if ("name".equals(value)) {
+                        if (parser.nextEvent() == JSONParser.STRING) {
+                            result[0] = parser.getString();
+                        }
+                    } else if ("creationTimestamp".equals(value)) {
+                        if (parser.nextEvent() == JSONParser.STRING) {
+                            result[1] = parser.getString();
+                        }
+                    }
+                }
+                break;
+            case JSONParser.OBJECT_END:
+                // Done
+                return result;
+            default:
+                break;
             }
 
-            member.setUniqueId(id);
-            members.add(member);
+            if (event == JSONParser.EOF)
+                break;
         }
+        return result;
     }
 
 }

Modified: tomcat/trunk/res/checkstyle/org-import-control.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/res/checkstyle/org-import-control.xml?rev=1843285&r1=1843284&r2=1843285&view=diff
==============================================================================
--- tomcat/trunk/res/checkstyle/org-import-control.xml (original)
+++ tomcat/trunk/res/checkstyle/org-import-control.xml Tue Oct  9 13:56:25 2018
@@ -85,7 +85,7 @@
         <subpackage name="cloud">
           <allow class="org.apache.tomcat.util.codec.binary.StringUtils"/>
           <allow class="org.apache.tomcat.util.net.jsse.PEMFile"/>
-          <allow pkg="com.github.openjson"/>
+          <allow pkg="org.noggit"/>
         </subpackage>
       </subpackage>
     </subpackage>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r1843285 - in /tomcat/trunk: TOMCAT-NEXT.txt build.properties.default build.xml java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java res/checkstyle/org-import-control.xml

Posted by Rémy Maucherat <re...@apache.org>.
On Tue, Oct 9, 2018 at 3:56 PM <re...@apache.org> wrote:

> Author: remm
> Date: Tue Oct  9 13:56:25 2018
> New Revision: 1843285
>
> URL: http://svn.apache.org/viewvc?rev=1843285&view=rev
> Log:
> Switch from OpenJSON to Noggit.
>
> Modified:
>     tomcat/trunk/TOMCAT-NEXT.txt
>     tomcat/trunk/build.properties.default
>     tomcat/trunk/build.xml
>
> tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java
>     tomcat/trunk/res/checkstyle/org-import-control.xml
>

Given the Noggit version number and lack of recent commits, it might be a
good idea to include the package renamed source in util. IMO. Maybe we can
talk to the author about it.
Or switch back to openjson.

Rémy