aboutsummaryrefslogtreecommitdiffstats
path: root/contrail-analyticsdb/hooks/contrail_analyticsdb_hooks.py
diff options
context:
space:
mode:
Diffstat (limited to 'contrail-analyticsdb/hooks/contrail_analyticsdb_hooks.py')
-rwxr-xr-xcontrail-analyticsdb/hooks/contrail_analyticsdb_hooks.py189
1 files changed, 189 insertions, 0 deletions
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()