diff --git a/src/_nebari/stages/kubernetes_services/__init__.py b/src/_nebari/stages/kubernetes_services/__init__.py index bd4dfd759..fdc413bd4 100644 --- a/src/_nebari/stages/kubernetes_services/__init__.py +++ b/src/_nebari/stages/kubernetes_services/__init__.py @@ -218,6 +218,7 @@ class ArgoWorkflows(schema.Base): class JHubApps(schema.Base): enabled: bool = False + overrides: Dict = {} class MonitoringOverrides(schema.Base): @@ -473,6 +474,7 @@ class JupyterhubInputVars(schema.Base): idle_culler_settings: Dict[str, Any] = Field(alias="idle-culler-settings") argo_workflows_enabled: bool = Field(alias="argo-workflows-enabled") jhub_apps_enabled: bool = Field(alias="jhub-apps-enabled") + jhub_apps_overrides: str = Field(alias="jhub-apps-overrides") cloud_provider: str = Field(alias="cloud-provider") jupyterlab_preferred_dir: Optional[str] = Field(alias="jupyterlab-preferred-dir") shared_fs_type: SharedFsEnum @@ -639,6 +641,7 @@ def input_vars(self, stage_outputs: Dict[str, Dict[str, Any]]): idle_culler_settings=self.config.jupyterlab.idle_culler.model_dump(), argo_workflows_enabled=self.config.argo_workflows.enabled, jhub_apps_enabled=self.config.jhub_apps.enabled, + jhub_apps_overrides=json.dumps(self.config.jhub_apps.overrides), initial_repositories=str(self.config.jupyterlab.initial_repositories), jupyterlab_default_settings=self.config.jupyterlab.default_settings, jupyterlab_gallery_settings=self.config.jupyterlab.gallery_settings, diff --git a/src/_nebari/stages/kubernetes_services/template/jupyterhub.tf b/src/_nebari/stages/kubernetes_services/template/jupyterhub.tf index 17b6f1241..121cff4b2 100644 --- a/src/_nebari/stages/kubernetes_services/template/jupyterhub.tf +++ b/src/_nebari/stages/kubernetes_services/template/jupyterhub.tf @@ -180,6 +180,7 @@ module "jupyterhub" { conda-store-service-name = module.kubernetes-conda-store-server.service_name conda-store-jhub-apps-token = module.kubernetes-conda-store-server.service-tokens.jhub-apps jhub-apps-enabled = var.jhub-apps-enabled + jhub-apps-overrides = var.jhub-apps-overrides extra-mounts = { "/etc/dask" = { diff --git a/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/files/jupyterhub/02-spawner.py b/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/files/jupyterhub/02-spawner.py index aa2153dc2..09bb649c0 100644 --- a/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/files/jupyterhub/02-spawner.py +++ b/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/files/jupyterhub/02-spawner.py @@ -1,4 +1,5 @@ import inspect +import json import kubernetes.client.models from tornado import gen @@ -65,6 +66,10 @@ def get_conda_store_environments(user_info: dict): c.JAppsConfig.hub_host = "hub" c.JAppsConfig.service_workers = 4 + jhub_apps_overrides = json.loads(z2jh.get_config("custom.jhub-apps-overrides")) + for config_key, config_value in jhub_apps_overrides.items(): + setattr(c.JAppsConfig, config_key, config_value) + def service_for_jhub_apps(name, url): return { "name": name, diff --git a/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/main.tf b/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/main.tf index 06cd4d6dd..a36090f41 100644 --- a/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/main.tf +++ b/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/main.tf @@ -77,6 +77,7 @@ resource "helm_release" "jupyterhub" { conda-store-service-name = var.conda-store-service-name conda-store-jhub-apps-token = var.conda-store-jhub-apps-token jhub-apps-enabled = var.jhub-apps-enabled + jhub-apps-overrides = var.jhub-apps-overrides initial-repositories = var.initial-repositories skel-mount = { name = kubernetes_config_map.etc-skel.metadata.0.name diff --git a/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/variables.tf b/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/variables.tf index 41089d391..f395e0848 100644 --- a/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/variables.tf +++ b/src/_nebari/stages/kubernetes_services/template/modules/kubernetes/services/jupyterhub/variables.tf @@ -124,6 +124,11 @@ variable "jhub-apps-enabled" { type = bool } +variable "jhub-apps-overrides" { + description = "jhub-apps configuration overrides" + type = string +} + variable "conda-store-argo-workflows-jupyter-scheduler-token" { description = "Token for argo-workflows-jupyter-schedule to use conda-store" type = string diff --git a/src/_nebari/stages/kubernetes_services/template/variables.tf b/src/_nebari/stages/kubernetes_services/template/variables.tf index 9e36e6597..5d4e6d4a7 100644 --- a/src/_nebari/stages/kubernetes_services/template/variables.tf +++ b/src/_nebari/stages/kubernetes_services/template/variables.tf @@ -59,6 +59,12 @@ variable "jhub-apps-enabled" { type = bool } +variable "jhub-apps-overrides" { + description = "jhub-apps configuration overrides" + type = string + default = "{}" +} + variable "cloud-provider" { description = "Name of cloud provider." type = string