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