git.iko.soy/typeable/octopod
on master help sign in
add genfly-utils
commit4047a25d1ef50005331ad69c24478392eeb52668 authorAndrei Orlov <aaorlov1@gmail.com> dateWed 1 Jul 2020, 15:38 (6 years ago) parent87a7161
12 files changed+855
utils/genfly-utils/Cargo.lock+184 utils/genfly-utils/Cargo.toml+29 utils/genfly-utils/Makefile+7 utils/genfly-utils/docker/Dockerfile+7 utils/genfly-utils/docker/build_docker.sh+13 utils/genfly-utils/src/bin/check.rs+3 utils/genfly-utils/src/bin/cleanup.rs+58 utils/genfly-utils/src/bin/create.rs+121 utils/genfly-utils/src/bin/delete.rs+58 utils/genfly-utils/src/bin/update.rs+113 utils/genfly-utils/src/lib.rs+259 utils/genfly-utils/src/main.rs+3
utils/genfly-utils/Cargo.locknew file+184
@@ -0,0 +1,184 @@
1+# This file is automatically @generated by Cargo.
2+# It is not intended for manual editing.
3+[[package]]
4+name = "ansi_term"
5+version = "0.11.0"
6+source = "registry+https://github.com/rust-lang/crates.io-index"
7+checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
8+dependencies = [
9+ "winapi",
10+]
11+
12+[[package]]
13+name = "atty"
14+version = "0.2.14"
15+source = "registry+https://github.com/rust-lang/crates.io-index"
16+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
17+dependencies = [
18+ "hermit-abi",
19+ "libc",
20+ "winapi",
21+]
22+
23+[[package]]
24+name = "bitflags"
25+version = "1.2.1"
26+source = "registry+https://github.com/rust-lang/crates.io-index"
27+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
28+
29+[[package]]
30+name = "cfg-if"
31+version = "0.1.10"
32+source = "registry+https://github.com/rust-lang/crates.io-index"
33+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
34+
35+[[package]]
36+name = "clap"
37+version = "2.33.1"
38+source = "registry+https://github.com/rust-lang/crates.io-index"
39+checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129"
40+dependencies = [
41+ "ansi_term",
42+ "atty",
43+ "bitflags",
44+ "strsim",
45+ "textwrap",
46+ "unicode-width",
47+ "vec_map",
48+]
49+
50+[[package]]
51+name = "genfly-utils"
52+version = "0.1.0"
53+dependencies = [
54+ "clap",
55+ "rand",
56+]
57+
58+[[package]]
59+name = "getrandom"
60+version = "0.1.14"
61+source = "registry+https://github.com/rust-lang/crates.io-index"
62+checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
63+dependencies = [
64+ "cfg-if",
65+ "libc",
66+ "wasi",
67+]
68+
69+[[package]]
70+name = "hermit-abi"
71+version = "0.1.14"
72+source = "registry+https://github.com/rust-lang/crates.io-index"
73+checksum = "b9586eedd4ce6b3c498bc3b4dd92fc9f11166aa908a914071953768066c67909"
74+dependencies = [
75+ "libc",
76+]
77+
78+[[package]]
79+name = "libc"
80+version = "0.2.71"
81+source = "registry+https://github.com/rust-lang/crates.io-index"
82+checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
83+
84+[[package]]
85+name = "ppv-lite86"
86+version = "0.2.8"
87+source = "registry+https://github.com/rust-lang/crates.io-index"
88+checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
89+
90+[[package]]
91+name = "rand"
92+version = "0.7.3"
93+source = "registry+https://github.com/rust-lang/crates.io-index"
94+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
95+dependencies = [
96+ "getrandom",
97+ "libc",
98+ "rand_chacha",
99+ "rand_core",
100+ "rand_hc",
101+]
102+
103+[[package]]
104+name = "rand_chacha"
105+version = "0.2.2"
106+source = "registry+https://github.com/rust-lang/crates.io-index"
107+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
108+dependencies = [
109+ "ppv-lite86",
110+ "rand_core",
111+]
112+
113+[[package]]
114+name = "rand_core"
115+version = "0.5.1"
116+source = "registry+https://github.com/rust-lang/crates.io-index"
117+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
118+dependencies = [
119+ "getrandom",
120+]
121+
122+[[package]]
123+name = "rand_hc"
124+version = "0.2.0"
125+source = "registry+https://github.com/rust-lang/crates.io-index"
126+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
127+dependencies = [
128+ "rand_core",
129+]
130+
131+[[package]]
132+name = "strsim"
133+version = "0.8.0"
134+source = "registry+https://github.com/rust-lang/crates.io-index"
135+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
136+
137+[[package]]
138+name = "textwrap"
139+version = "0.11.0"
140+source = "registry+https://github.com/rust-lang/crates.io-index"
141+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
142+dependencies = [
143+ "unicode-width",
144+]
145+
146+[[package]]
147+name = "unicode-width"
148+version = "0.1.8"
149+source = "registry+https://github.com/rust-lang/crates.io-index"
150+checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
151+
152+[[package]]
153+name = "vec_map"
154+version = "0.8.2"
155+source = "registry+https://github.com/rust-lang/crates.io-index"
156+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
157+
158+[[package]]
159+name = "wasi"
160+version = "0.9.0+wasi-snapshot-preview1"
161+source = "registry+https://github.com/rust-lang/crates.io-index"
162+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
163+
164+[[package]]
165+name = "winapi"
166+version = "0.3.9"
167+source = "registry+https://github.com/rust-lang/crates.io-index"
168+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
169+dependencies = [
170+ "winapi-i686-pc-windows-gnu",
171+ "winapi-x86_64-pc-windows-gnu",
172+]
173+
174+[[package]]
175+name = "winapi-i686-pc-windows-gnu"
176+version = "0.4.0"
177+source = "registry+https://github.com/rust-lang/crates.io-index"
178+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
179+
180+[[package]]
181+name = "winapi-x86_64-pc-windows-gnu"
182+version = "0.4.0"
183+source = "registry+https://github.com/rust-lang/crates.io-index"
184+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
utils/genfly-utils/Cargo.tomlnew file+29
@@ -0,0 +1,29 @@
1+[package]
2+name = "genfly-utils"
3+version = "0.1.0"
4+authors = ["Andrei Orlov <aaorlov1@gmail.com>"]
5+edition = "2018"
6+
7+[dependencies]
8+clap = "2.33.1"
9+rand = "0.7.3"
10+
11+[[bin]]
12+name = "create"
13+path = "src/bin/create.rs"
14+
15+[[bin]]
16+name = "update"
17+path = "src/bin/update.rs"
18+
19+[[bin]]
20+name = "delete"
21+path = "src/bin/delete.rs"
22+
23+[[bin]]
24+name = "check"
25+path = "src/bin/check.rs"
26+
27+[[bin]]
28+name = "cleanup"
29+path = "src/bin/cleanup.rs"
utils/genfly-utils/Makefilenew file+7
@@ -0,0 +1,7 @@
1+.PHONY: install-musl-target build-musl
2+
3+build-musl:
4+ cargo build --release --target x86_64-unknown-linux-musl
5+
6+install-musl-target:
7+ rustup target add x86_64-unknown-linux-musl
utils/genfly-utils/docker/Dockerfilenew file+7
@@ -0,0 +1,7 @@
1+FROM busybox
2+
3+ADD tmp/create /utils/
4+ADD tmp/update /utils/
5+ADD tmp/delete /utils/
6+ADD tmp/check /utils/
7+ADD tmp/cleanup /utils/
utils/genfly-utils/docker/build_docker.shnew file+13
@@ -0,0 +1,13 @@
1+#! /bin/bash
2+
3+(cd .. && make)
4+mkdir tmp
5+cp ../target/x86_64-unknown-linux-musl/release/create ./tmp
6+cp ../target/x86_64-unknown-linux-musl/release/update ./tmp
7+cp ../target/x86_64-unknown-linux-musl/release/delete ./tmp
8+cp ../target/x86_64-unknown-linux-musl/release/check ./tmp
9+cp ../target/x86_64-unknown-linux-musl/release/cleanup ./tmp
10+
11+docker build --no-cache -f Dockerfile -t 560065381221.dkr.ecr.us-east-1.amazonaws.com/dms:genfly-utils .
12+
13+rm -r tmp
utils/genfly-utils/src/bin/check.rsnew file+3
@@ -0,0 +1,3 @@
1+fn main() {
2+ println!("ok");
3+}
utils/genfly-utils/src/bin/cleanup.rsnew file+58
@@ -0,0 +1,58 @@
1+use clap::{App, Arg};
2+use std::process::{exit, Command};
3+
4+use genfly_utils::*;
5+
6+fn main() -> std::io::Result<()> {
7+ let matches = App::new("delete")
8+ .version("0.1")
9+ .arg(
10+ Arg::with_name("project-name")
11+ .long("project-name")
12+ .short("p")
13+ .required(true)
14+ .takes_value(true),
15+ )
16+ .arg(
17+ Arg::with_name("namespace")
18+ .long("namespace")
19+ .short("s")
20+ .required(true)
21+ .takes_value(true),
22+ )
23+ .arg(
24+ Arg::with_name("name")
25+ .long("name")
26+ .short("n")
27+ .required(true)
28+ .takes_value(true),
29+ )
30+ .get_matches();
31+
32+ let project_name = matches.value_of("project-name").expect("get project-name");
33+ let namespace = matches.value_of("namespace").expect("get namepace");
34+ let name = matches.value_of("name").expect("get name");
35+ println!("project_name: {:?}", project_name);
36+ println!("namespace: {:?}", namespace);
37+ println!("name: {:?}", name);
38+
39+ let output = Command::new("kubectl")
40+ .args(delete_pvcs_atrs(namespace, name))
41+ .output()
42+ .expect("delete PVCs");
43+ let success = output.status.success();
44+ print_command_result(output);
45+
46+ let output = Command::new("kubectl")
47+ .args(delete_cert_atrs(namespace, name))
48+ .output()
49+ .expect("delete certificates");
50+ let success2 = output.status.success();
51+ print_command_result(output);
52+
53+ if !(success && success2) {
54+ exit(1)
55+ }
56+
57+ Ok(())
58+}
utils/genfly-utils/src/bin/create.rsnew file+121
@@ -0,0 +1,121 @@
1+use clap::{App, Arg};
2+use std::convert::TryInto;
3+use std::fs;
4+use std::path::Path;
5+use std::process::{exit, Command};
6+
7+use genfly_utils::*;
8+
9+fn main() -> std::io::Result<()> {
10+ let matches = App::new("create")
11+ .version("0.1")
12+ .arg(
13+ Arg::with_name("project-name")
14+ .long("project-name")
15+ .short("p")
16+ .required(true)
17+ .takes_value(true),
18+ )
19+ .arg(
20+ Arg::with_name("base-domain")
21+ .long("base-domain")
22+ .short("d")
23+ .required(true)
24+ .takes_value(true),
25+ )
26+ .arg(
27+ Arg::with_name("namespace")
28+ .long("namespace")
29+ .short("s")
30+ .required(true)
31+ .takes_value(true),
32+ )
33+ .arg(
34+ Arg::with_name("name")
35+ .long("name")
36+ .short("n")
37+ .required(true)
38+ .takes_value(true),
39+ )
40+ .arg(
41+ Arg::with_name("tag")
42+ .long("tag")
43+ .short("t")
44+ .required(true)
45+ .takes_value(true),
46+ )
47+ .arg(
48+ Arg::with_name("env")
49+ .long("env")
50+ .short("e")
51+ .required(false)
52+ .multiple(true)
53+ .takes_value(true),
54+ )
55+ .get_matches();
56+
57+ let project_name = matches.value_of("project-name").expect("get project-name");
58+ let base_domain = matches.value_of("base-domain").expect("get base-domain");
59+ let namespace = matches.value_of("namespace").expect("get namepace");
60+ let name = matches.value_of("name").expect("get name");
61+ let tag = matches.value_of("tag").expect("get tag");
62+ let envs = matches
63+ .values_of("env")
64+ .unwrap_or_else(Default::default)
65+ .map(|e| e.try_into().expect("get valid key=value"))
66+ .collect::<Vec<EnvPair>>();
67+
68+ println!("project_name: {:?}", project_name);
69+ println!("base_domain: {:?}", base_domain);
70+ println!("namespace: {:?}", namespace);
71+ println!("name: {:?}", name);
72+ println!("tag: {:?}", tag);
73+ println!("envs: {:?}", envs);
74+
75+ let b2b_heml = whereis("b2b-helm").expect("get b2b-helm path");
76+
77+ let tmp_dir = tmp_dir();
78+ let work_dir = Path::new("/tmp").join(tmp_dir);
79+ println!("use {:?} dir", work_dir);
80+
81+ let _guard = TmpDirGuard::new(&work_dir);
82+ fs::create_dir(&work_dir)?;
83+
84+ let output = Command::new("git")
85+ .args(&[
86+ "clone",
87+ "--recursive",
88+ "--depth=1",
89+ "git@github.com:Aviora/b2b-helm.git",
90+ ".",
91+ ])
92+ .current_dir(&work_dir)
93+ .output()
94+ .expect("clone repo");
95+ let success = output.status.success();
96+ print_command_result(output);
97+
98+ fs::copy(&b2b_heml, Path::new(&work_dir).join("b2b-helm"))?;
99+
100+ let output = Command::new("b2b-helm")
101+ .args(create_infra_atrs(base_domain, namespace, name))
102+ .current_dir(&work_dir)
103+ .output()
104+ .expect("create infra");
105+ let success2 = output.status.success();
106+ print_command_result(output);
107+
108+ let output = Command::new("b2b-helm")
109+ .args(create_app_atrs(base_domain, namespace, name, tag, envs))
110+ .current_dir(&work_dir)
111+ .output()
112+ .expect("create app");
113+ let success3 = output.status.success();
114+ print_command_result(output);
115+
116+ if !(success && success2 && success3) {
117+ exit(1)
118+ }
119+
120+ Ok(())
121+}
utils/genfly-utils/src/bin/delete.rsnew file+58
@@ -0,0 +1,58 @@
1+use clap::{App, Arg};
2+use std::process::{exit, Command};
3+
4+use genfly_utils::*;
5+
6+fn main() -> std::io::Result<()> {
7+ let matches = App::new("delete")
8+ .version("0.1")
9+ .arg(
10+ Arg::with_name("project-name")
11+ .long("project-name")
12+ .short("p")
13+ .required(true)
14+ .takes_value(true),
15+ )
16+ .arg(
17+ Arg::with_name("namespace")
18+ .long("namespace")
19+ .short("s")
20+ .required(true)
21+ .takes_value(true),
22+ )
23+ .arg(
24+ Arg::with_name("name")
25+ .long("name")
26+ .short("n")
27+ .required(true)
28+ .takes_value(true),
29+ )
30+ .get_matches();
31+
32+ let project_name = matches.value_of("project-name").expect("get project-name");
33+ let namespace = matches.value_of("namespace").expect("get namepace");
34+ let name = matches.value_of("name").expect("get name");
35+ println!("project_name: {:?}", project_name);
36+ println!("namespace: {:?}", namespace);
37+ println!("name: {:?}", name);
38+
39+ let output = Command::new("helm")
40+ .args(delete_app_atrs(name))
41+ .output()
42+ .expect("delete app");
43+ let success = output.status.success();
44+ print_command_result(output);
45+
46+ let output = Command::new("helm")
47+ .args(delete_infra_atrs(name))
48+ .output()
49+ .expect("delete infra");
50+ let success2 = output.status.success();
51+ print_command_result(output);
52+
53+ if !(success && success2) {
54+ exit(1)
55+ }
56+
57+ Ok(())
58+}
utils/genfly-utils/src/bin/update.rsnew file+113
@@ -0,0 +1,113 @@
1+use clap::{App, Arg};
2+use std::convert::TryInto;
3+use std::fs;
4+use std::path::Path;
5+use std::process::{exit, Command};
6+
7+use genfly_utils::*;
8+
9+fn main() -> std::io::Result<()> {
10+ let matches = App::new("update")
11+ .version("0.1")
12+ .arg(
13+ Arg::with_name("project-name")
14+ .long("project-name")
15+ .short("p")
16+ .required(true)
17+ .takes_value(true),
18+ )
19+ .arg(
20+ Arg::with_name("base-domain")
21+ .long("base-domain")
22+ .short("d")
23+ .required(true)
24+ .takes_value(true),
25+ )
26+ .arg(
27+ Arg::with_name("namespace")
28+ .long("namespace")
29+ .short("s")
30+ .required(true)
31+ .takes_value(true),
32+ )
33+ .arg(
34+ Arg::with_name("name")
35+ .long("name")
36+ .short("n")
37+ .required(true)
38+ .takes_value(true),
39+ )
40+ .arg(
41+ Arg::with_name("tag")
42+ .long("tag")
43+ .short("t")
44+ .required(true)
45+ .takes_value(true),
46+ )
47+ .arg(
48+ Arg::with_name("env")
49+ .long("env")
50+ .short("e")
51+ .required(false)
52+ .multiple(true)
53+ .takes_value(true),
54+ )
55+ .get_matches();
56+
57+ let project_name = matches.value_of("project-name").expect("get project-name");
58+ let base_domain = matches.value_of("base-domain").expect("get base-domain");
59+ let namespace = matches.value_of("namespace").expect("get namepace");
60+ let name = matches.value_of("name").expect("get name");
61+ let tag = matches.value_of("tag").expect("get tag");
62+ let envs = matches
63+ .values_of("env")
64+ .unwrap_or_else(Default::default)
65+ .map(|e| e.try_into().expect("get valid key=value"))
66+ .collect::<Vec<EnvPair>>();
67+
68+ println!("project_name: {:?}", project_name);
69+ println!("base_domain: {:?}", base_domain);
70+ println!("namespace: {:?}", namespace);
71+ println!("name: {:?}", name);
72+ println!("tag: {:?}", tag);
73+ println!("envs: {:?}", envs);
74+
75+ let b2b_heml = whereis("b2b-helm").expect("get b2b-helm path");
76+
77+ let tmp_dir = tmp_dir();
78+ let work_dir = Path::new("/tmp").join(tmp_dir);
79+ println!("use {:?} dir", work_dir);
80+
81+ let _guard = TmpDirGuard::new(&work_dir);
82+ fs::create_dir(&work_dir)?;
83+
84+ let output = Command::new("git")
85+ .args(&[
86+ "clone",
87+ "--recursive",
88+ "--depth=1",
89+ "git@github.com:Aviora/b2b-helm.git",
90+ ".",
91+ ])
92+ .current_dir(&work_dir)
93+ .output()
94+ .expect("clone repo");
95+ let success = output.status.success();
96+ print_command_result(output);
97+
98+ fs::copy(&b2b_heml, Path::new(&work_dir).join("b2b-helm"))?;
99+
100+ let output = Command::new("b2b-helm")
101+ .args(create_app_atrs(base_domain, namespace, name, tag, envs))
102+ .current_dir(&work_dir)
103+ .output()
104+ .expect("create app");
105+ let success2 = output.status.success();
106+ print_command_result(output);
107+
108+ if !(success && success2) {
109+ exit(1)
110+ }
111+
112+ Ok(())
113+}
utils/genfly-utils/src/lib.rsnew file+259
@@ -0,0 +1,259 @@
1+use rand::{
2+ distributions::{Alphanumeric, Distribution},
3+ thread_rng,
4+};
5+use std::convert::TryFrom;
6+use std::env;
7+use std::fs;
8+use std::path::Path;
9+use std::path::PathBuf;
10+use std::process::Output;
11+
12+const APP_CHART_NAME: &str = "b2b-dm-staging";
13+const INFRA_CHART_NAME: &str = "b2b-infra-dm-staging";
14+
15+pub fn tmp_dir() -> String {
16+ const LENGTH: usize = 10;
17+
18+ let rng = thread_rng();
19+ let random_string: String = Alphanumeric.sample_iter(rng).take(LENGTH).collect();
20+ format!("dm-{}", random_string)
21+}
22+
23+pub struct TmpDirGuard(PathBuf);
24+
25+impl TmpDirGuard {
26+ pub fn new(tmp_dir: &PathBuf) -> Self {
27+ TmpDirGuard(tmp_dir.clone())
28+ }
29+}
30+
31+impl Drop for TmpDirGuard {
32+ fn drop(&mut self) {
33+ match fs::remove_dir_all(&self.0) {
34+ Ok(_) => (),
35+ Err(err) => eprintln!("remove_dir_all error: {:?}", err),
36+ };
37+ }
38+}
39+
40+pub fn whereis(cmd: &str) -> Option<String> {
41+ env::var("PATH")
42+ .expect("get PATH")
43+ .split(':')
44+ .fold(None, |acc, path| {
45+ if acc.is_some() {
46+ acc
47+ } else {
48+ let full_path = Path::new(path).join(cmd);
49+ if full_path.is_file() {
50+ full_path.to_str().map(ToString::to_string)
51+ } else {
52+ None
53+ }
54+ }
55+ })
56+}
57+
58+pub fn print_command_result(output: Output) {
59+ println!("status: {}", output.status);
60+ println!(
61+ "{}",
62+ String::from_utf8(output.stdout).expect("valid stdout")
63+ );
64+ eprintln!(
65+ "{}",
66+ String::from_utf8(output.stderr).expect("valid stderr")
67+ );
68+}
69+
70+#[derive(Debug)]
71+pub struct EnvPair {
72+ pub key: String,
73+ pub value: String,
74+}
75+
76+impl TryFrom<&str> for EnvPair {
77+ type Error = &'static str;
78+ fn try_from(s: &str) -> Result<Self, Self::Error> {
79+ let parts = s.split('=').collect::<Vec<_>>();
80+ if parts.len() == 2 {
81+ Ok(EnvPair {
82+ key: parts[0].to_string(),
83+ value: parts[1].to_string(),
84+ })
85+ } else {
86+ Err("Malformed environment key-value pair, should be similar to FOO=bar")
87+ }
88+ }
89+}
90+
91+impl ToString for EnvPair {
92+ fn to_string(&self) -> String {
93+ format!("{}={}", self.key, self.value)
94+ }
95+}
96+
97+pub fn create_infra_atrs(domain: &str, namespace: &str, name: &str) -> Vec<String> {
98+ let chart = INFRA_CHART_NAME;
99+ let rn = release_name(chart, name);
100+ let db = rn.replace("-", "_");
101+ let es = "elasticsearch";
102+
103+ vec![
104+ "-d",
105+ "deploy",
106+ "--release-name",
107+ &rn,
108+ "--set",
109+ &format!("b2b-kafka-int.zk={}-zk-0.{}-zk.{}/int", rn, rn, namespace),
110+ "--set",
111+ &format!(
112+ "b2b-{}.cluster_hosts={}-{}-0.{}-{}.{}",
113+ es, rn, es, rn, es, namespace
114+ ),
115+ "--set",
116+ &format!("b2b-postgres.postgres_db={}", db),
117+ "--set",
118+ &format!("global.staging_name={}", name),
119+ "--set",
120+ &format!(
121+ "b2b-kibana.elasic_hosts=http://{}-{}-{}-0.{}-{}-{}.{}:9200",
122+ chart, name, es, chart, name, es, namespace
123+ ),
124+ "--set",
125+ &format!("b2b-kibana.domain=kibana.{}.{}", name, domain),
126+ chart,
127+ ]
128+ .iter()
129+ .map(ToString::to_string)
130+ .collect::<Vec<_>>()
131+}
132+
133+pub fn create_app_atrs(
134+ domain: &str,
135+ namespace: &str,
136+ name: &str,
137+ tag: &str,
138+ envs: Vec<EnvPair>,
139+) -> Vec<String> {
140+ let rn = release_name(APP_CHART_NAME, name);
141+ let rni = release_name(INFRA_CHART_NAME, name);
142+ let es = "elasticsearch";
143+
144+ let mut atrs = vec![
145+ "-d",
146+ "deploy",
147+ "--release-name",
148+ &rn,
149+ "--set",
150+ "b2b-app.api_enabled=true",
151+ "--set",
152+ &format!("b2b-app.email_domain={}.{}", name, domain),
153+ "--set",
154+ &format!("b2b-app.domain={}.{}", name, domain),
155+ "--set",
156+ &format!(
157+ "b2b-app.connections.pg_instance=avia:avia@{}-postgres-0.{}-postgres.{}:5432",
158+ rni, rni, namespace
159+ ),
160+ "--set",
161+ &format!(
162+ "b2b-app.connections.elastic=http://{}-{}.{}:9200",
163+ rni, es, namespace
164+ ),
165+ "--set",
166+ &format!(
167+ "b2b-app.connections.elasic_hosts=http://{}-{}-0.{}-{}.{}:9200",
168+ rni, es, rni, es, namespace
169+ ),
170+ "--set",
171+ &format!(
172+ "b2b-app.connections.redis={}-redis-0.{}-redis.{}:6379",
173+ rni, rni, namespace
174+ ),
175+ "--set",
176+ &format!(
177+ "b2b-app.connections.kafka_ext={}-kafka-int-0.{}-kafka-int:9092",
178+ rni, rni
179+ ),
180+ "--set",
181+ &format!(
182+ "b2b-app.connections.kafka_int={}-kafka-int-0.{}-kafka-int:9092",
183+ rni, rni
184+ ),
185+ "--set",
186+ &format!("global.staging_name={}", name),
187+ ]
188+ .iter()
189+ .map(ToString::to_string)
190+ .collect::<Vec<_>>();
191+
192+ let mut env_atrs = envs
193+ .into_iter()
194+ .map(|e| {
195+ vec![
196+ "--set".to_string(),
197+ format!("b2b-app.env.{}", e.to_string()),
198+ ]
199+ })
200+ .flatten()
201+ .collect::<Vec<_>>();
202+ let mut tagged_release_name = vec![tagged_release(APP_CHART_NAME, tag)];
203+
204+ atrs.append(&mut env_atrs);
205+ atrs.append(&mut tagged_release_name);
206+
207+ atrs
208+}
209+
210+pub fn delete_infra_atrs(name: &str) -> Vec<String> {
211+ vec!["delete", &release_name(INFRA_CHART_NAME, name), "--purge"]
212+ .iter()
213+ .map(ToString::to_string)
214+ .collect::<Vec<_>>()
215+}
216+
217+pub fn delete_app_atrs(name: &str) -> Vec<String> {
218+ vec!["delete", &release_name(APP_CHART_NAME, name), "--purge"]
219+ .iter()
220+ .map(ToString::to_string)
221+ .collect::<Vec<_>>()
222+}
223+
224+pub fn delete_pvcs_atrs(namespace: &str, name: &str) -> Vec<String> {
225+ vec![
226+ "delete",
227+ "pvc",
228+ "-n",
229+ namespace,
230+ "-l",
231+ &format!("staging={}", name),
232+ ]
233+ .iter()
234+ .map(ToString::to_string)
235+ .collect::<Vec<_>>()
236+}
237+
238+pub fn delete_cert_atrs(namespace: &str, name: &str) -> Vec<String> {
239+ vec![
240+ "delete",
241+ "certificate",
242+ "-n",
243+ namespace,
244+ &format!("b2b-dm-staging-{}-tls", name),
245+ &format!("b2b-dm-staging-{}-tls-tasker", name),
246+ &format!("b2b-infra-dm-staging-{}-kibana-tls", name),
247+ ]
248+ .iter()
249+ .map(ToString::to_string)
250+ .collect::<Vec<_>>()
251+}
252+
253+fn release_name(chart_name: &str, name: &str) -> String {
254+ format!("{}-{}", chart_name, name)
255+}
256+
257+fn tagged_release(chart_name: &str, tag: &str) -> String {
258+ format!("{}:{}", chart_name, tag)
259+}
utils/genfly-utils/src/main.rsnew file+3
@@ -0,0 +1,3 @@
1+fn main() {
2+ println!("Hello, world!");
3+}