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.5KB

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