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

Reply via email to