Docker container that lists running containers and stores information on them in etcd
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

updater.py 1.8KB

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