Author: remm Date: Fri Dec 14 13:37:45 2018 New Revision: 1848938 URL: http://svn.apache.org/viewvc?rev=1848938&view=rev Log: Add dns-ping support to enumerate cluster members. This is much simpler than getting the pod list but it does not indicate pod status. Submitted by by Maxime Beck.
Added: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java (with props) Removed: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/Constants.java Modified: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/AbstractStreamProvider.java tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/AbstractStreamProvider.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/AbstractStreamProvider.java?rev=1848938&r1=1848937&r2=1848938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/AbstractStreamProvider.java (original) +++ tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/AbstractStreamProvider.java Fri Dec 14 13:37:45 2018 @@ -42,7 +42,7 @@ import org.apache.juli.logging.LogFactor public abstract class AbstractStreamProvider implements StreamProvider { private static final Log log = LogFactory.getLog(AbstractStreamProvider.class); - protected static final StringManager sm = StringManager.getManager(Constants.Package); + protected static final StringManager sm = StringManager.getManager(AbstractStreamProvider.class); protected static final TrustManager[] INSECURE_TRUST_MANAGERS = new TrustManager[] { new X509TrustManager() { Modified: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java?rev=1848938&r1=1848937&r2=1848938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java (original) +++ tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java Fri Dec 14 13:37:45 2018 @@ -39,8 +39,8 @@ import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; public abstract class CloudMembershipProvider extends MembershipProviderBase implements Heartbeat, ChannelListener { - private static final Log log = LogFactory.getLog(KubernetesMembershipProvider.class); - protected static final StringManager sm = StringManager.getManager(Constants.Package); + private static final Log log = LogFactory.getLog(CloudMembershipProvider.class); + protected static final StringManager sm = StringManager.getManager(CloudMembershipProvider.class); protected String url; protected StreamProvider streamProvider; Modified: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java?rev=1848938&r1=1848937&r2=1848938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java (original) +++ tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java Fri Dec 14 13:37:45 2018 @@ -35,12 +35,12 @@ public class CloudMembershipService exte implements CloudMembershipServiceMBean { private static final Log log = LogFactory.getLog(CloudMembershipService.class); - protected static final StringManager sm = StringManager.getManager(Constants.Package); + protected static final StringManager sm = StringManager.getManager(CloudMembershipService.class); public static final String MEMBERSHIP_PROVIDER_CLASS_NAME = "membershipProviderClassName"; private static final String KUBE = "kubernetes"; private static final String KUBE_PROVIDER_CLASS = "org.apache.catalina.tribes.membership.cloud.KubernetesMembershipProvider"; - static final byte[] INITIAL_ID = new byte[16]; + protected static final byte[] INITIAL_ID = new byte[16]; private MembershipProvider membershipProvider; private MemberImpl localMember; Added: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java?rev=1848938&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java (added) +++ tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java Fri Dec 14 13:37:45 2018 @@ -0,0 +1,97 @@ +/* + * 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.IOException; +import java.net.InetAddress; +import java.net.URLEncoder; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.catalina.tribes.Member; +import org.apache.catalina.tribes.MembershipService; +import org.apache.catalina.tribes.membership.MemberImpl; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +public class DNSMembershipProvider extends CloudMembershipProvider { + private static final Log log = LogFactory.getLog(DNSMembershipProvider.class); + + private static final String CUSTOM_ENV_PREFIX = "OPENSHIFT_KUBE_PING_"; + private String namespace; + + @Override + public void start(int level) throws Exception { + if ((level & MembershipService.MBR_RX) == 0) { + return; + } + + super.start(level); + + // Set up Kubernetes API parameters + namespace = getEnv("KUBERNETES_NAMESPACE", CUSTOM_ENV_PREFIX + "NAMESPACE"); + 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)); + } + namespace = URLEncoder.encode(namespace, "UTF-8"); + + // Fetch initial members + heartbeat(); + } + + @Override + public boolean stop(int level) throws Exception { + return super.stop(level); + } + + @Override + protected Member[] fetchMembers() { + List<MemberImpl> members = new ArrayList<>(); + + InetAddress[] inetAddresses = null; + try { + inetAddresses = InetAddress.getAllByName(namespace); + } catch (UnknownHostException exception) { + log.warn(sm.getString("dnsMembershipProvider.dnsError", namespace), exception); + } + + if (inetAddresses != null) { + for (InetAddress inetAddress : inetAddresses) { + String ip = inetAddress.getHostAddress(); + byte[] id = md5.digest(ip.getBytes()); + long aliveTime = -1; + MemberImpl member = null; + try { + member = new MemberImpl(ip, port, aliveTime); + } catch (IOException e) { + log.error(sm.getString("kubernetesMembershipProvider.memberError"), e); + continue; + } + member.setUniqueId(id); + members.add(member); + } + } + + return members.toArray(new Member[0]); + } +} \ No newline at end of file Propchange: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java ------------------------------------------------------------------------------ svn:eol-style = native 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=1848938&r1=1848937&r2=1848938&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 Fri Dec 14 13:37:45 2018 @@ -176,7 +176,6 @@ public class KubernetesMembershipProvide } String name = nameObject.toString(); Object objectUid = metadata.get("uid"); - String uid = (objectUid == null) ? name : objectUid.toString(); Object creationTimestampObject = metadata.get("creationTimestamp"); if (creationTimestampObject == null) { log.warn(sm.getString("kubernetesMembershipProvider.invalidPod")); @@ -199,6 +198,7 @@ public class KubernetesMembershipProvide continue; } String podIP = podIPObject.toString(); + String uid = (objectUid == null) ? podIP : objectUid.toString(); // We found ourselves, ignore if (name.equals(hostName)) { @@ -211,7 +211,7 @@ public class KubernetesMembershipProvide continue; } - long aliveTime = Duration.between(Instant.parse(creationTimestamp), startTime).getSeconds() * 1000; // aliveTime is in ms + long aliveTime = Duration.between(Instant.parse(creationTimestamp), startTime).toMillis(); MemberImpl member = null; try { Modified: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties?rev=1848938&r1=1848937&r2=1848938&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties Fri Dec 14 13:37:45 2018 @@ -21,6 +21,8 @@ certificateStream.clientCertError=Could cloudMembershipService.stopFail=Unable to stop the static membership service, level: [{0}] +dnsMembershipProvider.dnsError=Error getting hosts address list for namespace [{0}] + kubernetesMembershipProvider.invalidPod=Pod is missing some required attributes kubernetesMembershipProvider.invalidPodsList=Invalid pods list: {0} kubernetesMembershipProvider.jsonError=JSON error Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1848938&r1=1848937&r2=1848938&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Fri Dec 14 13:37:45 2018 @@ -63,6 +63,15 @@ </fix> </changelog> </subsection> + <subsection name="Tribes"> + <changelog> + <update> + Add dns-ping support to enumerate cluster members. This is much simpler + than getting the pod list but it does not indicate pod status. + Submitted by by Maxime Beck. (remm) + </update> + </changelog> + </subsection> </section> <section name="Tomcat 9.0.14 (markt)" rtext="2018-12-12"> <subsection name="Catalina"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org