From 3de48946b9adf827915b156d31123c1467a20512 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch
Date: Wed, 7 Aug 2019 14:35:33 +0200
Subject: [PATCH] Update job database entries on status change.
---
app/__init__.py | 4 +---
app/swarm.py | 40 ++++++++++++++++++++++++++++++----------
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/app/__init__.py b/app/__init__.py
index 8cac4c4d..41ab537f 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -5,12 +5,9 @@ from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from .swarm import Swarm
-
db = SQLAlchemy()
-
login_manager = LoginManager()
login_manager.login_view = 'auth.login'
-
mail = Mail()
swarm = Swarm()
@@ -23,6 +20,7 @@ def create_app(config_name):
db.init_app(app)
login_manager.init_app(app)
mail.init_app(app)
+ swarm.init_app(app)
from .auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint, url_prefix='/auth')
diff --git a/app/swarm.py b/app/swarm.py
index 5566e105..9988f2a4 100644
--- a/app/swarm.py
+++ b/app/swarm.py
@@ -1,3 +1,5 @@
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
import docker
import time
import json
@@ -5,9 +7,16 @@ import os
class Swarm:
- def __init__(self):
+ def __init__(self, app=None):
+ self.app = app
+ if app is not None:
+ self.init_app(app)
self.docker = docker.from_env()
+ def init_app(self, app):
+ engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
+ self.Session = sessionmaker(bind=engine)
+
'''
' Swarm mode is intendet to run containers which serve a non terminating
' service like a webserver. For processing an occuring job it is necessary
@@ -81,18 +90,29 @@ class Swarm:
restart_policy=_restart_policy
)
'''
- ' Poll the service until the job is completly executed.
- '
- ' Note: Because it takes some time until all data in the service object
- ' is initialized (especcially the task list returned by the tasks
- ' method) the poll loop also checks if the task list is empy (The
- ' not service.tasks() condition implements this).
+ ' Because it takes some time until all data in the service object is
+ ' initialized (especcially the task list returned by the service.tasks
+ ' method), a poll loop checks if the task list is empty.
'''
- print(service.attrs)
- while not service.tasks() or \
- service.tasks()[0].get('Status').get('State') != 'complete':
+ while not service.tasks():
time.sleep(1)
service.reload()
+ '''
+ ' Poll the service until the job is completly executed.
+ '''
+ session = self.Session()
+ while True:
+ current_state = service.tasks()[0].get('Status').get('State')
+ if job.status != current_state:
+ job.status = current_state
+ session.add(job)
+ session.commit()
+ print(current_state)
+ if current_state == 'complete':
+ break
+ time.sleep(1)
+ service.reload()
+ session.close()
# Remove the service from the swarm.
service.remove()