diff options
author | Kelley Spoon <kelley.spoon@linaro.org> | 2018-05-22 15:15:53 -0500 |
---|---|---|
committer | Kelley Spoon <kelley.spoon@linaro.org> | 2018-05-24 13:54:50 +0000 |
commit | 611f64996060f8b6d127bf5af5467852940cd6cd (patch) | |
tree | 0a2e60f8760060a826cbbc7b4ceda1d5810bde95 | |
parent | cc1e60b8780bf90547261b614cedc9923739e39e (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.py | 92 | ||||
-rw-r--r-- | roles/publishing-docker/tasks/main.yml | 2 |
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 |