(
config: &Config,
docker_config: &DockerComputeConfig,
supervisor_readiness: Arc<dyn SupervisorReadiness>,
)
| 352 | |
| 353 | impl DockerComputeDriver { |
| 354 | pub async fn new( |
| 355 | config: &Config, |
| 356 | docker_config: &DockerComputeConfig, |
| 357 | supervisor_readiness: Arc<dyn SupervisorReadiness>, |
| 358 | ) -> CoreResult<Self> { |
| 359 | let docker = Docker::connect_with_local_defaults() |
| 360 | .map_err(|err| Error::execution(format!("failed to create Docker client: {err}")))?; |
| 361 | let version = docker.version().await.map_err(|err| { |
| 362 | Error::execution(format!("failed to query Docker daemon version: {err}")) |
| 363 | })?; |
| 364 | let info = docker.info().await.map_err(|err| { |
| 365 | Error::execution(format!("failed to query Docker daemon info: {err}")) |
| 366 | })?; |
| 367 | let supports_gpu = info |
| 368 | .cdi_spec_dirs |
| 369 | .as_ref() |
| 370 | .is_some_and(|dirs| !dirs.is_empty()); |
| 371 | let cdi_gpu_inventory = docker_cdi_gpu_inventory(&info); |
| 372 | let allow_all_default_gpu = docker_info_reports_wsl2(&info); |
| 373 | validate_sandbox_pids_limit(docker_config.sandbox_pids_limit)?; |
| 374 | let gateway_port = config.bind_address.port(); |
| 375 | if gateway_port == 0 { |
| 376 | return Err(Error::config( |
| 377 | "docker compute driver requires a fixed non-zero gateway bind port", |
| 378 | )); |
| 379 | } |
| 380 | let network_name = docker_network_name(docker_config); |
| 381 | let bridge_gateway_ip = ensure_bridge_network(&docker, &network_name).await?; |
| 382 | let host_gateway_ip = parse_optional_host_gateway_ip(&docker_config.host_gateway_ip)?; |
| 383 | let gateway_route = |
| 384 | docker_gateway_route(&info, bridge_gateway_ip, gateway_port, host_gateway_ip); |
| 385 | let mut docker_config = docker_config.clone(); |
| 386 | if docker_config.grpc_endpoint.trim().is_empty() { |
| 387 | let scheme = if docker_guest_tls_configured(&docker_config) { |
| 388 | "https" |
| 389 | } else { |
| 390 | "http" |
| 391 | }; |
| 392 | docker_config.grpc_endpoint = |
| 393 | format!("{scheme}://{HOST_OPENSHELL_INTERNAL}:{gateway_port}"); |
| 394 | } |
| 395 | let grpc_endpoint = docker_container_openshell_endpoint( |
| 396 | &docker_config.grpc_endpoint, |
| 397 | HOST_OPENSHELL_INTERNAL, |
| 398 | gateway_port, |
| 399 | ); |
| 400 | let daemon_arch = normalize_docker_arch(version.arch.as_deref().unwrap_or_default()); |
| 401 | let supervisor_bin = resolve_supervisor_bin(&docker, &docker_config, &daemon_arch).await?; |
| 402 | let guest_tls = docker_guest_tls_paths(&docker_config)?; |
| 403 | |
| 404 | let driver = Self { |
| 405 | docker: Arc::new(docker), |
| 406 | config: DockerDriverRuntimeConfig { |
| 407 | default_image: docker_config.default_image.clone(), |
| 408 | image_pull_policy: docker_config.image_pull_policy.clone(), |
| 409 | sandbox_namespace: docker_config.sandbox_namespace.clone(), |
| 410 | grpc_endpoint, |
| 411 | network_name, |
nothing calls this directly
no test coverage detected