aboutsummaryrefslogtreecommitdiffstats
path: root/contrail-analyticsdb/hooks/contrail_analyticsdb_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'contrail-analyticsdb/hooks/contrail_analyticsdb_utils.py')
-rw-r--r--contrail-analyticsdb/hooks/contrail_analyticsdb_utils.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/contrail-analyticsdb/hooks/contrail_analyticsdb_utils.py b/contrail-analyticsdb/hooks/contrail_analyticsdb_utils.py
new file mode 100644
index 0000000..acd5c07
--- /dev/null
+++ b/contrail-analyticsdb/hooks/contrail_analyticsdb_utils.py
@@ -0,0 +1,134 @@
+from socket import inet_aton
+import struct
+
+import apt_pkg
+
+from charmhelpers.core.hookenv import (
+ config,
+ related_units,
+ relation_get,
+ relation_ids,
+ status_set,
+ leader_get,
+)
+from charmhelpers.core.templating import render
+
+from common_utils import (
+ get_ip,
+ decode_cert,
+ save_file,
+ check_run_prerequisites,
+ run_container,
+ json_loads,
+)
+
+
+apt_pkg.init()
+config = config()
+
+
+CONTAINER_NAME = "contrail-analyticsdb"
+CONFIG_NAME = "analyticsdb"
+SERVICES_TO_CHECK = ["contrail-database"]
+
+
+def servers_ctx():
+ controller_ip_list = []
+ analytics_ip_list = []
+ for rid in relation_ids("contrail-analyticsdb"):
+ for unit in related_units(rid):
+ ip = relation_get("private-address", unit, rid)
+ if unit.startswith("contrail-controller"):
+ controller_ip_list.append(ip)
+ if unit.startswith("contrail-analytics"):
+ analytics_ip_list.append(ip)
+
+ sort_key = lambda ip: struct.unpack("!L", inet_aton(ip))[0]
+ controller_ip_list = sorted(controller_ip_list, key=sort_key)
+ analytics_ip_list = sorted(analytics_ip_list, key=sort_key)
+ return {
+ "controller_servers": controller_ip_list,
+ "analytics_servers": analytics_ip_list}
+
+
+def analyticsdb_ctx():
+ """Get the ipaddres of all analyticsdb nodes"""
+ analyticsdb_ip_list = [
+ relation_get("private-address", unit, rid)
+ for rid in relation_ids("analyticsdb-cluster")
+ for unit in related_units(rid)]
+ # add it's own ip address
+ analyticsdb_ip_list.append(get_ip())
+ sort_key = lambda ip: struct.unpack("!L", inet_aton(ip))[0]
+ analyticsdb_ip_list = sorted(analyticsdb_ip_list, key=sort_key)
+ return {"analyticsdb_servers": analyticsdb_ip_list}
+
+
+def get_context():
+ ctx = {}
+ ctx.update(json_loads(config.get("orchestrator_info"), dict()))
+
+ ssl_ca = decode_cert("ssl_ca")
+ ctx["ssl_ca"] = ssl_ca
+ ctx["ssl_cert"] = decode_cert("ssl_cert")
+ ctx["ssl_key"] = decode_cert("ssl_key")
+ ctx["ssl_enabled"] = (ssl_ca is not None and len(ssl_ca) > 0)
+
+ ctx["db_user"] = leader_get("db_user")
+ ctx["db_password"] = leader_get("db_password")
+
+ ctx.update(servers_ctx())
+ ctx.update(analyticsdb_ctx())
+ ctx.update(json_loads(config.get("auth_info"), dict()))
+ return ctx
+
+
+def render_config(ctx=None):
+ if not ctx:
+ ctx = get_context()
+
+ # NOTE: store files in default paths cause no way to pass this path to
+ # some of components (sandesh)
+ ssl_ca = ctx["ssl_ca"]
+ save_file("/etc/contrailctl/ssl/ca-cert.pem", ssl_ca)
+ ssl_cert = ctx["ssl_cert"]
+ save_file("/etc/contrailctl/ssl/server.pem", ssl_cert)
+ ssl_key = ctx["ssl_key"]
+ save_file("/etc/contrailctl/ssl/server-privkey.pem", ssl_key)
+
+ render("analyticsdb.conf", "/etc/contrailctl/analyticsdb.conf", ctx)
+
+
+def update_charm_status(update_config=True):
+ update_config_func = render_config if update_config else None
+ result = check_run_prerequisites(CONTAINER_NAME, CONFIG_NAME,
+ update_config_func, SERVICES_TO_CHECK)
+ if not result:
+ return
+
+ ctx = get_context()
+ missing_relations = []
+ if not ctx.get("db_user"):
+ # NOTE: Charms don't allow to deploy cassandra in AllowAll mode
+ missing_relations.append("contrail-analyticsdb-cluster")
+ if not ctx.get("controller_servers"):
+ missing_relations.append("contrail-controller")
+ if not ctx.get("analytics_servers"):
+ missing_relations.append("contrail-analytics")
+ if missing_relations:
+ status_set('blocked',
+ 'Missing relations: ' + ', '.join(missing_relations))
+ return
+ if not ctx.get("cloud_orchestrator"):
+ status_set('blocked',
+ 'Missing cloud_orchestrator info in relation '
+ 'with contrail-controller.')
+ return
+ if not ctx.get("keystone_ip"):
+ status_set('blocked',
+ 'Missing auth info in relation with contrail-controller.')
+ return
+ # TODO: what should happens if relation departed?
+
+ render_config(ctx)
+ run_container(CONTAINER_NAME, "contrail-nodemgr")