summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKelley Spoon <kelley.spoon@linaro.org>2018-05-22 15:15:53 -0500
committerKelley Spoon <kelley.spoon@linaro.org>2018-05-24 13:54:50 +0000
commit611f64996060f8b6d127bf5af5467852940cd6cd (patch)
tree0a2e60f8760060a826cbbc7b4ceda1d5810bde95
parentcc1e60b8780bf90547261b614cedc9923739e39e (diff)
PublishingDocker: Upgrade event-watcher.py to be version independent
Change-Id: I91a35c2fe9efe4c6aed44cd7185a7d378448a2d0 Reviewed-on: https://review.linaro.org/25449 Reviewed-by: Benjamin Copeland <ben.copeland@linaro.org>
-rw-r--r--[-rwxr-xr-x]roles/publishing-docker/files/event-watcher.py92
-rw-r--r--roles/publishing-docker/tasks/main.yml2
2 files changed, 62 insertions, 32 deletions
diff --git a/roles/publishing-docker/files/event-watcher.py b/roles/publishing-docker/files/event-watcher.py
index 34467772..4158ba28 100755..100644
--- a/roles/publishing-docker/files/event-watcher.py
+++ b/roles/publishing-docker/files/event-watcher.py
@@ -3,8 +3,22 @@
import os, sys, json, re
import docker
import argparse
+import atexit
-parser = argparse.ArgumentParser( description="Manage host entries for docker containers")
+def get_name(cobj):
+ return re.sub('^/', '', cobj["Names"][0])
+
+def find_by_id(id):
+ for c in client.containers():
+ if c.has_key("Id") and c["Id"] == id:
+ return c
+
+def find_by_name(name):
+ for c in client.containers():
+ if "/%s" % name in c["Names"]:
+ return c
+
+parser = argparse.ArgumentParser(description="Manage host entries for docker containers")
parser.add_argument('-n', '--native', help='run service on docker host', action='store_true' , dest='NATIVE_MODE')
parser.add_argument('-o','-1', '--once', help='run once and exit (no continuous polling)', action='store_true', dest='ONCE_MODE')
args = parser.parse_args()
@@ -16,30 +30,34 @@ else:
print "Running in native mode... reading from /etc/hosts"
HOSTS_FILE="/etc/hosts"
-if os.environ.get("DOCKER_HOST"):
- client = docker.from_env()
-else:
- try:
- client = docker.DockerClient(base_url='unix://var/run/docker.sock')
- except:
- print "Sorry, I can't find a dockerd to connect to."
- sys.exit(1)
+try:
+ # version dependent. If it's pre 2.0, then we have to use the lower
+ # level APIClient class, but in version 1.x APIClient was the base
+ if int(docker.__version__.split('.')[0]) > 1:
+ client = docker.APIClient( base_url='unix://var/run/docker.sock')
+ else:
+ client = docker.from_env()
+except:
+ print "Sorry, I can't find a dockerd to connect to."
+ sys.exit(1)
def get_ip(c):
try:
- networks = c.attrs.get("NetworkSettings").get("Networks")
+ networks = c["NetworkSettings"]["Networks"]
for n in networks:
ip = networks[n]["IPAddress"]
if ip is not None:
return ip
- except:
+
+ except Exception as e:
+ print e
return None
def get_aliases(c):
aliases = []
try:
- envs = c.attrs.get("Config").get("Env")
+ envs = client.inspect_container(c)["Config"]["Env"]
for e in envs:
m = re.match('ALIAS=(?P<aliases>.*)', e)
@@ -48,32 +66,37 @@ def get_aliases(c):
aliases.append(a)
return aliases
except KeyError as e:
+ print e
return None
def event_remove(event):
- container = client.containers.get(event.get("id"))
- container_remove(container.name)
+ container = find_by_id(event["id"])
+ if container is not None:
+ container_remove(get_name(container))
def event_add(event):
- container = client.containers.get(event.get("id"))
- container_add(container.name)
+ container = find_by_id(event["id"])
+ container_add(get_name(container))
def container_add(name):
try:
- container = client.containers.get(name)
- except:
+ container = find_by_name(name)
+ except Exception as e:
+ print e
return
- container_remove(container.name)
+ container_remove(name)
ip = get_ip(container)
if ip:
- entry = "%s %s" % (ip, container.name)
+ entry = "%s %s" % (ip, name)
aliases = get_aliases(container)
if aliases:
entry += " %s" % ' '.join(aliases)
open(HOSTS_FILE, 'a').write(entry+'\n')
print "Added: %s" % entry
+ else:
+ print "WHUPS!!!! No IP found for %s" % name
def container_remove(name):
if name is None and len(name) > 0:
@@ -87,25 +110,32 @@ def container_remove(name):
if re.match(entry, line) is None:
outfile.write(line)
outfile.close()
-
print "removed entry for pattern %s" % name
+def cleanup():
+ for container in client.containers():
+ container_remove(get_name(container))
+if not args.ONCE_MODE:
+ atexit.register(cleanup)
### Let's start doing something useful.
# first, we catch up with any existing containers that are already deployed.
-for container in client.containers.list():
- container_add(container.name)
+for container in client.containers():
+ container_add(get_name(container))
if args.ONCE_MODE:
sys.exit(0)
# calling events will basically poll forever, so after this we're
# essentially in not-quite-a-daemon mode
-for event_json in client.events():
- print "SAW: %s" % str(event_json)
- event = json.loads(str(event_json))
-
- if event.get("status") == "start":
- event_add(event)
- elif event.get("status") == "kill":
- event_remove(event)
+try:
+ for event_json in client.events():
+ print "SAW: %s" % str(event_json)
+ event = json.loads(str(event_json))
+
+ if event.get("status") == "start":
+ event_add(event)
+ elif event.get("status") in ["kill","destroy","die"]:
+ event_remove(event)
+except KeyboardInterrupt as ki:
+ print "Exiting."
diff --git a/roles/publishing-docker/tasks/main.yml b/roles/publishing-docker/tasks/main.yml
index 9247866e..d226d4b9 100644
--- a/roles/publishing-docker/tasks/main.yml
+++ b/roles/publishing-docker/tasks/main.yml
@@ -24,7 +24,7 @@
regexp: "^SECURE_PROXY_SSL_HEADER"
line: "SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')"
-- name: Create symlink for event-watcher.py
+- name: Install event-watcher.py script
copy:
src: event-watcher.py
dest: /usr/sbin/event-watcher.py