Search in sources :

Example 1 with JSONParser

use of org.apache.tomcat.util.json.JSONParser in project tomcat by apache.

the class KubernetesMembershipProvider method parsePods.

@SuppressWarnings("unchecked")
protected void parsePods(Reader reader, List<MemberImpl> members) {
    JSONParser parser = new JSONParser(reader);
    try {
        LinkedHashMap<String, Object> json = parser.object();
        Object itemsObject = json.get("items");
        if (!(itemsObject instanceof List<?>)) {
            log.error(sm.getString("kubernetesMembershipProvider.invalidPodsList", "no items"));
            return;
        }
        List<Object> items = (List<Object>) itemsObject;
        for (Object podObject : items) {
            if (!(podObject instanceof LinkedHashMap<?, ?>)) {
                log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "item"));
                continue;
            }
            LinkedHashMap<String, Object> pod = (LinkedHashMap<String, Object>) podObject;
            // If there is a "kind", check it is "Pod"
            Object podKindObject = pod.get("kind");
            if (podKindObject != null && !"Pod".equals(podKindObject)) {
                continue;
            }
            // "metadata" contains "name", "uid" and "creationTimestamp"
            Object metadataObject = pod.get("metadata");
            if (!(metadataObject instanceof LinkedHashMap<?, ?>)) {
                log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "metadata"));
                continue;
            }
            LinkedHashMap<String, Object> metadata = (LinkedHashMap<String, Object>) metadataObject;
            Object nameObject = metadata.get("name");
            if (nameObject == null) {
                log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "name"));
                continue;
            }
            Object objectUid = metadata.get("uid");
            Object creationTimestampObject = metadata.get("creationTimestamp");
            if (creationTimestampObject == null) {
                log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "uid"));
                continue;
            }
            String creationTimestamp = creationTimestampObject.toString();
            // "status" contains "phase" (which must be "Running") and "podIP"
            Object statusObject = pod.get("status");
            if (!(statusObject instanceof LinkedHashMap<?, ?>)) {
                log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "status"));
                continue;
            }
            LinkedHashMap<String, Object> status = (LinkedHashMap<String, Object>) statusObject;
            if (!"Running".equals(status.get("phase"))) {
                continue;
            }
            Object podIPObject = status.get("podIP");
            if (podIPObject == null) {
                log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "podIP"));
                continue;
            }
            String podIP = podIPObject.toString();
            String uid = (objectUid == null) ? podIP : objectUid.toString();
            // We found ourselves, ignore
            if (podIP.equals(localIp)) {
                // Update the UID on initial lookup
                Member localMember = service.getLocalMember(false);
                if (localMember.getUniqueId() == CloudMembershipService.INITIAL_ID && localMember instanceof MemberImpl) {
                    byte[] id = md5.digest(uid.getBytes(StandardCharsets.US_ASCII));
                    ((MemberImpl) localMember).setUniqueId(id);
                }
                continue;
            }
            long aliveTime = Duration.between(Instant.parse(creationTimestamp), startTime).toMillis();
            MemberImpl member = null;
            try {
                member = new MemberImpl(podIP, 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;
            }
            byte[] id = md5.digest(uid.getBytes(StandardCharsets.US_ASCII));
            member.setUniqueId(id);
            members.add(member);
        }
    } catch (Exception e) {
        log.error(sm.getString("kubernetesMembershipProvider.jsonError"), e);
    }
}
Also used : MemberImpl(org.apache.catalina.tribes.membership.MemberImpl) IOException(java.io.IOException) IOException(java.io.IOException) LinkedHashMap(java.util.LinkedHashMap) JSONParser(org.apache.tomcat.util.json.JSONParser) ArrayList(java.util.ArrayList) List(java.util.List) Member(org.apache.catalina.tribes.Member)

Aggregations

IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 LinkedHashMap (java.util.LinkedHashMap)1 List (java.util.List)1 Member (org.apache.catalina.tribes.Member)1 MemberImpl (org.apache.catalina.tribes.membership.MemberImpl)1 JSONParser (org.apache.tomcat.util.json.JSONParser)1