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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org