Merge ~aluria/charm-telegraf:lp1775062 into ~telegraf-charmers/charm-telegraf:master

Proposed by Alvaro Uria
Status: Merged
Approved by: Thomas Cuthbert
Approved revision: cf038916694dcd678cdb0ae49a46ccf0e3b0f2ae
Merged at revision: 8d4b1413be4756028e5db77e44e48e7bfb373577
Proposed branch: ~aluria/charm-telegraf:lp1775062
Merge into: ~telegraf-charmers/charm-telegraf:master
Diff against target: 147 lines (+79/-15)
4 files modified
layer.yaml (+1/-0)
reactive/telegraf.py (+22/-5)
test_requirements.txt (+1/-0)
unit_tests/test_telegraf.py (+55/-10)
Reviewer Review Type Date Requested Status
Thomas Cuthbert (community) Approve
Review via email: mp+347481@code.launchpad.net

Commit message

LP#1775062 Fix regression at 2920829

To post a comment you must log in.
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

This merge proposal is being monitored by mergebot. Change the status to Approved to merge.

Revision history for this message
Thomas Cuthbert (tcuthbert) wrote :

This needed the netifaces package added to the test requirements, other than that +1

review: Approve
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

Change successfully merged at revision 8d4b1413be4756028e5db77e44e48e7bfb373577

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/layer.yaml b/layer.yaml
2index c8b5db2..678d4eb 100644
3--- a/layer.yaml
4+++ b/layer.yaml
5@@ -34,6 +34,7 @@ options:
6 include_system_packages: true
7 packages:
8 - python3-yaml
9+ - python3-netifaces
10 apt:
11 packages:
12 - telegraf
13diff --git a/reactive/telegraf.py b/reactive/telegraf.py
14index 94de186..174c64e 100644
15--- a/reactive/telegraf.py
16+++ b/reactive/telegraf.py
17@@ -23,6 +23,7 @@ import socket
18 import time
19 import yaml
20 import re
21+import netifaces
22
23 from charms.reactive import (
24 helpers,
25@@ -108,11 +109,27 @@ def get_hostname_label():
26
27
28 def get_remote_unit_name():
29- for rel_type in hookenv.metadata()['requires'].keys():
30- rels = hookenv.relations_of_type(rel_type)
31- if rels and len(rels) >= 1:
32- rel = rels[0]
33- return rel['__unit__']
34+ unit = os.environ.get('JUJU_PRINCIPAL_UNIT', None)
35+ if unit:
36+ # Note(aluria): use Juju env var available since 2017
37+ return unit
38+ else:
39+ # Note(aluria): lookup all available IPv4/IPv6 addresses (except lo)
40+ ip_addresses = set()
41+ for iface in netifaces.interfaces():
42+ if iface == 'lo':
43+ continue
44+ ip_addrs = netifaces.ifaddresses(iface)
45+ for iface_type in ip_addrs:
46+ if iface_type in (netifaces.AF_INET, netifaces.AF_INET6):
47+ for addrs in ip_addrs[iface_type]:
48+ ip_addresses.add(addrs['addr'])
49+
50+ # Note(aluria): and try to match them against rel['private-address']
51+ for rel_type in hookenv.metadata()['requires'].keys():
52+ for rel in hookenv.relations_of_type(rel_type):
53+ if rel['private-address'] in ip_addresses:
54+ return rel['__unit__']
55
56
57 def render_base_inputs():
58diff --git a/test_requirements.txt b/test_requirements.txt
59index 676f7c1..64be687 100644
60--- a/test_requirements.txt
61+++ b/test_requirements.txt
62@@ -9,5 +9,6 @@ charms.reactive
63 amulet
64 requests
65 juju-wait
66+netifaces
67 #--find-links https://launchpad.net/python-apt/+download/
68 #python-apt
69diff --git a/unit_tests/test_telegraf.py b/unit_tests/test_telegraf.py
70index b83d972..3071b10 100644
71--- a/unit_tests/test_telegraf.py
72+++ b/unit_tests/test_telegraf.py
73@@ -129,19 +129,64 @@ def persist_state():
74
75
76 # Tests
77-def test_get_remote_unit_name(monkeypatch):
78+def test_get_remote_unit_name_juju2(monkeypatch):
79 monkeypatch.undo()
80- # fix hookenv.metadata
81- real_charm_dir = os.path.join(os.path.dirname(reactive.__file__), "../")
82- with open(os.path.join(real_charm_dir, 'metadata.yaml')) as md:
83- metadata = yaml.safe_load(md)
84- monkeypatch.setattr(telegraf.hookenv, 'metadata', lambda: metadata)
85+ monkeypatch.setitem(os.environ, 'JUJU_PRINCIPAL_UNIT', 'remote/0')
86+ assert telegraf.get_remote_unit_name() == 'remote/0'
87+
88+
89+def test_get_remote_unit_name_juju1(monkeypatch):
90+ monkeypatch.undo()
91+ monkeypatch.setattr(telegraf.netifaces,
92+ 'interfaces',
93+ lambda: ['lo', 'eth0'])
94+
95+ ifaddresses = {17: [{'addr': 'AA:BB:CC:DD:EE:FF',
96+ 'broadcast': 'ff:ff:ff:ff:ff:ff'}],
97+ 2: [{'addr': '1.2.3.4',
98+ 'netmask': '255.255.255.0',
99+ 'broadcast': '1.2.3.1'}],
100+ 10: [{'addr': '2620:0:862:ed1a::1',
101+ 'netmask': 'ffff:ffff:ffff:ffff::'}]}
102+ monkeypatch.setattr(telegraf.netifaces,
103+ 'ifaddresses',
104+ lambda n: ifaddresses if n == 'eth0' else {})
105+
106+ md = {'name': 'telegraf',
107+ 'requires': {'mysql': {'interface': 'mysql-root'},
108+ 'postgresql': {'interface': 'pgsql'},
109+ 'mongodb': {'interface': 'mongodb',
110+ 'scope': 'container'},
111+ 'memcached': {'interface': 'memcache',
112+ 'scope': 'container'},
113+ 'elasticsearch': {'interface':
114+ 'elasticsearch',
115+ 'scope': 'container'},
116+ 'haproxy': {'interface': 'statistics',
117+ 'scope': 'container'},
118+ 'apache': {'interface': 'apache-website',
119+ 'scope': 'container'},
120+ 'influxdb-api': {'interface':
121+ 'influxdb-api'},
122+ 'juju-info': {'interface': 'juju-info',
123+ 'scope': 'container'},
124+ 'exec': {'interface': 'telegraf-exec',
125+ 'scope': 'container'}},
126+ 'provides': {'prometheus-client': {'interface': 'http'},
127+ 'prometheus-rules': {'interface': 'prometheus-rules'}}}
128+ monkeypatch.setattr(telegraf.hookenv, 'metadata', lambda: md)
129+
130 relations = []
131- monkeypatch.setattr(telegraf.hookenv, 'relations_of_type', lambda n: relations)
132- monkeypatch.setattr(telegraf.hookenv, 'unit_private_ip', lambda: '1.2.3.4')
133+ monkeypatch.setattr(telegraf.hookenv,
134+ 'relations_of_type',
135+ lambda n: relations)
136 assert telegraf.get_remote_unit_name() is None
137- relations = [{'private-address': '1.2.3.4', '__unit__': 'remote-0'}]
138- assert telegraf.get_remote_unit_name() == 'remote-0'
139+
140+ relations = [{'private-address': '1.2.3.4', '__unit__': 'remote/0'}]
141+ monkeypatch.setattr(telegraf.hookenv,
142+ 'relations_of_type',
143+ lambda n: relations)
144+ assert telegraf.get_remote_unit_name() == 'remote/0'
145
146
147 def test_inputs_config_set(monkeypatch, config):

Subscribers

People subscribed via source and target branches

to all changes: