From 509ec65a623a2a0caf722581e5f13ba09375f4ef Mon Sep 17 00:00:00 2001 From: groche97 Date: Mon, 10 Jul 2023 22:51:15 +0200 Subject: [PATCH] start network creation infraestructure --- Cargo.lock | 434 ++++------------------------------------ Cargo.toml | 3 +- src/create_container.rs | 119 +++++++---- src/main.rs | 59 ++---- src/network_docker.rs | 48 +++++ 5 files changed, 177 insertions(+), 486 deletions(-) create mode 100644 src/network_docker.rs diff --git a/Cargo.lock b/Cargo.lock index 342a98a..48e2616 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "ahash" version = "0.8.3" @@ -40,19 +34,6 @@ dependencies = [ "libc", ] -[[package]] -name = "asynchronous-codec" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" -dependencies = [ - "bytes", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -65,6 +46,12 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + [[package]] name = "bitflags" version = "1.3.2" @@ -79,15 +66,13 @@ checksum = "6776fc96284a0bb647b615056fc496d1fe1644a7ab01829818a6d91cae888b84" [[package]] name = "bollard" -version = "0.11.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92fed694fd5a7468c971538351c61b9c115f1ae6ed411cd2800f0f299403a4b" +checksum = "af254ed2da4936ef73309e9597180558821cb16ae9bba4cb24ce6b612d8d80ed" dependencies = [ - "base64", + "base64 0.21.2", "bollard-stubs", "bytes", - "chrono", - "dirs-next", "futures-core", "futures-util", "hex", @@ -95,27 +80,27 @@ dependencies = [ "hyper", "hyperlocal", "log", - "pin-project", + "pin-project-lite", "serde", "serde_derive", "serde_json", + "serde_repr", "serde_urlencoded", "thiserror", "tokio", - "tokio-util 0.6.10", + "tokio-util", "url", "winapi", ] [[package]] name = "bollard-stubs" -version = "1.41.0" +version = "1.42.0-rc.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2f2e73fffe9455141e170fb9c1feb0ac521ec7e7dcd47a7cab72a658490fb8" +checksum = "602bda35f33aeb571cef387dcd4042c643a8bf689d8aaac2cc47ea24cb7bc7e0" dependencies = [ - "chrono", "serde", - "serde_with 1.14.0", + "serde_with", ] [[package]] @@ -124,12 +109,6 @@ version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - [[package]] name = "bytes" version = "1.4.0" @@ -156,181 +135,17 @@ checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ "android-tzdata", "iana-time-zone", - "js-sys", "num-traits", "serde", - "time 0.1.45", - "wasm-bindgen", "winapi", ] -[[package]] -name = "containers-api" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74a6c297451ce82117ff9090e5174bf18f86e6bcbfbfc3820246abbc4f44fa16" -dependencies = [ - "chrono", - "flate2", - "futures-util", - "http", - "hyper", - "hyperlocal", - "log", - "mime", - "paste", - "pin-project", - "serde", - "serde_json", - "tar", - "thiserror", - "tokio", - "url", -] - [[package]] name = "core-foundation-sys" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - -[[package]] -name = "darling" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" -dependencies = [ - "darling_core 0.20.1", - "darling_macro 0.20.1", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_core" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.18", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" -dependencies = [ - "darling_core 0.20.1", - "quote", - "syn 2.0.18", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "docker-api" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4576e993f4ef4805931a835b7afe71dec6cbd096e9b08bbd8e8f03e1940b2745" -dependencies = [ - "asynchronous-codec", - "base64", - "byteorder", - "bytes", - "chrono", - "containers-api", - "docker-api-stubs", - "futures-util", - "http", - "hyper", - "log", - "paste", - "serde", - "serde_json", - "tar", - "thiserror", - "url", -] - -[[package]] -name = "docker-api-stubs" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6198e6d77eb486d04c9b3997aec536428a7cbba833e84cdfda49e144c8df1734" -dependencies = [ - "chrono", - "serde", - "serde_json", - "serde_with 2.3.3", -] - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -343,28 +158,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" -[[package]] -name = "filetime" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.2.16", - "windows-sys", -] - -[[package]] -name = "flate2" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fnv" version = "1.0.7" @@ -436,7 +229,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn", ] [[package]] @@ -469,17 +262,6 @@ dependencies = [ "slab", ] -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - [[package]] name = "h2" version = "0.3.19" @@ -495,7 +277,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.8", + "tokio-util", "tracing", ] @@ -633,12 +415,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "0.4.0" @@ -714,21 +490,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - [[package]] name = "mio" version = "0.8.8" @@ -736,7 +497,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys", ] @@ -745,7 +506,6 @@ name = "mrdeployer" version = "0.1.0" dependencies = [ "bollard", - "docker-api", "futures", "rusqlite", "tokio", @@ -794,17 +554,11 @@ checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", "windows-targets", ] -[[package]] -name = "paste" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" - [[package]] name = "percent-encoding" version = "2.3.0" @@ -828,7 +582,7 @@ checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn", ] [[package]] @@ -867,15 +621,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.3.5" @@ -885,17 +630,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", -] - [[package]] name = "rusqlite" version = "0.29.0" @@ -939,7 +673,7 @@ checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn", ] [[package]] @@ -953,6 +687,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -965,54 +710,19 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros 1.5.2", -] - [[package]] name = "serde_with" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" dependencies = [ - "base64", + "base64 0.13.1", "chrono", "hex", "indexmap", "serde", "serde_json", - "serde_with_macros 2.3.3", - "time 0.3.21", -] - -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling 0.13.4", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling 0.20.1", - "proc-macro2", - "quote", - "syn 2.0.18", + "time", ] [[package]] @@ -1049,23 +759,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.18" @@ -1077,17 +770,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tar" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" -dependencies = [ - "filetime", - "libc", - "xattr", -] - [[package]] name = "thiserror" version = "1.0.40" @@ -1105,18 +787,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", + "syn", ] [[package]] @@ -1188,21 +859,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", -] - -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", + "syn", ] [[package]] @@ -1305,12 +962,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1338,7 +989,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.18", + "syn", "wasm-bindgen-shared", ] @@ -1360,7 +1011,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1467,12 +1118,3 @@ name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "xattr" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" -dependencies = [ - "libc", -] diff --git a/Cargo.toml b/Cargo.toml index e13eb52..ed578f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,8 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -docker-api = "*" -bollard = "0.11" +bollard = "0.14" futures = "0.3" tokio = { version = "1", features = ["full"] } rusqlite = { version = "0.29.0", features = ["bundled"] } diff --git a/src/create_container.rs b/src/create_container.rs index f6a5b26..c1f7402 100644 --- a/src/create_container.rs +++ b/src/create_container.rs @@ -1,50 +1,87 @@ -use docker_api::opts::ContainerCreateOpts; +use bollard::container::{StartContainerOptions, CreateContainerOptions, Config, NetworkingConfig}; +use bollard::models::{EndpointSettings, EndpointIpamConfig}; +use bollard::errors::Error; +use std::collections::hash_map::HashMap; -pub async fn list(docker: docker_api::Docker){ - match docker.images().list(&Default::default()).await { - Ok(images) => { - for image in images { - println!("{0:?}", image.repo_tags); +pub struct Container { + name: String, + start: bool, + ip: String, + net: String, + id: Option, +} + +impl Container { + pub async fn new(docker: bollard::Docker, + name: String, + ip: String, + net: String) -> Result { + + let mut container = Container { + name: name, + ip: ip, + net: net, + start: false, + id: None, + }; + + match container.create(docker).await { + Ok(c) => { + container.start=true; + container.id = Some(c); + Ok(container) } - }, - Err(e) => println!("Something bad happened! {e}"), + Err(e) => Err(e), + } + } + + async fn create(&self, docker: bollard::Docker) -> Result{ + let create = docker.create_container(Some( + create_options(self.name.clone())), + create_config(self.ip.clone(), self.net.clone())) + .await?; + docker.start_container(&self.name, None::>).await?; + return Ok(create.id); + } + + pub fn get_id(&self) -> String { + match &self.id { + Some(id) => id.clone(), + None => String::from(""), + } + } +} +fn create_config(ip: String, net: String) -> Config { + let endpoint = EndpointSettings { + ipam_config: Some(EndpointIpamConfig{ + ipv4_address: Some(ip), + ..Default::default() + }), + ..Default::default() + }; + let mut hash = HashMap::new(); + hash.insert(net, endpoint); + let net = NetworkingConfig { + endpoints_config: hash + }; + let env = vec!["EULA=TRUE".to_string()]; + Config { + image: Some("itzg/minecraft-server:latest".to_string()), + env: Some(env), + networking_config: Some(net), + ..Default::default() } } -pub async fn list_c(docker: docker_api::Docker){ - match docker.containers().list(&Default::default()).await { - Ok(containers) => { - for container in containers { - println!("{0:?}", container.status); - } - }, - Err(e) => println!("Something bad happened! {e}"), +fn create_options(name: String) -> CreateContainerOptions { + CreateContainerOptions{ + name: name, + platform: None, } } -pub async fn create(docker: docker_api::Docker){ - let env = vec!["EULA=TRUE"]; - let opts = ContainerCreateOpts::builder() - .image("itzg/minecraft-server:latest") - .env(env) - //.network_config(network_config) - .build(); - let cont = match docker.containers().create(&opts).await { - Ok(c) => { - println!("OK: {c:?}"); - c - }, - Err(e) => {eprintln!("Error: {e}"); panic!("{e}")}, - }; - match cont.start().await { - Ok(s) => { - println!("Ok {s:?}") - }, - Err(e) => eprintln!("Error: {e}"), - - }; +async fn create(docker: bollard::Docker, name: String, ip: String, net: String) -> Result{ + let create = docker.create_container(Some(create_options(name.clone())), create_config(ip, net)).await?; + docker.start_container(&name, None::>).await?; + return Ok(create.id); } - -/*async fn get_network(docker: docker_api::Docker) -> Network { - -}*/ diff --git a/src/main.rs b/src/main.rs index 612f04d..5d9c364 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,7 @@ -use futures::executor::block_on; -use std::io; -use tokio::net::TcpListener; -use tokio::io::AsyncWriteExt; -use std::collections::hash_map::HashMap; use bollard::Docker; -use bollard::container::{StartContainerOptions, CreateContainerOptions, Config, NetworkingConfig}; -use bollard::models::{EndpointSettings, EndpointIpamConfig}; mod create_container; +mod network_docker; mod server; mod conf; @@ -18,47 +12,18 @@ async fn main() { Err(e) => panic!("error:{}",e.to_string()), }; - let options = Some(CreateContainerOptions{ - name: "my-new-container", - //platform: None, - }); - let ip = Some(String::from("172.20.0.5")); - let endpoint = EndpointSettings { - ipam_config: Some(EndpointIpamConfig{ - ipv4_address: ip.clone(), - ..Default::default() - }), - //network_id: Some(String::from("672821882d72")), - //ip_address: ip.clone(), - ..Default::default() - }; - let mut hash = HashMap::new(); - hash.insert("customnetwork", endpoint); - let net = NetworkingConfig { - endpoints_config: hash - }; - let env = vec!["EULA=TRUE"]; - let config = Config { - image: Some("itzg/minecraft-server:latest"), - env: Some(env), - networking_config: Some(net), - ..Default::default() + let net_name = String::from("customnetwork"); + let net_range = String::from("172.20.0.0/24"); + + match network_docker::Network::create_network(docker.clone(), net_name, net_range).await { + Ok(_n)=> println!("va"), + Err(e)=> println!("err: {}", e), }; - match docker.create_container(options, config).await{ - Ok(r) => println!("va1"), - Err(e) => println!("error1:{}",e.to_string()), - } - match docker.start_container("my-new-container", None::>).await { - Ok(r) => println!("va2"), - Err(e) => println!("error2:{}",e.to_string()), + match create_container::Container::new(docker, String::from("container1"), + String::from("172.20.0.5"), + String::from("customnetwork")).await { + Ok(c) => println!("id: {}", c.get_id()), + Err(e) => println!("error: {}", e), }; - /*let docker = match docker_api::Docker::new("unix:///var/run/docker.sock") { - Ok(d) => d, - Err(e) => {print!("{}",e.to_string()); panic!("{}", e.to_string())}, - }; - block_on(create_container::list(docker.clone()));*/ - //block_on(create_container::create(docker.clone())); - //block_on(create_container::list_c(docker)); - //server::start().await; } diff --git a/src/network_docker.rs b/src/network_docker.rs new file mode 100644 index 0000000..d41e321 --- /dev/null +++ b/src/network_docker.rs @@ -0,0 +1,48 @@ +use bollard::Docker; +use bollard::errors::Error; +use bollard::models::{IpamConfig,Ipam}; +use bollard::network::CreateNetworkOptions; + +pub struct Network { + name: String, + range: String, + +} + +impl Network { + async fn check_network(docker: bollard::Docker, name) -> bool { + let mut list_networks_filters = HashMap::new(); + list_networks_filters.insert("name", name); + match docker.list_networks(Some(ListNetworksOptions { + filters: list_networks_filters, + })).await { + Ok(l)=> l.len()>0, + Err(e)=> false + } + } + + pub async fn create_network(docker: bollard::Docker, name: String, range: String) -> Result{ + let ipam_config = IpamConfig { + subnet: Some(range.clone()), + ..Default::default() + }; + + let create_network_options = CreateNetworkOptions { + name: name.as_str(), + driver: "bridge", + ipam: Ipam { + config: Some(vec![ipam_config]), + ..Default::default() + }, + ..Default::default() + }; + match docker.create_network(create_network_options).await { + Ok(n)=> Ok(Network { + name: name, + range: range, + }), + Err(e)=> Err(e), + } + } +} +