Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/swarm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,4 +245,55 @@ impl Docker {

self.process_into_unit(req).await
}

/// ---
///
/// # Update a Swarm
///
/// Update a swarm's configuration.
///
/// # Arguments
///
/// - [SwarmSpec](SwarmSpec) struct.
/// - [UpdateSwarmOptions](crate::query_parameters::UpdateSwarmOptions) struct.
///
/// # Returns
///
/// - unit type `()`, wrapped in a Future.
///
/// # Examples
///
/// ```rust
/// # use bollard::Docker;
/// # let docker = Docker::connect_with_http_defaults().unwrap();
/// use bollard::query_parameters::UpdateSwarmOptionsBuilder;
///
/// let result = async move {
/// let swarm = docker.inspect_swarm().await?;
/// let version = swarm.version.unwrap().index.unwrap();
/// let spec = swarm.spec.unwrap();
///
/// let options = UpdateSwarmOptionsBuilder::default()
/// .version(version as i64)
/// .build();
///
/// docker.update_swarm(spec, options).await
/// };
/// ```
pub async fn update_swarm(
&self,
swarm_spec: SwarmSpec,
options: crate::query_parameters::UpdateSwarmOptions,
) -> Result<(), Error> {
let url = "/swarm/update";

let req = self.build_request(
url,
Builder::new().method(Method::POST),
Some(options),
Docker::serialize_payload(Some(swarm_spec)),
);

self.process_into_unit(req).await
}
}
16 changes: 16 additions & 0 deletions tests/swarm_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ pub mod common;

#[cfg(feature = "test_swarm")]
async fn swarm_test(docker: bollard::Docker) -> Result<(), bollard::errors::Error> {
use bollard::query_parameters::UpdateSwarmOptionsBuilder;
use bollard::swarm::*;

// init swarm
Expand All @@ -26,6 +27,21 @@ async fn swarm_test(docker: bollard::Docker) -> Result<(), bollard::errors::Erro
> 0
);

// test update swarm - get current version and spec
let swarm = docker.inspect_swarm().await?;
let version = swarm.version.unwrap().index.unwrap();
let spec = swarm.spec.unwrap();

// update swarm (no changes, just verify API works)
let options = UpdateSwarmOptionsBuilder::default()
.version(version as i64)
.build();
docker.update_swarm(spec, options).await?;

// verify swarm version incremented after update
let updated_swarm = docker.inspect_swarm().await?;
assert!(updated_swarm.version.unwrap().index.unwrap() > version);

// leave swarm
let config = LeaveSwarmOptions { force: true };
let _ = &docker.leave_swarm(Some(config)).await?;
Expand Down