Skip to content

Instantly share code, notes, and snippets.

@jhamman
Created April 5, 2019 16:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jhamman/a7f8a00fa19cfa9ecaf5a252a4707842 to your computer and use it in GitHub Desktop.
Save jhamman/a7f8a00fa19cfa9ecaf5a252a4707842 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"from kubernetes import config\n",
"\n",
"os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/Users/jhamman/workdir/pangeo-cloud-federation/deployments/dev/secrets/gcloud-service-key.json'\n",
"\n",
"if os.path.exists(os.path.join(os.environ[\"HOME\"], '.kube/config')):\n",
" config.load_kube_config(\n",
" os.path.join(os.environ[\"HOME\"], '.kube/config'))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"\n",
"class K8sClusterStatus(object):\n",
" \n",
" def __init__(self, client=None, namespaces=None):\n",
" import kubernetes\n",
"\n",
" if client is None:\n",
" self.client = kubernetes.client.CoreV1Api()\n",
" if namespaces is None:\n",
" self.namespaces = [i.metadata.name for i in self.client.list_namespace().items]\n",
" \n",
" def _get_pod_table(self, namespace, html=True):\n",
" import pandas as pd\n",
"\n",
" from dateutil.tz import tzutc\n",
" import datetime\n",
" \n",
" pod_list = self.client.list_namespaced_pod(namespace)\n",
" \n",
" names = []\n",
" status = []\n",
" restarts = []\n",
" age = []\n",
" now = datetime.datetime.now(tz=tzutc())\n",
" for pod in pod_list.items:\n",
"\n",
" names.append(pod.metadata.name)\n",
" status.append(pod.status.phase)\n",
" restarts.append(pod.status.container_statuses[0].restart_count)\n",
" age.append(now - pod.status.container_statuses[0].state.running.started_at)\n",
"\n",
" pods = pd.DataFrame({'STATUS': status, 'RESTARTS': restarts, 'AGE': age}, index=names)\n",
" if html:\n",
" return pods.to_html(border=1)\n",
"\n",
" return pods\n",
" \n",
" def _widget(self):\n",
"\n",
" from ipywidgets import GridBox, Layout, Dropdown, HTML\n",
"\n",
" namespace = Dropdown(\n",
" options=self.namespaces,\n",
" value='default',\n",
" description='Namespace:',\n",
" disabled=False,\n",
" )\n",
"\n",
" main = HTML(self._get_pod_table(namespace.value), description='')\n",
" self.table = main\n",
" \n",
" def update_html(change):\n",
" main.value = self._get_pod_table(namespace.value)\n",
"\n",
" namespace.observe(update_html, names='value')\n",
"\n",
" box = GridBox(children=[namespace, main],\n",
" layout=Layout(display='flex',\n",
" flex_flow='column',\n",
" width='76%')\n",
" )\n",
" self._cached_widget = box\n",
" \n",
" return box\n",
"\n",
" def _ipython_display_(self, **kwargs):\n",
" return self._widget()._ipython_display_(**kwargs)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6c5eab0aa90f47f7b66b2478782641ff",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"GridBox(children=(Dropdown(description='Namespace:', options=('default', 'kube-public', 'kube-system', 'prod',…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"w = K8sClusterStatus()\n",
"display(w)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment