aboutsummaryrefslogtreecommitdiffstats
path: root/charms/trusty/ceilometer-contrail/hooks/ceilometer_contrail_hooks.py
blob: 5244a728a2babaac535e5a239bf7b8f27b7211da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env python

from collections import OrderedDict
from socket import gethostbyname
import sys

import yaml

from charmhelpers.core.hookenv import (
    Hooks,
    UnregisteredHookError,
    config,
    log,
    related_units,
    relation_get,
    relation_ids,
    relation_set
)

from charmhelpers.fetch import (
    apt_install,
    apt_upgrade,
    configure_sources
)

from ceilometer_contrail_utils import contrail_analytics_api_units, units

PACKAGES = [ "ceilometer-plugin-contrail" ]

hooks = Hooks()
config = config()

@hooks.hook("ceilometer-plugin-relation-joined")
def ceilometer_plugin_joined():
    if contrail_analytics_api_units():
        configure_plugin()

@hooks.hook("config-changed")
def config_changed():
    pass

def configure_plugin():
    # create plugin config
    api_ip, api_port = [
       (vip if vip else gethostbyname(relation_get("private-address", unit, rid)),
        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 ][0]
    meter_sources = [
       OrderedDict([("name", "contrail_source"),
                    ("interval", 600),
                    ("meters", ["ip.floating.receive.packets",
                                "ip.floating.transmit.packets",
                                "ip.floating.receive.bytes",
                                "ip.floating.transmit.bytes"]),
                    ("resources", ["contrail://{}:{}".format(api_ip, api_port)]),
                    ("sinks", ["contrail_sink"])])]
    meter_sinks = [
       OrderedDict([("name", "contrail_sink"),
                    ("publishers", ["rpc://"]),
                    ("transformers", [])])]
    settings = { "meter-sources": yaml.dump(meter_sources),
                 "meter-sinks": yaml.dump(meter_sinks) }
    for rid in relation_ids("ceilometer-plugin"):
        relation_set(relation_id=rid, relation_settings=settings)

@hooks.hook("contrail-analytics-api-relation-changed")
def contrail_analytics_api_changed():
    if not relation_get("port"):
        log("Relation not ready")
        return
    if units("ceilometer-plugin"):
        configure_plugin()

@hooks.hook("contrail-analytics-api-relation-departed")
@hooks.hook("contrail-analytics-api-relation-broken")
def contrail_analytics_api_departed():
    if not units("contrail-analytics-api"):
        remove_plugin()

@hooks.hook()
def install():
    configure_sources(True, "install-sources", "install-keys")
    apt_upgrade(fatal=True, dist=True)
    apt_install(PACKAGES, fatal=True)

def main():
    try:
        hooks.execute(sys.argv)
    except UnregisteredHookError as e:
        log("Unknown hook {} - skipping.".format(e))

def remove_plugin():
    settings = { "meter-sources": None, "meter-sinks": None }
    for rid in relation_ids("ceilometer-plugin"):
        relation_set(relation_id=rid, relation_settings=settings)

@hooks.hook("upgrade-charm")
def upgrade_charm():
    pass

if __name__ == "__main__":
    main()