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.

report.py 2.4KB

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