From 711967ae9639095ce41500bb0e6f80c8b80fab95 Mon Sep 17 00:00:00 2001 From: Stuart Mackie Date: Tue, 25 Jul 2017 10:37:57 -0700 Subject: Contrail charms Change-Id: I2d259d03f63fce38348b8384e26ac23e3fce44a8 Signed-off-by: Stuart Mackie --- .../hooks/contrail_analyticsdb_hooks.py | 189 +++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100755 contrail-analyticsdb/hooks/contrail_analyticsdb_hooks.py (limited to 'contrail-analyticsdb/hooks/contrail_analyticsdb_hooks.py') diff --git a/contrail-analyticsdb/hooks/contrail_analyticsdb_hooks.py b/contrail-analyticsdb/hooks/contrail_analyticsdb_hooks.py new file mode 100755 index 0000000..a3d3006 --- /dev/null +++ b/contrail-analyticsdb/hooks/contrail_analyticsdb_hooks.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python + +import uuid +import sys + +from charmhelpers.core.hookenv import ( + Hooks, + UnregisteredHookError, + config, + log, + relation_get, + related_units, + relation_ids, + status_set, + relation_set, + leader_set, + leader_get, + is_leader, + relation_id, +) + +from charmhelpers.fetch import ( + apt_install, + apt_upgrade, + apt_update +) + +from contrail_analyticsdb_utils import ( + update_charm_status, + CONTAINER_NAME, +) +from common_utils import ( + get_ip, + fix_hostname, +) +from docker_utils import ( + add_docker_repo, + DOCKER_PACKAGES, + is_container_launched, +) + + +PACKAGES = [] + + +hooks = Hooks() +config = config() + + +@hooks.hook("install.real") +def install(): + status_set('maintenance', 'Installing...') + + # TODO: try to remove this call + fix_hostname() + + apt_upgrade(fatal=True, dist=True) + add_docker_repo() + apt_update(fatal=False) + apt_install(PACKAGES + DOCKER_PACKAGES, fatal=True) + + update_charm_status() + + +@hooks.hook("leader-elected") +def leader_elected(): + if not leader_get("db_user"): + user = "analytics" + password = uuid.uuid4().hex + leader_set(db_user=user, db_password=password) + _update_relation() + update_charm_status() + + +@hooks.hook("leader-settings-changed") +def leader_settings_changed(): + update_charm_status() + + +@hooks.hook("config-changed") +def config_changed(): + if config.changed("control-network"): + settings = {'private-address': get_ip()} + rnames = ("contrail-analyticsdb", "analyticsdb-cluster") + for rname in rnames: + for rid in relation_ids(rname): + relation_set(relation_id=rid, relation_settings=settings) + + update_charm_status() + + +def _update_relation(rid=None): + db_user = leader_get("db_user") + db_password = leader_get("db_password") + if not db_user or not db_password: + return + + settings = { + "db-user": db_user, + "db-password": db_password + } + + if rid: + relation_set(relation_id=rid, relation_settings=settings) + return + + for rid in relation_ids("contrail-analyticsdb"): + relation_set(relation_id=rid, relation_settings=settings) + + +@hooks.hook("contrail-analyticsdb-relation-joined") +def analyticsdb_joined(): + settings = {'private-address': get_ip()} + relation_set(relation_settings=settings) + if is_leader(): + _update_relation(rid=relation_id()) + + +def _value_changed(rel_data, rel_key, cfg_key): + if rel_key not in rel_data: + # data is absent in relation. it means that remote charm doesn't + # send it due to lack of information + return + value = rel_data[rel_key] + if value is not None: + config[cfg_key] = value + else: + config.pop(cfg_key, None) + + +@hooks.hook("contrail-analyticsdb-relation-changed") +def analyticsdb_changed(): + data = relation_get() + _value_changed(data, "auth-info", "auth_info") + _value_changed(data, "orchestrator-info", "orchestrator_info") + _value_changed(data, "ssl-ca", "ssl_ca") + _value_changed(data, "ssl-cert", "ssl_cert") + _value_changed(data, "ssl-key", "ssl_key") + # TODO: handle changing of all values + # TODO: set error if orchestrator is changing and container was started + update_charm_status() + + +@hooks.hook("contrail-analyticsdb-relation-departed") +def analyticsdb_departed(): + units = [unit for rid in relation_ids("contrail-controller") + for unit in related_units(rid)] + if not units: + for key in ["auth_info", "orchestrator_info", + "ssl_ca", "ssl_cert", "ssl_key"]: + config.pop(key, None) + if is_container_launched(CONTAINER_NAME): + status_set( + "blocked", + "Container is present but cloud orchestrator was disappeared." + " Please kill container by yourself or restore cloud orchestrator.") + update_charm_status() + + +@hooks.hook("analyticsdb-cluster-relation-joined") +def analyticsdb_cluster_joined(): + settings = {'private-address': get_ip()} + relation_set(relation_settings=settings) + + +@hooks.hook("update-status") +def update_status(): + update_charm_status(update_config=False) + + +@hooks.hook("upgrade-charm") +def upgrade_charm(): + # NOTE: image can not be deleted if container is running. + # TODO: so think about killing the container + + # NOTE: this hook can be fired when either resource changed or charm code + # changed. so if code was changed then we may need to update config + update_charm_status() + + +def main(): + try: + hooks.execute(sys.argv) + except UnregisteredHookError as e: + log("Unknown hook {} - skipping.".format(e)) + + +if __name__ == "__main__": + main() -- cgit 1.2.3-korg