diff --git a/gu-model/src/dockerman.rs b/gu-model/src/dockerman.rs index a5e277461..cf6620863 100644 --- a/gu-model/src/dockerman.rs +++ b/gu-model/src/dockerman.rs @@ -9,6 +9,8 @@ pub struct CreateOptions { #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] pub net: Option, + #[serde(default)] // default is false + pub autostart: bool, } impl CreateOptions { diff --git a/gu-provider/src/dockerman.rs b/gu-provider/src/dockerman.rs index fb82413c9..bd56812d3 100644 --- a/gu-provider/src/dockerman.rs +++ b/gu-provider/src/dockerman.rs @@ -420,15 +420,23 @@ impl Handler> for DockerMan { ActorResponse::r#async(fut::wrap_future(pull_and_create).and_then( move |id, act: &mut DockerMan, _| { if let Some(ref api) = act.docker_api { - let deploy = DockerSession { + let mut deploy = DockerSession { workspace, container: api.container(Cow::from(id.clone())), status: PeerSessionStatus::CREATED, }; + let maybe_start = if msg.options.autostart { + info!("Autostarting the container"); + let autostart_future = + deploy.do_start().map_err(Error::Error).map(|_| ()); + fut::Either::A(fut::wrap_future(autostart_future)) + } else { + fut::Either::B(fut::ok(())) + }; act.deploys.insert_deploy(id.clone(), deploy); - fut::ok(id) + fut::Either::A(maybe_start.and_then(|_, _, _| fut::ok(id))) } else { - fut::err(Error::UnknownEnv(msg.env_type.clone())) + fut::Either::B(fut::err(Error::UnknownEnv(msg.env_type.clone()))) } }, ))