Unverified Commit 8f0da640 authored by Peter Stanko's avatar Peter Stanko
Browse files

Log name support, Submission course hybrid property

parent 870c0ff8
Loading
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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}")


+2 −1
Original line number Diff line number Diff line
@@ -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"
@@ -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"
+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
@@ -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():
@@ -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

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

+1 −1
Original line number Diff line number Diff line
@@ -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

+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

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

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