diff --git a/src/runtime-rs/Cargo.lock b/src/runtime-rs/Cargo.lock index ae055471fb..67178e586a 100644 --- a/src/runtime-rs/Cargo.lock +++ b/src/runtime-rs/Cargo.lock @@ -9,7 +9,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -238,7 +238,7 @@ checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -316,7 +316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78d456f91b4c1fdebf2698214e599fec3d7f8b46e3140fb254a9ea88c970ab0a" dependencies = [ "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -438,9 +438,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cgroups-rs" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b098e7c3a70d03c288fa0a96ccf13e770eb3d78c4cc0e1549b3c13215d5f965" +checksum = "6db7c2f5545da4c12c5701455d9471da5f07db52e49b9cccb4f5512226dd0836" dependencies = [ "libc", "log", @@ -488,6 +488,16 @@ dependencies = [ "cc", ] +[[package]] +name = "command-fds" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f190f3c954f7bca3c6296d0ec561c739bdbe6c7e990294ed168d415f6e1b5b01" +dependencies = [ + "nix 0.27.1", + "thiserror", +] + [[package]] name = "common" version = "0.1.0" @@ -534,6 +544,37 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "containerd-shim" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063d0e137d508846210c2f8b6c6dc3db9f1abd4c20b0a9aecdb962385dcb7899" +dependencies = [ + "async-trait", + "cgroups-rs", + "command-fds", + "containerd-shim-protos", + "futures 0.3.28", + "go-flag", + "lazy_static", + "libc", + "log", + "mio", + "nix 0.27.1", + "oci-spec", + "os_pipe", + "page_size", + "prctl", + "serde", + "serde_json", + "signal-hook", + "signal-hook-tokio", + "thiserror", + "time 0.3.31", + "tokio", + "windows-sys 0.48.0", +] + [[package]] name = "containerd-shim-protos" version = "0.6.0" @@ -683,6 +724,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", + "strsim", "syn 1.0.109", ] @@ -871,6 +913,16 @@ dependencies = [ "vmm-sys-util 0.11.1", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + [[package]] name = "derivative" version = "2.2.0" @@ -893,6 +945,37 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_builder" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder_macro" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" +dependencies = [ + "derive_builder_core", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.9.0" @@ -1241,7 +1324,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -1306,6 +1389,18 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "getset" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "gimli" version = "0.27.3" @@ -2099,6 +2194,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.3.3", + "cfg-if 1.0.0", + "libc", + "memoffset 0.9.0", +] + [[package]] name = "ntapi" version = "0.4.1" @@ -2254,6 +2361,19 @@ dependencies = [ "serde_json", ] +[[package]] +name = "oci-spec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8384f8eff13954bafafba991f1910779020456f9694de25e81a13da5b7de6309" +dependencies = [ + "derive_builder", + "getset", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -2289,7 +2409,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -2431,12 +2551,32 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "os_pipe" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "parking" version = "2.1.0" @@ -2551,7 +2691,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -2588,6 +2728,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2595,10 +2741,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] -name = "proc-macro2" -version = "1.0.66" +name = "prctl" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "059a34f111a9dee2ce1ac2826a68b24601c4298cfeb1a587c3cb493d5ab46f52" +dependencies = [ + "libc", + "nix 0.26.2", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907a61bd0f64c2f29cd1cf1dc34d05176426a3f504a78010f08416ddb7b13708" dependencies = [ "unicode-ident", ] @@ -2778,9 +2958,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.32" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -3272,9 +3452,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.177" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63ba2516aa6bf82e0b19ca8b50019d52df58455d3cf9bdaf6315225fdd0c560a" +checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" dependencies = [ "serde_derive", ] @@ -3311,13 +3491,13 @@ checksum = "794e44574226fc701e3be5c651feb7939038fc67fb73f6f4dd5c4ba90fd3be70" [[package]] name = "serde_derive" -version = "1.0.177" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401797fe7833d72109fedec6bfcbe67c0eed9b99772f26eb8afd261f0abc6fd3" +checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -3387,7 +3567,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -3397,6 +3577,7 @@ dependencies = [ "anyhow", "async-trait", "common", + "containerd-shim", "containerd-shim-protos", "kata-types", "logging", @@ -3509,6 +3690,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -3518,6 +3709,18 @@ dependencies = [ "libc", ] +[[package]] +name = "signal-hook-tokio" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213241f76fb1e37e27de3b6aa1b068a2c333233b59cca6634f634b80a27ecf1e" +dependencies = [ + "futures-core", + "libc", + "signal-hook", + "tokio", +] + [[package]] name = "slab" version = "0.4.8" @@ -3554,7 +3757,7 @@ dependencies = [ "serde", "serde_json", "slog", - "time 0.3.23", + "time 0.3.31", ] [[package]] @@ -3589,7 +3792,7 @@ dependencies = [ "slog", "term", "thread_local", - "time 0.3.23", + "time 0.3.31", ] [[package]] @@ -3614,6 +3817,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strum" version = "0.24.1" @@ -3665,9 +3874,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.27" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -3763,7 +3972,7 @@ checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -3811,13 +4020,15 @@ dependencies = [ [[package]] name = "time" -version = "0.3.23" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ + "deranged", "itoa", "libc", "num_threads", + "powerfmt", "serde", "time-core", "time-macros", @@ -3825,15 +4036,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ "time-core", ] @@ -3890,7 +4101,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -3985,7 +4196,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", ] [[package]] @@ -4377,7 +4588,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", "wasm-bindgen-shared", ] @@ -4411,7 +4622,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4504,6 +4715,15 @@ dependencies = [ "windows-targets 0.48.1", ] +[[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.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -4534,6 +4754,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -4546,6 +4781,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -4558,6 +4799,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -4570,6 +4817,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -4582,6 +4835,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -4594,6 +4853,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4606,6 +4871,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -4618,6 +4889,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winreg" version = "0.50.0" diff --git a/src/runtime-rs/crates/runtimes/common/src/message.rs b/src/runtime-rs/crates/runtimes/common/src/message.rs index 622d5a1620..fa8dbb6fc5 100644 --- a/src/runtime-rs/crates/runtimes/common/src/message.rs +++ b/src/runtime-rs/crates/runtimes/common/src/message.rs @@ -47,6 +47,7 @@ impl Message { } const TASK_OOM_EVENT_TOPIC: &str = "/tasks/oom"; +const TASK_OOM_EVENT_URL: &str = "containerd.events.TaskOOM"; pub trait Event: std::fmt::Debug + Send { fn r#type(&self) -> String; @@ -60,7 +61,7 @@ impl Event for TaskOOM { } fn type_url(&self) -> String { - "containerd.events.TaskOOM".to_string() + TASK_OOM_EVENT_URL.to_string() } fn value(&self) -> Result> { diff --git a/src/runtime-rs/crates/service/Cargo.toml b/src/runtime-rs/crates/service/Cargo.toml index 1a89147508..09ef3223d9 100644 --- a/src/runtime-rs/crates/service/Cargo.toml +++ b/src/runtime-rs/crates/service/Cargo.toml @@ -16,6 +16,7 @@ ttrpc = "0.8" common = { path = "../runtimes/common" } containerd-shim-protos = { version = "0.6.0", features = ["async"]} +containerd-shim = { version = "0.6.0", features = ["async"] } logging = { path = "../../../libs/logging"} kata-types = { path = "../../../libs/kata-types" } runtimes = { path = "../runtimes" } diff --git a/src/runtime-rs/crates/service/src/event.rs b/src/runtime-rs/crates/service/src/event.rs new file mode 100644 index 0000000000..79cf711027 --- /dev/null +++ b/src/runtime-rs/crates/service/src/event.rs @@ -0,0 +1,156 @@ +// Copyright (c) 2019-2024 Ant Group +// +// SPDX-License-Identifier: Apache-2.0 +// + +use std::collections::HashMap; +use std::env; +use std::sync::Arc; + +use anyhow::{anyhow, Context, Result}; +use async_trait::async_trait; +use common::message::Event; +use containerd_shim::publisher::RemotePublisher; +use containerd_shim::util::timestamp; +use containerd_shim::TtrpcContext; +use containerd_shim_protos::protobuf::well_known_types::any::Any; +use containerd_shim_protos::shim::events; +use containerd_shim_protos::shim_async::Events; +use ttrpc::MessageHeader; + +const REMOTE_FORWARDER: &str = "remote"; +const LOG_FORWARDER: &str = "log"; + +// Ttrpc address passed from container runtime. +// For now containerd will pass the address, and CRI-O will not. +const TTRPC_ADDRESS_ENV: &str = "TTRPC_ADDRESS"; + +/// Forwarder forwards events to upper runtime. +#[async_trait] +pub(crate) trait Forwarder { + /// Forward an event to publisher + async fn forward(&self, event: Arc) -> Result<()>; + /// Get forwarder type + async fn r#type(&self) -> String; +} + +/// Returns an instance of `ContainerdForwarder` in the case of +/// `TTRPC_ADDRESS` existing. Otherwise, fall back to `LogForwarder`. +pub(crate) async fn new_event_publisher(namespace: &str) -> Result> { + let fwd: Box = match env::var(TTRPC_ADDRESS_ENV) { + Ok(address) => Box::new( + ContainerdForwarder::new(namespace, &address) + .await + .context("new containerd forwarder")?, + ), + Err(_) => Box::new( + LogForwarder::new(namespace) + .await + .context("new log forwarder")?, + ), + }; + + Ok(fwd) +} + +/// Events are forwarded to containerd via ttrpc. +struct ContainerdForwarder { + namespace: String, + publisher: RemotePublisher, +} + +impl ContainerdForwarder { + async fn new(namespace: &str, address: &str) -> Result { + let publisher = RemotePublisher::new(address) + .await + .context("new remote publisher")?; + Ok(Self { + namespace: namespace.to_string(), + publisher, + }) + } + + fn build_forward_request( + &self, + event: &Arc, + ) -> Result { + let mut envelope = events::Envelope::new(); + envelope.set_topic(event.r#type().clone()); + envelope.set_namespace(self.namespace.to_string()); + envelope.set_timestamp( + timestamp().map_err(|err| anyhow!("failed to get timestamp: {:?}", err))?, + ); + envelope.set_event(Any { + type_url: event.type_url().clone(), + value: event.value().context("get event value")?, + ..Default::default() + }); + + let mut req = events::ForwardRequest::new(); + req.set_envelope(envelope); + + Ok(req) + } +} + +#[async_trait] +impl Forwarder for ContainerdForwarder { + async fn forward(&self, event: Arc) -> Result<()> { + let req = self + .build_forward_request(&event) + .context("build forward request")?; + self.publisher + .forward(&default_ttrpc_context(), req) + .await + .context("forward")?; + Ok(()) + } + + async fn r#type(&self) -> String { + REMOTE_FORWARDER.to_string() + } +} + +/// Events are writen into logs. +struct LogForwarder { + namespace: String, +} + +impl LogForwarder { + async fn new(namespace: &str) -> Result { + Ok(Self { + namespace: namespace.to_string(), + }) + } +} + +#[async_trait] +impl Forwarder for LogForwarder { + async fn forward(&self, event: Arc) -> Result<()> { + let ts = timestamp().map_err(|err| anyhow!("failed to get timestamp: {:?}", err))?; + info!( + sl!(), + "Received an event: topic: {}, namespace: {}, timestamp: {}, url: {}, value: {:?}", + event.r#type(), + self.namespace, + ts.seconds, + event.type_url(), + event + ); + Ok(()) + } + + async fn r#type(&self) -> String { + LOG_FORWARDER.to_string() + } +} + +#[inline] +fn default_ttrpc_context() -> TtrpcContext { + TtrpcContext { + fd: 0, + mh: MessageHeader::default(), + metadata: HashMap::default(), + timeout_nano: 0, + } +} diff --git a/src/runtime-rs/crates/service/src/lib.rs b/src/runtime-rs/crates/service/src/lib.rs index 1f28a8009c..7049760ec8 100644 --- a/src/runtime-rs/crates/service/src/lib.rs +++ b/src/runtime-rs/crates/service/src/lib.rs @@ -9,6 +9,8 @@ extern crate slog; logging::logger_with_subsystem!(sl, "service"); +mod event; mod manager; -pub use manager::ServiceManager; mod task_service; + +pub use manager::ServiceManager; diff --git a/src/runtime-rs/crates/service/src/manager.rs b/src/runtime-rs/crates/service/src/manager.rs index 176ef9f538..5a28b17c54 100644 --- a/src/runtime-rs/crates/service/src/manager.rs +++ b/src/runtime-rs/crates/service/src/manager.rs @@ -4,28 +4,19 @@ // SPDX-License-Identifier: Apache-2.0 // -use std::{ - fs, - os::unix::io::{FromRawFd, RawFd}, - process::Stdio, - sync::Arc, -}; +use std::fs; +use std::os::unix::io::{FromRawFd, RawFd}; +use std::sync::Arc; use anyhow::{Context, Result}; -use common::message::{Action, Event, Message}; -use containerd_shim_protos::{ - protobuf::{well_known_types::any::Any, Message as ProtobufMessage}, - shim_async, -}; +use common::message::{Action, Message}; +use containerd_shim_protos::shim_async; use kata_types::config::KATA_PATH; use runtimes::RuntimeHandlerManager; -use tokio::{ - io::AsyncWriteExt, - process::Command, - sync::mpsc::{channel, Receiver}, -}; +use tokio::sync::mpsc::{channel, Receiver}; use ttrpc::asynchronous::Server; +use crate::event::{new_event_publisher, Forwarder}; use crate::task_service::TaskService; /// message buffer size @@ -38,6 +29,7 @@ pub struct ServiceManager { binary: String, address: String, namespace: String, + event_publisher: Box, } impl std::fmt::Debug for ServiceManager { @@ -70,6 +62,10 @@ impl ServiceManager { let handler = Arc::new(rt_mgr); let mut task_server = unsafe { Server::from_raw_fd(task_server_fd) }; task_server = task_server.set_domain_unix(); + let event_publisher = new_event_publisher(namespace) + .await + .context("new event publisher")?; + Ok(Self { receiver: Some(receiver), handler, @@ -77,6 +73,7 @@ impl ServiceManager { binary: containerd_binary.to_string(), address: address.to_string(), namespace: namespace.to_string(), + event_publisher, }) } @@ -99,7 +96,10 @@ impl ServiceManager { } Action::Event(event) => { info!(sl!(), "get event {:?}", &event); - self.send_event(event).await.context("send event") + self.event_publisher + .forward(event) + .await + .context("forward event") } }; @@ -158,40 +158,4 @@ impl ServiceManager { } Ok(()) } - - async fn send_event(&self, event: Arc) -> Result<()> { - let any = Any { - type_url: event.type_url(), - value: event.value().context("get event value")?, - ..Default::default() - }; - let data = any.write_to_bytes().context("write to any")?; - let mut child = Command::new(&self.binary) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .args([ - "--address", - &self.address, - "publish", - "--topic", - &event.r#type(), - "--namespace", - &self.namespace, - ]) - .spawn() - .context("spawn containerd cmd to publish event")?; - - let stdin = child.stdin.as_mut().context("failed to open stdin")?; - stdin - .write_all(&data) - .await - .context("failed to write to stdin")?; - let output = child - .wait_with_output() - .await - .context("failed to read stdout")?; - info!(sl!(), "get output: {:?}", output); - Ok(()) - } }