Loading app.py +3 −2 Original line number Diff line number Diff line Loading @@ -66,9 +66,10 @@ def cli_init_data(env): @click.argument('name') @click.option('-p', '--password', help='Users password', prompt=True, hide_input=True, confirmation_prompt=True) def cli_users_create(name, password): @click.option('-s', '--secret', help="User's secret") def cli_users_create(name, password, secret): log.info(f"[CMD] Create User: {name}") user = manager.create_admin_user(name, password) user = manager.create_admin_user(name, password, secret) log.info(f"[CMD] Created User: {user}") Loading docker_run.sh +2 −1 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ ENVIRONMENT="${ENVIRONMENT:-dev}" ADMIN_USER="${ADMIN_USER:-admin}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-789789}" ADMIN_SECRET="${ADMIN_SECRET:-devel-admin-secret}" # INIT echo "[INIT] Initializing the database" Loading @@ -10,7 +11,7 @@ flask db upgrade echo "[INIT] Initializing data for env: $ENVIRONMENT" flask data init ${ENVIRONMENT} echo "[INIT] Initializing admin user: ${ADMIN_USER}" flask users create ${ADMIN_USER} --password ${ADMIN_PASSWORD} flask users create ${ADMIN_USER} --password ${ADMIN_PASSWORD} --secret ${ADMIN_SECRET} # RUN THE SERVER gunicorn -b 0.0.0.0:8000 --access-logfile - --reload "app:app" Loading management/data/__init__.py +8 −7 Original line number Diff line number Diff line import datetime from flask import Flask from flask_sqlalchemy import SQLAlchemy from management.data import shared from management.data.data_test import init_test_data from management.data.data_dev import init_dev_data from management.data.data_prod import init_prod_data from portal.database.models import Course, Role, User, Submission, SubmissionState from management.data.data_test import init_test_data from portal.database.models import Course, Role, Secret, Submission, SubmissionState, User from portal.service import general from portal.service.general import write_entity from portal.tools import time Loading Loading @@ -65,11 +66,12 @@ class DataManagement(object): self.db.session.commit() return user def create_admin_user(self, name: str, password: str) -> User: def create_admin_user(self, name: str, password: str, secret: str = None) -> User: """Creates new admin user with username Args: name(str): Username of the user password(str): User's password secret(str): User's secret Returns(User): Created user """ with self.app.app_context(): Loading @@ -77,8 +79,9 @@ class DataManagement(object): username=name, name=name, admin=True, password=password ) password=password) if secret: user.secrets.append(Secret(name='admin-secret', value=secret)) self.db.session.commit() return user Loading Loading @@ -158,5 +161,3 @@ class DataManagement(object): for submission in Submission.query.all(): Submission.query.filter_by(id=submission.id).delete() self.db.session.commit() management/data/shared.py +1 −1 Original line number Diff line number Diff line Loading @@ -148,7 +148,7 @@ class DataFactory(object): codename = codename or name project = self.__create_entity(Project, course=course, name=name, codename=codename, description=desc) log.debug(f"[CREATE] Project config: ({project.id}): {config}") log.debug(f"[CREATE] Project config: {project.log_name}: {config}") project.set_config(**config) return project Loading portal/async_celery/submission_processor.py +11 −12 Original line number Diff line number Diff line import json import random from pathlib import Path from typing import Union from storage import UploadedEntity Loading Loading @@ -48,11 +46,11 @@ class SubmissionProcessor: general.write_entity(self.submission) def submission_enqueue_ended(self): log.info(f"[ASYNC] Submission enqueue ended: {self.submission}") log.info(f"[ASYNC] Submission enqueue ended {self.submission.log_name}: {self.submission}") self.reset_task_id(state=SubmissionState.QUEUED) def get_delay_for_submission(self): log.debug(f"[ASYNC] Submission delay: {self.submission}") log.debug(f"[ASYNC] Submission delay {self.submission.log_name}: {self.submission}") time_wait = self.project.config.submissions_cancellation_period return time_wait Loading @@ -63,42 +61,43 @@ class SubmissionProcessor: start_processing_submission.apply_async(args=args, countdown=delay) def submission_store_ended(self, version: str): log.info(f"[ASYNC] Submission preparation ended: {self.submission}") log.info(f"[ASYNC] Submission preparation ended {self.submission.log_name}: " f"{self.submission}") self.submission.source_hash = version self.reset_task_id(state=SubmissionState.READY) def download_submission(self): file_params = self.params['file_params'] log.info(f"[ASYNC] Uploading submission: {self.submission} with {file_params}") log.info(f"[ASYNC] Uploading submission: {self.submission.log_name} with {file_params}") updated_entity: UploadedEntity = self.storage. \ submissions.create(entity_id=self.submission.id, **file_params) self.submission_store_ended(version=updated_entity.version) def clone(self, target): log.info(f"[ASYNC] Cloning submission: {self.submission} to {target}") log.info(f"[ASYNC] Cloning submission: {self.submission.log_name} to {target.log_name}") self.storage.submissions.clone(self.submission.id, target.id) self.submission_store_ended(version=self.submission.source_hash) def send_to_worker(self): # TODO: implement processing log.info(f"[ASYNC] Sending submission to worker: {self.submission}") log.info(f"[ASYNC] Sending submission to worker: {self.submission.log_name}") worker = self.schedule_submission_to_worker() self.execute_submission(worker) def upload_result(self, path, file_params): log.info(f"[ASYNC] Uploading result for the submission " f"{self.submission.id} with {file_params}") f"{self.submission.log_name} with {file_params}") self.storage.results.create(entity_id=self.submission.id, **file_params) Path(path).unlink() self.reset_task_id(SubmissionState.FINISHED) def process_submission(self): log.info(f"[ASYNC] Processing submission: {self.submission}") log.info(f"[ASYNC] Processing submission {self.submission.log_name}") self.download_submission() self.dispatch_submission_processing() def revoke_task(self): log.info(f'[ASYNC] Submission processing cancelled {self.submission}') log.info(f'[ASYNC] Submission processing cancelled {self.submission.log_name}') task_id = self.submission.async_task_id if task_id: self.celery.control.revoke(task_id=task_id, terminate=True) Loading @@ -124,5 +123,5 @@ class SubmissionProcessor: worker_client.execute_submission(self.submission) def _worker_not_available(self): log.warning(f"[PROC] Worker is no available for submission: {self.submission}") log.warning(f"[PROC] Worker is no available for submission: {self.submission.log_name}") pass Loading
app.py +3 −2 Original line number Diff line number Diff line Loading @@ -66,9 +66,10 @@ def cli_init_data(env): @click.argument('name') @click.option('-p', '--password', help='Users password', prompt=True, hide_input=True, confirmation_prompt=True) def cli_users_create(name, password): @click.option('-s', '--secret', help="User's secret") def cli_users_create(name, password, secret): log.info(f"[CMD] Create User: {name}") user = manager.create_admin_user(name, password) user = manager.create_admin_user(name, password, secret) log.info(f"[CMD] Created User: {user}") Loading
docker_run.sh +2 −1 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ ENVIRONMENT="${ENVIRONMENT:-dev}" ADMIN_USER="${ADMIN_USER:-admin}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-789789}" ADMIN_SECRET="${ADMIN_SECRET:-devel-admin-secret}" # INIT echo "[INIT] Initializing the database" Loading @@ -10,7 +11,7 @@ flask db upgrade echo "[INIT] Initializing data for env: $ENVIRONMENT" flask data init ${ENVIRONMENT} echo "[INIT] Initializing admin user: ${ADMIN_USER}" flask users create ${ADMIN_USER} --password ${ADMIN_PASSWORD} flask users create ${ADMIN_USER} --password ${ADMIN_PASSWORD} --secret ${ADMIN_SECRET} # RUN THE SERVER gunicorn -b 0.0.0.0:8000 --access-logfile - --reload "app:app" Loading
management/data/__init__.py +8 −7 Original line number Diff line number Diff line import datetime from flask import Flask from flask_sqlalchemy import SQLAlchemy from management.data import shared from management.data.data_test import init_test_data from management.data.data_dev import init_dev_data from management.data.data_prod import init_prod_data from portal.database.models import Course, Role, User, Submission, SubmissionState from management.data.data_test import init_test_data from portal.database.models import Course, Role, Secret, Submission, SubmissionState, User from portal.service import general from portal.service.general import write_entity from portal.tools import time Loading Loading @@ -65,11 +66,12 @@ class DataManagement(object): self.db.session.commit() return user def create_admin_user(self, name: str, password: str) -> User: def create_admin_user(self, name: str, password: str, secret: str = None) -> User: """Creates new admin user with username Args: name(str): Username of the user password(str): User's password secret(str): User's secret Returns(User): Created user """ with self.app.app_context(): Loading @@ -77,8 +79,9 @@ class DataManagement(object): username=name, name=name, admin=True, password=password ) password=password) if secret: user.secrets.append(Secret(name='admin-secret', value=secret)) self.db.session.commit() return user Loading Loading @@ -158,5 +161,3 @@ class DataManagement(object): for submission in Submission.query.all(): Submission.query.filter_by(id=submission.id).delete() self.db.session.commit()
management/data/shared.py +1 −1 Original line number Diff line number Diff line Loading @@ -148,7 +148,7 @@ class DataFactory(object): codename = codename or name project = self.__create_entity(Project, course=course, name=name, codename=codename, description=desc) log.debug(f"[CREATE] Project config: ({project.id}): {config}") log.debug(f"[CREATE] Project config: {project.log_name}: {config}") project.set_config(**config) return project Loading
portal/async_celery/submission_processor.py +11 −12 Original line number Diff line number Diff line import json import random from pathlib import Path from typing import Union from storage import UploadedEntity Loading Loading @@ -48,11 +46,11 @@ class SubmissionProcessor: general.write_entity(self.submission) def submission_enqueue_ended(self): log.info(f"[ASYNC] Submission enqueue ended: {self.submission}") log.info(f"[ASYNC] Submission enqueue ended {self.submission.log_name}: {self.submission}") self.reset_task_id(state=SubmissionState.QUEUED) def get_delay_for_submission(self): log.debug(f"[ASYNC] Submission delay: {self.submission}") log.debug(f"[ASYNC] Submission delay {self.submission.log_name}: {self.submission}") time_wait = self.project.config.submissions_cancellation_period return time_wait Loading @@ -63,42 +61,43 @@ class SubmissionProcessor: start_processing_submission.apply_async(args=args, countdown=delay) def submission_store_ended(self, version: str): log.info(f"[ASYNC] Submission preparation ended: {self.submission}") log.info(f"[ASYNC] Submission preparation ended {self.submission.log_name}: " f"{self.submission}") self.submission.source_hash = version self.reset_task_id(state=SubmissionState.READY) def download_submission(self): file_params = self.params['file_params'] log.info(f"[ASYNC] Uploading submission: {self.submission} with {file_params}") log.info(f"[ASYNC] Uploading submission: {self.submission.log_name} with {file_params}") updated_entity: UploadedEntity = self.storage. \ submissions.create(entity_id=self.submission.id, **file_params) self.submission_store_ended(version=updated_entity.version) def clone(self, target): log.info(f"[ASYNC] Cloning submission: {self.submission} to {target}") log.info(f"[ASYNC] Cloning submission: {self.submission.log_name} to {target.log_name}") self.storage.submissions.clone(self.submission.id, target.id) self.submission_store_ended(version=self.submission.source_hash) def send_to_worker(self): # TODO: implement processing log.info(f"[ASYNC] Sending submission to worker: {self.submission}") log.info(f"[ASYNC] Sending submission to worker: {self.submission.log_name}") worker = self.schedule_submission_to_worker() self.execute_submission(worker) def upload_result(self, path, file_params): log.info(f"[ASYNC] Uploading result for the submission " f"{self.submission.id} with {file_params}") f"{self.submission.log_name} with {file_params}") self.storage.results.create(entity_id=self.submission.id, **file_params) Path(path).unlink() self.reset_task_id(SubmissionState.FINISHED) def process_submission(self): log.info(f"[ASYNC] Processing submission: {self.submission}") log.info(f"[ASYNC] Processing submission {self.submission.log_name}") self.download_submission() self.dispatch_submission_processing() def revoke_task(self): log.info(f'[ASYNC] Submission processing cancelled {self.submission}') log.info(f'[ASYNC] Submission processing cancelled {self.submission.log_name}') task_id = self.submission.async_task_id if task_id: self.celery.control.revoke(task_id=task_id, terminate=True) Loading @@ -124,5 +123,5 @@ class SubmissionProcessor: worker_client.execute_submission(self.submission) def _worker_not_available(self): log.warning(f"[PROC] Worker is no available for submission: {self.submission}") log.warning(f"[PROC] Worker is no available for submission: {self.submission.log_name}") pass