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 flask_sqlalchemy import SQLAlchemy
from .swarm import Swarm from .swarm import Swarm
db = SQLAlchemy() db = SQLAlchemy()
login_manager = LoginManager() login_manager = LoginManager()
login_manager.login_view = 'auth.login' login_manager.login_view = 'auth.login'
mail = Mail() mail = Mail()
swarm = Swarm() swarm = Swarm()
@ -23,6 +20,7 @@ def create_app(config_name):
db.init_app(app) db.init_app(app)
login_manager.init_app(app) login_manager.init_app(app)
mail.init_app(app) mail.init_app(app)
swarm.init_app(app)
from .auth import auth as auth_blueprint from .auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint, url_prefix='/auth') 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 docker
import time import time
import json import json
@ -5,9 +7,16 @@ import os
class Swarm: 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() 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 ' Swarm mode is intendet to run containers which serve a non terminating
' service like a webserver. For processing an occuring job it is necessary ' service like a webserver. For processing an occuring job it is necessary
@ -81,18 +90,29 @@ class Swarm:
restart_policy=_restart_policy restart_policy=_restart_policy
) )
''' '''
' Poll the service until the job is completly executed. ' Because it takes some time until all data in the service object is
' ' initialized (especcially the task list returned by the service.tasks
' Note: Because it takes some time until all data in the service object ' method), a poll loop checks if the task list is empty.
' 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).
''' '''
print(service.attrs) while not service.tasks():
while not service.tasks() or \
service.tasks()[0].get('Status').get('State') != 'complete':
time.sleep(1) time.sleep(1)
service.reload() 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. # Remove the service from the swarm.
service.remove() service.remove()