forked from yuvipanda/jupyterhub-fancy-profiles
/
jupyterhub_config.py
137 lines (126 loc) · 5.38 KB
/
jupyterhub_config.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import os
import socket
from jupyterhub_fancy_profiles import setup_ui
c = get_config() # noqa
# Allow any username and any password to login
c.JupyterHub.authenticator_class = "dummy"
# Launch into Kubernetes
c.JupyterHub.spawner_class = "kubespawner.KubeSpawner"
# Explicitly set the command to start, as repo2docker default is notebook,
# not the jupyterhub-singleuser
c.Spawner.cmd = ["jupyterhub-singleuser"]
# Don't try to cleanup servers on exit - since in general for k8s, we want
# the hub to be able to restart without losing user containers
c.JupyterHub.cleanup_servers = False
# Automatically start binderhub as a service, at the URL path that jupyterhub-fancy-profiles
# expects it to be at
c.JupyterHub.services = [
{
"name": "binder",
"url": "http://localhost:8585",
"command": ["python", "-m", "binderhub", "-f", "binderhub_config.py"],
# Pass on environment variables required for binderhub to find where the docker image is
"environment": os.environ.copy(),
}
]
# Find the IP of the machine that minikube is most likely able to talk to
# Graciously used from https://stackoverflow.com/a/166589
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
host_ip = s.getsockname()[0]
s.close()
c.JupyterHub.hub_connect_ip = host_ip
# Setup jupyterhub_fancy_profiles
setup_ui(c)
# Provide an example profile with various options in use
c.KubeSpawner.profile_list = [
{
"display_name": "Small",
"description": "~2 CPU, ~2G RAM",
"profile_options": {
"image": {
"display_name": "Image",
"unlisted_choice": {
"enabled": True,
"display_name": "Custom image",
"validation_regex": "^.+:.+$",
"validation_message": "Must be a publicly available docker image, of form <image-name>:<tag>",
"display_name_in_choices": "Specify an existing docker image",
"description_in_choices": "Use a pre-existing docker image from a public docker registry",
"kubespawner_override": {"image": "{value}"},
},
"choices": {
"pangeo": {
"display_name": "Pangeo Notebook Image",
"description": "Python image with scientific, dask and geospatial tools",
"kubespawner_override": {
"image": "pangeo/pangeo-notebook:2023.09.11"
},
},
"geospatial": {
"display_name": "Rocker Geospatial",
"description": "R image with RStudio, the tidyverse & Geospatial tools",
"default": True,
"slug": "geospatial",
"kubespawner_override": {
"image": "rocker/binder:4.3",
"default_url": "/rstudio",
"working_dir": "/home/rstudio",
},
},
"scipy": {
"display_name": "Jupyter SciPy Notebook",
"slug": "scipy",
"kubespawner_override": {
"image": "jupyter/scipy-notebook:2023-06-26"
},
},
},
},
"resources": {
"display_name": "Resource Allocation",
"choices": {
"mem_2_7": {
"display_name": "2.7 GB RAM, upto 3.479 CPUs",
"description": "Use this for the workshop on 2023 September",
"kubespawner_override": {
"mem_guarantee": 1024,
"mem_limit": 2904451072,
"cpu_guarantee": 0.1,
"cpu_limit": 3.479,
},
"default": True,
},
"mem_5_4": {
"display_name": "5.4 GB RAM, upto 3.479 CPUs",
"kubespawner_override": {
"mem_guarantee": 1024,
"mem_limit": 5808902144,
"cpu_guarantee": 0.1,
"cpu_limit": 3.479,
},
},
"mem_10_8": {
"display_name": "10.8 GB RAM, upto 3.479 CPUs",
"kubespawner_override": {
"mem_guarantee": 1024,
"mem_limit": 11617804288,
"cpu_guarantee": 0.1,
"cpu_limit": 3.479,
},
},
"mem_21_6": {
"display_name": "21.6 GB RAM, upto 3.479 CPUs",
"description": "Large amount of RAM, might start slowly",
"kubespawner_override": {
"mem_guarantee": 1024,
"mem_limit": 23235608576,
"cpu_guarantee": 0.1,
"cpu_limit": 3.479,
},
},
},
},
},
}
]