Update job database entries on status change.

This commit is contained in:
Patrick Jentsch 2019-08-07 14:35:33 +02:00
parent 9d0d386942
commit 3de48946b9
2 changed files with 31 additions and 13 deletions

View File

@ -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')

View File

@ -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()