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