diff --git a/cli/Cargo.lock b/cli/Cargo.lock index 014daf7..67f71b3 100644 --- a/cli/Cargo.lock +++ b/cli/Cargo.lock @@ -2,21 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "aho-corasick" version = "1.1.3" @@ -226,21 +211,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base64" version = "0.22.1" @@ -253,6 +223,15 @@ version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.19.0" @@ -316,6 +295,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link 0.2.0", ] @@ -384,6 +364,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -399,6 +389,8 @@ dependencies = [ "colored", "cortexflow_agent_api", "directories", + "k8s-openapi", + "kube", "prost", "prost-types", "serde", @@ -411,7 +403,7 @@ dependencies = [ [[package]] name = "cortexflow_agent_api" -version = "0.1.1-beta.0" +version = "0.1.1-beta.2" dependencies = [ "anyhow", "aya", @@ -433,7 +425,7 @@ dependencies = [ [[package]] name = "cortexflow_identity" -version = "0.1.1-beta.0" +version = "0.1.1-beta.1" dependencies = [ "anyhow", "aya", @@ -441,13 +433,25 @@ dependencies = [ "bytemuck", "bytemuck_derive", "bytes", + "k8s-openapi", + "kube", "libc", "nix", + "serde_yaml", "tokio", "tracing", "tracing-subscriber", ] +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -457,6 +461,46 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "directories" version = "6.0.0" @@ -475,7 +519,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.60.2", + "windows-sys 0.61.1", ] [[package]] @@ -530,6 +574,29 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -537,6 +604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -545,6 +613,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + [[package]] name = "futures-sink" version = "0.3.31" @@ -563,10 +637,25 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", ] [[package]] @@ -592,12 +681,6 @@ dependencies = [ "wasi 0.14.3+wasi-0.2.4", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "h2" version = "0.4.12" @@ -634,6 +717,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.1", +] + [[package]] name = "http" version = "1.3.1" @@ -703,6 +795,24 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-timeout" version = "0.5.2" @@ -771,17 +881,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -813,6 +912,95 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonpath-rust" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c00ae348f9f8fd2d09f82a98ca381c60df9e0820d8d79fce43e649b4dc3128b" +dependencies = [ + "pest", + "pest_derive", + "regex", + "serde_json", + "thiserror 2.0.16", +] + +[[package]] +name = "k8s-openapi" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d13f06d5326a915becaffabdfab75051b8cdc260c2a5c06c0e90226ede89a692" +dependencies = [ + "base64", + "chrono", + "serde", + "serde_json", +] + +[[package]] +name = "kube" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e7bb0b6a46502cc20e4575b6ff401af45cfea150b34ba272a3410b78aa014e" +dependencies = [ + "k8s-openapi", + "kube-client", + "kube-core", +] + +[[package]] +name = "kube-client" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4987d57a184d2b5294fdad3d7fc7f278899469d21a4da39a8f6ca16426567a36" +dependencies = [ + "base64", + "bytes", + "chrono", + "either", + "futures", + "home", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-timeout", + "hyper-util", + "jsonpath-rust", + "k8s-openapi", + "kube-core", + "pem", + "rustls", + "secrecy", + "serde", + "serde_json", + "serde_yaml", + "thiserror 2.0.16", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tracing", +] + +[[package]] +name = "kube-core" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914bbb770e7bb721a06e3538c0edd2babed46447d128f7c21caa68747060ee73" +dependencies = [ + "chrono", + "derive_more", + "form_urlencoded", + "http", + "k8s-openapi", + "serde", + "serde-value", + "serde_json", + "thiserror 2.0.16", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -893,15 +1081,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - [[package]] name = "mio" version = "1.0.4" @@ -995,12 +1174,27 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + [[package]] name = "option-ext" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "parking_lot" version = "0.12.4" @@ -1024,12 +1218,65 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pest" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +dependencies = [ + "pest", + "sha2", +] + [[package]] name = "petgraph" version = "0.7.1" @@ -1230,10 +1477,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] -name = "rustc-demangle" -version = "0.1.26" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] [[package]] name = "rustix" @@ -1248,6 +1503,53 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "rustls" +version = "0.23.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -1260,32 +1562,106 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.1", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -1299,6 +1675,17 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -1351,6 +1738,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.106" @@ -1432,35 +1825,42 @@ dependencies = [ [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.1", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.17" @@ -1586,6 +1986,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "base64", + "bitflags", + "bytes", + "http", + "http-body", + "mime", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -1604,6 +2022,7 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1665,6 +2084,18 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "unicase" version = "2.8.1" @@ -1683,6 +2114,12 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "utf8parse" version = "0.2.2" @@ -1876,6 +2313,15 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-sys" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -2010,3 +2456,9 @@ name = "wit-bindgen" version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 8da801e..1af552a 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -23,7 +23,9 @@ tonic = "0.14.1" tonic-reflection = "0.14.1" prost-types = "0.14.1" prost = "0.14.1" -cortexflow_agent_api = "0.1.1-beta.2" +cortexflow_agent_api = {path = "../core/api",features = ["client"]} +kube = "2.0.1" +k8s-openapi = {version = "0.26.0", features = ["v1_34"]} [[bin]] name = "cfcli" diff --git a/cli/src/essential.rs b/cli/src/essential.rs index 6ff30d2..37f0e5d 100644 --- a/cli/src/essential.rs +++ b/cli/src/essential.rs @@ -1,8 +1,16 @@ +use std::collections::BTreeMap; +use std::ptr::read; +//TODO: Check if is possible to use the get_config_path function. Check for reusable components use std::{fs, io::stdin, path::PathBuf, process::exit}; use directories::ProjectDirs; +use k8s_openapi::api::core::v1::ConfigMap; +use k8s_openapi::serde_json::json; +use kube::Config; +use prost_types::MethodDescriptorProto; use serde::Serialize; -use std::fs::OpenOptions; +use std::fs::{Metadata, OpenOptions}; +use std::result::Result::Ok; use colored::Colorize; use std::thread; @@ -10,12 +18,15 @@ use std::time::Duration; use std::process::Command; +use kube::api::{Api, ObjectMeta, Patch, PatchParams, PostParams}; +use kube::client::Client; + pub struct GeneralData { env: String, } #[derive(Serialize)] pub struct MetadataConfigFile { - env: String, + blocklist: Vec, } #[derive(Debug)] pub enum Environments { @@ -27,10 +38,10 @@ impl TryFrom<&str> for Environments { fn try_from(environment: &str) -> Result { match environment { "kubernetes" | "k8s" => Ok(Environments::Kubernetes), - _ => Err(format!( - "Environment '{}' not supported. Please insert a supported value: Kubernetes, K8s", - environment - )), + _ => + Err( + format!("Environment '{}' not supported. Please insert a supported value: Kubernetes, K8s", environment) + ), } } } @@ -75,51 +86,21 @@ impl GeneralData { pub fn update_cli() { println!("{} {}", "=====>".blue().bold(), "Updating CortexFlow CLI"); - println!( - "{} {}", - "=====>".blue().bold(), - "Looking for a newer version" - ); + println!("{} {}", "=====>".blue().bold(), "Looking for a newer version"); - let output = Command::new("cargo") - .args(["update", "cortexflow-cli"]) - .output() - .expect("error"); + let output = Command::new("cargo").args(["update", "cortexflow-cli"]).output().expect("error"); if !output.status.success() { - eprintln!( - "Error updating CLI : {}", - String::from_utf8_lossy(&output.stderr) - ); + eprintln!("Error updating CLI : {}", String::from_utf8_lossy(&output.stderr)); } else { println!("✅ Updated CLI"); } } pub fn info(general_data: GeneralData) { - println!( - "{} {} {}", - "=====>".blue().bold(), - "Version:", - GeneralData::VERSION - ); - println!( - "{} {} {}", - "=====>".blue().bold(), - "Author:", - GeneralData::AUTHOR - ); - println!( - "{} {} {}", - "=====>".blue().bold(), - "Description:", - GeneralData::DESCRIPTION - ); - println!( - "{} {} {}", - "=====>".blue().bold(), - "Environment:", - general_data.get_env() - ); + println!("{} {} {}", "=====>".blue().bold(), "Version:", GeneralData::VERSION); + println!("{} {} {}", "=====>".blue().bold(), "Author:", GeneralData::AUTHOR); + println!("{} {} {}", "=====>".blue().bold(), "Description:", GeneralData::DESCRIPTION); + println!("{} {} {}", "=====>".blue().bold(), "Environment:", general_data.get_env()); } fn is_supported_env(env: &str) -> bool { @@ -127,89 +108,133 @@ fn is_supported_env(env: &str) -> bool { } pub fn create_configs() -> MetadataConfigFile { - let mut user_input: String = String::new(); - println!( - "{} {}", - "=====>".blue().bold(), - "Insert your cluster environment (e.g. Kubernetes)".white() - ); - stdin().read_line(&mut user_input).unwrap(); - let cluster_environment = user_input.trim().to_string(); - - if !is_supported_env(&cluster_environment) { - eprintln!( - "Cannot save cluster environment data. Installation aborted. Please insert supported environment" - ); - exit(1); - } + let mut blocklist: Vec = Vec::new(); + blocklist.push("".to_string()); - let configs = MetadataConfigFile { - env: cluster_environment, - }; + let configs = MetadataConfigFile { blocklist }; configs } -//TODO: add here and explaination of what read_configs returns -pub fn read_configs(config_path: PathBuf) -> String { - let config = fs::File::open(config_path).unwrap(); - let parsed_config: Result = - serde_yaml::from_reader(config); - - match parsed_config { - Ok(cfg) => { - let env = &cfg["env"].as_str().unwrap().to_string(); - thread::sleep(Duration::from_secs(1)); - println!( - "{} {} {:?}", - "[SYSTEM]".blue().bold(), - "Readed configs for env variable:".white(), - env - ); - return env.to_string(); +pub async fn read_configs() -> Result, anyhow::Error> { + let client = Client::try_default().await?; + let namespace = "cortexflow"; + let configmap = "cortexbrain-client-config"; + let api: Api = Api::namespaced(client, namespace); + + let cm = api.get(configmap).await?; + + if let Some(data) = cm.data { + if let Some(blocklist_raw) = data.get("blocklist") { + let lines: Vec = blocklist_raw + .lines() + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) // ignora righe vuote + .collect(); + + return Ok(lines); + } + } + + Ok(Vec::new()) //in case the key fails +} +pub async fn create_config_file(config_struct: MetadataConfigFile) -> Result<(), anyhow::Error> { + let client = Client::try_default().await?; + let namespace = "cortexflow"; + let configmap = "cortexbrain-client-config"; + + let api: Api = Api::namespaced(client, namespace); + + // create configmap + let mut data = BTreeMap::new(); + for x in config_struct.blocklist { + data.insert("blocklist".to_string(), x); + } + let cm = ConfigMap { + metadata: ObjectMeta { + name: Some("cortexbrain-client-config".to_string()), + ..Default::default() + }, // type ObjectMeta + data: Some(data), //type Option> + ..Default::default() + }; + match api.create(&PostParams::default(), &cm).await { + Ok(_) => { + println!("Configmap created successfully"); } Err(e) => { - eprintln!("An error occured while reading the config file: {:?}", e); - exit(1) + eprintln!("An error occured: {}", e); } - } + }; + Ok(()) } -pub fn create_config_file(config_struct: MetadataConfigFile) { - let dirs = ProjectDirs::from("org", "cortexflow", "cfcli") - .expect("Cannot determine the config directory"); - let config_dir = dirs.config_dir().to_path_buf(); - let config_save_path = config_dir.join("config.yaml"); +pub async fn update_config_metadata(input: &str, action: &str) { + if action == "add" { + //retrieve current blocked ips list + let mut ips = read_configs().await.unwrap(); + println!("Readed current blocked ips: {:?}", ips); + + //create a temporary vector of ips + ips.push(input.to_string()); + + // override blocklist parameters + let new_configs = MetadataConfigFile { blocklist: ips }; + //create a new config + update_configmap(new_configs).await; + } else if action == "delete" { + let mut ips = read_configs().await.unwrap(); + if let Some(index) = ips.iter().position(|target| target == &input.to_string()) { + ips.remove(index); + } else { + eprintln!("Index of element not found"); + } - //create directory - fs::create_dir_all(&config_dir).expect("Cannot create directories"); + // override blocklist parameters + let new_configs = MetadataConfigFile { blocklist: ips }; + //create a new config + update_configmap(new_configs).await; + } +} - let configs = OpenOptions::new() - .write(true) - .create(true) - .open(&config_save_path) - .expect("Cannot open config file"); +pub async fn update_configmap(config_struct: MetadataConfigFile) -> Result<(), anyhow::Error> { + let client = Client::try_default().await?; + let namespace = "cortexflow"; + let name = "cortexbrain-client-config"; + let api: Api = Api::namespaced(client, namespace); + + let blocklist_yaml = config_struct + .blocklist + .iter() + .map(|x| format!("{}", x)) + .collect::>() + .join("\n"); + + let patch = Patch::Apply(json!({ + "apiVersion": "v1", + "kind": "ConfigMap", + "data": { + "blocklist": blocklist_yaml + } + })); - match serde_yaml::to_writer(configs, &config_struct) { + let patch_params = PatchParams::apply("cortexbrain").force(); + match api.patch(name, &patch_params, &patch).await { Ok(_) => { - println!("\n"); - thread::sleep(Duration::from_secs(1)); - println!( - "{} {}{:?}", - "[SYSTEM]".blue().bold(), - "Configuration files saved in path :".white(), - &config_save_path.display() - ); - println!("\n"); + println!("Map updated successfully"); + } + Err(e) => { + eprintln!("An error occured during the patching process: {}", e); + return Err(e.into()); } - Err(e) => eprintln!( - "An error occured during the creation of the config files. {:?}", - e - ), } + + Ok(()) } + //TODO: add here an explanation of what are config_dir and file_path pub fn get_config_directory() -> Result<(PathBuf, PathBuf), ()> { - let dirs = ProjectDirs::from("org", "cortexflow", "cfcli") - .expect("Cannot determine the config directory"); + let dirs = ProjectDirs::from("org", "cortexflow", "cfcli").expect( + "Cannot determine the config directory" + ); let config_dir = dirs.config_dir().to_path_buf(); let file_path = config_dir.join("config.yaml"); @@ -224,4 +249,3 @@ pub fn get_startup_config_dir() -> bool { }) .unwrap_or(false) } -// TODO: add save to config function \ No newline at end of file diff --git a/cli/src/install.rs b/cli/src/install.rs index 5fe7ebc..af0ae48 100644 --- a/cli/src/install.rs +++ b/cli/src/install.rs @@ -39,12 +39,6 @@ fn install_cluster_components(env: String) { println!("{} {}", "=====>".blue().bold(), "Copying installation files".white()); copy_installation_files(); thread::sleep(Duration::from_secs(1)); - println!("{} {}", "=====>".blue().bold(), "Creating cortexflow namespace".white()); - Command::new(env) - .args(["create", "namespace", "cortexflow"]) - .output() - .expect("Failed to create cortexflow namespace"); - install_components(env.to_string()); println!("\n"); rm_installation_files(); @@ -79,15 +73,19 @@ fn install_simple_example_component(env: String) { } /* main installation function */ -pub fn install_cortexflow() { +pub async fn install_cortexflow() { println!("{} {}", "=====>".blue().bold(), "Preparing cortexflow installation".white()); println!("{} {}", "=====>".blue().bold(), "Creating the config files".white()); - let metadata_configs = create_configs(); - create_config_file(metadata_configs); + println!("{} {}", "=====>".blue().bold(), "Creating cortexflow namespace".white()); + Command::new("kubectl") + .args(["create", "namespace", "cortexflow"]) + .output() + .expect("Failed to create cortexflow namespace"); - let file_path = get_config_directory().unwrap().1; + let metadata_configs = create_configs(); + create_config_file(metadata_configs).await; - let env = read_configs(file_path); + let env = "kubernetes".to_string(); install_cluster_components(env); } /* install simple example */ @@ -96,7 +94,7 @@ pub fn install_simple_example() { let file_path = get_config_directory().unwrap().1; - let env = read_configs(file_path); + let env = "kubectl".to_string(); install_simple_example_component(env); } @@ -131,7 +129,6 @@ fn install_example(env: String) { /* Installation functions */ fn install_components(env: String) { let files_to_install = vec![ - "configmap.yaml", "configmap-role.yaml", "rolebinding.yaml", "cortexflow-rolebinding.yaml", @@ -179,9 +176,6 @@ fn apply_component(file: &str, env: &str) { } fn copy_installation_files() { - download_file( - "https://raw.githubusercontent.com/CortexFlow/CortexBrain/refs/heads/main/core/src/testing/configmap.yaml" - ); download_file( "https://raw.githubusercontent.com/CortexFlow/CortexBrain/refs/heads/main/core/src/testing/configmap-role.yaml" ); @@ -192,7 +186,7 @@ fn copy_installation_files() { "https://raw.githubusercontent.com/CortexFlow/CortexBrain/refs/heads/main/core/src/testing/cortexflow-rolebinding.yaml" ); download_file( - "https://raw.githubusercontent.com/CortexFlow/CortexBrain/refs/heads/main/core/src/testing/identity.yaml" + "https://raw.githubusercontent.com/CortexFlow/CortexBrain/refs/heads/feature/ebpf-core/core/src/testing/identity.yaml" ); download_file( "https://raw.githubusercontent.com/CortexFlow/CortexBrain/refs/heads/feature/ebpf-core/core/src/testing/agent.yaml" @@ -207,7 +201,6 @@ fn copy_example_installation_file() { } fn rm_installation_files() { println!("{} {}", "=====>".blue().bold(), "Removing temporary installation files".white()); - rm_file("configmap.yaml"); rm_file("configmap-role.yaml"); rm_file("rolebinding.yaml"); rm_file("cortexflow-rolebinding.yaml"); diff --git a/cli/src/logs.rs b/cli/src/logs.rs index d4b5b5d..2e760d3 100644 --- a/cli/src/logs.rs +++ b/cli/src/logs.rs @@ -48,7 +48,7 @@ impl Component { fn check_namespace_exists(namespace: &str) -> bool { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -70,7 +70,7 @@ fn check_namespace_exists(namespace: &str) -> bool { fn get_available_namespaces() -> Vec { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -105,7 +105,7 @@ fn get_available_namespaces() -> Vec { fn get_pods_for_service(namespace: &str, service_name: &str) -> Vec { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -144,7 +144,7 @@ fn get_pods_for_service(namespace: &str, service_name: &str) -> Vec { fn get_pods_for_component(namespace: &str, component: &Component) -> Vec { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -183,7 +183,7 @@ fn get_pods_for_component(namespace: &str, component: &Component) -> Vec fn get_all_pods(namespace: &str) -> Vec { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -220,7 +220,7 @@ fn get_all_pods(namespace: &str) -> Vec { pub fn logs_command(service: Option, component: Option, namespace: Option) { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { diff --git a/cli/src/main.rs b/cli/src/main.rs index d1c0586..77f1104 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -4,39 +4,29 @@ mod essential; mod install; mod logs; mod monitoring; +mod policies; mod service; mod status; mod uninstall; -mod policies; use clap::command; -use clap::{ Args, Error, Parser, Subcommand }; +use clap::{Args, Error, Parser, Subcommand}; use colored::Colorize; use std::result::Result::Ok; +use std::string; use tracing::debug; -use crate::essential::{ - get_config_directory, - get_startup_config_dir, - info, - read_configs, - update_cli, -}; -use crate::install::{ InstallArgs, InstallCommands, install_cortexflow, install_simple_example }; -use crate::logs::{ LogsArgs, logs_command }; -use crate::monitoring::{ list_features, monitor_identity_events, MonitorArgs, MonitorCommands }; -use crate::service::{ ServiceCommands, ServiceArgs, describe_service, list_services }; -use crate::status::{ StatusArgs, status_command }; +use crate::essential::{get_config_directory, get_startup_config_dir, info, read_configs, update_cli}; +use crate::install::{InstallArgs, InstallCommands, install_cortexflow, install_simple_example}; +use crate::logs::{LogsArgs, logs_command}; +use crate::monitoring::{MonitorArgs, MonitorCommands, list_features, monitor_identity_events}; +use crate::policies::{PoliciesArgs, PoliciesCommands, check_blocklist, create_blocklist, remove_ip}; +use crate::service::{ServiceArgs, ServiceCommands, describe_service, list_services}; +use crate::status::{StatusArgs, status_command}; use crate::uninstall::uninstall; -use crate::policies::{ - PoliciesCommands, - PoliciesArgs, - create_blocklist, - check_blocklist, - remove_ip, -}; use crate::essential::GeneralData; +use crate::essential::update_config_metadata; #[derive(Parser, Debug)] #[command( @@ -77,129 +67,127 @@ struct SetArgs { async fn args_parser() -> Result<(), Error> { let args = Cli::parse(); - - //get the environment from the config file metadata - - let config_dir = get_startup_config_dir(); - - if !config_dir { - eprintln!( - "{} {}", - "[SYSTEM]".blue().bold(), - "Config files not found. Please proceed with the installation" - ); - install_cortexflow(); - Ok(()) - } else { - println!("{} {}", "[SYSTEM]".blue().bold(), "Founded config files".white()); - let config_file_path = get_config_directory(); - let file_path = config_file_path.unwrap().1; - let env = read_configs(file_path.to_path_buf()); - let general_data = GeneralData::new(env); - debug!("Arguments {:?}", args.cmd); - match args.cmd { - Some(Commands::SetEnv(env)) => { - general_data.set_env(env.val); + let env = "kubernetes".to_string(); + let general_data = GeneralData::new(env); + debug!("Arguments {:?}", args.cmd); + match args.cmd { + Some(Commands::SetEnv(env)) => { + general_data.set_env(env.val); + Ok(()) + } + Some(Commands::GetEnv) => { + general_data.get_env_output(); + Ok(()) + } + Some(Commands::Install(installation_args)) => match installation_args.install_cmd { + InstallCommands::All => { + install_cortexflow().await; Ok(()) } - Some(Commands::GetEnv) => { - general_data.get_env_output(); + InstallCommands::TestPods => { + install_simple_example(); Ok(()) } - Some(Commands::Install(installation_args)) => - match installation_args.install_cmd { - InstallCommands::All => { - install_cortexflow(); - Ok(()) - } - InstallCommands::TestPods => { - install_simple_example(); - Ok(()) - } - } - Some(Commands::Uninstall) => { - uninstall(); - Ok(()) - } - Some(Commands::Update) => { - update_cli(); + }, + Some(Commands::Uninstall) => { + uninstall(); + Ok(()) + } + Some(Commands::Update) => { + update_cli(); + Ok(()) + } + Some(Commands::Info) => { + info(general_data); + Ok(()) + } + Some(Commands::Service(service_args)) => match service_args.service_cmd { + ServiceCommands::List { namespace } => { + Some(list_services(namespace)); Ok(()) } - Some(Commands::Info) => { - info(general_data); + ServiceCommands::Describe { + service_name, + namespace, + } => { + describe_service(service_name, &namespace); Ok(()) } - Some(Commands::Service(service_args)) => - match service_args.service_cmd { - ServiceCommands::List { namespace } => { - Some(list_services(namespace)); - Ok(()) - } - ServiceCommands::Describe { service_name, namespace } => { - describe_service(service_name, &namespace); - Ok(()) - } - } - Some(Commands::Status(status_args)) => { - status_command(status_args.output, status_args.namespace); + }, + Some(Commands::Status(status_args)) => { + status_command(status_args.output, status_args.namespace); + Ok(()) + } + Some(Commands::Logs(logs_args)) => { + logs_command(logs_args.service, logs_args.component, logs_args.namespace); + Ok(()) + } + Some(Commands::Monitor(monitor_args)) => match monitor_args.monitor_cmd { + MonitorCommands::List => { + let _ = list_features().await; Ok(()) } - Some(Commands::Logs(logs_args)) => { - logs_command(logs_args.service, logs_args.component, logs_args.namespace); + MonitorCommands::Connections => { + let _ = monitor_identity_events().await; Ok(()) } - Some(Commands::Monitor(monitor_args)) => { - match monitor_args.monitor_cmd { - MonitorCommands::List => { - let _ = list_features().await; - Ok(()) - } - MonitorCommands::Connections => { - let _ = monitor_identity_events().await; - Ok(()) - } + }, + Some(Commands::Policies(policies_args)) => { + match policies_args.policy_cmd { + PoliciesCommands::CheckBlocklist => { + let _ = check_blocklist().await; + Ok(()) } - } - Some(Commands::Policies(policies_args)) => { - match policies_args.policy_cmd { - PoliciesCommands::CheckBlocklist => { - let _ = check_blocklist().await; - Ok(()) - } - PoliciesCommands::CreateBlocklist => { - // pass the ip as a monitoring flag - match policies_args.flags { - None => { - println!("{}","Insert at least one ip to create a blocklist".red()); - Ok(()) - } - Some(exclude_flag) => { - println!("inserted ip: {} ", exclude_flag); - let _ = create_blocklist(&exclude_flag).await; - Ok(()) + PoliciesCommands::CreateBlocklist => { + // pass the ip as a monitoring flag + match policies_args.flags { + None => { + println!("{}", "Insert at least one ip to create a blocklist".red()); + Ok(()) + } + Some(exclude_flag) => { + println!("inserted ip: {} ", exclude_flag); + //insert the ip in the blocklist + match create_blocklist(&exclude_flag).await { + Ok(_) => { + //update the config metadata + let _ = update_config_metadata(&exclude_flag, "add").await; + } + Err(e) => { + println!("{}", e); + } } + Ok(()) } } - PoliciesCommands::RemoveIpFromBlocklist => { - match policies_args.flags { - None => { - println!("{}","Insert at least one ip to remove from the blocklist".red()); - Ok(()) + } + PoliciesCommands::RemoveIpFromBlocklist => match policies_args.flags { + None => { + println!( + "{}", + "Insert at least one ip to remove from the blocklist".red() + ); + Ok(()) + } + Some(ip) => { + println!("Inserted ip: {}", ip); + match remove_ip(&ip).await { + Ok(_) => { + let _ = update_config_metadata(&ip, "delete").await; } - Some(ip) => { - println!("Inserted ip: {}", ip); - let _ = remove_ip(&ip).await; - Ok(()) + Err(e) => { + println!("{}", e); } } + Ok(()) } - } - } - None => { - eprintln!("CLI unknown argument. Cli arguments passed: {:?}", args.cmd); - Ok(()) + }, } } + None => { + eprintln!("CLI unknown argument. Cli arguments passed: {:?}", args.cmd); + Ok(()) + } } } diff --git a/cli/src/monitoring.rs b/cli/src/monitoring.rs index 56578e8..75941ac 100644 --- a/cli/src/monitoring.rs +++ b/cli/src/monitoring.rs @@ -75,15 +75,18 @@ pub async fn list_features() -> Result<(), Error> { "Error:", e ); + return Err(e); } } } - Err(_) => + Err(e) =>{ println!( "{} {}", "=====>".blue().bold(), "Failed to connect to CortexFlow Server Reflection".red() - ), + ); + return Err(e); + } } Ok(()) } @@ -121,15 +124,18 @@ pub async fn monitor_identity_events() -> Result<(), Error> { "Error:", e ); + return Err(e); } } } - Err(_) => + Err(e) =>{ println!( "{} {}", "=====>".blue().bold(), "Failed to connect to CortexFlow Client".red() - ), + ); + return Err(e); + } } Ok(()) diff --git a/cli/src/policies.rs b/cli/src/policies.rs index 9f264d1..03841e9 100644 --- a/cli/src/policies.rs +++ b/cli/src/policies.rs @@ -46,15 +46,17 @@ pub async fn create_blocklist(ip: &str) -> Result<(), Error> { "Error:", e ); + return Err(e) } } } - Err(_) => { + Err(e) => { println!( "{} {}", "=====>".blue().bold(), "Failed to connect to CortexFlow Client".red() ); + return Err(e) } } Ok(()) @@ -78,15 +80,17 @@ pub async fn check_blocklist() -> Result<(), Error> { "Error:", e ); + return Err(e); } } } - Err(_) => { + Err(e) => { println!( "{} {}", "=====>".blue().bold(), "Failed to connect to CortexFlow Client".red() ); + return Err(e); } } Ok(()) @@ -108,15 +112,17 @@ pub async fn remove_ip(ip:&str) -> Result<(), Error> { "Error:", e ); + return Err(e); } } } - Err(_) => { + Err(e) => { println!( "{} {}", "=====>".blue().bold(), "Failed to connect to CortexFlow Client".red() ); + return Err(e); } } Ok(()) diff --git a/cli/src/service.rs b/cli/src/service.rs index e16e33a..42788a1 100644 --- a/cli/src/service.rs +++ b/cli/src/service.rs @@ -29,7 +29,7 @@ pub struct ServiceArgs { fn check_namespace_exists(namespace: &str) -> bool { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -49,7 +49,7 @@ fn check_namespace_exists(namespace: &str) -> bool { fn get_available_namespaces() -> Vec { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -85,7 +85,7 @@ pub fn list_services(namespace: Option) -> Result<(), Error> { //TODO: maybe we can list both services and pods let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { Ok(cluster_environment) => { @@ -185,7 +185,7 @@ pub fn describe_service(service_name: String, namespace: &Option) { Ok(_) => { let file_path = get_config_directory().unwrap().1; - let env = read_configs(file_path); + let env = "kubectl".to_string(); let ns = namespace.clone().unwrap_or_else(|| "cortexflow".to_string()); diff --git a/cli/src/status.rs b/cli/src/status.rs index de750d1..772a64a 100644 --- a/cli/src/status.rs +++ b/cli/src/status.rs @@ -119,7 +119,7 @@ pub fn status_command(output_format: Option, namespace: Option) fn check_namespace_exists(namespace: &str) -> bool { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -141,7 +141,7 @@ fn check_namespace_exists(namespace: &str) -> bool { fn get_available_namespaces() -> Vec { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -176,7 +176,7 @@ fn get_available_namespaces() -> Vec { fn get_pods_status(namespace: &str) -> Vec<(String, String, String)> { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file = "kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { @@ -215,7 +215,7 @@ fn get_pods_status(namespace: &str) -> Vec<(String, String, String)> { fn get_services_status(namespace: &str) -> Vec<(String, String, String)> { let file_path = get_config_directory().unwrap().1; - let env_from_file = read_configs(file_path); + let env_from_file ="kubernetes".to_string(); let user_env = Environments::try_from(env_from_file.to_lowercase()); match user_env { diff --git a/cli/src/uninstall.rs b/cli/src/uninstall.rs index 4253ce6..91e6329 100644 --- a/cli/src/uninstall.rs +++ b/cli/src/uninstall.rs @@ -1,76 +1,76 @@ use crate::essential::{Environments, get_config_directory, read_configs}; use colored::Colorize; -use tracing::debug; use std::io::stdin; use std::process::Command; +use tracing::debug; use std::thread; use std::time::Duration; pub fn uninstall() { - let file_path = get_config_directory().unwrap().1; - let dir_config_path = get_config_directory().unwrap().0; - debug!("file_path variable:{:?}", dir_config_path); - let env_from_file = read_configs(file_path.clone()); - let user_env = Environments::try_from(env_from_file.to_lowercase()); + //let file_path = get_config_directory().unwrap().1; + //let dir_config_path = get_config_directory().unwrap().0; + //debug!("file_path variable:{:?}", dir_config_path); + //let env_from_file = read_configs(file_path.clone()); + //let user_env = Environments::try_from(env_from_file.to_lowercase()); + + //match user_env { + // Ok(cluster_environment) => { + let env = "kubectl".to_string(); + println!( + "{} {}", + "=====>".blue().bold(), + "Uninstalling cortexflow..." + ); + let mut userinput: String = String::new(); + println!("{} {}", "=====>".blue().bold(), "Select one option:"); + display_uninstall_options(); + stdin() + .read_line(&mut userinput) + .expect("Error reading user input"); - match user_env { - Ok(cluster_environment) => { - let env = cluster_environment.base_command(); + let trimmed_input = userinput.trim(); + if trimmed_input == "1" { + uninstall_all(&env); + println!( + "{} {}", + "=====>".blue().bold(), + "Do you want to remove the command line metadata? [y/n]" + ); + + //clear the user input before assigning a new value + userinput.clear(); + stdin() + .read_line(&mut userinput) + .expect("Error reading user input"); + + if userinput.trim() == "y" { println!( "{} {}", "=====>".blue().bold(), - "Uninstalling cortexflow..." + "Deleting metadata config files" + ); + //println!( + // "{} {}: {:?}", + // "=====>".blue().bold(), + // "Removing", + // dir_config_path.clone() + //); + //rm_dir(dir_config_path.as_os_str().to_str().unwrap()); + } else if userinput.trim() == "n" { + println!( + "{} {}", + "=====>".blue().bold(), + "Skipping metadata config files deletion" ); - let mut userinput: String = String::new(); - println!("{} {}", "=====>".blue().bold(), "Select one option:"); - display_uninstall_options(); - stdin() - .read_line(&mut userinput) - .expect("Error reading user input"); - - let trimmed_input = userinput.trim(); - if trimmed_input == "1" { - uninstall_all(env); - println!( - "{} {}", - "=====>".blue().bold(), - "Do you want to remove the command line metadata? [y/n]" - ); - - //clear the user input before assigning a new value - userinput.clear(); - stdin() - .read_line(&mut userinput) - .expect("Error reading user input"); - - if userinput.trim() == "y" { - println!( - "{} {}", - "=====>".blue().bold(), - "Deleting metadata config files" - ); - println!( - "{} {}: {:?}", - "=====>".blue().bold(), - "Removing", - dir_config_path.clone() - ); - rm_dir(dir_config_path.as_os_str().to_str().unwrap()); - } else if userinput.trim() == "n" { - println!( - "{} {}", - "=====>".blue().bold(), - "Skipping metadata config files deletion" - ); - } - } else if trimmed_input == "2" { - uninstall_component("deployment", "cortexflow-identity", env); - } } - Err(e) => println!("An error occured while reading the config files: {}", e), + } else if trimmed_input == "2" { + uninstall_component("deployment", "cortexflow-identity", &env.to_owned()); } } +// Err(e) => println!("An error occured while reading the config files: {}", e), +//} +//} fn display_uninstall_options() { println!("{} {}", "=====>".blue().bold(), "1 > all"); @@ -83,7 +83,20 @@ fn uninstall_all(env: &str) { "=====>".blue().bold(), "Deleting cortexflow components".red() ); - uninstall_component("namespace", "cortexflow", env); + //uninstall_component("namespace", "cortexflow", env); + let output = Command::new(env) + .args(["delete", "namespace", "cortexflow"]) + .output() + .expect("Error deleting cortexflow namespace"); + + if !output.status.success() { + eprintln!( + "Error deleting cortexflow namespace:\n{}", + String::from_utf8_lossy(&output.stderr) + ); + } else { + println!("✅ Removed cortexflow namespace"); + } } fn uninstall_component(component_type: &str, component: &str, env: &str) { diff --git a/core/Cargo.lock b/core/Cargo.lock index d289779..4ff5da1 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -2,21 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "aho-corasick" version = "1.1.3" @@ -131,9 +116,9 @@ dependencies = [ "bytes", "libc", "log", - "object 0.36.7", + "object", "once_cell", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -182,7 +167,7 @@ dependencies = [ "aya-log-common 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "bytes", "log", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -243,23 +228,8 @@ dependencies = [ "core-error", "hashbrown 0.15.5", "log", - "object 0.36.7", - "thiserror", -] - -[[package]] -name = "backtrace" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object 0.37.3", - "rustc-demangle", - "windows-link", + "object", + "thiserror 1.0.69", ] [[package]] @@ -274,6 +244,15 @@ version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.19.0" @@ -337,6 +316,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -359,6 +339,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -367,7 +357,7 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cortexflow_agent_api" -version = "0.1.1-beta.1" +version = "0.1.1-beta.2" dependencies = [ "anyhow", "aya", @@ -397,13 +387,25 @@ dependencies = [ "bytemuck", "bytemuck_derive", "bytes", + "k8s-openapi", + "kube", "libc", "nix", + "serde_yaml", "tokio", "tracing", "tracing-subscriber", ] +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -413,6 +415,46 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "either" version = "1.15.0" @@ -471,6 +513,29 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -478,6 +543,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -486,6 +552,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + [[package]] name = "futures-sink" version = "0.3.31" @@ -504,10 +576,36 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] @@ -522,12 +620,6 @@ dependencies = [ "wasi 0.14.7+wasi-0.2.4", ] -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - [[package]] name = "h2" version = "0.4.12" @@ -570,6 +662,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "http" version = "1.3.1" @@ -639,6 +740,24 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-timeout" version = "0.5.2" @@ -707,17 +826,6 @@ dependencies = [ "hashbrown 0.16.0", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] - [[package]] name = "itertools" version = "0.14.0" @@ -743,6 +851,95 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonpath-rust" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c00ae348f9f8fd2d09f82a98ca381c60df9e0820d8d79fce43e649b4dc3128b" +dependencies = [ + "pest", + "pest_derive", + "regex", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "k8s-openapi" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d13f06d5326a915becaffabdfab75051b8cdc260c2a5c06c0e90226ede89a692" +dependencies = [ + "base64", + "chrono", + "serde", + "serde_json", +] + +[[package]] +name = "kube" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e7bb0b6a46502cc20e4575b6ff401af45cfea150b34ba272a3410b78aa014e" +dependencies = [ + "k8s-openapi", + "kube-client", + "kube-core", +] + +[[package]] +name = "kube-client" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4987d57a184d2b5294fdad3d7fc7f278899469d21a4da39a8f6ca16426567a36" +dependencies = [ + "base64", + "bytes", + "chrono", + "either", + "futures", + "home", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-timeout", + "hyper-util", + "jsonpath-rust", + "k8s-openapi", + "kube-core", + "pem", + "rustls", + "secrecy", + "serde", + "serde_json", + "serde_yaml", + "thiserror 2.0.17", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tracing", +] + +[[package]] +name = "kube-core" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914bbb770e7bb721a06e3538c0edd2babed46447d128f7c21caa68747060ee73" +dependencies = [ + "chrono", + "derive_more", + "form_urlencoded", + "http", + "k8s-openapi", + "serde", + "serde-value", + "serde_json", + "thiserror 2.0.17", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -838,15 +1035,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - [[package]] name = "mio" version = "1.0.4" @@ -928,21 +1116,27 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "parking_lot" version = "0.12.5" @@ -966,12 +1160,65 @@ dependencies = [ "windows-link", ] +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pest" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +dependencies = [ + "pest", + "sha2", +] + [[package]] name = "petgraph" version = "0.7.1" @@ -1173,10 +1420,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298" [[package]] -name = "rustc-demangle" -version = "0.1.26" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] [[package]] name = "rustix" @@ -1191,18 +1446,132 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.23.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -1223,6 +1592,43 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -1269,6 +1675,12 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.106" @@ -1293,7 +1705,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -1305,7 +1717,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", ] [[package]] @@ -1319,6 +1740,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thread_local" version = "1.1.9" @@ -1330,35 +1762,42 @@ dependencies = [ [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.17" @@ -1484,6 +1923,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "base64", + "bitflags", + "bytes", + "http", + "http-body", + "mime", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -1502,6 +1959,7 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1563,6 +2021,18 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "unicase" version = "2.8.1" @@ -1575,6 +2045,18 @@ version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "valuable" version = "0.1.1" @@ -1750,6 +2232,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -1917,3 +2408,9 @@ name = "wit-bindgen" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" diff --git a/core/api/Cargo.toml b/core/api/Cargo.toml index 5136245..4bc6d80 100644 --- a/core/api/Cargo.toml +++ b/core/api/Cargo.toml @@ -10,6 +10,10 @@ repository = "https://github.com/CortexFlow/CortexBrain" license = "Apache-2.0" readme = "../../README.md" +[features] +default = ["client"] +client = [] + [dependencies] anyhow = "1.0.98" @@ -25,7 +29,7 @@ tracing-subscriber = "0.3.19" tokio-stream = "0.1.17" bytemuck = {version ="1.23.0"} bytemuck_derive = "1.10.1" -cortexflow_identity = "0.1.1-beta.1" +cortexflow_identity = {path = "../src/components/identity", features = ["enums"]} chrono = "0.4.42" [build-dependencies] diff --git a/core/api/Dockerfile b/core/api/Dockerfile index fc89272..468bf97 100644 --- a/core/api/Dockerfile +++ b/core/api/Dockerfile @@ -1,5 +1,5 @@ # Phase 1: Build image -FROM rust:1.86 AS builder +FROM rust:1.90 AS builder # Install system dependencies including protoc RUN apt-get update && apt-get install -y \ diff --git a/core/api/config.yaml b/core/api/config.yaml deleted file mode 100644 index 337f8f3..0000000 --- a/core/api/config.yaml +++ /dev/null @@ -1,131 +0,0 @@ -default: - base_dir: "/etc/edgemesh" - config_file: "/etc/edgemesh/config-file" - edgemesh_agent_config_name: "edgemesh-agent.yaml" - edgemesh_gateway_config_name: "edgemesh-gateway.yaml" - - edgemesh_proxy_module_name: "EdgeProxy" - edgemesh_gateway_module_name: "EdgeGateway" - edgemesh_tunnel_module_name: "EdgeTunnel" - edgemesh_cni_module_name: "EdgeCNI" - - bridge_device_name: "edgemesh0" - bridge_device_ip: "169.254.96.16" - tun_device_name: "edge_tun0" - - temp_kube_config_path: "kubeconfig" - temp_core_file_path: "corefile" - meta_server_address: "http://127.0.0.1:10550" - meta_server_cert_dir: "/etc/edgemesh/metaserver/" - meta_server_ca_file: "/etc/edgemesh/metaserver/rootCA.crt" - meta_server_cert_file: "/etc/edgemesh/metaserver/server.crt" - meta_server_key_file: "/etc/edgemesh/metaserver/server.key" - - cloud_mode: "CloudMode" - manual_mode: "ManualMode" - kubeapi: - master: "127.0.0.1:54616" - content_type: "application/vnd.kubernetes.protobuf" - qps: 50 - burst: 100 - kube_config: "~/.kube/config" - meta_server: null - delete_kube_config: false - edge_dns: - edge_mode: "EdgeMode" - edge_mode_enable: true - module_name: "EdgeDNS" - enable: true - listen_interface: - listen_port: 5353 - cache_dns: - enable: true - auto_detect: true - upstream_servers: #will be delete in the next update - cache_ttl: 20 - proxy: - enable: true - listen_interface: - service_filter_mode: - filter_if_label_exists_mode: "FilterIfLabelExists" - filter_if_label_doesn_not_exists_mode: "FilterIfLabelDoesNotExists" - loadbalancer_caller: - proxy_caller: "ProxyCaller" - gateway_caller: "GatewayCaller" - discovery_type: - mdns_discovery: "MDNS" - dht_discovery: "DHT" - edgeCNI: - enable: true - encap_ip: "192.168.1.1" - tun_mode: 0 - mesh_cidr_config: null - - empty_node_name: "EMPTY_NODE_NAME" - empty_pod_name: "EMPTY_POD_NAME" - -v1: - base_dir: "/etc/edgemesh" - config_file: "/etc/edgemesh/config-file" - edgemesh_agent_config_name: "edgemesh-agent.yaml" - edgemesh_gateway_config_name: "edgemesh-gateway.yaml" - - edgemesh_proxy_module_name: "EdgeProxy" - edgemesh_gateway_module_name: "EdgeGateway" - edgemesh_tunnel_module_name: "EdgeTunnel" - edgemesh_cni_module_name: "EdgeCNI" - - bridge_device_name: "edgemesh0" - bridge_device_ip: "169.254.96.16" - tun_device_name: "edge_tun0" - - temp_kube_config_path: "kubeconfig" - temp_core_file_path: "corefile" - meta_server_address: "http://127.0.0.1:10550" - meta_server_cert_dir: "/etc/edgemesh/metaserver/" - meta_server_ca_file: "/etc/edgemesh/metaserver/rootCA.crt" - meta_server_cert_file: "/etc/edgemesh/metaserver/server.crt" - meta_server_key_file: "/etc/edgemesh/metaserver/server.key" - - cloud_mode: "CloudMode" - manual_mode: "ManualMode" - kubeapi: - master: "127.0.0.1:54616" - content_type: "application/vnd.kubernetes.protobuf" - qps: 50 - burst: 100 - kube_config: "~/.kube/config" - meta_server: null - delete_kube_config: false - edge_dns: - edge_mode: "EdgeMode" - edge_mode_enable: true - module_name: "EdgeDNS" - enable: true - listen_interface: - listen_port: 53 - cache_dns: - enable: true - auto_detect: true - upstream_servers: #will be delete in the next update - cache_ttl: 20 - proxy: - enable: true - listen_interface: "lo" - service_filter_mode: - filter_if_label_exists_mode: "FilterIfLabelExists" - filter_if_label_doesn_not_exists_mode: "FilterIfLabelDoesNotExists" - loadbalancer_caller: - proxy_caller: "ProxyCaller" - gateway_caller: "GatewayCaller" - discovery_type: - mdns_discovery: "MDNS" - dht_discovery: "DHT" - edgeCNI: - enable: true - encap_ip: "192.168.1.1" - tun_mode: 0 - mesh_cidr_config: null - - empty_node_name: "EMPTY_NODE_NAME" - empty_pod_name: "EMPTY_POD_NAME" diff --git a/core/api/src/api.rs b/core/api/src/api.rs index 4bb266d..51ff64d 100644 --- a/core/api/src/api.rs +++ b/core/api/src/api.rs @@ -221,15 +221,6 @@ impl Agent for AgentApi { } } - //if 'exclude' flag is not None exclude the events from the aggregated events - //TODO: move this section into the event reader - //TODO: transform the block_list parameter in a parameter that the user can pass using the CLI - //let block_list = "135.171.168.192".to_string(); - //if aggregated_events.contains(&block_list) { - // aggregated_events.remove(&block_list); - // info!("Blocked ip from block_list: {:?}", block_list); - //} - //log response for debugging info!("DEBUGGING RESPONSE FROM ACTIVE CONNECTION REQUEST: {:?}", aggregated_events); diff --git a/core/api/src/client.rs b/core/api/src/client.rs index b4080b2..844ea75 100644 --- a/core/api/src/client.rs +++ b/core/api/src/client.rs @@ -8,6 +8,7 @@ use crate::agent::agent_client::AgentClient; const AGENT_IP : &str = "http://127.0.0.1:9090"; +#[cfg(feature="client")] pub async fn connect_to_client() -> Result, Error> { //this methods force a HTTP/2 connection from a static string //FIXME: this will require an update to ensure a protected connection @@ -17,7 +18,7 @@ pub async fn connect_to_client() -> Result, Error> { let client = AgentClient::new(channel); Ok(client) } - +#[cfg(feature="client")] pub async fn connect_to_server_reflection() -> Result, Error> { //this methods force a HTTP/2 connection from a static string let channel = Channel::from_static(AGENT_IP) diff --git a/core/api/src/requests.rs b/core/api/src/requests.rs index 4bb2228..e9fb2b1 100644 --- a/core/api/src/requests.rs +++ b/core/api/src/requests.rs @@ -16,6 +16,7 @@ use crate::agent::AddIpToBlocklistRequest; use crate::agent::RmIpFromBlocklistRequest; use crate::agent::RmIpFromBlocklistResponse; +#[cfg(feature = "client")] pub async fn send_active_connection_request( mut client: AgentClient ) -> Result, Error> { @@ -24,6 +25,7 @@ pub async fn send_active_connection_request( Ok(response) } +#[cfg(feature = "client")] pub async fn get_all_features( mut client: ServerReflectionClient ) -> Result>, Error> { @@ -36,6 +38,7 @@ pub async fn get_all_features( Ok(response) } +#[cfg(feature = "client")] pub async fn send_create_blocklist_request( mut client: AgentClient, ip: &str @@ -46,6 +49,7 @@ pub async fn send_create_blocklist_request( Ok(response) } +#[cfg(feature = "client")] pub async fn send_check_blocklist_request( mut client: AgentClient ) -> Result, Error> { @@ -54,6 +58,7 @@ pub async fn send_check_blocklist_request( Ok(response) } +#[cfg(feature = "client")] pub async fn remove_ip_from_blocklist_request( mut client: AgentClient, ip: &str diff --git a/core/src/components/identity/Cargo.toml b/core/src/components/identity/Cargo.toml index c27cd70..dd0f401 100644 --- a/core/src/components/identity/Cargo.toml +++ b/core/src/components/identity/Cargo.toml @@ -9,16 +9,25 @@ documentation = "https://docs.cortexflow.org" homepage = "https://docs.cortexflow.org" repository = "https://github.com/CortexFlow/CortexBrain" +[features] +default = ["map-handlers","struct","enums"] +map-handlers = [] +struct = [] +enums = [] + + [dependencies] aya = "0.13.1" aya-log = "0.2.1" bytes = "1.4" -tokio = { version = "1", features = ["full"] } +tokio = { version = "1.48.0", features = ["rt","rt-multi-thread","fs","signal","fs","time","macros"] } anyhow = "1.0" tracing = "0.1.41" tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } libc = "0.2.172" bytemuck = {version ="1.23.0",features = ["derive"]} bytemuck_derive = "1.10.1" - nix = { version = "0.30.1", features = ["net"] } +kube = {version = "2.0.1",features = ["client"]} +k8s-openapi = {version ="0.26.0", features = ["v1_34"]} +serde_yaml = "0.9.34" diff --git a/core/src/components/identity/Dockerfile b/core/src/components/identity/Dockerfile index 5a9c7af..197b5cb 100644 --- a/core/src/components/identity/Dockerfile +++ b/core/src/components/identity/Dockerfile @@ -1,5 +1,5 @@ # Phase 1: Build image -FROM rust:1.85 AS builder +FROM rust:1.90 AS builder # Set working directory WORKDIR /usr/src/app/identity-service diff --git a/core/src/components/identity/src/enums.rs b/core/src/components/identity/src/enums.rs index 144dfaa..b0b271b 100644 --- a/core/src/components/identity/src/enums.rs +++ b/core/src/components/identity/src/enums.rs @@ -2,6 +2,7 @@ * IpProtocols enum to reconstruct the packet protocol based on the * IPV4 Header Protocol code */ +#[cfg(feature="enums")] #[derive(Debug)] #[repr(u8)] pub enum IpProtocols { diff --git a/core/src/components/identity/src/main.rs b/core/src/components/identity/src/main.rs index 5fc2607..2e6813c 100644 --- a/core/src/components/identity/src/main.rs +++ b/core/src/components/identity/src/main.rs @@ -23,7 +23,7 @@ use aya::{ }; use crate::helpers::{ display_events, display_veth_events, get_veth_channels }; -use crate::map_handlers::{ init_bpf_maps, map_pinner }; +use crate::map_handlers::{ init_bpf_maps, map_pinner,populate_blocklist }; use bytes::BytesMut; use std::{ convert::TryInto, path::Path, sync::{ Arc, Mutex, atomic::{ AtomicBool, Ordering } } }; @@ -70,7 +70,7 @@ async fn main() -> Result<(), anyhow::Error> { .context("PIN_MAP_PATH environment variable required")?; match init_bpf_maps(bpf.clone()) { - std::result::Result::Ok(bpf_maps) => { + std::result::Result::Ok(mut bpf_maps) => { info!("Successfully loaded bpf maps"); //TODO: save the bpf maps in a Vec instead of using a tuple @@ -85,6 +85,10 @@ async fn main() -> Result<(), anyhow::Error> { let interfaces = get_veth_channels(); info!("Found interfaces: {:?}", interfaces); + + { + populate_blocklist(&mut bpf_maps.2).await; + } { init_tc_classifier(bpf.clone(), interfaces, link_ids.clone()) diff --git a/core/src/components/identity/src/map_handlers.rs b/core/src/components/identity/src/map_handlers.rs index ecbbf3a..49697b7 100644 --- a/core/src/components/identity/src/map_handlers.rs +++ b/core/src/components/identity/src/map_handlers.rs @@ -1,18 +1,24 @@ use anyhow::Error; use anyhow::Ok; use aya::Bpf; +use aya::maps::HashMap; use aya::maps::Map; +use k8s_openapi::api::core::v1::ConfigMap; +use kube::{Api, Client}; +use std::net::Ipv4Addr; use std::path::PathBuf; +use std::str::FromStr; use std::sync::Arc; use std::sync::Mutex; use tokio::fs; -use tracing::info; +use tracing::{error, info}; pub fn init_bpf_maps(bpf: Arc>) -> Result<(Map, Map, Map), anyhow::Error> { // this function init the bpfs maps used in the main program /* index 0: events_map index 1: veth_map + index 2: blocklist map */ let mut bpf_new = bpf.lock().unwrap(); @@ -28,18 +34,8 @@ pub fn init_bpf_maps(bpf: Arc>) -> Result<(Map, Map, Map), anyhow::Er .take_map("Blocklist") .ok_or_else(|| anyhow::anyhow!("Blocklist map not found"))?; - /* EDIT: this part is paused right now - info!("loading bpf connections map"); + // - //init connection map - let connections_map_raw = bpf - .take_map("ConnectionMap") - .context("failed to take connections map")?; - - let connection_tracker_map = bpf - .take_map("ConnectionTrackerMap") - .context("failed to take ConnectionTrackerMap map")?; - */ Ok((events_map, veth_map, blocklist_map)) } @@ -70,3 +66,39 @@ pub async fn map_pinner(maps: &(Map, Map, Map), path: &PathBuf) -> Result<(), Er Ok(()) } +pub async fn populate_blocklist(map: &mut Map) -> Result<(), Error> { + let client = Client::try_default().await.unwrap(); + let namespace = "cortexflow"; + let configmap = "cortexbrain-client-config"; + + let mut blocklist_map =HashMap::<_, [u8; 4],[u8;4]>::try_from(map)?; + + + let api: Api = Api::namespaced(client, namespace); + match api.get(configmap).await { + std::result::Result::Ok(configs) => { + info!("Configmap : {} loaded correctly ", configmap); + info!("[CONFIGMAP]: {:?} ", configs); + if let Some(data) = configs.data { + if let Some(blocklist) = data.get("blocklist") { + let addresses: Vec = blocklist + .lines() + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) + .collect(); + //String parsing from "x y" to ["x","y"] + info!("Inserting addresses: {:?}", addresses); + for item in addresses { + let addr = Ipv4Addr::from_str(&item)?.octets(); + let _ = blocklist_map.insert(addr, addr, 0); + } + } + } + Ok(()) + } + std::result::Result::Err(e) => { + error!("An error occured while reading configmap: {}", e); + return Err(e.into()); + } + } +} diff --git a/core/src/components/metrics/Cargo.toml b/core/src/components/metrics/Cargo.toml index 9116a11..b2b4fb8 100644 --- a/core/src/components/metrics/Cargo.toml +++ b/core/src/components/metrics/Cargo.toml @@ -7,7 +7,7 @@ edition = "2024" aya = "0.13.1" aya-log = "0.2.1" bytes = "1.4" -tokio = { version = "1", features = ["full"] } +tokio = { version = "1.48.0", features = ["rt","macros","time","fs","signal","rt-multi-thread"] } anyhow = "1.0" tracing = "0.1.41" tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } diff --git a/core/src/components/metrics/Dockerfile b/core/src/components/metrics/Dockerfile index 001099d..b5674bf 100644 --- a/core/src/components/metrics/Dockerfile +++ b/core/src/components/metrics/Dockerfile @@ -1,5 +1,5 @@ # Phase 1: Build image -FROM rust:1.85 AS builder +FROM rust:1.90 AS builder # Set working directory WORKDIR /usr/src/app/metrics diff --git a/core/src/testing/configmap.yaml b/core/src/testing/configmap.yaml deleted file mode 100644 index a56c1d6..0000000 --- a/core/src/testing/configmap.yaml +++ /dev/null @@ -1,138 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: cortexbrain-client-config - namespace: cortexflow -data: - config.yaml: | - default: - base_dir: "/etc/edgemesh" - config_file: "/etc/edgemesh/config-file" - edgemesh_agent_config_name: "edgemesh-agent.yaml" - edgemesh_gateway_config_name: "edgemesh-gateway.yaml" - - edgemesh_proxy_module_name: "EdgeProxy" - edgemesh_gateway_module_name: "EdgeGateway" - edgemesh_tunnel_module_name: "EdgeTunnel" - edgemesh_cni_module_name: "EdgeCNI" - - bridge_device_name: "edgemesh0" - bridge_device_ip: "169.254.96.16" - tun_device_name: "edge_tun0" - - temp_kube_config_path: "kubeconfig" - temp_core_file_path: "corefile" - meta_server_address: "http://127.0.0.1:10550" - meta_server_cert_dir: "/etc/edgemesh/metaserver/" - meta_server_ca_file: "/etc/edgemesh/metaserver/rootCA.crt" - meta_server_cert_file: "/etc/edgemesh/metaserver/server.crt" - meta_server_key_file: "/etc/edgemesh/metaserver/server.key" - - cloud_mode: "CloudMode" - manual_mode: "ManualMode" - kubeapi: - master: "127.0.0.1:54616" - content_type: "application/vnd.kubernetes.protobuf" - qps: 50 - burst: 100 - kube_config: "~/.kube/config" - meta_server: null - delete_kube_config: false - edge_dns: - edge_mode: "EdgeMode" - edge_mode_enable: true - module_name: "EdgeDNS" - enable: true - listen_interface: "" - listen_port: 5353 - cache_dns: - enable: true - auto_detect: true - upstream_servers: #will be delete in the next update - cache_ttl: 20 - proxy: - enable: true - listen_interface: "" - service_filter_mode: - filter_if_label_exists_mode: "FilterIfLabelExists" - filter_if_label_doesn_not_exists_mode: "FilterIfLabelDoesNotExists" - loadbalancer_caller: - proxy_caller: "ProxyCaller" - gateway_caller: "GatewayCaller" - discovery_type: - mdns_discovery: "MDNS" - dht_discovery: "DHT" - edgeCNI: - enable: true - encap_ip: "192.168.1.1" - tun_mode: 0 - mesh_cidr_config: null - - empty_node_name: "EMPTY_NODE_NAME" - empty_pod_name: "EMPTY_POD_NAME" - - v1: - base_dir: "/etc/edgemesh" - config_file: "/etc/edgemesh/config-file" - edgemesh_agent_config_name: "edgemesh-agent.yaml" - edgemesh_gateway_config_name: "edgemesh-gateway.yaml" - - edgemesh_proxy_module_name: "EdgeProxy" - edgemesh_gateway_module_name: "EdgeGateway" - edgemesh_tunnel_module_name: "EdgeTunnel" - edgemesh_cni_module_name: "EdgeCNI" - - bridge_device_name: "edgemesh0" - bridge_device_ip: "169.254.96.16" - tun_device_name: "edge_tun0" - - temp_kube_config_path: "kubeconfig" - temp_core_file_path: "corefile" - meta_server_address: "http://127.0.0.1:10550" - meta_server_cert_dir: "/etc/edgemesh/metaserver/" - meta_server_ca_file: "/etc/edgemesh/metaserver/rootCA.crt" - meta_server_cert_file: "/etc/edgemesh/metaserver/server.crt" - meta_server_key_file: "/etc/edgemesh/metaserver/server.key" - - cloud_mode: "CloudMode" - manual_mode: "ManualMode" - kubeapi: - master: "127.0.0.1:54616" - content_type: "application/vnd.kubernetes.protobuf" - qps: 50 - burst: 100 - kube_config: "~/.kube/config" - meta_server: null - delete_kube_config: false - edge_dns: - edge_mode: "EdgeMode" - edge_mode_enable: true - module_name: "EdgeDNS" - enable: true - listen_interface: "lo" - listen_port: 53 - cache_dns: - enable: true - auto_detect: true - upstream_servers: #will be delete in the next update - cache_ttl: 20 - proxy: - enable: true - listen_interface: "lo" - service_filter_mode: - filter_if_label_exists_mode: "FilterIfLabelExists" - filter_if_label_doesn_not_exists_mode: "FilterIfLabelDoesNotExists" - loadbalancer_caller: - proxy_caller: "ProxyCaller" - gateway_caller: "GatewayCaller" - discovery_type: - mdns_discovery: "MDNS" - dht_discovery: "DHT" - edgeCNI: - enable: true - encap_ip: "192.168.1.1" - tun_mode: 0 - mesh_cidr_config: null - - empty_node_name: "EMPTY_NODE_NAME" - empty_pod_name: "EMPTY_POD_NAME" diff --git a/core/src/testing/identity.yaml b/core/src/testing/identity.yaml index 0aa1bdf..968894b 100644 --- a/core/src/testing/identity.yaml +++ b/core/src/testing/identity.yaml @@ -53,7 +53,7 @@ spec: - SYS_PTRACE containers: - name: identity - image: lorenzotettamanti/cortexflow-identity:0.1.1-beta.1 + image: lorenzotettamanti/cortexflow-identity:0.1.1-beta.2 command: ["/bin/bash", "-c"] args: - |