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 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. parser = argparse.ArgumentParser()
  28. parser.add_argument('--name', help='Name of this docker host', default='unknown')
  29. parser.add_argument('--etcd-port', type=int, help='Port to connect to etcd on', default=2379)
  30. parser.add_argument('--etcd-host', help='Host to connect to etcd on', default='etcd')
  31. parser.add_argument('--etcd-prefix', help='Prefix to use when adding keys to etcd', default='/docker')
  32. args = parser.parse_args()
  33. monitor = Monitor(args.name, add_containers, lambda x: None)
  34. etcd_client = etcd.Client(host=args.etcd_host, port=args.etcd_port)
  35. prefix = args.etcd_prefix
  36. host = args.name
  37. containers = {}
  38. label_index = defaultdict(dict)
  39. network_index = defaultdict(dict)
  40. host_index = defaultdict(dict)
  41. try:
  42. etcd_client.delete(prefix, recursive=True)
  43. except etcd.EtcdKeyNotFound:
  44. pass
  45. monitor.monitor()