mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-04 04:12:45 +00:00 
			
		
		
		
	Update job database entries on status change.
This commit is contained in:
		@@ -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')
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								app/swarm.py
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								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()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user