From 7ec539631a723c6f96e1d70acb53ece4d01646fd Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Mon, 21 Mar 2022 18:21:20 +0530 Subject: [PATCH 01/58] lti changes --- .../graderservice/graderservice.py | 13 +-- .../illumidesk/apis/nbgrader_service.py | 63 +++++-------- .../authenticators/authenticator.py | 94 +++++++++++++++---- src/illumidesk/requirements.txt | 2 +- src/illumidesk/setup.py | 2 +- src/illumidesk/tests/illumidesk/conftest.py | 2 +- 6 files changed, 106 insertions(+), 70 deletions(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index 5981cabf..b4374489 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -35,9 +35,6 @@ "ILLUMIDESK_NB_EXCHANGE_MNT_ROOT", "/illumidesk-nb-exchange" ) GRADER_PVC = os.environ.get("GRADER_PVC", "grader-setup-pvc") -GRADER_EXCHANGE_SHARED_PVC = os.environ.get( - "GRADER_SHARED_PVC", "exchange-shared-volume" -) # user UI and GID to use within the grader container NB_UID = os.environ.get("NB_UID", 10001) @@ -184,7 +181,7 @@ def _create_nbgrader_files(self): grader_home_nbconfig_content = NBGRADER_HOME_CONFIG_TEMPLATE.format( grader_name=self.grader_name, course_id=self.course_id, - db_url=f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:5432/{self.org_name}_{self.course_id}", + db_url=f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:5432/{nbgrader_db_name}", ) grader_nbconfig_path.write_text(grader_home_nbconfig_content) # Write the nbgrader_config.py file at grader home directory @@ -278,7 +275,7 @@ def _create_deployment_object(self): ), client.V1VolumeMount( mount_path="/srv/nbgrader/exchange", - name=GRADER_EXCHANGE_SHARED_PVC, + name=GRADER_PVC, sub_path=sub_path_exchange, ), ], @@ -298,12 +295,6 @@ def _create_deployment_object(self): claim_name=GRADER_PVC ), ), - client.V1Volume( - name=GRADER_EXCHANGE_SHARED_PVC, - persistent_volume_claim=client.V1PersistentVolumeClaimVolumeSource( - claim_name=GRADER_EXCHANGE_SHARED_PVC - ), - ), ], ), ) diff --git a/src/illumidesk/illumidesk/apis/nbgrader_service.py b/src/illumidesk/illumidesk/apis/nbgrader_service.py index d9e1cae7..23b71b52 100644 --- a/src/illumidesk/illumidesk/apis/nbgrader_service.py +++ b/src/illumidesk/illumidesk/apis/nbgrader_service.py @@ -5,8 +5,6 @@ from nbgrader.api import Course from nbgrader.api import Gradebook from nbgrader.api import InvalidEntry -from sqlalchemy_utils import create_database -from sqlalchemy_utils import database_exists from illumidesk.authenticators.utils import LTIUtils @@ -18,6 +16,7 @@ nbgrader_db_port = os.environ.get("POSTGRES_NBGRADER_PORT") or 5432 nbgrader_db_password = os.environ.get("POSTGRES_NBGRADER_PASSWORD") nbgrader_db_user = os.environ.get("POSTGRES_NBGRADER_USER") +nbgrader_db_name = os.environ.get("POSTGRES_NBGRADER_DATABASE") mnt_root = os.environ.get("ILLUMIDESK_MNT_ROOT", "/illumidesk-courses") org_name = os.environ.get("ORGANIZATION_NAME") or "my-org" @@ -25,17 +24,15 @@ if not org_name: raise EnvironmentError("ORGANIZATION_NAME env-var is not set") +CAMPUS_ID = os.environ.get("CAMPUS_ID") +if not CAMPUS_ID: + raise EnvironmentError("CAMPUS_ID env-var is not set") -def nbgrader_format_db_url(course_id: str) -> str: +def nbgrader_format_db_url() -> str: """ - Returns the nbgrader database url with the format: _ - - Args: - course_id: the course id (usually associated with the course label) from which the launch was initiated. + Returns the nbgrader database url """ - course_id = LTIUtils().normalize_string(course_id) - database_name = f"{org_name}_{course_id}" - return f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:{nbgrader_db_port}/{database_name}" + return f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:{nbgrader_db_port}/{nbgrader_db_name}" class NbGraderServiceHelper: @@ -51,7 +48,7 @@ class NbGraderServiceHelper: database_name: the database name """ - def __init__(self, course_id: str, check_database_exists: bool = False): + def __init__(self, course_id: str): if not course_id: raise ValueError("course_id missing") @@ -62,41 +59,33 @@ def __init__(self, course_id: str, check_database_exists: bool = False): self.uid = int(os.environ.get("NB_GRADER_UID") or "10001") self.gid = int(os.environ.get("NB_GRADER_GID") or "100") - self.db_url = nbgrader_format_db_url(course_id) - self.database_name = f"{org_name}_{self.course_id}" - if check_database_exists: - self.create_database_if_not_exists() - - def create_database_if_not_exists(self) -> None: - """Creates a new database if it doesn't exist""" - conn_uri = nbgrader_format_db_url(self.course_id) - - if not database_exists(conn_uri): - logger.debug("db not exist, create database") - create_database(conn_uri) + self.db_url = nbgrader_format_db_url() - def add_user_to_nbgrader_gradebook(self, username: str, lms_user_id: str) -> None: + def add_user_to_nbgrader_gradebook(self, email: str, external_user_id: str, source: str, source_type: str, role: str) -> None: """ Adds a user to the nbgrader gradebook database for the course. Args: - username: The user's username - lms_user_id: The user's id on the LMS + email: The user's email + external_user_id: The user's id on the external system + source: source from where user was authenticated + source_type: source_type Raises: InvalidEntry: when there was an error adding the user to the database """ - if not username: - raise ValueError("username missing") - if not lms_user_id: - raise ValueError("lms_user_id missing") + if not email: + raise ValueError("email missing") + if not external_user_id: + raise ValueError("external_user_id missing") - with Gradebook(self.db_url, course_id=self.course_id) as gb: + with Gradebook(self.db_url, course_id=self.course_id, campus_id=CAMPUS_ID) as gb: try: - gb.update_or_create_student(username, lms_user_id=lms_user_id) + user = gb.update_or_create_user_by_email(email, role=role, external_user_id=external_user_id, source=source, source_type=source_type) logger.debug( - "Added user %s with lms_user_id %s to gradebook" - % (username, lms_user_id) + "Added user %s with external_user_id %s to gradebook" + % (email, external_user_id) ) + return user.to_dict() except InvalidEntry as e: logger.debug("Error during adding student to gradebook: %s" % e) @@ -104,14 +93,14 @@ def update_course(self, **kwargs) -> None: """ Updates the course in nbgrader database """ - with Gradebook(self.db_url, course_id=self.course_id) as gb: + with Gradebook(self.db_url, course_id=self.course_id, campus_id=CAMPUS_ID) as gb: gb.update_course(self.course_id, **kwargs) def get_course(self) -> Course: """ Gets the course model instance """ - with Gradebook(self.db_url, course_id=self.course_id) as gb: + with Gradebook(self.db_url, course_id=self.course_id, campus_id=CAMPUS_ID) as gb: course = gb.check_course(self.course_id) logger.debug(f"course got from db:{course}") return course @@ -131,7 +120,7 @@ def register_assignment(self, assignment_name: str, **kwargs: dict) -> Assignmen "Assignment name normalized %s to save in gradebook" % assignment_name ) assignment = None - with Gradebook(self.db_url, course_id=self.course_id) as gb: + with Gradebook(self.db_url, course_id=self.course_id, campus_id=CAMPUS_ID) as gb: try: assignment = gb.update_or_create_assignment(assignment_name, **kwargs) logger.debug("Added assignment %s to gradebook" % assignment_name) diff --git a/src/illumidesk/illumidesk/authenticators/authenticator.py b/src/illumidesk/illumidesk/authenticators/authenticator.py index 6104ba9e..01dd0a1d 100644 --- a/src/illumidesk/illumidesk/authenticators/authenticator.py +++ b/src/illumidesk/illumidesk/authenticators/authenticator.py @@ -60,7 +60,7 @@ async def setup_course_hook_lti11( jupyterhub_api = JupyterHubAPI() # normalize the name and course_id strings in authentication dictionary - username = authentication["name"] + name = authentication["name"] lms_user_id = authentication["auth_state"]["user_id"] user_role = authentication["auth_state"]["roles"].split(",")[0] course_id = lti_utils.normalize_string( @@ -69,25 +69,28 @@ async def setup_course_hook_lti11( nb_service = NbGraderServiceHelper(course_id, True) # register the user (it doesn't matter if it is a student or instructor) with her/his lms_user_id in nbgrader - nb_service.add_user_to_nbgrader_gradebook(username, lms_user_id) + role = "STUDENT" + if not user_is_a_student(user_role) and user_is_an_instructor(user_role): + role = "INSTRUCTOR" + nb_service.add_user_to_nbgrader_gradebook(name, lms_user_id, role) # TODO: verify the logic to simplify groups creation and membership - if user_is_a_student(user_role): + if role == "STUDENT": try: # assign the user to 'nbgrader-' group in jupyterhub and gradebook - await jupyterhub_api.add_student_to_jupyterhub_group(course_id, username) + await jupyterhub_api.add_student_to_jupyterhub_group(course_id, lms_user_id) except AddJupyterHubUserException as e: logger.error( - "An error when adding student username: %s to course_id: %s with exception %s", - (username, course_id, e), + "An error when adding student user_id: %s to course_id: %s with exception %s", + (lms_user_id, course_id, e), ) - elif user_is_an_instructor(user_role): + elif role == "INSTRUCTOR": try: # assign the user in 'formgrade-' group - await jupyterhub_api.add_instructor_to_jupyterhub_group(course_id, username) + await jupyterhub_api.add_instructor_to_jupyterhub_group(course_id, lms_user_id) except AddJupyterHubUserException as e: logger.error( - "An error when adding instructor username: %s to course_id: %s with exception %s", - (username, course_id, e), + "An error when adding instructor user_id: %s to course_id: %s with exception %s", + (lms_user_id, course_id, e), ) # launch the new grader-notebook as a service @@ -128,30 +131,33 @@ async def setup_course_hook( # normalize the name and course_id strings in authentication dictionary course_id = lti_utils.normalize_string(authentication["auth_state"]["course_id"]) nb_service = NbGraderServiceHelper(course_id, True) - username = lti_utils.normalize_string(authentication["name"]) lms_user_id = authentication["auth_state"]["lms_user_id"] + email = authentication["auth_state"]["email"] user_role = authentication["auth_state"]["user_role"] + source = authentication["auth_state"]["source"] + source_type = authentication["auth_state"]["source_type"] # register the user (it doesn't matter if it is a student or instructor) with her/his lms_user_id in nbgrader - nb_service.add_user_to_nbgrader_gradebook(username, lms_user_id) + user = nb_service.add_user_to_nbgrader_gradebook(email, lms_user_id, source, source_type) + authentication["name"] = user["id"] # TODO: verify the logic to simplify groups creation and membership if user_is_a_student(user_role): try: # assign the user to 'nbgrader-' group in jupyterhub and gradebook - await jupyterhub_api.add_student_to_jupyterhub_group(course_id, username) + await jupyterhub_api.add_student_to_jupyterhub_group(course_id, user["id"]) except AddJupyterHubUserException as e: logger.error( - "An error when adding student username: %s to course_id: %s with exception %s", - (username, course_id, e), + "An error when adding student user_id: %s to course_id: %s with exception %s", + (lms_user_id, course_id, e), ) elif user_is_an_instructor(user_role): try: # assign the user in 'formgrade-' group - await jupyterhub_api.add_instructor_to_jupyterhub_group(course_id, username) + await jupyterhub_api.add_instructor_to_jupyterhub_group(course_id, user["id"]) except AddJupyterHubUserException as e: logger.error( - "An error when adding instructor username: %s to course_id: %s with exception %s", - (username, course_id, e), + "An error when adding instructor user_id: %s to course_id: %s with exception %s", + (lms_user_id, course_id, e), ) # launch the new grader-notebook as a service @@ -163,6 +169,48 @@ async def setup_course_hook( return authentication +async def setup_user_hook_auth0( + authenticator: Authenticator, + handler: RequestHandler, + authentication: Dict[str, str], +) -> Dict[str, str]: + """ + Calls the microservice to create a new user in case it does not exist. + The data needed is received from auth_state within authentication object. This + function assumes that the required k/v's in the auth_state dictionary are available, + since the Authenticator(s) validates the data beforehand. + + This function requires `Authenticator.enable_auth_state = True` and is intended + to be used as a post_auth_hook. + + Args: + authenticator: the JupyterHub Authenticator object + handler: the JupyterHub handler object + authentication: the authentication object returned by the + authenticator class + + Returns: + authentication (Required): updated authentication object + """ + lti_utils = LTIUtils() + + # normalize the name and course_id strings in authentication dictionary + course_id = lti_utils.normalize_string(authentication["auth_state"]["course_id"]) + nb_service = NbGraderServiceHelper(course_id, True) + oauth_user = authentication["auth_state"]["oauth_user"] or {} + + lms_user_id = oauth_user.get("user_id") or oauth_user.get("username") or oauth_user.get("sub") + email = oauth_user.get("email") or oauth_user.get("sub") + # user_role = authentication["auth_state"]["user_role"] + source = "auth0" + source_type = "generic-oauth" + + # register the user (it doesn't matter if it is a student or instructor) with her/his lms_user_id in nbgrader + user = nb_service.add_user_to_nbgrader_gradebook(email, lms_user_id, source, source_type) + authentication["name"] = user["id"] + return authentication + + class LTI13Authenticator(OAuthenticator): """Custom authenticator used with LTI 1.3 requests""" @@ -235,7 +283,9 @@ async def authenticate( # noqa: C901 course_id = lti_utils.normalize_string(course_id) self.log.debug("Normalized course label is %s" % course_id) username = "" + email = "" if "email" in jwt_decoded and jwt_decoded["email"]: + email = jwt_decoded["email"] username = lti_utils.email_to_username(jwt_decoded["email"]) elif "name" in jwt_decoded and jwt_decoded["name"]: username = jwt_decoded["name"] @@ -294,6 +344,7 @@ async def authenticate( # noqa: C901 await process_resource_link_lti_13(self.log, course_id, jwt_decoded) lms_user_id = jwt_decoded["sub"] if "sub" in jwt_decoded else username + lms_id = (jwt_decoded.get("https://purl.imsglobal.org/spec/lti/claim/tool_platform") or {}).get("guid") # ensure the username is normalized self.log.debug("username is %s" % username) @@ -303,14 +354,19 @@ async def authenticate( # noqa: C901 # ensure the user name is normalized username_normalized = lti_utils.normalize_string(username) self.log.debug("Assigned username is: %s" % username_normalized) + self.log.debug("Assigned id is: %s for username %s" % (lms_user_id, username)) return { - "name": username_normalized, + "name": email or lms_user_id, "auth_state": { "course_id": course_id, "user_role": user_role, "lms_user_id": lms_user_id, + "username": username, + "email": email or lms_user_id, "launch_return_url": launch_return_url, + "source": lms_id, + "source_type": "lti13" }, # noqa: E231 } diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 3d222b0b..afa29904 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -48,7 +48,7 @@ matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert nbconvert==5.6.1 # via jupyter, nbgrader, notebook nbformat==5.1.3 # via ipywidgets, nbconvert, nbgrader, notebook -nbgrader==0.6.2 # via illumidesk (setup.py) +git+ssh://git@github.com/IllumiDesk/illumidesk-next.git@feature/refactor-modals-lti#subdirectory=packages/nbgrader # via illumidesk (setup.py) notebook==6.4.1 # via jupyter, nbgrader, widgetsnbextension oauthenticator==14.2.0 # via illumidesk (setup.py) oauthlib==3.1.0 # via illumidesk (setup.py), jupyterhub, jupyterhub-ltiauthenticator, requests-oauthlib diff --git a/src/illumidesk/setup.py b/src/illumidesk/setup.py index b0cd6319..14ba901e 100644 --- a/src/illumidesk/setup.py +++ b/src/illumidesk/setup.py @@ -40,7 +40,7 @@ "jupyterhub-kubespawner==0.14.1", "jupyterhub-ltiauthenticator@git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5", "jwcrypto==0.8", - "nbgrader==0.6.2", + "git+ssh://git@github.com/IllumiDesk/illumidesk-next.git@feature/refactor-modals-lti#subdirectory=packages/nbgrader", "oauthlib==3.1", "oauthenticator>=0.13.0", "pem==20.1.0", diff --git a/src/illumidesk/tests/illumidesk/conftest.py b/src/illumidesk/tests/illumidesk/conftest.py index 3774b4a0..c6348176 100644 --- a/src/illumidesk/tests/illumidesk/conftest.py +++ b/src/illumidesk/tests/illumidesk/conftest.py @@ -27,7 +27,7 @@ @pytest.fixture(scope="module") def auth_state_dict(): authenticator_auth_state = { - "name": "student1", + "name": "185d6c59731a553009ca9b59ca3a885100000", "auth_state": { "course_id": "intro101", "lms_user_id": "185d6c59731a553009ca9b59ca3a885100000", From ee0dfd755c23d61d1b89a5c71587c8580248518c Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 22 Mar 2022 01:35:17 -0400 Subject: [PATCH 02/58] added illumidesk secret option --- src/formgradernext/requirements.txt | 1 + src/graderservice/graderservice/graderservice.py | 2 +- src/graderservice/requirements.txt | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 5fce9ae0..9c032da6 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -212,6 +212,7 @@ webencodings==0.5.1 # via bleach widgetsnbextension==3.5.2 # via ipywidgets +secretsmanager-illumidesk==0.0.1 # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index 5981cabf..7ef2904b 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -6,7 +6,7 @@ from os import path from pathlib import Path from secrets import token_hex - +from secretsmanager.secretsmanager import SecretsManager from kubernetes import client from kubernetes import config from kubernetes.config import ConfigException diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index aea7f9e2..323ddf6b 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -73,5 +73,6 @@ websocket-client==0.59.0 werkzeug==2.0.0 # via flask +secretsmanager-illumidesk==0.0.1 # The following packages are considered to be unsafe in a requirements file: # setuptools From d07623ce19bacbc33c9ccdedee7aa533a03cc7d5 Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Tue, 22 Mar 2022 15:58:00 +0530 Subject: [PATCH 03/58] Dockerfile changes --- src/illumidesk/requirements.txt | 2 +- src/illumidesk/setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index afa29904..96c928c7 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -37,7 +37,7 @@ jupyter-core==4.7.1 # via jupyter-client, nbconvert, nbformat, nbgrader, n jupyter-telemetry==0.1.0 # via jupyterhub jupyter==1.0.0 # via nbgrader jupyterhub-kubespawner==0.14.1 # via illumidesk (setup.py) -git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5 # via illumidesk (setup.py) +git+https://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5 # via illumidesk (setup.py) jupyterhub==1.4.1 # via jupyterhub-kubespawner, jupyterhub-ltiauthenticator, oauthenticator jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) diff --git a/src/illumidesk/setup.py b/src/illumidesk/setup.py index 14ba901e..d84b5b0b 100644 --- a/src/illumidesk/setup.py +++ b/src/illumidesk/setup.py @@ -38,9 +38,9 @@ install_requires=[ "josepy==1.4.0", "jupyterhub-kubespawner==0.14.1", - "jupyterhub-ltiauthenticator@git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5", + "jupyterhub-ltiauthenticator@git+ssh://git@github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5", "jwcrypto==0.8", - "git+ssh://git@github.com/IllumiDesk/illumidesk-next.git@feature/refactor-modals-lti#subdirectory=packages/nbgrader", + "nbgrader@git+ssh://git@github.com/IllumiDesk/illumidesk-next.git@feature/refactor-modals-lti#subdirectory=packages/nbgrader", "oauthlib==3.1", "oauthenticator>=0.13.0", "pem==20.1.0", From f30091c7948ed13ffc0182c21aa06393fd5e13d4 Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Tue, 22 Mar 2022 17:54:38 +0530 Subject: [PATCH 04/58] add env variable --- .../graderservice/graderservice.py | 3 ++ src/illumidesk/Dockerfile | 43 +++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index b4374489..570cc3ae 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -50,6 +50,8 @@ JUPYTERHUB_API_URL = os.environ.get("JUPYTERHUB_API_URL") or "http://hub:8081/hub/api" JUPYTERHUB_BASE_URL = os.environ.get("JUPYTERHUB_BASE_URL") or "/" +CAMPUS_ID = os.environ.get("CAMPUS_ID") + # NBGrader database settings to save in nbgrader_config.py file nbgrader_db_host = os.environ.get("POSTGRES_NBGRADER_HOST") nbgrader_db_password = os.environ.get("POSTGRES_NBGRADER_PASSWORD") @@ -266,6 +268,7 @@ def _create_deployment_object(self): client.V1EnvVar(name="NB_UID", value=str(NB_UID)), client.V1EnvVar(name="NB_GID", value=str(NB_GID)), client.V1EnvVar(name="NB_USER", value=self.grader_name), + client.V1EnvVar(name="CAMPUS_ID", value=str(CAMPUS_ID)), ], volume_mounts=[ client.V1VolumeMount( diff --git a/src/illumidesk/Dockerfile b/src/illumidesk/Dockerfile index 15fb9d67..c553018a 100644 --- a/src/illumidesk/Dockerfile +++ b/src/illumidesk/Dockerfile @@ -1,37 +1,74 @@ # for kubernetes, use the --build-arg when building image or uncomment # ARG BASE_IMAGE=jupyterhub/k8s-hub:1.1.2 ARG BASE_IMAGE=jupyterhub/jupyterhub:1.4.2 +ARG SSH_PRIVATE_KEY FROM "${BASE_IMAGE}" USER root + RUN apt-get update \ && apt-get install -y \ curl \ git \ unzip \ wget \ + openssh-server \ + libmysqlclient-dev \ && rm -rf /var/lib/apt/lists/* +USER "${NB_USER}" + +ARG SSH_PRIVATE_KEY +RUN mkdir ~/.ssh/ +RUN echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_ed25519 +RUN chmod 600 ~/.ssh/id_ed25519 +RUN ssh-keyscan github.com >> ~/.ssh/known_hosts +# Print SSH_PRIVATE_KEY (for test) +RUN echo "${SSH_PRIVATE_KEY}" + +# # Authorize SSH Host +# RUN mkdir -p "/home/${NB_USER}/.ssh" && \ +# chmod 0700 "/home/${NB_USER}/.ssh" + +# COPY ./id_illumidesk_ssh "/home/${NB_USER}/.ssh/id_rsa" +# COPY ./id_illumidesk_ssh.pub "/home/${NB_USER}/.ssh/id_rsa.pub" + +# # Add the keys and set permissions +# RUN chmod 600 "/home/${NB_USER}/.ssh/id_rsa" && \ +# chmod 600 "/home/${NB_USER}/.ssh/id_rsa.pub" && \ +# touch "/home/${NB_USER}/.ssh"/known_hosts + +# RUN chown -R "${NB_USER}" "/home/${NB_USER}/.ssh" + +# # RUN ssh-keyscan github.com >> "/home/${NB_USER}/.ssh"/known_hosts +# RUN ssh-keyscan -t ssh-ed25519 github.com >> "/home/${NB_USER}/.ssh"/known_hosts + +# RUN file="/home/${NB_USER}/.ssh"/known_hosts && echo $file + +# # RUN echo "Host github.com\n\tStrictHostKeyChecking no\n" >> "/home/${NB_USER}/.ssh/config" +# RUN file="/home/${NB_USER}/.ssh/config" && echo $file + WORKDIR /tmp RUN wget https://configs.illumidesk.com/images/illumidesk-80.png \ && cp -r /tmp/illumidesk-80.png /srv/jupyterhub/ \ && cp -r /tmp/illumidesk-80.png /usr/local/share/jupyterhub/static/images/illumidesk-80.png \ && chown "${NB_UID}" /srv/jupyterhub/illumidesk-80.png -USER "${NB_UID}" - ENV PATH="/home/${NB_USER}/.local/bin:${PATH}" +# ENV PYTHONUNBUFFERED 1 # ensure pip is up to date RUN python3 -m pip install --upgrade pip COPY requirements.txt /tmp/ -RUN pip install -r /tmp/requirements.txt +RUN pip install -r /tmp/requirements.txt --use-deprecated=legacy-resolver WORKDIR /tmp COPY . /tmp RUN python3 -m pip install /tmp/. +RUN rm -rf "/home/${NB_USER}/.ssh/" + WORKDIR /srv/jupyterhub/ # This config is overwitten with k8s setup From 32db3a51e9316ea99fb562fb64beef5bdac61bd0 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Thu, 24 Mar 2022 21:54:49 -0400 Subject: [PATCH 05/58] initialization of secrets manager --- src/graderservice/graderservice/graderservice.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index 7ef2904b..a780feff 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -60,6 +60,9 @@ nbgrader_db_port = os.environ.get("POSTGRES_NBGRADER_PORT") nbgrader_db_name = os.environ.get("POSTGRES_NBGRADER_DB_NAME") +aws_secret_arn = os.environ.get('AWS_SECRET_ARN') +secretmanager = SecretsManager(aws_secret_arn, region_name='us-west-2', host=nbgrader_db_host) + class GraderServiceLauncher: def __init__(self, org_name: str, course_id: str): @@ -180,11 +183,16 @@ def _create_nbgrader_files(self): logger.info( f"Writing the nbgrader_config.py file at jupyter directory (within the grader home): {grader_nbconfig_path}" ) + db_url = '' + if aws_secret_arn != '': + db_url = secretmanager.rds_connection(f'{self.org_name}_{self.course_id}') + else: + db_url = f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:5432/{self.org_name}_{self.course_id}" # write the file grader_home_nbconfig_content = NBGRADER_HOME_CONFIG_TEMPLATE.format( grader_name=self.grader_name, course_id=self.course_id, - db_url=f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:5432/{self.org_name}_{self.course_id}", + db_url=db_url, ) grader_nbconfig_path.write_text(grader_home_nbconfig_content) # Write the nbgrader_config.py file at grader home directory From 070ca4f4adf3ad8c6db57ebe89b5e854d9cb73b1 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Thu, 24 Mar 2022 21:56:54 -0400 Subject: [PATCH 06/58] updated graderservice to add restart grader functionality --- .../graderservice/graderservice.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index a780feff..aa275e7f 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -366,3 +366,23 @@ def update_jhub_deployment(self): name="hub", namespace=NAMESPACE, body=deployment ) logger.info(f"Jhub patch response:{api_response}") + + # Restarts deployment in namespace + def restart_deployment(v1_apps, deployment, namespace): + now = datetime.datetime.utcnow() + now = str(now.isoformat("T") + "Z") + body = { + 'spec': { + 'template':{ + 'metadata': { + 'annotations': { + 'kubectl.kubernetes.io/restartedAt': now + } + } + } + } + } + try: + v1_apps.patch_namespaced_deployment(deployment, namespace, body, pretty='true') + except ApiException as e: + print("Exception when calling AppsV1Api->read_namespaced_deployment_status: %s\n" % e) \ No newline at end of file From 4554626212b296076c99ea1aa7d72f39ea85ebfa Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Fri, 25 Mar 2022 17:34:11 -0400 Subject: [PATCH 07/58] updated route to restart grader --- .../graderservice/graderservice.py | 30 +++++++++++-------- src/graderservice/graderservice/routes.py | 18 +++++++++++ src/graderservice/requirements.txt | 2 +- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index aa275e7f..3ec1c032 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -6,10 +6,11 @@ from os import path from pathlib import Path from secrets import token_hex -from secretsmanager.secretsmanager import SecretsManager from kubernetes import client from kubernetes import config from kubernetes.config import ConfigException +from kubernetes.client.rest import ApiException +import time from .templates import NBGRADER_COURSE_CONFIG_TEMPLATE from .templates import NBGRADER_HOME_CONFIG_TEMPLATE @@ -60,8 +61,6 @@ nbgrader_db_port = os.environ.get("POSTGRES_NBGRADER_PORT") nbgrader_db_name = os.environ.get("POSTGRES_NBGRADER_DB_NAME") -aws_secret_arn = os.environ.get('AWS_SECRET_ARN') -secretmanager = SecretsManager(aws_secret_arn, region_name='us-west-2', host=nbgrader_db_host) class GraderServiceLauncher: @@ -183,16 +182,11 @@ def _create_nbgrader_files(self): logger.info( f"Writing the nbgrader_config.py file at jupyter directory (within the grader home): {grader_nbconfig_path}" ) - db_url = '' - if aws_secret_arn != '': - db_url = secretmanager.rds_connection(f'{self.org_name}_{self.course_id}') - else: - db_url = f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:5432/{self.org_name}_{self.course_id}" # write the file grader_home_nbconfig_content = NBGRADER_HOME_CONFIG_TEMPLATE.format( grader_name=self.grader_name, course_id=self.course_id, - db_url=db_url, + db_url=f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:5432/{self.org_name}_{self.course_id}", ) grader_nbconfig_path.write_text(grader_home_nbconfig_content) # Write the nbgrader_config.py file at grader home directory @@ -368,8 +362,8 @@ def update_jhub_deployment(self): logger.info(f"Jhub patch response:{api_response}") # Restarts deployment in namespace - def restart_deployment(v1_apps, deployment, namespace): - now = datetime.datetime.utcnow() + def restart_deployment(self, deployment, namespace): + now = datetime.utcnow() now = str(now.isoformat("T") + "Z") body = { 'spec': { @@ -382,7 +376,17 @@ def restart_deployment(v1_apps, deployment, namespace): } } } + deployment_status = f'{deployment} failed to deploy to organization: {namespace}' try: - v1_apps.patch_namespaced_deployment(deployment, namespace, body, pretty='true') + restart_deployment = self.apps_v1.patch_namespaced_deployment(deployment, namespace, body, pretty='true') except ApiException as e: - print("Exception when calling AppsV1Api->read_namespaced_deployment_status: %s\n" % e) \ No newline at end of file + logger.error("Exception when calling AppsV1Api->read_namespaced_deployment_status: %s\n" % e) + else: + while restart_deployment.status.updated_replicas != restart_deployment.spec.replicas: + logger.info(f'Waiting for status to update for grader{deployment} to organization {namespace}') + time.sleep(5) + deployment_status = f'{deployment} successfully deployed to organization {namespace}' + return deployment_status + + return deployment_status + diff --git a/src/graderservice/graderservice/routes.py b/src/graderservice/graderservice/routes.py index 93416c4d..4bbc86a9 100644 --- a/src/graderservice/graderservice/routes.py +++ b/src/graderservice/graderservice/routes.py @@ -203,6 +203,24 @@ def assignment_dir_creation(org_name: str, course_id: str, assignment_name: str) success=True, message=f"Created new assignment directory: {assignment_dir}", ) +@grader_setup_bp.route( + "/services///restart", methods=["POST"] +) +def restart_grader(org_name: str, course_id: str): + launcher = GraderServiceLauncher(org_name=org_name, course_id=course_id) + try: + restart_deployment_status = launcher.restart_deployment(f'grader-{course_id}',org_name) + + except Exception as e: + logger.error(f"Error restarting grader: {e}") + return jsonify(success=False, error=str(e)), 404 + logger.info(restart_deployment_status) + return jsonify( + success=True, + message=f"{restart_deployment_status}" + ) + + @grader_setup_bp.route("/healthcheck") diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 323ddf6b..728b41a4 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -73,6 +73,6 @@ websocket-client==0.59.0 werkzeug==2.0.0 # via flask -secretsmanager-illumidesk==0.0.1 +secretsmanager-illumidesk==0.0.2 # The following packages are considered to be unsafe in a requirements file: # setuptools From 2ad280f791d4a13e208770cc19910c9307dfe127 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Fri, 25 Mar 2022 17:46:54 -0400 Subject: [PATCH 08/58] added response code for route --- src/graderservice/graderservice/graderservice.py | 3 ++- src/graderservice/graderservice/routes.py | 13 +++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index 3ec1c032..d7223e16 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -381,6 +381,7 @@ def restart_deployment(self, deployment, namespace): restart_deployment = self.apps_v1.patch_namespaced_deployment(deployment, namespace, body, pretty='true') except ApiException as e: logger.error("Exception when calling AppsV1Api->read_namespaced_deployment_status: %s\n" % e) + return deployment_status else: while restart_deployment.status.updated_replicas != restart_deployment.spec.replicas: logger.info(f'Waiting for status to update for grader{deployment} to organization {namespace}') @@ -388,5 +389,5 @@ def restart_deployment(self, deployment, namespace): deployment_status = f'{deployment} successfully deployed to organization {namespace}' return deployment_status - return deployment_status + diff --git a/src/graderservice/graderservice/routes.py b/src/graderservice/graderservice/routes.py index 4bbc86a9..500dd8c5 100644 --- a/src/graderservice/graderservice/routes.py +++ b/src/graderservice/graderservice/routes.py @@ -214,12 +214,13 @@ def restart_grader(org_name: str, course_id: str): except Exception as e: logger.error(f"Error restarting grader: {e}") return jsonify(success=False, error=str(e)), 404 - logger.info(restart_deployment_status) - return jsonify( - success=True, - message=f"{restart_deployment_status}" - ) - + else: + logger.info(restart_deployment_status) + return jsonify( + success=True, + message=f"{restart_deployment_status}" + ), 200 + From 938df6a4ff2a94f0619578722b6462bd1c11b522 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Fri, 25 Mar 2022 18:07:32 -0400 Subject: [PATCH 09/58] updated formgrader secretsmanager version to a valid one --- src/formgradernext/requirements.txt | 2 +- src/graderservice/graderservice/graderservice.py | 9 +++++---- src/graderservice/graderservice/routes.py | 15 +++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 9c032da6..96568a49 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -212,7 +212,7 @@ webencodings==0.5.1 # via bleach widgetsnbextension==3.5.2 # via ipywidgets -secretsmanager-illumidesk==0.0.1 +secretsmanager-illumidesk==0.0.2 # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index d7223e16..620d90d1 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -376,18 +376,19 @@ def restart_deployment(self, deployment, namespace): } } } - deployment_status = f'{deployment} failed to deploy to organization: {namespace}' + deployment_status = f'{deployment} failed to deploy to organization: {namespace}', 404 try: restart_deployment = self.apps_v1.patch_namespaced_deployment(deployment, namespace, body, pretty='true') except ApiException as e: logger.error("Exception when calling AppsV1Api->read_namespaced_deployment_status: %s\n" % e) - return deployment_status + except Exception as e: + logger.error(deployment_status, e) else: while restart_deployment.status.updated_replicas != restart_deployment.spec.replicas: logger.info(f'Waiting for status to update for grader{deployment} to organization {namespace}') time.sleep(5) - deployment_status = f'{deployment} successfully deployed to organization {namespace}' - return deployment_status + deployment_status = f'{deployment} successfully deployed to organization {namespace}', 200 + return deployment_status diff --git a/src/graderservice/graderservice/routes.py b/src/graderservice/graderservice/routes.py index 500dd8c5..9721b019 100644 --- a/src/graderservice/graderservice/routes.py +++ b/src/graderservice/graderservice/routes.py @@ -210,16 +210,15 @@ def restart_grader(org_name: str, course_id: str): launcher = GraderServiceLauncher(org_name=org_name, course_id=course_id) try: restart_deployment_status = launcher.restart_deployment(f'grader-{course_id}',org_name) - except Exception as e: logger.error(f"Error restarting grader: {e}") - return jsonify(success=False, error=str(e)), 404 - else: - logger.info(restart_deployment_status) - return jsonify( - success=True, - message=f"{restart_deployment_status}" - ), 200 + + logger.info(restart_deployment_status) + success = True if restart_deployment_status[1]==200 else False + return jsonify( + success=success, + message=f"{restart_deployment_status[0]}" + ), restart_deployment_status[1] From b8944e582d6e33c4d5e5da91cd7ab52459662df1 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Fri, 25 Mar 2022 20:27:34 -0400 Subject: [PATCH 10/58] graderservice restart grader timeout 10 seconds --- src/graderservice/graderservice/graderservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index 620d90d1..8a51c83d 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -386,7 +386,7 @@ def restart_deployment(self, deployment, namespace): else: while restart_deployment.status.updated_replicas != restart_deployment.spec.replicas: logger.info(f'Waiting for status to update for grader{deployment} to organization {namespace}') - time.sleep(5) + time.sleep(10) deployment_status = f'{deployment} successfully deployed to organization {namespace}', 200 return deployment_status From 48a64674a9edf9ab3be59bd327bb15c4b410df43 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 08:40:50 -0400 Subject: [PATCH 11/58] grader service sleep changed --- src/graderservice/graderservice/graderservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index 8a51c83d..620d90d1 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -386,7 +386,7 @@ def restart_deployment(self, deployment, namespace): else: while restart_deployment.status.updated_replicas != restart_deployment.spec.replicas: logger.info(f'Waiting for status to update for grader{deployment} to organization {namespace}') - time.sleep(10) + time.sleep(5) deployment_status = f'{deployment} successfully deployed to organization {namespace}', 200 return deployment_status From 7ac98ace6eb2c56f7c77a276e6e450e4236c9569 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 08:47:08 -0400 Subject: [PATCH 12/58] updated to jupyterhub ltiauthenticator --- src/illumidesk/requirements.txt | 2 +- src/illumidesk/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 3d222b0b..54f3e45c 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -37,7 +37,7 @@ jupyter-core==4.7.1 # via jupyter-client, nbconvert, nbformat, nbgrader, n jupyter-telemetry==0.1.0 # via jupyterhub jupyter==1.0.0 # via nbgrader jupyterhub-kubespawner==0.14.1 # via illumidesk (setup.py) -git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5 # via illumidesk (setup.py) +jupyterhub-ltiauthenticator==1.3.0 # via illumidesk (setup.py) jupyterhub==1.4.1 # via jupyterhub-kubespawner, jupyterhub-ltiauthenticator, oauthenticator jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) diff --git a/src/illumidesk/setup.py b/src/illumidesk/setup.py index b0cd6319..9c4abf61 100644 --- a/src/illumidesk/setup.py +++ b/src/illumidesk/setup.py @@ -38,7 +38,7 @@ install_requires=[ "josepy==1.4.0", "jupyterhub-kubespawner==0.14.1", - "jupyterhub-ltiauthenticator@git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5", + "jupyterhub-ltiauthenticator==1.3.0", "jwcrypto==0.8", "nbgrader==0.6.2", "oauthlib==3.1", From abe0606ad9deddec0fa7afaa39bd628b52add015 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 08:55:54 -0400 Subject: [PATCH 13/58] updated jinja2 and markupsafe version --- src/formgradernext/requirements.txt | 4 ++-- src/graderservice/requirements.txt | 4 ++-- src/illumidesk/requirements.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 96568a49..86788c65 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.2 +jinja2==3.1.1 # via # nbconvert # notebook @@ -89,7 +89,7 @@ jupyterlab-widgets==1.0.2 # via ipywidgets mako==1.1.5 # via alembic -markupsafe==2.0.1 +markupsafe==2.1.1 # via # jinja2 # mako diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 728b41a4..e95898d4 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,11 +30,11 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.0.0 +jinja2==3.1.1 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) -markupsafe==2.0.0 +markupsafe==2.1.1 # via jinja2 oauthlib==3.1.0 # via requests-oauthlib diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 54f3e45c..cf5a14dc 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==3.1.1 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole @@ -43,7 +43,7 @@ jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) kubernetes==17.17.0 # via jupyterhub-kubespawner mako==1.1.4 # via alembic -markupsafe==2.0.0 # via jinja2, mako +markupsafe==2.1.1 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert nbconvert==5.6.1 # via jupyter, nbgrader, notebook From 47bf3826128abe85915ea3e232b18ec4031f0313 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 09:08:01 -0400 Subject: [PATCH 14/58] remove markup package --- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 86788c65..0d2b9943 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -89,7 +89,7 @@ jupyterlab-widgets==1.0.2 # via ipywidgets mako==1.1.5 # via alembic -markupsafe==2.1.1 + # via # jinja2 # mako diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index e95898d4..7926e186 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -34,7 +34,7 @@ jinja2==3.1.1 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) -markupsafe==2.1.1 + # via jinja2 oauthlib==3.1.0 # via requests-oauthlib diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index cf5a14dc..b0cb9920 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -43,7 +43,6 @@ jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) kubernetes==17.17.0 # via jupyterhub-kubespawner mako==1.1.4 # via alembic -markupsafe==2.1.1 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert nbconvert==5.6.1 # via jupyter, nbgrader, notebook From 089e1c39dd2223c53f2e17f9bba6fcdbb7d8f955 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 09:14:07 -0400 Subject: [PATCH 15/58] set jinja version to 3.0.3 --- src/formgradernext/requirements.txt | 4 ++-- src/graderservice/requirements.txt | 4 ++-- src/illumidesk/requirements.txt | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 0d2b9943..e4478e2f 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.1.1 +jinja2==3.0.3 # via # nbconvert # notebook @@ -89,7 +89,7 @@ jupyterlab-widgets==1.0.2 # via ipywidgets mako==1.1.5 # via alembic - +markupsafe==2.1.1 # via # jinja2 # mako diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 7926e186..132d91a3 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,11 +30,11 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.1.1 +jinja2==3.0.3 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) - +markupsafe==2.1.1 # via jinja2 oauthlib==3.1.0 # via requests-oauthlib diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index b0cb9920..1b62d7be 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.1.1 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==3.0.3 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole @@ -43,6 +43,7 @@ jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) kubernetes==17.17.0 # via jupyterhub-kubespawner mako==1.1.4 # via alembic +markupsafe==2.1.1 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert nbconvert==5.6.1 # via jupyter, nbgrader, notebook From 508d95d746003464eeeab49cc860e56c97692b36 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 09:18:21 -0400 Subject: [PATCH 16/58] removed markup safe --- src/formgradernext/requirements.txt | 1 - src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index e4478e2f..0809916d 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -89,7 +89,6 @@ jupyterlab-widgets==1.0.2 # via ipywidgets mako==1.1.5 # via alembic -markupsafe==2.1.1 # via # jinja2 # mako diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 132d91a3..4d5165d6 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -34,7 +34,7 @@ jinja2==3.0.3 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) -markupsafe==2.1.1 + # via jinja2 oauthlib==3.1.0 # via requests-oauthlib diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 1b62d7be..f0783fcf 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -43,7 +43,6 @@ jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) kubernetes==17.17.0 # via jupyterhub-kubespawner mako==1.1.4 # via alembic -markupsafe==2.1.1 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert nbconvert==5.6.1 # via jupyter, nbgrader, notebook From 28d73e912210e0e32610c7d6ab349be95d054e99 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 10:33:54 -0400 Subject: [PATCH 17/58] updated jinja2 and packages dependent on jinja2 --- src/formgradernext/requirements.txt | 4 ++-- src/graderservice/requirements.txt | 4 ++-- src/illumidesk/requirements.txt | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 0809916d..6d9be33f 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.3 +jinja2==3.1.1 # via # nbconvert # notebook @@ -87,7 +87,7 @@ jupyter-core==4.7.1 # qtconsole jupyterlab-widgets==1.0.2 # via ipywidgets -mako==1.1.5 +mako==1.2.0 # via alembic # via # jinja2 diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 4d5165d6..9ae4169a 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,13 +30,13 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.0.3 +jinja2==3.1.1 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) # via jinja2 -oauthlib==3.1.0 +oauthlib==3.2.0 # via requests-oauthlib pyasn1-modules==0.2.8 # via google-auth diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index f0783fcf..eedb3152 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,8 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.3 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==1.2.0 +oauthlib==3.2.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From 96390e16b14dc325089438a3921082e692d3f042 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 10:39:57 -0400 Subject: [PATCH 18/58] fixed jinja version --- src/illumidesk/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index eedb3152..08814e70 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==1.2.0 +jinja2==3.2.0 oauthlib==3.2.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader From 6a7c7a18fc5c11fc8d81dd4be9d1ac92bdfac8b6 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 10:45:44 -0400 Subject: [PATCH 19/58] update jedi version --- src/formgradernext/requirements.txt | 4 ++-- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 6d9be33f..12a42e19 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -56,9 +56,9 @@ ipython-genutils==0.2.0 # traitlets ipywidgets==7.6.5 # via jupyter -jedi==0.18.0 +jedi==0.18.1 # via ipython -jinja2==3.1.1 +jinja2==3.2.0 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 9ae4169a..53ead4db 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.1.1 +jinja2==3.2.0 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 08814e70..7aa9faea 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -27,7 +27,7 @@ ipykernel==5.5.5 # via ipywidgets, jupyter, jupyter-console, notebook, ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter -jedi==0.18.0 # via ipython +jedi==0.18.1 # via ipython jinja2==3.2.0 oauthlib==3.2.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) From 5bfdada84e4eeaa6a15c09c9f90843040f8f0785 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 10:50:51 -0400 Subject: [PATCH 20/58] jinja 3.1.1 --- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 12a42e19..8477117a 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.1 # via ipython -jinja2==3.2.0 +jinja2==3.1.1 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 53ead4db..9ae4169a 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.2.0 +jinja2==3.1.1 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 7aa9faea..9c94ce56 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.1 # via ipython -jinja2==3.2.0 +jinja2==3.1.1 oauthlib==3.2.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader From 0216198216528da7abad613b85f229fbdc874749 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 10:58:38 -0400 Subject: [PATCH 21/58] oauthlib 3.1.1 --- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 9ae4169a..8f9fd485 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -36,7 +36,7 @@ kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) # via jinja2 -oauthlib==3.2.0 +jinja2==3.1.1 # via requests-oauthlib pyasn1-modules==0.2.8 # via google-auth diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 9c94ce56..ebe3e7f2 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -29,7 +29,7 @@ ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.1 # via ipython jinja2==3.1.1 -oauthlib==3.2.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +oauthlib==3.1.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From 40f79cafbe776e0407d50bfdd59c4cd956c3933d Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 11:11:47 -0400 Subject: [PATCH 22/58] revert jinja2 to 3.0.3 --- src/formgradernext/requirements.txt | 6 +++--- src/graderservice/requirements.txt | 6 +++--- src/illumidesk/requirements.txt | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 8477117a..0809916d 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -56,9 +56,9 @@ ipython-genutils==0.2.0 # traitlets ipywidgets==7.6.5 # via jupyter -jedi==0.18.1 +jedi==0.18.0 # via ipython -jinja2==3.1.1 +jinja2==3.0.3 # via # nbconvert # notebook @@ -87,7 +87,7 @@ jupyter-core==4.7.1 # qtconsole jupyterlab-widgets==1.0.2 # via ipywidgets -mako==1.2.0 +mako==1.1.5 # via alembic # via # jinja2 diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 8f9fd485..132d91a3 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,13 +30,13 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.1.1 +jinja2==3.0.3 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) - +markupsafe==2.1.1 # via jinja2 -jinja2==3.1.1 +oauthlib==3.1.0 # via requests-oauthlib pyasn1-modules==0.2.8 # via google-auth diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index ebe3e7f2..1b62d7be 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -27,9 +27,8 @@ ipykernel==5.5.5 # via ipywidgets, jupyter, jupyter-console, notebook, ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter -jedi==0.18.1 # via ipython -jinja2==3.1.1 -oauthlib==3.1.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jedi==0.18.0 # via ipython +jinja2==3.0.3 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole @@ -44,6 +43,7 @@ jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) kubernetes==17.17.0 # via jupyterhub-kubespawner mako==1.1.4 # via alembic +markupsafe==2.1.1 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert nbconvert==5.6.1 # via jupyter, nbgrader, notebook From 980b972e1b01866a00a1cba91480eda2c4996d15 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 12:19:40 -0400 Subject: [PATCH 23/58] updated flask to version 2.1.0 --- src/graderservice/requirements.txt | 2 +- src/graderservice/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 132d91a3..a24c62a2 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -16,7 +16,7 @@ click==8.0.0 # via flask flask-sqlalchemy==2.5.1 # via graderservice (src/graderservice/setup.py) -flask==1.1.2 +flask==2.1.0 # via # flask-sqlalchemy # graderservice (src/graderservice/setup.py) diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 61c30550..90a6d184 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -34,7 +34,7 @@ license="Apache 2.0", packages=find_packages(exclude="./tests"), install_requires=[ - "flask==1.1.2", + "flask==2.1.0", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", "kubernetes==12.0.1", From cee446415487f1413e7a294060f390fe1b4945ca Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 12:25:24 -0400 Subject: [PATCH 24/58] revert flask version --- src/graderservice/requirements.txt | 2 +- src/graderservice/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index a24c62a2..132d91a3 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -16,7 +16,7 @@ click==8.0.0 # via flask flask-sqlalchemy==2.5.1 # via graderservice (src/graderservice/setup.py) -flask==2.1.0 +flask==1.1.2 # via # flask-sqlalchemy # graderservice (src/graderservice/setup.py) diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 90a6d184..61c30550 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -34,7 +34,7 @@ license="Apache 2.0", packages=find_packages(exclude="./tests"), install_requires=[ - "flask==2.1.0", + "flask==1.1.2", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", "kubernetes==12.0.1", From e2aceec65611f5c55bf769905786de262a1029dc Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 12:31:34 -0400 Subject: [PATCH 25/58] flask version 1.1.1 --- src/graderservice/requirements.txt | 2 +- src/graderservice/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 132d91a3..362f5b44 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -16,7 +16,7 @@ click==8.0.0 # via flask flask-sqlalchemy==2.5.1 # via graderservice (src/graderservice/setup.py) -flask==1.1.2 +flask==1.1.1 # via # flask-sqlalchemy # graderservice (src/graderservice/setup.py) diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 61c30550..8d9fafe4 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -34,7 +34,7 @@ license="Apache 2.0", packages=find_packages(exclude="./tests"), install_requires=[ - "flask==1.1.2", + "flask==1.1.1", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", "kubernetes==12.0.1", From db33df40c276ad9f1b8cc0b1fb3a64a8ed60859e Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 12:40:52 -0400 Subject: [PATCH 26/58] update requirements --- src/graderservice/requirements.txt | 2 +- src/graderservice/setup.py | 2 +- src/illumidesk/requirements.txt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 362f5b44..132d91a3 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -16,7 +16,7 @@ click==8.0.0 # via flask flask-sqlalchemy==2.5.1 # via graderservice (src/graderservice/setup.py) -flask==1.1.1 +flask==1.1.2 # via # flask-sqlalchemy # graderservice (src/graderservice/setup.py) diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 8d9fafe4..61c30550 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -34,7 +34,7 @@ license="Apache 2.0", packages=find_packages(exclude="./tests"), install_requires=[ - "flask==1.1.1", + "flask==1.1.2", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", "kubernetes==12.0.1", diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 1b62d7be..54f3e45c 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.3 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==3.0.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole @@ -43,7 +43,7 @@ jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) kubernetes==17.17.0 # via jupyterhub-kubespawner mako==1.1.4 # via alembic -markupsafe==2.1.1 # via jinja2, mako +markupsafe==2.0.0 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert nbconvert==5.6.1 # via jupyter, nbgrader, notebook From 784dd48859eb9de864055ec724b9d13bd03856d3 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 13:12:12 -0400 Subject: [PATCH 27/58] update requirements --- src/formgradernext/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 0809916d..886ee8f1 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.3 +jinja2==3.0.2 # via # nbconvert # notebook From 5d3a3f4d829734f4f795dd87511e5008506365e3 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 29 Mar 2022 13:35:27 -0400 Subject: [PATCH 28/58] update test location in makefile --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index ded1ef62..fa62980b 100644 --- a/Makefile +++ b/Makefile @@ -60,11 +60,11 @@ push-all: ## push jupyterhub images to docker hub @docker push ${OWNER}/k8s-hub:${JUPYTERHUB_DOCKER_K8_TAG} test: dev ## run tests for all packages - ${VENV_BIN}/pytest -v src/async_nbgrader + ${VENV_BIN}/pytest -v src/async_nbgrader/async_nbgrader/tests ${VENV_BIN}/pytest -v src/formgradernext/tests - ${VENV_BIN}/pytest -v src/graderservice - ${VENV_BIN}/pytest -v src/illumidesk - ${VENV_BIN}/pytest -v src/illumideskdummyauthenticator + ${VENV_BIN}/pytest -v src/graderservice/tests + ${VENV_BIN}/pytest -v src/illumidesk/tests + ${VENV_BIN}/pytest -v src/illumideskdummyauthenticator/tests test-create-cov: ## create coverage report ${VENV_BIN}/pytest --cov=async_nbgrader src/async_nbgrader/async_nbgrader/tests From 8a4c151e37262be89e347bd800b72e7feae0dcb1 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Fri, 1 Apr 2022 19:59:53 -0400 Subject: [PATCH 29/58] removed asyncnbgrader test --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index fa62980b..eeee63fa 100644 --- a/Makefile +++ b/Makefile @@ -60,11 +60,11 @@ push-all: ## push jupyterhub images to docker hub @docker push ${OWNER}/k8s-hub:${JUPYTERHUB_DOCKER_K8_TAG} test: dev ## run tests for all packages - ${VENV_BIN}/pytest -v src/async_nbgrader/async_nbgrader/tests + ${VENV_BIN}/pytest -v src/formgradernext/tests - ${VENV_BIN}/pytest -v src/graderservice/tests - ${VENV_BIN}/pytest -v src/illumidesk/tests - ${VENV_BIN}/pytest -v src/illumideskdummyauthenticator/tests + ${VENV_BIN}/pytest -v src/graderservice + ${VENV_BIN}/pytest -v src/illumidesk + ${VENV_BIN}/pytest -v src/illumideskdummyauthenticator test-create-cov: ## create coverage report ${VENV_BIN}/pytest --cov=async_nbgrader src/async_nbgrader/async_nbgrader/tests From 972352e4baba4d2eb63cd7eddaa58ced444b0736 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Sun, 3 Apr 2022 01:01:33 -0400 Subject: [PATCH 30/58] add async_test back --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index eeee63fa..ded1ef62 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ push-all: ## push jupyterhub images to docker hub @docker push ${OWNER}/k8s-hub:${JUPYTERHUB_DOCKER_K8_TAG} test: dev ## run tests for all packages - + ${VENV_BIN}/pytest -v src/async_nbgrader ${VENV_BIN}/pytest -v src/formgradernext/tests ${VENV_BIN}/pytest -v src/graderservice ${VENV_BIN}/pytest -v src/illumidesk From aa9d7da534565f2550f425ea8ef2a219895b3c9f Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Thu, 7 Apr 2022 17:36:37 -0400 Subject: [PATCH 31/58] uses secretmanager package to fetch secret values --- src/formgradernext/requirements.txt | 2 +- src/graderservice/graderservice/graderservice.py | 8 +++++--- src/graderservice/requirements.txt | 2 +- src/illumidesk/illumidesk/apis/nbgrader_service.py | 14 +++++++++++++- src/illumidesk/illumidesk/lti13/handlers.py | 2 +- src/illumidesk/requirements.txt | 3 ++- src/illumidesk/setup.py | 3 ++- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 9c032da6..4c6ae34a 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -212,7 +212,7 @@ webencodings==0.5.1 # via bleach widgetsnbextension==3.5.2 # via ipywidgets -secretsmanager-illumidesk==0.0.1 +secretsmanager-illumidesk==0.0.3 # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index a780feff..2d0c5d29 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -61,8 +61,10 @@ nbgrader_db_name = os.environ.get("POSTGRES_NBGRADER_DB_NAME") aws_secret_arn = os.environ.get('AWS_SECRET_ARN') -secretmanager = SecretsManager(aws_secret_arn, region_name='us-west-2', host=nbgrader_db_host) - +region = os.environ.get('AWS_REGION') or 'us-west-2' +secretmanager = SecretsManager(aws_secret_arn, region_name=region) +if secretmanager.host == "": + secretmanager.host = nbgrader_db_host class GraderServiceLauncher: def __init__(self, org_name: str, course_id: str): @@ -184,7 +186,7 @@ def _create_nbgrader_files(self): f"Writing the nbgrader_config.py file at jupyter directory (within the grader home): {grader_nbconfig_path}" ) db_url = '' - if aws_secret_arn != '': + if aws_secret_arn != "" or aws_secret_arn is not None: db_url = secretmanager.rds_connection(f'{self.org_name}_{self.course_id}') else: db_url = f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:5432/{self.org_name}_{self.course_id}" diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 323ddf6b..0ecff868 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -73,6 +73,6 @@ websocket-client==0.59.0 werkzeug==2.0.0 # via flask -secretsmanager-illumidesk==0.0.1 +secretsmanager-illumidesk==0.0.3 # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/src/illumidesk/illumidesk/apis/nbgrader_service.py b/src/illumidesk/illumidesk/apis/nbgrader_service.py index d9e1cae7..cbcf3843 100644 --- a/src/illumidesk/illumidesk/apis/nbgrader_service.py +++ b/src/illumidesk/illumidesk/apis/nbgrader_service.py @@ -9,6 +9,8 @@ from sqlalchemy_utils import database_exists from illumidesk.authenticators.utils import LTIUtils +from secretsmanager.secretsmanager import SecretsManager + logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) @@ -25,6 +27,12 @@ if not org_name: raise EnvironmentError("ORGANIZATION_NAME env-var is not set") +aws_secret_arn = os.environ.get('AWS_SECRET_ARN') +region = os.environ.get('AWS_REGION') or 'us-west-2' +secretmanager = SecretsManager(aws_secret_arn, region_name=region) +if secretmanager.host == "": + secretmanager.host = nbgrader_db_host + def nbgrader_format_db_url(course_id: str) -> str: """ @@ -35,6 +43,10 @@ def nbgrader_format_db_url(course_id: str) -> str: """ course_id = LTIUtils().normalize_string(course_id) database_name = f"{org_name}_{course_id}" + if aws_secret_arn != "" or aws_secret_arn is not None: + logger.info(f'secrets manager db secret : {secretmanager.db_secret}') + logger.info(f'secrets manager rds connection : {secretmanager.rds_connection(database_name)}') + return secretmanager.rds_connection(database_name) return f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:{nbgrader_db_port}/{database_name}" @@ -137,4 +149,4 @@ def register_assignment(self, assignment_name: str, **kwargs: dict) -> Assignmen logger.debug("Added assignment %s to gradebook" % assignment_name) except InvalidEntry as e: logger.debug("Error ocurred by adding assignment to gradebook: %s" % e) - return assignment + return assignment \ No newline at end of file diff --git a/src/illumidesk/illumidesk/lti13/handlers.py b/src/illumidesk/illumidesk/lti13/handlers.py index 1fb292fc..63380529 100644 --- a/src/illumidesk/illumidesk/lti13/handlers.py +++ b/src/illumidesk/illumidesk/lti13/handlers.py @@ -199,4 +199,4 @@ async def get(self): files=link_item_files, action_url=auth_state["launch_return_url"], ) - self.finish(html) + self.finish(html) \ No newline at end of file diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 3d222b0b..d6008912 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -37,7 +37,7 @@ jupyter-core==4.7.1 # via jupyter-client, nbconvert, nbformat, nbgrader, n jupyter-telemetry==0.1.0 # via jupyterhub jupyter==1.0.0 # via nbgrader jupyterhub-kubespawner==0.14.1 # via illumidesk (setup.py) -git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5 # via illumidesk (setup.py) +jupyterhub-ltiauthenticator==1.3.0 # via illumidesk (setup.py) jupyterhub==1.4.1 # via jupyterhub-kubespawner, jupyterhub-ltiauthenticator, oauthenticator jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) @@ -102,6 +102,7 @@ wcwidth==0.2.5 # via prompt-toolkit webencodings==0.5.1 # via bleach websocket-client==0.59.0 # via kubernetes widgetsnbextension==3.5.1 # via ipywidgets +secretsmanager-illumidesk==0.0.3 # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/src/illumidesk/setup.py b/src/illumidesk/setup.py index b0cd6319..81731e34 100644 --- a/src/illumidesk/setup.py +++ b/src/illumidesk/setup.py @@ -38,8 +38,9 @@ install_requires=[ "josepy==1.4.0", "jupyterhub-kubespawner==0.14.1", - "jupyterhub-ltiauthenticator@git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5", + "jupyterhub-ltiauthenticator==1.3.0", "jwcrypto==0.8", + "secretsmanager-illumidesk==0.0.3", "nbgrader==0.6.2", "oauthlib==3.1", "oauthenticator>=0.13.0", From e1fdbb5d2c4ae3b41f65666a8f4662aa4467453e Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Tue, 12 Apr 2022 21:46:20 +0530 Subject: [PATCH 32/58] fix role addition issue --- .../illumidesk/apis/nbgrader_service.py | 5 +++-- .../illumidesk/authenticators/authenticator.py | 17 ++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/illumidesk/illumidesk/apis/nbgrader_service.py b/src/illumidesk/illumidesk/apis/nbgrader_service.py index 23b71b52..162b2500 100644 --- a/src/illumidesk/illumidesk/apis/nbgrader_service.py +++ b/src/illumidesk/illumidesk/apis/nbgrader_service.py @@ -61,7 +61,7 @@ def __init__(self, course_id: str): self.db_url = nbgrader_format_db_url() - def add_user_to_nbgrader_gradebook(self, email: str, external_user_id: str, source: str, source_type: str, role: str) -> None: + def add_user_to_nbgrader_gradebook(self, email: str, external_user_id: str, source: str, source_type: str, role_name: str = None) -> None: """ Adds a user to the nbgrader gradebook database for the course. @@ -70,6 +70,7 @@ def add_user_to_nbgrader_gradebook(self, email: str, external_user_id: str, sour external_user_id: The user's id on the external system source: source from where user was authenticated source_type: source_type + role_name: role of the user Raises: InvalidEntry: when there was an error adding the user to the database """ @@ -80,7 +81,7 @@ def add_user_to_nbgrader_gradebook(self, email: str, external_user_id: str, sour with Gradebook(self.db_url, course_id=self.course_id, campus_id=CAMPUS_ID) as gb: try: - user = gb.update_or_create_user_by_email(email, role=role, external_user_id=external_user_id, source=source, source_type=source_type) + user = gb.update_or_create_user_by_email(email, role_name=role_name, external_user_id=external_user_id, source=source, source_type=source_type) logger.debug( "Added user %s with external_user_id %s to gradebook" % (email, external_user_id) diff --git a/src/illumidesk/illumidesk/authenticators/authenticator.py b/src/illumidesk/illumidesk/authenticators/authenticator.py index 01dd0a1d..91c418a1 100644 --- a/src/illumidesk/illumidesk/authenticators/authenticator.py +++ b/src/illumidesk/illumidesk/authenticators/authenticator.py @@ -66,7 +66,7 @@ async def setup_course_hook_lti11( course_id = lti_utils.normalize_string( authentication["auth_state"]["context_label"] ) - nb_service = NbGraderServiceHelper(course_id, True) + nb_service = NbGraderServiceHelper(course_id) # register the user (it doesn't matter if it is a student or instructor) with her/his lms_user_id in nbgrader role = "STUDENT" @@ -130,7 +130,7 @@ async def setup_course_hook( # normalize the name and course_id strings in authentication dictionary course_id = lti_utils.normalize_string(authentication["auth_state"]["course_id"]) - nb_service = NbGraderServiceHelper(course_id, True) + nb_service = NbGraderServiceHelper(course_id) lms_user_id = authentication["auth_state"]["lms_user_id"] email = authentication["auth_state"]["email"] user_role = authentication["auth_state"]["user_role"] @@ -192,13 +192,16 @@ async def setup_user_hook_auth0( Returns: authentication (Required): updated authentication object """ - lti_utils = LTIUtils() # normalize the name and course_id strings in authentication dictionary - course_id = lti_utils.normalize_string(authentication["auth_state"]["course_id"]) - nb_service = NbGraderServiceHelper(course_id, True) + nb_service = NbGraderServiceHelper("dummy") oauth_user = authentication["auth_state"]["oauth_user"] or {} - + + logger.info( + "Auth0 authentication: %s", + (authentication,), + ) + lms_user_id = oauth_user.get("user_id") or oauth_user.get("username") or oauth_user.get("sub") email = oauth_user.get("email") or oauth_user.get("sub") # user_role = authentication["auth_state"]["user_role"] @@ -384,7 +387,7 @@ async def process_resource_link_lti_13( "https://purl.imsglobal.org/spec/lti/claim/resource_link" ] resource_link_title = resource_link["title"] or "" - nbgrader_service = NbGraderServiceHelper(course_id, True) + nbgrader_service = NbGraderServiceHelper(course_id) if resource_link_title: assignment_name = LTIUtils().normalize_string(resource_link_title) logger.debug( From 98d951e28b9904b82d6805b7b9ca49b8ea8032d1 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 15:04:59 -0400 Subject: [PATCH 33/58] update markup safe --- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 886ee8f1..2aa6cc2c 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.2 +jinja2==3.0.0 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 132d91a3..728b41a4 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,11 +30,11 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.0.3 +jinja2==3.0.0 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) -markupsafe==2.1.1 +markupsafe==2.0.0 # via jinja2 oauthlib==3.1.0 # via requests-oauthlib From 29cb56243b3e69925bc4412094533cc3e0c6392b Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 15:07:43 -0400 Subject: [PATCH 34/58] update jinja2 version --- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 2aa6cc2c..48dfd9ba 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.0 +jinja2<3.1.0 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 728b41a4..b1d15cd7 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.0.0 +jinja2<3.1.0 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 54f3e45c..30d1c13c 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2<3.1.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From fb09de66a4e24c88d832c7bdc00edc899f0b45ab Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 15:13:55 -0400 Subject: [PATCH 35/58] updated flask to version 2.1.0 --- src/graderservice/requirements.txt | 2 +- src/graderservice/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index b1d15cd7..63e30678 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -16,7 +16,7 @@ click==8.0.0 # via flask flask-sqlalchemy==2.5.1 # via graderservice (src/graderservice/setup.py) -flask==1.1.2 +flask==2.1.0 # via # flask-sqlalchemy # graderservice (src/graderservice/setup.py) diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 61c30550..90a6d184 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -34,7 +34,7 @@ license="Apache 2.0", packages=find_packages(exclude="./tests"), install_requires=[ - "flask==1.1.2", + "flask==2.1.0", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", "kubernetes==12.0.1", From 0405223565b730a7ee43c5a6cb18e7657783ba94 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 15:29:58 -0400 Subject: [PATCH 36/58] updated jinja2 --- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 48dfd9ba..8a679175 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2<3.1.0 +jinja2==3.1.1 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 63e30678..77c48285 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2<3.1.0 +jinja2==3.1.1 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 30d1c13c..22d1f2c7 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2<3.1.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==3.1.1 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From e2fb9a7485573213f1abe0d5c71298c4ac2351b8 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 15:46:13 -0400 Subject: [PATCH 37/58] update jinja2 for async_nbgrader --- src/async_nbgrader/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/async_nbgrader/requirements.txt b/src/async_nbgrader/requirements.txt index ecf975e2..a5b0332c 100644 --- a/src/async_nbgrader/requirements.txt +++ b/src/async_nbgrader/requirements.txt @@ -1 +1 @@ --e . \ No newline at end of file +jinja2>=2.10,<3.1.0 \ No newline at end of file From 92db213387a930a123979c2bef562ce1067049ab Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 15:53:29 -0400 Subject: [PATCH 38/58] updated jinja2 to semver 2.10>=jinja2<3.1.0 --- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 8a679175..e9123ee6 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.1.1 +jinja2>=2.10,<3.1.0 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 77c48285..dff6abe8 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.1.1 +jinja2>=2.10,<3.1.0 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 22d1f2c7..5255ab37 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.1.1 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2>=2.10,<3.1.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From 56d5cbbe7b19b37908f41db3a5fc49d124740d90 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:00:42 -0400 Subject: [PATCH 39/58] updated nbconvert version --- src/async_nbgrader/requirements.txt | 2 +- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 4 ++-- src/graderservice/setup.py | 2 +- src/illumidesk/requirements.txt | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/async_nbgrader/requirements.txt b/src/async_nbgrader/requirements.txt index a5b0332c..ecf975e2 100644 --- a/src/async_nbgrader/requirements.txt +++ b/src/async_nbgrader/requirements.txt @@ -1 +1 @@ -jinja2>=2.10,<3.1.0 \ No newline at end of file +-e . \ No newline at end of file diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index e9123ee6..92f8423c 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -98,7 +98,7 @@ matplotlib-inline==0.1.3 # ipython mistune==0.8.4 # via nbconvert -nbconvert==5.6.1 +nbconvert==6.5.0 # via # jupyter # nbgrader diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index dff6abe8..728b41a4 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -16,7 +16,7 @@ click==8.0.0 # via flask flask-sqlalchemy==2.5.1 # via graderservice (src/graderservice/setup.py) -flask==2.1.0 +flask==1.1.2 # via # flask-sqlalchemy # graderservice (src/graderservice/setup.py) @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2>=2.10,<3.1.0 +jinja2==3.0.0 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 90a6d184..61c30550 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -34,7 +34,7 @@ license="Apache 2.0", packages=find_packages(exclude="./tests"), install_requires=[ - "flask==2.1.0", + "flask==1.1.2", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", "kubernetes==12.0.1", diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 5255ab37..b1513efc 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2>=2.10,<3.1.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==3.0.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole @@ -46,7 +46,7 @@ mako==1.1.4 # via alembic markupsafe==2.0.0 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert -nbconvert==5.6.1 # via jupyter, nbgrader, notebook +nbconvert==6.5.0 # via jupyter, nbgrader, notebook nbformat==5.1.3 # via ipywidgets, nbconvert, nbgrader, notebook nbgrader==0.6.2 # via illumidesk (setup.py) notebook==6.4.1 # via jupyter, nbgrader, widgetsnbextension From 9e6533ab92290279ebe21660fd031673b5dc1ef1 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:05:30 -0400 Subject: [PATCH 40/58] jinja2 version downgrade to 3.1.0 --- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 728b41a4..b1d15cd7 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.0.0 +jinja2<3.1.0 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index b1513efc..6e8fd0d4 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2<3.1.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From 7ba436aea3433251d8fe4f4364b5d5b4f527be74 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:09:29 -0400 Subject: [PATCH 41/58] updated flask to 2.1.0 --- src/graderservice/requirements.txt | 2 +- src/graderservice/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index b1d15cd7..e9208166 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -16,7 +16,7 @@ click==8.0.0 # via flask flask-sqlalchemy==2.5.1 # via graderservice (src/graderservice/setup.py) -flask==1.1.2 +Flask==2.1.0 # via # flask-sqlalchemy # graderservice (src/graderservice/setup.py) diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 61c30550..142396be 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -34,7 +34,7 @@ license="Apache 2.0", packages=find_packages(exclude="./tests"), install_requires=[ - "flask==1.1.2", + "Flask==2.1.0", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", "kubernetes==12.0.1", From 13d4ad20e6ac1c9a189c278bc23c89ce09ef8cd5 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:14:34 -0400 Subject: [PATCH 42/58] revert nbconvert --- src/formgradernext/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 92f8423c..525b7597 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -98,7 +98,7 @@ matplotlib-inline==0.1.3 # ipython mistune==0.8.4 # via nbconvert -nbconvert==6.5.0 +nbconvert==5.6.0 # via # jupyter # nbgrader diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 6e8fd0d4..301a338c 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -46,7 +46,7 @@ mako==1.1.4 # via alembic markupsafe==2.0.0 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert -nbconvert==6.5.0 # via jupyter, nbgrader, notebook +nbconvert==5.6.0 # via jupyter, nbgrader, notebook nbformat==5.1.3 # via ipywidgets, nbconvert, nbgrader, notebook nbgrader==0.6.2 # via illumidesk (setup.py) notebook==6.4.1 # via jupyter, nbgrader, widgetsnbextension From c365961e9146a8893c63ff17468a84f04e83381c Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:20:30 -0400 Subject: [PATCH 43/58] update werkzeug --- src/graderservice/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index e9208166..9cdcdd5a 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -70,7 +70,7 @@ urllib3==1.26.5 # requests websocket-client==0.59.0 # via kubernetes -werkzeug==2.0.0 +werkzeug==2.1.1 # via flask secretsmanager-illumidesk==0.0.2 From a4691eac50d1ef5d5b792c02d469680b817d5804 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:25:15 -0400 Subject: [PATCH 44/58] update jinja2 to the latest version --- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 525b7597..bb0aadde 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2>=2.10,<3.1.0 +jinja2==3.1.1 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 9cdcdd5a..12b9f6ac 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2<3.1.0 +jinja2==3.1.1 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 301a338c..24dc3f45 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2<3.1.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==3.1.1 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From a533e5622648c426f289412938bb5ce3cb7e4118 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:30:33 -0400 Subject: [PATCH 45/58] jinja 3.1 --- src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index bb0aadde..a104c0ba 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.1.1 +jinja2<3.1 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 12b9f6ac..4c060dc1 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.1.1 +jinja2<3.1 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 24dc3f45..ffb8ca71 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.1.1 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2<3.1 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From 08463b349d9d22f2a86247c64da9c51b2df19b05 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:36:42 -0400 Subject: [PATCH 46/58] nbconvert version 6.4.3 --- src/formgradernext/requirements.txt | 2 +- src/illumidesk/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index a104c0ba..9ba94178 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -98,7 +98,7 @@ matplotlib-inline==0.1.3 # ipython mistune==0.8.4 # via nbconvert -nbconvert==5.6.0 +nbconvert==6.4.3 # via # jupyter # nbgrader diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index ffb8ca71..62010265 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -46,7 +46,7 @@ mako==1.1.4 # via alembic markupsafe==2.0.0 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert -nbconvert==5.6.0 # via jupyter, nbgrader, notebook +nbconvert==6.4.3 # via jupyter, nbgrader, notebook nbformat==5.1.3 # via ipywidgets, nbconvert, nbgrader, notebook nbgrader==0.6.2 # via illumidesk (setup.py) notebook==6.4.1 # via jupyter, nbgrader, widgetsnbextension From 9da1fb636782d42eb0593d48288ecce6c85d0ca4 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:44:19 -0400 Subject: [PATCH 47/58] reverted requirements txt --- src/formgradernext/requirements.txt | 8 ++++---- src/graderservice/requirements.txt | 9 ++++----- src/graderservice/setup.py | 2 +- src/illumidesk/requirements.txt | 8 ++++---- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 9ba94178..9f976d8d 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2<3.1 +jinja2==3.0.2 # via # nbconvert # notebook @@ -89,6 +89,7 @@ jupyterlab-widgets==1.0.2 # via ipywidgets mako==1.1.5 # via alembic +markupsafe==2.0.1 # via # jinja2 # mako @@ -98,7 +99,7 @@ matplotlib-inline==0.1.3 # ipython mistune==0.8.4 # via nbconvert -nbconvert==6.4.3 +nbconvert==5.6.1 # via # jupyter # nbgrader @@ -211,7 +212,6 @@ webencodings==0.5.1 # via bleach widgetsnbextension==3.5.2 # via ipywidgets -secretsmanager-illumidesk==0.0.2 # The following packages are considered to be unsafe in a requirements file: -# setuptools +# setuptools \ No newline at end of file diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 4c060dc1..b7ded396 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -16,7 +16,7 @@ click==8.0.0 # via flask flask-sqlalchemy==2.5.1 # via graderservice (src/graderservice/setup.py) -Flask==2.1.0 +flask==1.1.2 # via # flask-sqlalchemy # graderservice (src/graderservice/setup.py) @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2<3.1 +jinja2==3.0.0 # via flask kubernetes==12.0.1 # via graderservice (src/graderservice/setup.py) @@ -70,9 +70,8 @@ urllib3==1.26.5 # requests websocket-client==0.59.0 # via kubernetes -werkzeug==2.1.1 +werkzeug==2.0.0 # via flask -secretsmanager-illumidesk==0.0.2 # The following packages are considered to be unsafe in a requirements file: -# setuptools +# setuptools \ No newline at end of file diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 142396be..61c30550 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -34,7 +34,7 @@ license="Apache 2.0", packages=find_packages(exclude="./tests"), install_requires=[ - "Flask==2.1.0", + "flask==1.1.2", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", "kubernetes==12.0.1", diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 62010265..a062d837 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2<3.1 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==3.0.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole @@ -37,7 +37,7 @@ jupyter-core==4.7.1 # via jupyter-client, nbconvert, nbformat, nbgrader, n jupyter-telemetry==0.1.0 # via jupyterhub jupyter==1.0.0 # via nbgrader jupyterhub-kubespawner==0.14.1 # via illumidesk (setup.py) -jupyterhub-ltiauthenticator==1.3.0 # via illumidesk (setup.py) +git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5 # via illumidesk (setup.py) jupyterhub==1.4.1 # via jupyterhub-kubespawner, jupyterhub-ltiauthenticator, oauthenticator jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) @@ -46,7 +46,7 @@ mako==1.1.4 # via alembic markupsafe==2.0.0 # via jinja2, mako matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert -nbconvert==6.4.3 # via jupyter, nbgrader, notebook +nbconvert==5.6.1 # via jupyter, nbgrader, notebook nbformat==5.1.3 # via ipywidgets, nbconvert, nbgrader, notebook nbgrader==0.6.2 # via illumidesk (setup.py) notebook==6.4.1 # via jupyter, nbgrader, widgetsnbextension @@ -104,4 +104,4 @@ websocket-client==0.59.0 # via kubernetes widgetsnbextension==3.5.1 # via ipywidgets # The following packages are considered to be unsafe in a requirements file: -# setuptools +# setuptools \ No newline at end of file From 7c53d069cdcceb3ca466f31dc1b5f17994aa4c21 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 16:57:29 -0400 Subject: [PATCH 48/58] updates ltiauthenticator to use pypi version --- src/illumidesk/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index a062d837..d51a232c 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -37,7 +37,7 @@ jupyter-core==4.7.1 # via jupyter-client, nbconvert, nbformat, nbgrader, n jupyter-telemetry==0.1.0 # via jupyterhub jupyter==1.0.0 # via nbgrader jupyterhub-kubespawner==0.14.1 # via illumidesk (setup.py) -git+git://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5 # via illumidesk (setup.py) +jupyterhub-ltiauthenticator==1.3.0 # via illumidesk (setup.py) jupyterhub==1.4.1 # via jupyterhub-kubespawner, jupyterhub-ltiauthenticator, oauthenticator jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) From 83856ec8cafdda7ea9c5f07e9d778e31e0bbc59e Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 17:00:59 -0400 Subject: [PATCH 49/58] matched kubernetes version --- src/graderservice/requirements.txt | 2 +- src/graderservice/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index b7ded396..497e720a 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -32,7 +32,7 @@ itsdangerous==2.0.0 # via flask jinja2==3.0.0 # via flask -kubernetes==12.0.1 +kubernetes==17.17.0 # via graderservice (src/graderservice/setup.py) markupsafe==2.0.0 # via jinja2 diff --git a/src/graderservice/setup.py b/src/graderservice/setup.py index 61c30550..174156cf 100644 --- a/src/graderservice/setup.py +++ b/src/graderservice/setup.py @@ -37,7 +37,7 @@ "flask==1.1.2", "flask-sqlalchemy==2.5.1", "gunicorn==20.0.4", - "kubernetes==12.0.1", + "kubernetes==17.17.0", ], # noqa: E231 package_data={ "": ["*.html"], From b336d3f91084b805ed9bbd3070f6ac0e59859c25 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Tue, 12 Apr 2022 19:28:35 -0400 Subject: [PATCH 50/58] update requirements.txt --- src/async_nbgrader/dev-requirements.txt | 1 + src/formgradernext/requirements.txt | 2 +- src/graderservice/requirements.txt | 4 ++-- src/illumidesk/requirements.txt | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/async_nbgrader/dev-requirements.txt b/src/async_nbgrader/dev-requirements.txt index 220e1565..b7d8c8f1 100644 --- a/src/async_nbgrader/dev-requirements.txt +++ b/src/async_nbgrader/dev-requirements.txt @@ -16,3 +16,4 @@ sphinx-autodoc-typehints nbval requests-mock wheel + diff --git a/src/formgradernext/requirements.txt b/src/formgradernext/requirements.txt index 9f976d8d..c4800b53 100644 --- a/src/formgradernext/requirements.txt +++ b/src/formgradernext/requirements.txt @@ -58,7 +58,7 @@ ipywidgets==7.6.5 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.2 +jinja2==3.0.3 # via # nbconvert # notebook diff --git a/src/graderservice/requirements.txt b/src/graderservice/requirements.txt index 497e720a..8991050e 100644 --- a/src/graderservice/requirements.txt +++ b/src/graderservice/requirements.txt @@ -30,7 +30,7 @@ idna==2.10 # via requests itsdangerous==2.0.0 # via flask -jinja2==3.0.0 +jinja2==3.0.3 # via flask kubernetes==17.17.0 # via graderservice (src/graderservice/setup.py) @@ -70,7 +70,7 @@ urllib3==1.26.5 # requests websocket-client==0.59.0 # via kubernetes -werkzeug==2.0.0 +werkzeug==2.0.2 # via flask # The following packages are considered to be unsafe in a requirements file: diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index d51a232c..130ef88f 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -28,7 +28,7 @@ ipython-genutils==0.2.0 # via nbformat, notebook, qtconsole, traitlets ipython==7.23.1 # via ipykernel, ipywidgets, jupyter-console ipywidgets==7.6.3 # via jupyter jedi==0.18.0 # via ipython -jinja2==3.0.0 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook +jinja2==3.0.3 # via jupyterhub, jupyterhub-kubespawner, nbconvert, notebook josepy==1.4.0 # via illumidesk (setup.py) jsonschema==3.2.0 # via jupyter-telemetry, nbformat, nbgrader jupyter-client==6.1.12 # via ipykernel, jupyter-console, nbgrader, notebook, qtconsole From a39211ca7332dab5b78108f12d55d6006cccafaa Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Thu, 14 Apr 2022 19:46:02 +0530 Subject: [PATCH 51/58] fix build --- .github/workflows/docker.yml | 7 ++++++- Makefile | 2 +- .../illumidesk/authenticators/authenticator.py | 6 +++++- .../illumidesk/apis/test_nbgrader_service_helper.py | 10 +++++----- src/illumidesk/tests/illumidesk/conftest.py | 1 - 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index db975d44..eadbacfd 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -47,8 +47,13 @@ jobs: run: | make -C main dev + - name: Copy SSH private key + env: + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + run: echo $SSH_PRIVATE_KEY | base64 --decode > ./ssh_pvt_key + - name: Build Kubernetes JupyterHub Image - run: make -C main build-hubs-k8 + run: make -C main build-hubs-k8 SSH_PRIVATE_KEY=$(cat ./ssh_pvt_key) env: # Full logs for CI build BUILDKIT_PROGRESS: plain diff --git a/Makefile b/Makefile index ded1ef62..957719fa 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ build-grader-setup-service: ## build grader-setup-service docker image build-hubs-k8: ## build jupyterhub images kubernetes setups @docker build --build-arg BASE_IMAGE=${JUPYTERHUB_K8_BASE_IMAGE}:${JUPYTERHUB_K8_BASE_TAG} -t ${OWNER}/k8s-hub:base-${JUPYTERHUB_K8_BASE_TAG} src/illumidesk/. --no-cache - @docker build --build-arg BASE_IMAGE=${OWNER}/k8s-hub:base-${JUPYTERHUB_K8_BASE_TAG} -t ${OWNER}/k8s-hub:${JUPYTERHUB_K8_BASE_TAG} src/illumideskdummyauthenticator/. --no-cache + @docker build --build-arg BASE_IMAGE=${OWNER}/k8s-hub:base-${JUPYTERHUB_K8_BASE_TAG} --build-arg SSH_PRIVATE_KEY="$(SSH_PRIVATE_KEY)" -t ${OWNER}/k8s-hub:${JUPYTERHUB_K8_BASE_TAG} src/illumideskdummyauthenticator/. --no-cache build-hubs: ## build jupyterhub images for standard docker-compose and docker run setups @docker build --build-arg BASE_IMAGE=${JUPYTERHUB_DOCKER_BASE_IMAGE} -t ${OWNER}/jupyterhub:base-${JUPYTERHUB_DOCKER_BASE_TAG} src/illumidesk/. --no-cache diff --git a/src/illumidesk/illumidesk/authenticators/authenticator.py b/src/illumidesk/illumidesk/authenticators/authenticator.py index 91c418a1..9d64db24 100644 --- a/src/illumidesk/illumidesk/authenticators/authenticator.py +++ b/src/illumidesk/illumidesk/authenticators/authenticator.py @@ -62,17 +62,21 @@ async def setup_course_hook_lti11( # normalize the name and course_id strings in authentication dictionary name = authentication["name"] lms_user_id = authentication["auth_state"]["user_id"] + email = authentication["auth_state"]["email"] or lms_user_id user_role = authentication["auth_state"]["roles"].split(",")[0] course_id = lti_utils.normalize_string( authentication["auth_state"]["context_label"] ) + + source = authentication["auth_state"]["source"] or "lti" + source_type = authentication["auth_state"]["source_type"] or "lti11" nb_service = NbGraderServiceHelper(course_id) # register the user (it doesn't matter if it is a student or instructor) with her/his lms_user_id in nbgrader role = "STUDENT" if not user_is_a_student(user_role) and user_is_an_instructor(user_role): role = "INSTRUCTOR" - nb_service.add_user_to_nbgrader_gradebook(name, lms_user_id, role) + nb_service.add_user_to_nbgrader_gradebook(email, lms_user_id, source, source_type, role) # TODO: verify the logic to simplify groups creation and membership if role == "STUDENT": try: diff --git a/src/illumidesk/tests/illumidesk/apis/test_nbgrader_service_helper.py b/src/illumidesk/tests/illumidesk/apis/test_nbgrader_service_helper.py index 16fac5f4..1f82c6e5 100644 --- a/src/illumidesk/tests/illumidesk/apis/test_nbgrader_service_helper.py +++ b/src/illumidesk/tests/illumidesk/apis/test_nbgrader_service_helper.py @@ -37,10 +37,10 @@ def test_add_user_to_nbgrader_gradebook_raises_error_when_empty( Does add_user_to_nbgrader_gradebook method accept an empty username, or lms user id? """ with pytest.raises(ValueError): - self.sut.add_user_to_nbgrader_gradebook(username="", lms_user_id="abc123") + self.sut.add_user_to_nbgrader_gradebook(email="", external_user_id="abc123", source="test", source_type="test") with pytest.raises(ValueError): - self.sut.add_user_to_nbgrader_gradebook(username="user1", lms_user_id="") + self.sut.add_user_to_nbgrader_gradebook(email="user1", external_user_id="", source="test", source_type="test") class TestNbGraderServiceHelper: @@ -56,9 +56,9 @@ def test_nbgrader_format_db_url_method_uses_env_vars_to_get_db_url( monkeypatch.setattr( "illumidesk.apis.nbgrader_service.nbgrader_db_user", "test_user" ) - monkeypatch.setattr("illumidesk.apis.nbgrader_service.org_name", "org-dummy") + monkeypatch.setattr("illumidesk.apis.nbgrader_service.nbgrader_db_name", "dummy_database") assert ( - nbgrader_format_db_url("Course 1") - == "postgresql://test_user:test_pwd@test_host:5432/org-dummy_course1" + nbgrader_format_db_url() + == "postgresql://test_user:test_pwd@test_host:5432/dummy_database" ) diff --git a/src/illumidesk/tests/illumidesk/conftest.py b/src/illumidesk/tests/illumidesk/conftest.py index c6348176..790a23b7 100644 --- a/src/illumidesk/tests/illumidesk/conftest.py +++ b/src/illumidesk/tests/illumidesk/conftest.py @@ -63,7 +63,6 @@ def mock_nbhelper(): "illumidesk.apis.nbgrader_service.NbGraderServiceHelper", # __init__=lambda x, y: None, update_course=Mock(return_value=None), - create_database_if_not_exists=Mock(), add_user_to_nbgrader_gradebook=Mock(return_value=None), register_assignment=Mock(return_value=None), get_course=Mock( From 819dbb763e1eca1cf515b5ecab94bc17e710d350 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Thu, 14 Apr 2022 16:50:45 -0400 Subject: [PATCH 52/58] updated graderservice.py --- src/graderservice/graderservice/graderservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index 620d90d1..9b9624aa 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -367,7 +367,7 @@ def restart_deployment(self, deployment, namespace): now = str(now.isoformat("T") + "Z") body = { 'spec': { - 'template':{ + 'template': { 'metadata': { 'annotations': { 'kubectl.kubernetes.io/restartedAt': now From 839a1a8f24cabb8232bb4d83f4f31ff0cb89ca08 Mon Sep 17 00:00:00 2001 From: Abhilash Nair Date: Thu, 14 Apr 2022 18:09:22 -0400 Subject: [PATCH 53/58] tests for secrets and rollow restart route --- src/graderservice/graderservice/routes.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/graderservice/graderservice/routes.py b/src/graderservice/graderservice/routes.py index 9721b019..4a9fc3cc 100644 --- a/src/graderservice/graderservice/routes.py +++ b/src/graderservice/graderservice/routes.py @@ -220,8 +220,6 @@ def restart_grader(org_name: str, course_id: str): message=f"{restart_deployment_status[0]}" ), restart_deployment_status[1] - - @grader_setup_bp.route("/healthcheck") def healthcheck(): From 17ea6c31cb3185cc2c14522056616c80d1856030 Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Wed, 20 Apr 2022 19:30:07 +0530 Subject: [PATCH 54/58] add default course hook for auth0 --- .../authenticators/authenticator.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/illumidesk/illumidesk/authenticators/authenticator.py b/src/illumidesk/illumidesk/authenticators/authenticator.py index 9d64db24..4f8a7934 100644 --- a/src/illumidesk/illumidesk/authenticators/authenticator.py +++ b/src/illumidesk/illumidesk/authenticators/authenticator.py @@ -173,6 +173,31 @@ async def setup_course_hook( return authentication +async def setup_default_course_hook( + authenticator: Authenticator, + handler: RequestHandler, + authentication: Dict[str, str], +) -> Dict[str, str]: + """ + Args: + authenticator: the JupyterHub Authenticator object + handler: the JupyterHub handler object + authentication: the authentication object returned by the + authenticator class + + Returns: + authentication (Required): updated authentication object + """ + + # launch the new grader-notebook as a service + try: + _ = await register_new_service(org_name=ORG_NAME, course_id="default_course") + except Exception as e: + logger.error("Unable to launch the shared grader notebook with exception %s", e) + + return authentication + + async def setup_user_hook_auth0( authenticator: Authenticator, handler: RequestHandler, From 9fbb70e4dcba900b20989d24d82930d190123136 Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Wed, 20 Apr 2022 21:30:14 +0530 Subject: [PATCH 55/58] fix requirements --- .../authenticators/authenticator.py | 31 ++++--------------- src/illumidesk/requirements.txt | 6 ++-- src/illumidesk/setup.py | 2 +- 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/src/illumidesk/illumidesk/authenticators/authenticator.py b/src/illumidesk/illumidesk/authenticators/authenticator.py index 4f8a7934..894b24be 100644 --- a/src/illumidesk/illumidesk/authenticators/authenticator.py +++ b/src/illumidesk/illumidesk/authenticators/authenticator.py @@ -173,31 +173,6 @@ async def setup_course_hook( return authentication -async def setup_default_course_hook( - authenticator: Authenticator, - handler: RequestHandler, - authentication: Dict[str, str], -) -> Dict[str, str]: - """ - Args: - authenticator: the JupyterHub Authenticator object - handler: the JupyterHub handler object - authentication: the authentication object returned by the - authenticator class - - Returns: - authentication (Required): updated authentication object - """ - - # launch the new grader-notebook as a service - try: - _ = await register_new_service(org_name=ORG_NAME, course_id="default_course") - except Exception as e: - logger.error("Unable to launch the shared grader notebook with exception %s", e) - - return authentication - - async def setup_user_hook_auth0( authenticator: Authenticator, handler: RequestHandler, @@ -240,6 +215,12 @@ async def setup_user_hook_auth0( # register the user (it doesn't matter if it is a student or instructor) with her/his lms_user_id in nbgrader user = nb_service.add_user_to_nbgrader_gradebook(email, lms_user_id, source, source_type) authentication["name"] = user["id"] + # launch the new grader-notebook as a service + try: + _ = await register_new_service(org_name=ORG_NAME, course_id="default_course") + except Exception as e: + logger.error("Unable to launch the shared grader notebook with exception %s", e) + return authentication diff --git a/src/illumidesk/requirements.txt b/src/illumidesk/requirements.txt index 0c7abcf7..4492fac9 100644 --- a/src/illumidesk/requirements.txt +++ b/src/illumidesk/requirements.txt @@ -37,7 +37,7 @@ jupyter-core==4.7.1 # via jupyter-client, nbconvert, nbformat, nbgrader, n jupyter-telemetry==0.1.0 # via jupyterhub jupyter==1.0.0 # via nbgrader jupyterhub-kubespawner==0.14.1 # via illumidesk (setup.py) -jupyterhub-ltiauthenticator==1.3.0 # via illumidesk (setup.py) +git+https://github.com/jupyterhub/ltiauthenticator.git@71d86a9da2562df4bdcc9f374af834a172ac52d5 # via illumidesk (setup.py) jupyterhub==1.4.1 # via jupyterhub-kubespawner, jupyterhub-ltiauthenticator, oauthenticator jupyterlab-widgets==1.0.0 # via ipywidgets jwcrypto==0.8 # via illumidesk (setup.py) @@ -48,7 +48,7 @@ matplotlib-inline==0.1.2 # via ipython mistune==0.8.4 # via nbconvert nbconvert==5.6.1 # via jupyter, nbgrader, notebook nbformat==5.1.3 # via ipywidgets, nbconvert, nbgrader, notebook -nbgrader==0.6.2 +git+ssh://git@github.com/IllumiDesk/illumidesk-next.git@feature/refactor-modals-lti#subdirectory=packages/nbgrader # via illumidesk (setup.py) notebook==6.4.1 # via jupyter, nbgrader, widgetsnbextension oauthenticator==14.2.0 # via illumidesk (setup.py) oauthlib==3.1.0 # via illumidesk (setup.py), jupyterhub, jupyterhub-ltiauthenticator, requests-oauthlib @@ -105,4 +105,4 @@ widgetsnbextension==3.5.1 # via ipywidgets secretsmanager-illumidesk==0.0.3 # The following packages are considered to be unsafe in a requirements file: -# setuptools \ No newline at end of file +# setuptools diff --git a/src/illumidesk/setup.py b/src/illumidesk/setup.py index 81731e34..58aececa 100644 --- a/src/illumidesk/setup.py +++ b/src/illumidesk/setup.py @@ -41,7 +41,7 @@ "jupyterhub-ltiauthenticator==1.3.0", "jwcrypto==0.8", "secretsmanager-illumidesk==0.0.3", - "nbgrader==0.6.2", + "nbgrader @ git+ssh://git@github.com/IllumiDesk/illumidesk-next.git@feature/refactor-modals-lti#subdirectory=packages/nbgrader&egg=nbgrader" "oauthlib==3.1", "oauthenticator>=0.13.0", "pem==20.1.0", From 1351cc1c14d0343dd1943198ae77855f86da1a28 Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Thu, 21 Apr 2022 19:35:05 +0530 Subject: [PATCH 56/58] update default course name --- src/illumidesk/illumidesk/authenticators/authenticator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/illumidesk/illumidesk/authenticators/authenticator.py b/src/illumidesk/illumidesk/authenticators/authenticator.py index 894b24be..00261795 100644 --- a/src/illumidesk/illumidesk/authenticators/authenticator.py +++ b/src/illumidesk/illumidesk/authenticators/authenticator.py @@ -217,7 +217,7 @@ async def setup_user_hook_auth0( authentication["name"] = user["id"] # launch the new grader-notebook as a service try: - _ = await register_new_service(org_name=ORG_NAME, course_id="default_course") + _ = await register_new_service(org_name=ORG_NAME, course_id="default-course") except Exception as e: logger.error("Unable to launch the shared grader notebook with exception %s", e) From 6c0ce3fabd237b7f3f1738a830d43c7094ae7d62 Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Fri, 22 Apr 2022 17:09:20 +0530 Subject: [PATCH 57/58] add user to default course --- src/illumidesk/illumidesk/authenticators/authenticator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/illumidesk/illumidesk/authenticators/authenticator.py b/src/illumidesk/illumidesk/authenticators/authenticator.py index 00261795..798020ae 100644 --- a/src/illumidesk/illumidesk/authenticators/authenticator.py +++ b/src/illumidesk/illumidesk/authenticators/authenticator.py @@ -198,7 +198,7 @@ async def setup_user_hook_auth0( """ # normalize the name and course_id strings in authentication dictionary - nb_service = NbGraderServiceHelper("dummy") + nb_service = NbGraderServiceHelper("default-course") oauth_user = authentication["auth_state"]["oauth_user"] or {} logger.info( From 3abcc7f6d11c29fe420c343e6149125568d74640 Mon Sep 17 00:00:00 2001 From: Rupesh Parab Date: Thu, 5 May 2022 21:41:47 +0530 Subject: [PATCH 58/58] deployment fixes --- .../graderservice/graderservice.py | 9 +++++++-- src/illumidesk/Dockerfile | 5 +++++ .../illumidesk/apis/nbgrader_service.py | 20 ++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/graderservice/graderservice/graderservice.py b/src/graderservice/graderservice/graderservice.py index 76e9b8dd..941abd14 100644 --- a/src/graderservice/graderservice/graderservice.py +++ b/src/graderservice/graderservice/graderservice.py @@ -59,7 +59,7 @@ nbgrader_db_password = os.environ.get("POSTGRES_NBGRADER_PASSWORD") nbgrader_db_user = os.environ.get("POSTGRES_NBGRADER_USER") nbgrader_db_port = os.environ.get("POSTGRES_NBGRADER_PORT") -nbgrader_db_name = os.environ.get("POSTGRES_NBGRADER_DB_NAME") +nbgrader_db_name = os.environ.get("POSTGRES_NBGRADER_DATABASE") or "illumidesk" aws_secret_arn = os.environ.get('AWS_SECRET_ARN') region = os.environ.get('AWS_REGION') or 'us-west-2' @@ -187,7 +187,7 @@ def _create_nbgrader_files(self): f"Writing the nbgrader_config.py file at jupyter directory (within the grader home): {grader_nbconfig_path}" ) db_url = '' - if aws_secret_arn != "" or aws_secret_arn is not None: + if aws_secret_arn: db_url = secretmanager.rds_connection(nbgrader_db_name) else: db_url = f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:5432/{nbgrader_db_name}" @@ -281,6 +281,11 @@ def _create_deployment_object(self): client.V1EnvVar(name="NB_GID", value=str(NB_GID)), client.V1EnvVar(name="NB_USER", value=self.grader_name), client.V1EnvVar(name="CAMPUS_ID", value=str(CAMPUS_ID)), + client.V1EnvVar(name="POSTGRES_JUPYTERHUB_HOST", value=str(nbgrader_db_host)), + client.V1EnvVar(name="POSTGRES_JUPYTERHUB_USER", value=str(nbgrader_db_user)), + client.V1EnvVar(name="POSTGRES_JUPYTERHUB_PASSWORD", value=str(nbgrader_db_password)), + client.V1EnvVar(name="POSTGRES_JUPYTERHUB_PORT", value=str(nbgrader_db_port)), + client.V1EnvVar(name="POSTGRES_JUPYTERHUB_DB", value=str(nbgrader_db_name)), ], volume_mounts=[ client.V1VolumeMount( diff --git a/src/illumidesk/Dockerfile b/src/illumidesk/Dockerfile index fe76d08a..d94f7d34 100644 --- a/src/illumidesk/Dockerfile +++ b/src/illumidesk/Dockerfile @@ -54,6 +54,11 @@ RUN wget https://configs.illumidesk.com/images/illumidesk-80.png \ && cp -r /tmp/illumidesk-80.png /usr/local/share/jupyterhub/static/images/illumidesk-80.png \ && chown "${NB_UID}" /srv/jupyterhub/illumidesk-80.png +RUN wget https://raw.githubusercontent.com/jupyterhub/jupyterhub/main/examples/service-announcement/announcement.py \ + && mkdir -p /etc/jupyterhub-services/ \ + && cp -r /tmp/announcement.py /etc/jupyterhub-services/ \ + && chown "${NB_UID}" /etc/jupyterhub-services/ + ENV PATH="/home/${NB_USER}/.local/bin:${PATH}" # ENV PYTHONUNBUFFERED 1 diff --git a/src/illumidesk/illumidesk/apis/nbgrader_service.py b/src/illumidesk/illumidesk/apis/nbgrader_service.py index b707700f..1497d8bf 100644 --- a/src/illumidesk/illumidesk/apis/nbgrader_service.py +++ b/src/illumidesk/illumidesk/apis/nbgrader_service.py @@ -5,6 +5,8 @@ from nbgrader.api import Course from nbgrader.api import Gradebook from nbgrader.api import InvalidEntry +from sqlalchemy_utils import create_database +from sqlalchemy_utils import database_exists from illumidesk.authenticators.utils import LTIUtils from secretsmanager.secretsmanager import SecretsManager @@ -42,12 +44,19 @@ def nbgrader_format_db_url() -> str: Returns the nbgrader database url """ - if aws_secret_arn != "" or aws_secret_arn is not None: + if aws_secret_arn: return secretmanager.rds_connection(nbgrader_db_name) return f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:{nbgrader_db_port}/{nbgrader_db_name}" +def jupyter_format_db_url() -> str: + """ + Returns the jupyter database url with the format: campus-id. + """ + database_name = CAMPUS_ID + return f"postgresql://{nbgrader_db_user}:{nbgrader_db_password}@{nbgrader_db_host}:{nbgrader_db_port}/{database_name}" + class NbGraderServiceHelper: """ @@ -74,6 +83,15 @@ def __init__(self, course_id: str): self.gid = int(os.environ.get("NB_GRADER_GID") or "100") self.db_url = nbgrader_format_db_url() + self.create_jupyterhub_database_if_not_exists() + + def create_jupyterhub_database_if_not_exists(self) -> None: + """Creates a new database if it doesn't exist""" + conn_uri = jupyter_format_db_url() + + if not database_exists(conn_uri): + logger.debug("db not exist, create database") + create_database(conn_uri) def add_user_to_nbgrader_gradebook(self, email: str, external_user_id: str, source: str, source_type: str, role_name: str = None) -> None: """