20
20
import webbrowser
21
21
from datetime import datetime
22
22
from pathlib import Path
23
- from typing import TYPE_CHECKING , Any , Dict , Iterable , List , Optional , Tuple , cast
23
+ from typing import TYPE_CHECKING , Any , Dict , Iterable , List , Optional , Tuple , Union , cast
24
24
from uuid import uuid4
25
25
26
26
import docker
@@ -126,6 +126,97 @@ def get_start_parameters(self) -> List["ProviderParameter"]:
126
126
return [
127
127
ProviderParameter ("port" , help = "Local port to use (random if not specified)." , type = int ),
128
128
ProviderParameter ("force-build" , help = "Always build image and don't check if it exists." , is_flag = True ),
129
+ ProviderParameter (
130
+ "blkio-weight" , help = "Block IO (relative weight), between 10 and 1000, or 0 to disable." , type = int
131
+ ),
132
+ ProviderParameter ("cap-add" , help = "Add Linux capabilities." , multiple = True ),
133
+ ProviderParameter ("cap-drop" , help = "Drop Linux capabilities." , multiple = True ),
134
+ ProviderParameter ("cgroup-parent" , help = "Override the default parent cgroup." , type = str ),
135
+ ProviderParameter ("cpu-count" , help = "Number of usable CPUs." , type = int ),
136
+ ProviderParameter ("cpu-percent" , help = "Usable percentage of the available CPUs." , type = int ),
137
+ ProviderParameter ("cpu-period" , help = "The length of a CPU period in microseconds." , type = int ),
138
+ ProviderParameter (
139
+ "cpu-quota" , help = "Microseconds of CPU time that the container can get in a CPU period." , type = int
140
+ ),
141
+ ProviderParameter ("cpu-rt-period" , help = "Limit CPU real-time period in microseconds." , type = int ),
142
+ ProviderParameter ("cpu-rt-runtime" , help = "Limit CPU real-time runtime in microseconds." , type = int ),
143
+ ProviderParameter ("cpu-shares" , help = "CPU shares (relative weight)." , type = int ),
144
+ ProviderParameter ("cpuset-cpus" , help = "CPUs in which to allow execution ('0-3', '0,1')." , type = str ),
145
+ ProviderParameter (
146
+ "cpuset-mems" , help = "Memory nodes (MEMs) in which to allow execution ('0-3', '0,1')." , type = str
147
+ ),
148
+ ProviderParameter (
149
+ "device-cgroup-rules" ,
150
+ help = "A list of cgroup rules to apply to the container." ,
151
+ multiple = True ,
152
+ flags = ["device-cgroup-rule" ],
153
+ ),
154
+ ProviderParameter ("devices" , help = "Expose host devices to the container." , multiple = True , flags = ["device" ]),
155
+ ProviderParameter ("dns" , help = "Set custom DNS servers." , multiple = True ),
156
+ ProviderParameter (
157
+ "dns-opt" ,
158
+ help = "Additional options to be added to the container's ``resolv.conf`` file." ,
159
+ type = str ,
160
+ flags = ["dns-opt" , "dns-option" ],
161
+ ),
162
+ ProviderParameter ("dns-search" , help = "DNS search domains." , multiple = True ),
163
+ ProviderParameter ("domainname" , help = "Container NIS domain name." , type = str ),
164
+ ProviderParameter ("entrypoint" , help = "The entrypoint for the container." , type = str ),
165
+ ProviderParameter (
166
+ "environment" ,
167
+ help = "Environment variables to set inside the container, in the format 'VAR=VAL'" ,
168
+ multiple = True ,
169
+ flags = ["env" ],
170
+ ),
171
+ ProviderParameter (
172
+ "group-add" ,
173
+ help = "List of additional group names and/or IDs that the container process will run as." ,
174
+ multiple = True ,
175
+ ),
176
+ ProviderParameter ("hostname" , help = "Optional hostname for the container." , type = str ),
177
+ ProviderParameter (
178
+ "init" , help = "Run an init inside the container that forwards signals and reaps processes" , is_flag = True
179
+ ),
180
+ ProviderParameter ("isolation" , help = "Isolation technology to use." , type = str ),
181
+ ProviderParameter ("kernel-memory" , help = "Kernel memory limit (bytes)." , type = int , metavar = "<bytes>" ),
182
+ ProviderParameter ("mac-address" , help = "MAC address to assign to the container." , type = str ),
183
+ ProviderParameter ("mem-reservation" , help = "Memory soft limit." , type = int , flags = ["memory-reservation" ]),
184
+ ProviderParameter (
185
+ "mem-swappiness" ,
186
+ help = "Tune container memory swappiness (0 to 100)." ,
187
+ type = int ,
188
+ flags = ["memory-swappiness" ],
189
+ ),
190
+ ProviderParameter ("memswap-limit" , help = "Swap limit equal to memory plus swap." , flags = ["memory-swap" ]),
191
+ ProviderParameter ("name" , help = "The name for this container." , type = str ),
192
+ ProviderParameter ("network" , help = "Connect a container to a network." , type = str ),
193
+ ProviderParameter ("oom-kill-disable" , help = "Disable OOM Killer." , is_flag = True ),
194
+ ProviderParameter ("oom-score-adj" , help = "Tune host's OOM preferences (-1000 to 1000)." , type = int ),
195
+ ProviderParameter ("pids-limit" , help = "Tune a container's PIDs limit." , type = int ),
196
+ ProviderParameter ("platform" , help = "Set platform if server is multi-platform capable." , type = str ),
197
+ ProviderParameter ("privileged" , help = "Give extended privileges to this container." , is_flag = True ),
198
+ ProviderParameter (
199
+ "publish-all-ports" , help = "Publish all ports to the host." , is_flag = True , flags = ["publish-all" ]
200
+ ),
201
+ ProviderParameter ("read-only" , help = "Mount the container's root filesystem as read-only" , is_flag = True ),
202
+ ProviderParameter ("remove" , help = "Automatically remove the container when it exits." , flags = ["rm" ]),
203
+ ProviderParameter ("runtime" , help = "Runtime to use with this container." , type = str ),
204
+ ProviderParameter ("security-opt" , help = "Security Options." , multiple = True ),
205
+ ProviderParameter ("shm-size" , help = "Size of /dev/shm (bytes)." , type = int , metavar = "<bytes>" ),
206
+ ProviderParameter (
207
+ "stdin-open" , help = "Keep STDIN open even if not attached." , is_flag = True , flags = ["interactive" ]
208
+ ),
209
+ ProviderParameter ("stop-signal" , help = "Signal to stop the container." , type = str ),
210
+ ProviderParameter ("tty" , help = "Allocate a pseudo-TTY." , is_flag = True ),
211
+ ProviderParameter ("user" , help = "Username or UID" , type = str ),
212
+ ProviderParameter ("volume-driver" , help = "The name of a volume driver/plugin." , type = str ),
213
+ ProviderParameter (
214
+ "volumes" ,
215
+ help = "A list of volume mounts (e.g. '/host/path/:/mount/path/in/container')" ,
216
+ multiple = True ,
217
+ flags = ["volume" ],
218
+ ),
219
+ ProviderParameter ("volumes-from" , help = "Mount volumes from the specified container(s)" , multiple = True ),
129
220
]
130
221
131
222
def get_open_parameters (self ) -> List ["ProviderParameter" ]:
@@ -162,7 +253,7 @@ def session_start(
162
253
cpu_request : Optional [float ] = None ,
163
254
mem_request : Optional [str ] = None ,
164
255
disk_request : Optional [str ] = None ,
165
- gpu_request : Optional [str ] = None ,
256
+ gpu_request : Optional [Union [ str , int ] ] = None ,
166
257
** kwargs ,
167
258
) -> Tuple [str , str ]:
168
259
"""Creates an interactive session.
@@ -173,6 +264,8 @@ def session_start(
173
264
show_non_standard_user_warning = True
174
265
175
266
def session_start_helper (consider_disk_request : bool ):
267
+ nonlocal gpu_request
268
+
176
269
try :
177
270
docker_is_running = self .docker_client ().ping ()
178
271
if not docker_is_running :
@@ -201,8 +294,15 @@ def session_start_helper(consider_disk_request: bool):
201
294
docker .types .DeviceRequest (count = - 1 , capabilities = [["compute" , "utility" ]])
202
295
]
203
296
else :
297
+ if not isinstance (gpu_request , int ):
298
+ try :
299
+ gpu_request = int (gpu_request )
300
+ except ValueError :
301
+ raise errors .ParameterError (
302
+ f"Invalid value for 'gpu': '{ gpu_request } '. Valid values are integers or 'all'"
303
+ )
204
304
resource_requests ["device_requests" ] = [
205
- docker .types .DeviceRequest (count = [ gpu_request ] , capabilities = [["compute" , "utility" ]])
305
+ docker .types .DeviceRequest (count = gpu_request , capabilities = [["compute" , "utility" ]])
206
306
]
207
307
208
308
# NOTE: set git user
@@ -214,15 +314,27 @@ def session_start_helper(consider_disk_request: bool):
214
314
215
315
work_dir = Path (working_dir ) / "work" / project_name .split ("/" )[- 1 ]
216
316
217
- volumes = [f"{ str (project_context .path .resolve ())} :{ work_dir } " ]
317
+ volumes = kwargs .pop ("volumes" , [])
318
+ volumes = list (volumes )
319
+ volumes .append (f"{ str (project_context .path .resolve ())} :{ work_dir } " )
320
+
321
+ environment = {}
322
+ passed_env_vars = kwargs .pop ("environment" , [])
323
+ for env_var in passed_env_vars :
324
+ var , _ , value = env_var .partition ("=" )
325
+ if not var :
326
+ raise errors .ParameterError (f"Invalid environment variable: '{ env_var } '" )
327
+ environment [var ] = value
218
328
219
329
user = project_context .repository .get_user ()
220
- environment = {
221
- "GIT_AUTHOR_NAME" : user .name ,
222
- "GIT_AUTHOR_EMAIL" : user .email ,
223
- "GIT_COMMITTER_EMAIL" : user .email ,
224
- "EMAIL" : user .email ,
225
- }
330
+ environment .update (
331
+ {
332
+ "GIT_AUTHOR_NAME" : user .name ,
333
+ "GIT_AUTHOR_EMAIL" : user .email ,
334
+ "GIT_COMMITTER_EMAIL" : user .email ,
335
+ "EMAIL" : user .email ,
336
+ }
337
+ )
226
338
227
339
additional_options : Dict [str , Any ] = {}
228
340
@@ -239,7 +351,7 @@ def session_start_helper(consider_disk_request: bool):
239
351
)
240
352
show_non_standard_user_warning = False
241
353
242
- additional_options ["user" ] = " root"
354
+ additional_options ["user" ] = kwargs . pop ( "user" , " root")
243
355
environment ["NB_UID" ] = str (os .getuid ())
244
356
environment ["CHOWN_HOME" ] = "yes"
245
357
environment ["CHOWN_HOME_OPTS" ] = "-R"
@@ -267,6 +379,7 @@ def session_start_helper(consider_disk_request: bool):
267
379
working_dir = str (work_dir ),
268
380
** resource_requests ,
269
381
** additional_options ,
382
+ ** kwargs ,
270
383
)
271
384
272
385
if not container .ports :
0 commit comments