From 4af548bb5aa80e6c32c729e8fff1bc52cf8f176e Mon Sep 17 00:00:00 2001 From: Kevin W Monroe Date: Tue, 6 Feb 2018 05:16:20 +0000 Subject: [PATCH 1/2] Ensure daemon opts are in effect before docker login --- .../kubernetes-worker/reactive/kubernetes_worker.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py b/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py index 78fbcc6d339..61e2e05b349 100644 --- a/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py +++ b/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py @@ -451,8 +451,17 @@ def extra_args_changed(): @when('config.changed.docker-logins') +@when_not('docker.restart') def docker_logins_changed(): + """Login to a docker registry with configured credentials.""" config = hookenv.config() + + if data_changed('docker-opts', config['docker-opts']): + hookenv.log('Skipping docker login until daemon is restarted.') + # State will be removed by layer-docker after restart + set_state('docker.restart') + return + previous_logins = config.previous('docker-logins') logins = config['docker-logins'] logins = json.loads(logins) From fa440c8dd2e530d56e5727f578ba57e769b8d628 Mon Sep 17 00:00:00 2001 From: Kevin W Monroe Date: Tue, 6 Feb 2018 11:29:42 -0600 Subject: [PATCH 2/2] split docker-logins logic into 2 handlers Previous commit relied on non-obvious reactive behavior, with the 'docker.restart' flag being exploited to re-execute docker_logins_changed in a single hook execution. Split this into 2 handlers: - when docker-logins config changes, set one flag to handle the login and another to request a daemon restart (if needed). - run docker login after any potential daemon restarts have occurred. --- .../reactive/kubernetes_worker.py | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py b/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py index 61e2e05b349..edc6fa24cb0 100644 --- a/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py +++ b/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py @@ -451,16 +451,27 @@ def extra_args_changed(): @when('config.changed.docker-logins') -@when_not('docker.restart') def docker_logins_changed(): - """Login to a docker registry with configured credentials.""" + """Set a flag to handle new docker login options. + + If docker daemon options have also changed, set a flag to ensure the + daemon is restarted prior to running docker login. + """ config = hookenv.config() if data_changed('docker-opts', config['docker-opts']): - hookenv.log('Skipping docker login until daemon is restarted.') + hookenv.log('Found new docker daemon options. Requesting a restart.') # State will be removed by layer-docker after restart set_state('docker.restart') - return + + set_state('kubernetes-worker.docker-login') + + +@when('kubernetes-worker.docker-login') +@when_not('docker.restart') +def run_docker_login(): + """Login to a docker registry with configured credentials.""" + config = hookenv.config() previous_logins = config.previous('docker-logins') logins = config['docker-logins'] @@ -482,6 +493,7 @@ def docker_logins_changed(): cmd = ['docker', 'login', server, '-u', username, '-p', password] subprocess.check_call(cmd) + remove_state('kubernetes-worker.docker-login') set_state('kubernetes-worker.restart-needed')