aboutsummaryrefslogtreecommitdiffstats
path: root/charms/trusty/contrail-configuration/hooks/contrail_configuration_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'charms/trusty/contrail-configuration/hooks/contrail_configuration_utils.py')
-rw-r--r--charms/trusty/contrail-configuration/hooks/contrail_configuration_utils.py503
1 files changed, 0 insertions, 503 deletions
diff --git a/charms/trusty/contrail-configuration/hooks/contrail_configuration_utils.py b/charms/trusty/contrail-configuration/hooks/contrail_configuration_utils.py
deleted file mode 100644
index bb11693..0000000
--- a/charms/trusty/contrail-configuration/hooks/contrail_configuration_utils.py
+++ /dev/null
@@ -1,503 +0,0 @@
-from collections import OrderedDict
-import functools
-import os
-import pwd
-import shutil
-from socket import gethostbyname, gethostname
-from subprocess import (
- CalledProcessError,
- check_call,
- check_output
-)
-from time import sleep, time
-
-import apt_pkg
-from apt_pkg import version_compare
-import json
-import urllib2
-
-from charmhelpers.core.hookenv import (
- config,
- leader_get,
- log,
- related_units,
- relation_get,
- relation_ids,
- relation_type,
- remote_unit,
- unit_get
-)
-
-from charmhelpers.core.host import (
- service_available,
- service_restart,
- service_stop
-)
-
-from charmhelpers.core.templating import render
-
-apt_pkg.init()
-
-def dpkg_version(pkg):
- try:
- return check_output(["dpkg-query", "-f", "${Version}\\n", "-W", pkg]).rstrip()
- except CalledProcessError:
- return None
-
-CONTRAIL_VERSION = dpkg_version("contrail-config")
-
-config = config()
-
-def retry(f=None, timeout=10, delay=2):
- """Retry decorator.
-
- Provides a decorator that can be used to retry a function if it raises
- an exception.
-
- :param timeout: timeout in seconds (default 10)
- :param delay: retry delay in seconds (default 2)
-
- Examples::
-
- # retry fetch_url function
- @retry
- def fetch_url():
- # fetch url
-
- # retry fetch_url function for 60 secs
- @retry(timeout=60)
- def fetch_url():
- # fetch url
- """
- if not f:
- return functools.partial(retry, timeout=timeout, delay=delay)
- @functools.wraps(f)
- def func(*args, **kwargs):
- start = time()
- error = None
- while True:
- try:
- return f(*args, **kwargs)
- except Exception as e:
- error = e
- elapsed = time() - start
- if elapsed >= timeout:
- raise error
- remaining = timeout - elapsed
- if delay <= remaining:
- sleep(delay)
- else:
- sleep(remaining)
- raise error
- return func
-
-def amqp_ctx():
- ctxs = []
- servers = OrderedDict()
- for rid in relation_ids("amqp"):
- for unit in related_units(rid):
- password = relation_get("password", unit, rid)
- if not password:
- continue
- ctxs.append({"rabbit_user": "contrail",
- "rabbit_password": password,
- "rabbit_vhost": "contrail"})
- vip = relation_get("vip", unit, rid)
- server = (vip if vip \
- else gethostbyname(relation_get("hostname", unit, rid))) + ":5672"
- servers[server] = None
- ctx = ctxs[0] if ctxs else {}
- ctx["rabbit_servers"] = servers.keys()
- return ctx
-
-def analytics_api_ctx():
- ctxs = [ { "analytics_server_ip": vip if vip \
- else gethostbyname(relation_get("private-address", unit, rid)),
- "analytics_server_port": port }
- for rid in relation_ids("contrail-analytics-api")
- for unit, port, vip in
- ((unit, relation_get("port", unit, rid), relation_get("vip", unit, rid))
- for unit in related_units(rid))
- if port ]
- return ctxs[0] if ctxs else {}
-
-def api_port():
- return 8082
-
-def cassandra_ctx():
- servers = [ gethostbyname(relation_get("private-address", unit, rid))
- + ":" + (rpc_port if rpc_port else port)
- for rid in relation_ids("cassandra")
- for unit, rpc_port, port in
- ((unit, relation_get("rpc_port", unit, rid), relation_get("port", unit, rid))
- for unit in related_units(rid))
- if rpc_port or port ] \
- if config.get("cassandra-ready") else []
- return { "cassandra_servers": servers }
-
-def cassandra_units():
- """Return a list of cassandra units"""
- return [ unit for rid in relation_ids("cassandra")
- for unit in related_units(rid)
- if relation_get("rpc_port", unit, rid) or relation_get("port", unit, rid) ]
-
-@retry(timeout=300, delay=10)
-def check_url(url):
- try:
- urllib2.urlopen(url)
- except urllib2.HTTPError:
- pass
-
-def contrail_ctx():
- addr = gethostbyname(unit_get("private-address"))
- return { "api_port": api_port(),
- "ifmap_server": addr,
- "disc_server": addr,
- "disc_port": discovery_port() }
-
-def contrail_floating_ip_create(network, name):
- user, password, tenant = [ (relation_get("service_username", unit, rid),
- relation_get("service_password", unit, rid),
- relation_get("service_tenant_name", unit, rid))
- for rid in relation_ids("identity-admin")
- for unit in related_units(rid) ][0]
- log("Creating floating ip pool {} for network {}".format(name, network))
- check_call(["python", "/usr/share/contrail-utils/create_floating_pool.py",
- "--public_vn_name", network,
- "--floating_ip_pool_name", name,
- "--api_server_ip", "127.0.0.1",
- "--api_server_port", str(api_port()),
- "--admin_user", user,
- "--admin_password", password,
- "--admin_tenant", tenant])
-
-def contrail_floating_ip_deactivate(project, name):
- user, password, tenant = [ (relation_get("service_username", unit, rid),
- relation_get("service_password", unit, rid),
- relation_get("service_tenant_name", unit, rid))
- for rid in relation_ids("identity-admin")
- for unit in related_units(rid) ][0]
- log("Deactivating floating ip pool {} for project {}".format(name, project))
- check_call(["scripts/deactivate_floating_pool.py",
- "--api_server_ip", "127.0.0.1",
- "--api_server_port", str(api_port()),
- "--admin_user", user,
- "--admin_password", password,
- "--admin_tenant", tenant,
- project, name])
-
-def contrail_floating_ip_delete(network, name):
- user, password, tenant = [ (relation_get("service_username", unit, rid),
- relation_get("service_password", unit, rid),
- relation_get("service_tenant_name", unit, rid))
- for rid in relation_ids("identity-admin")
- for unit in related_units(rid) ][0]
- log("Deleting floating ip pool {} for network {}".format(name, network))
- check_call(["scripts/delete_floating_pool.py",
- "--api_server_ip", "127.0.0.1",
- "--api_server_port", str(api_port()),
- "--admin_user", user,
- "--admin_password", password,
- "--admin_tenant", tenant,
- network, name])
-
-def contrail_floating_ip_use(project, name):
- user, password, tenant = [ (relation_get("service_username", unit, rid),
- relation_get("service_password", unit, rid),
- relation_get("service_tenant_name", unit, rid))
- for rid in relation_ids("identity-admin")
- for unit in related_units(rid) ][0]
- log("Activating floating ip pool {} for project {}".format(name, project))
- check_call(["python", "/usr/share/contrail-utils/use_floating_pool.py",
- "--project_name", project,
- "--floating_ip_pool_name", name,
- "--api_server_ip", "127.0.0.1",
- "--api_server_port", str(api_port()),
- "--admin_user", user,
- "--admin_password", password,
- "--admin_tenant", tenant])
-
-def contrail_ifmap_ctx():
- creds = []
- cs = leader_get("ifmap-creds")
- if cs:
- cs = json.loads(cs)
- for units in cs.itervalues():
- for c in units.itervalues():
- creds.append(c)
- return { "ifmap_creds": creds }
-
-def discovery_port():
- return 5998
-
-def fix_ifmap_server():
- # disable ifmap-server upstart service
- if service_available("ifmap-server"):
- service_stop("ifmap-server")
- with open("/etc/init/ifmap-server.override", "w") as conf:
- conf.write("manual\n")
-
- # use supervisord config
- shutil.copy("files/ifmap.ini", "/etc/contrail/supervisord_config_files")
- pw = pwd.getpwnam("contrail")
- os.chown("/etc/contrail/supervisord_config_files/ifmap.ini", pw.pw_uid,
- pw.pw_gid)
- shutil.copy("files/ifmap", "/etc/init.d")
- os.chmod("/etc/init.d/ifmap", 0755)
-
-def fix_nodemgr():
- # add files missing from contrail-nodemgr package
- shutil.copy("files/contrail-nodemgr-config.ini",
- "/etc/contrail/supervisord_config_files")
- pw = pwd.getpwnam("contrail")
- os.chown("/etc/contrail/supervisord_config_files/contrail-nodemgr-config.ini",
- pw.pw_uid, pw.pw_gid)
- shutil.copy("files/contrail-config-nodemgr", "/etc/init.d")
- os.chmod("/etc/init.d/contrail-config-nodemgr", 0755)
-
- # fake ntp status when inside a container
- if is_container():
- shutil.copy("files/ntpq-nodemgr", "/usr/local/bin/ntpq")
-
-def fix_permissions():
- os.chmod("/etc/contrail", 0755)
- os.chown("/etc/contrail", 0, 0)
-
-def fix_scripts():
- version = dpkg_version("contrail-config")
- if version_compare(version, "2.01") >= 0:
- # supervisord and init scripts need correcting on contrail 2.01+
- for service in [ "contrail-api", "contrail-discovery" ]:
- # remove hardcoded port
- check_call(["sed", "-E", "-i", "-e",
- "s/ --listen_port [^[:blank:]]+//",
- "/etc/contrail/supervisord_config_files/{}.ini".format(service)])
-
- # fix init script
- check_call(["sed", "-i", "-e",
- "s/`basename ${0}`$/\"`basename ${0}`:*\"/",
- "/etc/init.d/{}".format(service)])
-
-def fix_services():
- fix_permissions()
- fix_ifmap_server()
- fix_nodemgr()
- fix_scripts()
- service_restart("supervisor-config")
-
-def identity_admin_ctx():
- ctxs = [ { "auth_host": gethostbyname(hostname),
- "auth_port": relation_get("service_port", unit, rid),
- "admin_user": relation_get("service_username", unit, rid),
- "admin_password": relation_get("service_password", unit, rid),
- "admin_tenant_name": relation_get("service_tenant_name", unit, rid),
- "auth_region": relation_get("service_region", unit, rid) }
- for rid in relation_ids("identity-admin")
- for unit, hostname in
- ((unit, relation_get("service_hostname", unit, rid)) for unit in related_units(rid))
- if hostname ]
- return ctxs[0] if ctxs else {}
-
-def is_container():
- """Return boolean determining if inside container"""
- try:
- check_call(["running-in-container"])
- return True
- except CalledProcessError:
- return False
-
-def provision_configuration():
- hostname = gethostname()
- ip = gethostbyname(unit_get("private-address"))
- user, password, tenant = [ (relation_get("service_username", unit, rid),
- relation_get("service_password", unit, rid),
- relation_get("service_tenant_name", unit, rid))
- for rid in relation_ids("identity-admin")
- for unit in related_units(rid)
- if relation_get("service_hostname", unit, rid) ][0]
- log("Provisioning configuration {}".format(ip))
- check_call(["contrail-provision-config",
- "--host_name", hostname,
- "--host_ip", ip,
- "--api_server_ip", "127.0.0.1",
- "--api_server_port", str(api_port()),
- "--oper", "add",
- "--admin_user", user,
- "--admin_password", password,
- "--admin_tenant_name", tenant])
-
-def provision_metadata():
- ip = [ gethostbyname(relation_get("private-address", unit, rid))
- for rid in relation_ids("neutron-metadata")
- for unit in related_units(rid) ][0]
- user, password = [ (relation_get("service_username", unit, rid),
- relation_get("service_password", unit, rid))
- for rid in relation_ids("identity-admin")
- for unit in related_units(rid)
- if relation_get("service_hostname", unit, rid) ][0]
- log("Provisioning metadata service {}:8775".format(ip))
- check_call(["contrail-provision-linklocal",
- "--api_server_ip", "127.0.0.1",
- "--api_server_port", str(api_port()),
- "--linklocal_service_name", "metadata",
- "--linklocal_service_ip", "169.254.169.254",
- "--linklocal_service_port", "80",
- "--ipfabric_service_ip", ip,
- "--ipfabric_service_port", "8775",
- "--oper", "add",
- "--admin_user", user,
- "--admin_password", password])
-
-def units(relation):
- """Return a list of units for the specified relation"""
- return [ unit for rid in relation_ids(relation)
- for unit in related_units(rid) ]
-
-def unprovision_configuration():
- if not remote_unit():
- return
- hostname = gethostname()
- ip = gethostbyname(unit_get("private-address"))
- relation = relation_type()
- user = None
- password = None
- tenant = None
- if relation == "identity-admin":
- user = relation_get("service_username")
- password = relation_get("service_password")
- tenant = relation_get("service_tenant_name")
- else:
- user, password, tenant = [ (relation_get("service_username", unit, rid),
- relation_get("service_password", unit, rid),
- relation_get("service_tenant_name", unit, rid))
- for rid in relation_ids("identity-admin")
- for unit in related_units(rid) ][0]
- log("Unprovisioning configuration {}".format(ip))
- check_call(["contrail-provision-config",
- "--host_name", hostname,
- "--host_ip", ip,
- "--api_server_ip", "127.0.0.1",
- "--api_server_port", str(api_port()),
- "--oper", "del",
- "--admin_user", user,
- "--admin_password", password,
- "--admin_tenant_name", tenant])
-
-def unprovision_metadata():
- if not remote_unit():
- return
- relation = relation_type()
- ip = None
- if relation == "neutron-metadata":
- ip = gethostbyname(relation_get("private-address"))
- else:
- ip = [ gethostbyname(relation_get("private-address", unit, rid))
- for rid in relation_ids("neutron-metadata")
- for unit in related_units(rid) ][0]
- user = None
- password = None
- if relation == "identity-admin":
- user = relation_get("service_username")
- password = relation_get("service_password")
- else:
- user, password = [ (relation_get("service_username", unit, rid),
- relation_get("service_password", unit, rid))
- for rid in relation_ids("identity-admin")
- for unit in related_units(rid) ][0]
- log("Unprovisioning metadata service {}:8775".format(ip))
- check_call(["contrail-provision-linklocal",
- "--api_server_ip", "127.0.0.1",
- "--api_server_port", str(api_port()),
- "--linklocal_service_name", "metadata",
- "--linklocal_service_ip", "169.254.169.254",
- "--linklocal_service_port", "80",
- "--ipfabric_service_ip", ip,
- "--ipfabric_service_port", "8775",
- "--oper", "del",
- "--admin_user", user,
- "--admin_password", password])
-
-def write_barbican_auth_config():
- ctx = identity_admin_ctx()
- render("contrail-barbican-auth.conf",
- "/etc/contrail/contrail-barbican-auth.conf", ctx, "root", "contrail",
- 0440)
-
-def write_contrail_api_config():
- ctx = {}
- ctx.update(contrail_ctx())
- ctx.update(cassandra_ctx())
- ctx.update(zookeeper_ctx())
- ctx.update(amqp_ctx())
- ctx.update(identity_admin_ctx())
- render("contrail-api.conf", "/etc/contrail/contrail-api.conf", ctx, "root",
- "contrail", 0440)
-
-def write_contrail_schema_config():
- ctx = {}
- ctx.update(cassandra_ctx())
- ctx.update(zookeeper_ctx())
- ctx.update(identity_admin_ctx())
- ctx.update(contrail_ctx())
- if version_compare(CONTRAIL_VERSION, "3.0") >= 0:
- ctx["rabbitmq"] = True
- ctx.update(amqp_ctx())
- render("contrail-schema.conf", "/etc/contrail/contrail-schema.conf",
- ctx, "root", "contrail", 0440)
-
-def write_contrail_svc_monitor_config():
- ctx = {}
- ctx.update(contrail_ctx())
- ctx.update(cassandra_ctx())
- ctx.update(zookeeper_ctx())
- ctx.update(amqp_ctx())
- ctx.update(identity_admin_ctx())
- ctx.update(analytics_api_ctx())
- render("contrail-svc-monitor.conf",
- "/etc/contrail/contrail-svc-monitor.conf", ctx, "root", "contrail",
- 0440)
-
-def write_device_manager_config():
- ctx = {}
- ctx.update(contrail_ctx())
- ctx.update(zookeeper_ctx())
- ctx.update(cassandra_ctx())
- ctx.update(amqp_ctx())
- ctx.update(identity_admin_ctx())
- render("contrail-device-manager.conf",
- "/etc/contrail/contrail-device-manager.conf", ctx, "root",
- "contrail", 0440)
-
-def write_discovery_config():
- ctx = {}
- ctx.update(zookeeper_ctx())
- ctx.update(cassandra_ctx())
- target = "/etc/contrail/contrail-discovery.conf" \
- if version_compare(CONTRAIL_VERSION, "1.20~") >= 0 \
- else "/etc/contrail/discovery.conf"
- render("discovery.conf", target, ctx)
-
-def write_ifmap_config():
- ctx = contrail_ifmap_ctx()
- render("basicauthusers.properties",
- "/etc/ifmap-server/basicauthusers.properties", ctx, "root",
- "contrail", 0440)
-
-def write_nodemgr_config():
- ctx = contrail_ctx()
- render("contrail-config-nodemgr.conf",
- "/etc/contrail/contrail-config-nodemgr.conf", ctx)
-
-def write_vnc_api_config():
- ctx = {}
- ctx.update(contrail_ctx())
- ctx.update(identity_admin_ctx())
- render("vnc_api_lib.ini", "/etc/contrail/vnc_api_lib.ini", ctx)
-
-def zookeeper_ctx():
- return { "zk_servers": [ gethostbyname(relation_get("private-address", unit, rid))
- + ":" + port
- for rid in relation_ids("zookeeper")
- for unit, port in
- ((unit, relation_get("port", unit, rid)) for unit in related_units(rid))
- if port ] }