Created
August 31, 2017 09:08
-
-
Save cecton/2bd6948825804587908eb93949cd0029 to your computer and use it in GitHub Desktop.
docker_listener.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import asyncio | |
import logging | |
import aiohttp | |
from aiohttp import web | |
import aiodocker | |
from aiodocker.docker import Docker | |
from aiodocker.exceptions import DockerError | |
logging.basicConfig(level=logging.DEBUG) | |
log = logging.getLogger(__name__) | |
async def websocket_handler(request): | |
ws = web.WebSocketResponse() | |
await ws.prepare(request) | |
#request.app['websockets'][user_id].add(ws) | |
task = request.app.loop.create_task( | |
listen_to_docker(ws)) | |
try: | |
async for msg in ws: | |
# handle incoming messages | |
if msg.type == aiohttp.WSMsgType.close: | |
log.debug('websocket connection closed') | |
await ws.close() | |
break | |
elif msg.type == aiohttp.WSMsgType.error: | |
log.debug('ws connection closed with exception %s' % ws.exception()) | |
break | |
elif msg.type == aiohttp.WSMsgType.text: | |
log.debug(msg) | |
await ws.send_str('ECHO') | |
else: | |
print('ws connection received unknown message type %s' % msg.type) | |
except asyncio.CancelledError: | |
log.debug('websocket cancelled') | |
#finally: | |
# request.app['websockets'][user_id].remove(ws) | |
await ws.close() | |
return ws | |
async def listen_to_docker(ws): | |
log.debug("Running Listening Docker") | |
docker = Docker() | |
subscriber = docker.events.subscribe() | |
try: | |
while True: | |
event = await subscriber.get() | |
log.debug(event) | |
# Forward message to all connected websockets: | |
if event['Type'] == 'container': | |
log.debug(ws) | |
await ws.send_str('Message from docker') | |
log.debug("Message sent") | |
except asyncio.CancelledError: | |
pass | |
finally: | |
await docker.close() | |
log.debug("Outside the loop!") | |
app = web.Application() | |
app.router.add_get('/', websocket_handler) | |
web.run_app(app, port=5000) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment