Browse Source

Refactor etcd updating into its own class.

master
Chris Smith 8 years ago
parent
commit
f4f37d56b4
2 changed files with 63 additions and 62 deletions
  1. 5
    62
      report.py
  2. 58
    0
      updater.py

+ 5
- 62
report.py View File

@@ -1,55 +1,8 @@
1 1
 #!/usr/bin/env python3
2 2
 
3
-from collections import defaultdict
4 3
 from monitor import Monitor
4
+from updater import Updater
5 5
 import argparse
6
-import etcd
7
-
8
-
9
-def etcd_put(client, prefix, obj):
10
-  for key, value in obj.items():
11
-    new_prefix = "%s/%s" % (prefix, key)
12
-
13
-    if isinstance(value, dict):
14
-      etcd_put(client, new_prefix, value)
15
-    else:
16
-      client.write(new_prefix, str(value))
17
-
18
-
19
-def add_containers(new_containers):
20
-  global containers, host_index, label_index, network_index
21
-  for container in new_containers:
22
-    name = container['name']
23
-    containers[name] = container
24
-
25
-    for k, v in container['labels'].items():
26
-      label_index[k][name] = v
27
-    for k, v in container['net']['addr'].items():
28
-      network_index[k][name] = v
29
-
30
-    host_index[host][name] = name
31
-
32
-  etcd_put(etcd_client, prefix + '/containers', containers)
33
-  etcd_put(etcd_client, prefix + '/labels', label_index)
34
-  etcd_put(etcd_client, prefix + '/networks', network_index)
35
-  etcd_put(etcd_client, prefix + '/hosts', host_index)
36
-
37
-
38
-def remove_containers(old_containers):
39
-  global containers, host_index, label_index, network_index
40
-  for container in old_containers:
41
-    name = container['name']
42
-    del containers[name]
43
-    etcd_client.delete(prefix + '/containers/' + name, recursive=True)
44
-
45
-    for k, v in container['labels'].items():
46
-      del label_index[k][name]
47
-      etcd_client.delete(prefix + '/labels/' + k + '/' + name)
48
-    for k, v in container['net']['addr'].items():
49
-      del network_index[k][name]
50
-      etcd_client.delete(prefix + '/networks/' + k + '/' + name)
51
-    etcd_client.delete(prefix + '/hosts/' + host + '/' + name)
52
-
53 6
 
54 7
 parser = argparse.ArgumentParser()
55 8
 parser.add_argument('--name', help='Name of this docker host', default='unknown')
@@ -58,19 +11,9 @@ parser.add_argument('--etcd-host', help='Host to connect to etcd on', default='e
58 11
 parser.add_argument('--etcd-prefix', help='Prefix to use when adding keys to etcd', default='/docker')
59 12
 args = parser.parse_args()
60 13
 
61
-monitor = Monitor(args.name, add_containers, remove_containers)
62
-etcd_client = etcd.Client(host=args.etcd_host, port=args.etcd_port)
63
-prefix = args.etcd_prefix
64
-host = args.name
65
-
66
-containers = {}
67
-label_index = defaultdict(dict) 
68
-network_index = defaultdict(dict)
69
-host_index = defaultdict(dict)
70
-
71
-try:
72
-  etcd_client.delete(prefix, recursive=True)
73
-except etcd.EtcdKeyNotFound:
74
-  pass
14
+updater = Updater(args.etcd_host, args.etcd_port, args.etcd_prefix)
15
+monitor = Monitor(args.name, updater.add_containers, updater.remove_containers)
75 16
 
17
+updater.wipe()
76 18
 monitor.monitor()
19
+

+ 58
- 0
updater.py View File

@@ -0,0 +1,58 @@
1
+#!/usr/bin/env python3
2
+
3
+import etcd
4
+
5
+
6
+class Updater:
7
+
8
+  def __init__(self, host, port, prefix):
9
+    self._client = etcd.Client(host=host, port=port)
10
+    self._prefix = prefix
11
+
12
+
13
+  def _write(self, key, value):
14
+    self._client.write(self._prefix + key, value)
15
+
16
+
17
+  def _write_obj(self, prefix, obj):
18
+    for key, value in obj.items():
19
+      new_prefix = "%s/%s" % (prefix, key)
20
+
21
+      if isinstance(value, dict):
22
+        self._write_obj(new_prefix, value)
23
+      else:
24
+        self._write(new_prefix, str(value))
25
+
26
+
27
+  def _delete(self, key):
28
+    try:
29
+      self._client.delete(self._prefix + key, recursive=True)
30
+    except etcd.EtcdKeyNotFound:
31
+      pass
32
+
33
+
34
+  def wipe(self):
35
+    self._delete('')
36
+
37
+
38
+  def add_containers(self, new_containers):
39
+    for container in new_containers:
40
+      name = container['name']
41
+      self._write_obj('/containers/%s' % name, container)
42
+      for k, v in container['labels'].items():
43
+        self._write('/labels/%s/%s' % (k, name), v)
44
+      for k, v in container['net']['addr'].items():
45
+        self._write('/networks/%s/%s' % (k, name), v)
46
+      self._write('/hosts/%s/%s' % (container['host'], name), name)
47
+
48
+
49
+  def remove_containers(self, old_containers):
50
+    for container in old_containers:
51
+      name = container['name']
52
+      self._delete('/containers/%s' % name)
53
+      for k, v in container['labels'].items():
54
+        self._delete('/labels/%s/%s' % (k, name))
55
+      for k, v in container['net']['addr'].items():
56
+        self._delete('/networks/%s/%s' % (k, name)) 
57
+      self._delete('/hosts/%s/%s' % (container['host'], name))
58
+

Loading…
Cancel
Save