/
kubernetes_master_worker_base.py
88 lines (77 loc) · 3.22 KB
/
kubernetes_master_worker_base.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from charms.layer import snap
from charms.leadership import (
leader_get,
leader_set
)
from charms.reactive import (
when,
when_not,
when_any,
data_changed
)
from charmhelpers.core import hookenv
from charmhelpers.core.host import is_container
from charmhelpers.core.sysctl import create as create_sysctl
@when_any('kubernetes-master.snaps.installed',
'kubernetes-worker.snaps.installed')
@when('snap.refresh.set')
@when('leadership.is_leader')
def process_snapd_timer():
"""
Set the snapd refresh timer on the leader so all cluster members
(present and future) will refresh near the same time.
:return: None
"""
# Get the current snapd refresh timer; we know layer-snap has set this
# when the 'snap.refresh.set' flag is present.
timer = snap.get(
snapname='core', key='refresh.timer').decode('utf-8').strip()
if not timer:
# The core snap timer is empty. This likely means a subordinate timer
# reset ours. Try to set it back to a previously leader-set value,
# falling back to config if needed. Luckily, this should only happen
# during subordinate install, so this should remain stable afterward.
timer = leader_get('snapd_refresh') or hookenv.config('snapd_refresh')
snap.set_refresh_timer(timer)
# Ensure we have the timer known by snapd (it may differ from config).
timer = snap.get(
snapname='core', key='refresh.timer').decode('utf-8').strip()
# The first time through, data_changed will be true. Subsequent calls
# should only update leader data if something changed.
if data_changed('snapd_refresh', timer):
hookenv.log('setting leader snapd_refresh timer to: {}'.format(timer))
leader_set({'snapd_refresh': timer})
@when_any('kubernetes-master.snaps.installed',
'kubernetes-worker.snaps.installed')
@when('snap.refresh.set')
@when('leadership.changed.snapd_refresh')
@when_not('leadership.is_leader')
def set_snapd_timer():
"""
Set the snapd refresh.timer on non-leader cluster members.
:return: None
"""
# NB: This method should only be run when 'snap.refresh.set' is present.
# Layer-snap will always set a core refresh.timer, which may not be the
# same as our leader. Gating with 'snap.refresh.set' ensures layer-snap
# has finished and we are free to set our config to the leader's timer.
timer = leader_get('snapd_refresh') or '' # None will error
hookenv.log('setting snapd_refresh timer to: {}'.format(timer))
snap.set_refresh_timer(timer)
@when('config.changed.sysctl')
def write_sysctl():
"""
:return: None
"""
sysctl_settings = hookenv.config('sysctl')
if sysctl_settings and not is_container():
create_sysctl(
sysctl_settings,
'/etc/sysctl.d/50-kubernetes-charm.conf',
# Some keys in the config may not exist in /proc/sys/net/.
# For example, the conntrack module may not be loaded when
# using lxd drivers insteam of kvm. In these cases, we
# simply ignore the missing keys, rather than making time
# consuming calls out to the filesystem to check for their
# existence.
ignore=True)