From a371b1bc27e18ab85ceb371b38953c7344ebafcf Mon Sep 17 00:00:00 2001 From: George Kraft Date: Fri, 27 Jan 2017 09:33:10 -0600 Subject: [PATCH] Add "Waiting for kube-system pods to start" status message --- .../reactive/kubernetes_master.py | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py b/cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py index 0fd56553d50..b23c1466966 100644 --- a/cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py +++ b/cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py @@ -19,7 +19,7 @@ import os import random import socket import string - +import json from shlex import split from subprocess import call @@ -182,7 +182,9 @@ def set_app_version(): @when('kube-dns.available', 'kubernetes-master.components.installed') def idle_status(): ''' Signal at the end of the run that we are running. ''' - if hookenv.config('service-cidr') != service_cidr(): + if not all_kube_system_pods_running(): + hookenv.status_set('waiting', 'Waiting for kube-system pods to start') + elif hookenv.config('service-cidr') != service_cidr(): hookenv.status_set('active', 'WARN: cannot change service-cidr, still using ' + service_cidr()) else: hookenv.status_set('active', 'Kubernetes master running.') @@ -657,3 +659,24 @@ def setup_tokens(token, username, user): token = ''.join(random.SystemRandom().choice(alpha) for _ in range(32)) with open(known_tokens, 'w') as stream: stream.write('{0},{1},{2}'.format(token, username, user)) + + +def all_kube_system_pods_running(): + ''' Check pod status in the kube-system namespace. Returns True if all + pods are running, False otherwise. ''' + cmd = ['kubectl', 'get', 'po', '-n', 'kube-system', '-o', 'json'] + + try: + output = check_output(cmd).decode('utf-8') + except CalledProcessError: + hookenv.log('failed to get kube-system pod status') + return False + + result = json.loads(output) + + for pod in result['items']: + status = pod['status']['phase'] + if status != 'Running': + return False + + return True