#!/usr/bin/env python # coding: utf-8 # In[1]: import kubernetes.config import kubernetes.client import json context = "ovh" ns = "ovh2" hub_api = "https://hub.ovh2.mybinder.org/hub/api" kubernetes.config.load_config(context=context) k8s = kubernetes.client.CoreV1Api() # In[2]: import base64 hub_secret = k8s.read_namespaced_secret("hub", namespace=ns) api_token = base64.b64decode(hub_secret.data['hub.services.binder.apiToken']).decode("ascii") # In[3]: user_pods = k8s.list_namespaced_pod(namespace=ns, label_selector="component=singleuser-server").items user_pods = sorted(user_pods, key=lambda pod: pod.status.start_time, reverse=True) # In[4]: import requests s = requests.Session() s.headers = { "Authorization": f"Bearer {api_token}", "Accept": "application/jupyterhub-pagination+json", } all_users = [] user_info = s.get(hub_api + "/users").json() all_users.extend(user_info["items"]) next_page = user_info["_pagination"]["next"] while next_page: user_info = s.get(hub_api + "/users", params=next_page).json() all_users.extend(user_info["items"]) next_page = user_info["_pagination"]["next"] # In[5]: current_users = { user['name']: user for user in all_users } # In[6]: pods_by_user = { pod.metadata.annotations['hub.jupyter.org/username']: pod for pod in user_pods } # In[7]: pods_without_users = [] for pod in user_pods: username = pod.metadata.annotations['hub.jupyter.org/username'] if username not in current_users: pods_without_users.append(pod) # In[8]: len(pods_without_users) # In[9]: for pod in pods_without_users: print(pod.metadata.name, pod.status.start_time) # k8s.delete_namespaced_pod(pod.metadata.name, pod.metadata.namespace)