from charmhelpers.contrib.templating.jinja import render from charmhelpers.core.hookenv import ( network_get, unit_private_ip, ) import json GRAFANA_DASHBOARD_FILE = 'grafana_dashboard.json.j2' def get_ingress_addresses(endpoint_name): ''' Returns all ingress-addresses belonging to the named endpoint, if available. Falls back to private-address if necessary. ''' try: data = network_get(endpoint_name) except NotImplementedError: return [unit_private_ip()] if 'ingress-addresses' in data: return data['ingress-addresses'] else: return [unit_private_ip()] def get_ingress_address(endpoint_name): ''' Returns an ingress-address belonging to the named endpoint, if available. Falls back to private-address if necessary. ''' return get_ingress_addresses(endpoint_name)[0] def get_bind_address(endpoint_name): ''' Returns the first bind-address found in network info belonging to the named endpoint, if available. Falls back to private-address if necessary. @param endpoint_name the endpoint from where taking the bind address ''' try: data = network_get(endpoint_name) except NotImplementedError: return unit_private_ip() # Consider that network-get returns something like: # # bind-addresses: # - macaddress: 02:d0:9e:31:d9:e0 # interfacename: ens5 # addresses: # - hostname: "" # address: 172.31.5.4 # cidr: 172.31.0.0/20 # - hostname: "" # address: 172.31.5.4 # cidr: 172.31.0.0/20 # - macaddress: 8a:32:d7:8d:f6:9a # interfacename: fan-252 # addresses: # - hostname: "" # address: 252.5.4.1 # cidr: 252.0.0.0/12 # egress-subnets: # - 172.31.5.4/32 # ingress-addresses: # - 172.31.5.4 # - 172.31.5.4 # - 252.5.4.1 if 'bind-addresses' in data: bind_addresses = data['bind-addresses'] if len(bind_addresses) > 0: if 'addresses' in bind_addresses[0]: if len(bind_addresses[0]['addresses']) > 0: return bind_addresses[0]['addresses'][0]['address'] return unit_private_ip() def render_grafana_dashboard(datasource): """Load grafana dashboard json model and insert prometheus datasource. :param datasource: name of the 'prometheus' application that will be used as datasource in grafana dashboard :return: Grafana dashboard json model as a dict. """ datasource = "{} - Juju generated source".format(datasource) jinja_args = {'variable_start_string': '<<', 'variable_end_string': '>>'} return json.loads(render(GRAFANA_DASHBOARD_FILE, {'datasource': datasource}, jinja_env_args=jinja_args))