use bytes::Bytes;
use http::request::Builder;
use http_body_util::Full;
use hyper::Method;
use serde_derive::{Deserialize, Serialize};
use std::cmp::Eq;
use std::collections::HashMap;
use std::hash::Hash;
use super::Docker;
use crate::docker::BodyType;
use crate::errors::Error;
use crate::models::*;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct CreateNetworkOptions<T>
where
T: Into<String> + Eq + Hash,
{
pub name: T,
pub check_duplicate: bool,
pub driver: T,
pub internal: bool,
pub attachable: bool,
pub ingress: bool,
#[serde(rename = "IPAM")]
pub ipam: Ipam,
#[serde(rename = "EnableIPv6")]
pub enable_ipv6: bool,
pub options: HashMap<T, T>,
pub labels: HashMap<T, T>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
pub struct InspectNetworkOptions<T>
where
T: Into<String> + serde::ser::Serialize,
{
pub verbose: bool,
pub scope: T,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
pub struct ListNetworksOptions<T>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
#[serde(serialize_with = "crate::docker::serialize_as_json")]
pub filters: HashMap<T, Vec<T>>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct ConnectNetworkOptions<T>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
pub container: T,
pub endpoint_config: EndpointSettings,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct DisconnectNetworkOptions<T>
where
T: Into<String> + serde::ser::Serialize,
{
pub container: T,
pub force: bool,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
pub struct PruneNetworksOptions<T>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
#[serde(serialize_with = "crate::docker::serialize_as_json")]
pub filters: HashMap<T, Vec<T>>,
}
impl Docker {
pub async fn create_network<T>(
&self,
config: CreateNetworkOptions<T>,
) -> Result<NetworkCreateResponse, Error>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
let url = "/networks/create";
let req = self.build_request(
url,
Builder::new().method(Method::POST),
None::<String>,
Docker::serialize_payload(Some(config)),
);
self.process_into_value(req).await
}
pub async fn remove_network(&self, network_name: &str) -> Result<(), Error> {
let url = format!("/networks/{network_name}");
let req = self.build_request(
&url,
Builder::new().method(Method::DELETE),
None::<String>,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_unit(req).await
}
pub async fn inspect_network<T>(
&self,
network_name: &str,
options: Option<InspectNetworkOptions<T>>,
) -> Result<Network, Error>
where
T: Into<String> + serde::ser::Serialize,
{
let url = format!("/networks/{network_name}");
let req = self.build_request(
&url,
Builder::new().method(Method::GET),
options,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_value(req).await
}
pub async fn list_networks<T>(
&self,
options: Option<ListNetworksOptions<T>>,
) -> Result<Vec<Network>, Error>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
let url = "/networks";
let req = self.build_request(
url,
Builder::new().method(Method::GET),
options,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_value(req).await
}
pub async fn connect_network<T>(
&self,
network_name: &str,
config: ConnectNetworkOptions<T>,
) -> Result<(), Error>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
let url = format!("/networks/{network_name}/connect");
let req = self.build_request(
&url,
Builder::new().method(Method::POST),
None::<String>,
Docker::serialize_payload(Some(config)),
);
self.process_into_unit(req).await
}
pub async fn disconnect_network<T>(
&self,
network_name: &str,
config: DisconnectNetworkOptions<T>,
) -> Result<(), Error>
where
T: Into<String> + serde::ser::Serialize,
{
let url = format!("/networks/{network_name}/disconnect");
let req = self.build_request(
&url,
Builder::new().method(Method::POST),
None::<String>,
Docker::serialize_payload(Some(config)),
);
self.process_into_unit(req).await
}
pub async fn prune_networks<T>(
&self,
options: Option<PruneNetworksOptions<T>>,
) -> Result<NetworkPruneResponse, Error>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
let url = "/networks/prune";
let req = self.build_request(
url,
Builder::new().method(Method::POST),
options,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_value(req).await
}
}