12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- #!/usr/bin/env python3
-
- import etcd
- import time
-
-
- class Updater:
-
- def __init__(self, host, port, prefix):
- self._client = etcd.Client(host=host, port=port)
- self._prefix = prefix
-
-
- def _write(self, key, value):
- self._client.write(self._prefix + key, value)
-
-
- def _write_obj(self, prefix, obj):
- for key, value in obj.items():
- new_prefix = "%s/%s" % (prefix, key)
-
- if isinstance(value, dict):
- self._write_obj(new_prefix, value)
- else:
- self._write(new_prefix, str(value))
-
-
- def _delete(self, key):
- try:
- self._client.delete(self._prefix + key, recursive=True)
- except etcd.EtcdKeyNotFound:
- pass
-
-
- def wipe(self):
- self._delete('')
-
-
- def add_containers(self, new_containers):
- for container in new_containers:
- name = container['name']
- print('Adding container %s' % name)
- self._write_obj('/containers/%s' % name, container)
- for k, v in container['labels'].items():
- self._write('/labels/%s/%s' % (k, name), v)
- for k, v in container['net']['addr'].items():
- self._write('/networks/%s/%s' % (k, name), v)
- self._write('/hosts/%s/%s' % (container['host'], name), name)
- self._notify_update()
-
-
- def remove_containers(self, old_containers):
- for container in old_containers:
- name = container['name']
- print('Removing container %s' % name)
- self._delete('/containers/%s' % name)
- for k, v in container['labels'].items():
- self._delete('/labels/%s/%s' % (k, name))
- for k, v in container['net']['addr'].items():
- self._delete('/networks/%s/%s' % (k, name))
- self._delete('/hosts/%s/%s' % (container['host'], name))
- self._notify_update()
-
- def _notify_update(self):
- print('Update completed', flush=True)
- self._write('/_updated', time.time())
|