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);
}
}
Aggregations