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 09:21:51 UTC

svn commit: r1843232 - in /tomcat/trunk: java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java test/org/apache/catalina/tribes/membership/cloud/ test/org/apache/catalina/tribes/membership/cloud/TestKubernetesJson.java

Author: remm
Date: Tue Oct  9 09:21:51 2018
New Revision: 1843232

URL: http://svn.apache.org/viewvc?rev=1843232&view=rev
Log:
Refactor to add a json test. The json isn't a separate text file since I cannot put the license text in it.

Added:
    tomcat/trunk/test/org/apache/catalina/tribes/membership/cloud/
    tomcat/trunk/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesJson.java   (with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java

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=1843232&r1=1843231&r2=1843232&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 09:21:51 2018
@@ -20,6 +20,7 @@ package org.apache.catalina.tribes.membe
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.Reader;
 import java.net.URLEncoder;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
@@ -56,8 +57,9 @@ public class KubernetesMembershipProvide
 
         // Set up Kubernetes API parameters
         String namespace = getEnv("KUBERNETES_NAMESPACE", CUSTOM_ENV_PREFIX + "NAMESPACE");
-        if (namespace == null || namespace.length() == 0)
-            throw new RuntimeException(sm.getString("kubernetesMembershipProvider.noNamespace"));
+        if (namespace == null || namespace.length() == 0) {
+            throw new IllegalArgumentException(sm.getString("kubernetesMembershipProvider.noNamespace"));
+        }
 
         if (log.isDebugEnabled()) {
             log.debug(String.format("Namespace [%s] set; clustering enabled", namespace));
@@ -131,64 +133,70 @@ public class KubernetesMembershipProvide
 
         List<MemberImpl> members = new ArrayList<>();
 
-        try (InputStream stream = streamProvider.openStream(url, headers, connectionTimeout, readTimeout)) {
-            JSONObject json = new JSONObject(new JSONTokener(new InputStreamReader(stream, "UTF-8")));
+        try (InputStream stream = streamProvider.openStream(url, headers, connectionTimeout, readTimeout);
+                InputStreamReader reader = new InputStreamReader(stream, "UTF-8")) {
+            parsePods(reader, members);
+        } catch (IOException e) {
+            log.error(sm.getString("kubernetesMembershipProvider.streamError"), e);
+        }
 
-            JSONArray items = json.getJSONArray("items");
+        return members.toArray(new Member[0]);
+    }
 
-            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.warn(sm.getString("kubernetesMembershipProvider.jsonError"), e);
-                    continue;
-                }
+    protected void parsePods(Reader reader, List<MemberImpl> members)
+            throws IOException{
+        JSONObject json = new JSONObject(new JSONTokener(reader));
+
+        JSONArray items = json.getJSONArray("items");
+
+        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");
 
-                // We found ourselves, ignore
-                if (name.equals(hostName))
+                // Ignore shutdown pods
+                if (!phase.equals("Running"))
                     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.warn(sm.getString("kubernetesMembershipProvider.memberError"), e);
-                    continue;
-                }
+                ip = status.getString("podIP");
 
-                member.setUniqueId(id);
-                members.add(member);
+                // 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;
             }
-        } catch (IOException e) {
-            log.warn(sm.getString("kubernetesMembershipProvider.streamError"), e);
-        }
 
-        return members.toArray(new Member[0]);
+            // 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;
+            }
+
+            member.setUniqueId(id);
+            members.add(member);
+        }
     }
 
 }

Added: tomcat/trunk/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesJson.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesJson.java?rev=1843232&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesJson.java (added)
+++ tomcat/trunk/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesJson.java Tue Oct  9 09:21:51 2018
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+package org.apache.catalina.tribes.membership.cloud;
+
+import java.io.StringReader;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.catalina.tribes.membership.MemberImpl;
+
+public class TestKubernetesJson extends KubernetesMembershipProvider {
+
+    private static final String JSON_POD_LIST = "{\n" +
+            "  \"kind\": \"List\",\n" +
+            "  \"apiVersion\": \"v1\",\n" +
+            "  \"items\": [\n" +
+            "    {\n" +
+            "      \"kind\": \"Pod\",\n" +
+            "      \"apiVersion\": \"v1\",\n" +
+            "      \"metadata\": {\n" +
+            "        \"name\": \"test_pod\",\n" +
+            "        \"namespace\": \"default\",\n" +
+            "        \"selfLink\": \"/api/v1/pods/foo\",\n" +
+            "        \"uid\": \"748932794874923\",\n" +
+            "        \"resourceVersion\": \"23\",\n" +
+            "        \"creationTimestamp\": \"2018-10-02T09:14:01Z\"\n" +
+            "      },\n" +
+            "      \"status\": {\n" +
+            "        \"phase\": \"Running\",\n" +
+            "        \"podIP\": \"192.168.0.2\"\n" +
+            "      }\n" +
+            "    },\n" +
+            "    {\n" +
+            "      \"kind\": \"Pod\",\n" +
+            "      \"apiVersion\": \"v1\",\n" +
+            "      \"metadata\": {\n" +
+            "        \"name\": \"test_pod_2\",\n" +
+            "        \"namespace\": \"default\",\n" +
+            "        \"selfLink\": \"/api/v1/pods/foo2\",\n" +
+            "        \"uid\": \"7489327944322341414923\",\n" +
+            "        \"resourceVersion\": \"18\",\n" +
+            "        \"creationTimestamp\": \"2018-10-01T09:14:01Z\"\n" +
+            "      },\n" +
+            "      \"status\": {\n" +
+            "        \"phase\": \"Running\",\n" +
+            "        \"podIP\": \"192.168.0.3\"\n" +
+            "      }\n" +
+            "    }\n" +
+            "  ]\n" +
+            "}";
+
+    @Test
+    public void testJson() throws Exception {
+        startTime = Instant.now();
+
+        List<MemberImpl> members = new ArrayList<>();
+        parsePods(new StringReader(JSON_POD_LIST), members);
+
+        Assert.assertTrue(members.size() == 2);
+        Assert.assertTrue("192.168.0.2".equals(members.get(0).getHostname()));
+        Assert.assertTrue("tcp://192.168.0.2:0".equals(members.get(0).getName()));
+    }
+}

Propchange: tomcat/trunk/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesJson.java
------------------------------------------------------------------------------
    svn:eol-style = native



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