11import datetime
22import logging
3+ import time
34from urllib .parse import urljoin
45
56import requests
@@ -55,6 +56,10 @@ def request(cluster, path, **kwargs):
5556 return session .get (urljoin (cluster .api_server_url , path ), auth = cluster .auth , verify = cluster .ssl_ca_cert , ** kwargs )
5657
5758
59+ def parse_time (s : str ):
60+ return datetime .datetime .strptime (s , '%Y-%m-%dT%H:%M:%SZ' ).replace (tzinfo = datetime .timezone .utc ).timestamp ()
61+
62+
5863def query_kubernetes_cluster (cluster ):
5964 cluster_id = cluster .id
6065 api_server_url = cluster .api_server_url
@@ -68,14 +73,24 @@ def query_kubernetes_cluster(cluster):
6873 nodes [obj ['name' ]] = obj
6974 response = request (cluster , '/api/v1/pods' )
7075 response .raise_for_status ()
76+ now = time .time ()
7177 for pod in response .json ()['items' ]:
7278 obj = map_pod (pod )
7379 if 'deletionTimestamp' in pod ['metadata' ]:
74- obj ['deleted' ] = datetime .datetime .strptime (pod ['metadata' ]['deletionTimestamp' ],
75- '%Y-%m-%dT%H:%M:%SZ' ).replace (
76- tzinfo = datetime .timezone .utc ).timestamp ()
80+ obj ['deleted' ] = parse_time (pod ['metadata' ]['deletionTimestamp' ])
7781 for cont in pod ['spec' ]['containers' ]:
7882 obj ['containers' ].append (map_container (cont , pod ))
83+ if obj ['phase' ] == 'Succeeded' :
84+ last_termination_time = 0
85+ for container in obj ['containers' ]:
86+ termination_time = container .get ('state' , {}).get ('terminated' , {}).get ('finishedAt' , '' )
87+ termination_time = parse_time (termination_time )
88+ if termination_time > last_termination_time :
89+ last_termination_time = termination_time
90+ if last_termination_time < now - 3600 :
91+ # the job/pod finished more than an hour ago
92+ # => filter out
93+ continue
7994 pods_by_namespace_name [(obj ['namespace' ], obj ['name' ])] = obj
8095 pod_key = '{}/{}' .format (obj ['namespace' ], obj ['name' ])
8196 if 'nodeName' in pod ['spec' ] and pod ['spec' ]['nodeName' ] in nodes :
0 commit comments