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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#!/usr/bin/env python
import json
import sys
from charmhelpers.core.hookenv import (
Hooks,
UnregisteredHookError,
config,
log,
related_units,
relation_get,
relation_ids,
relation_set,
status_set,
is_leader,
)
from charmhelpers.fetch import (
apt_install,
apt_update,
apt_upgrade,
configure_sources
)
from contrail_kubernetes_utils import (
write_configs,
)
PACKAGES = ["contrail-k8s-cni"]
hooks = Hooks()
config = config()
@hooks.hook("install.real")
def install():
status_set('maintenance', 'Installing...')
configure_sources(True, "install-sources", "install-keys")
apt_update(fatal=True)
apt_upgrade(fatal=True, dist=False)
apt_install(PACKAGES, fatal=True)
status_set("blocked", "Missing relation to contrail-controller")
@hooks.hook("config-changed")
def config_changed():
if config.changed("install-sources") or config.changed("install-keys"):
configure_sources(True, "install-sources", "install-keys")
apt_update(fatal=True)
apt_upgrade(fatal=True, dist=False)
@hooks.hook("contrail-controller-relation-joined")
def contrail_controller_joined():
if not is_leader():
return
data = _get_orchestrator_info()
relation_set(**data)
@hooks.hook("contrail-controller-relation-changed")
def contrail_controller_changed():
data = relation_get()
def _update_config(key, data_key):
if data_key in data:
val = data[data_key]
if val is not None:
config[key] = val
else:
config.pop(key, None)
_update_config("api_vip", "api-vip")
_update_config("api_ip", "private-address")
_update_config("api_port", "port")
config.save()
write_configs()
status_set("active", "Unit is ready")
@hooks.hook("contrail-controller-relation-departed")
def contrail_cotroller_departed():
units = [unit for rid in relation_ids("contrail-controller")
for unit in related_units(rid)]
if units:
return
for key in ["api_vip", "api_ip", "api_port"]:
config.pop(key, None)
config.save()
write_configs()
status_set("blocked", "Missing relation to contrail-controller")
def _notify_clients():
# notify clients
data = _get_orchestrator_info()
for rid in relation_ids("contrail-controller"):
relation_set(relation_id=rid, **data)
def _get_orchestrator_info():
info = {"cloud_orchestrator": "kubernetes"}
# TODO: add info from CNI
return {"orchestrator-info": json.dumps(info)}
def main():
try:
hooks.execute(sys.argv)
except UnregisteredHookError as e:
log("Unknown hook {} - skipping.".format(e))
if __name__ == "__main__":
main()
|