From 88463cfb5c2f191036bb8da0fd11638632422c11 Mon Sep 17 00:00:00 2001 From: Felipe Gonzalez Date: Thu, 22 Aug 2024 17:14:52 -0300 Subject: [PATCH] chore: Implement delete project (#92) * chore: Implement UpdateResource * Improve tests * Fix warnings * Attempt to fix tests * Attempt to fix tests * Attempt to fix tests * Attempt to fix tests * chore: Implement delete project * Update specs to use main * Fix tests --- ...093efcc9014f9a6b933ab74c84fff3e14f41f.json | 12 + ...db58274696265b4e07c0737640ad6c16f4d1f.json | 12 + Cargo.lock | 219 ++++++++++-------- src/domain/event/mod.rs | 11 + src/domain/project/cache.rs | 9 +- src/domain/project/cluster.rs | 26 ++- src/domain/project/command.rs | 42 +++- src/domain/resource/command.rs | 1 + src/driven/cache/project.rs | 38 +++ src/driven/k8s/mod.rs | 21 ++ src/drivers/cache/mod.rs | 3 + src/drivers/grpc/project.rs | 17 ++ src/drivers/monitor/mod.rs | 4 + test/expect | 14 ++ 14 files changed, 333 insertions(+), 96 deletions(-) create mode 100644 .sqlx/query-0bab15fb43284f30749c198e059093efcc9014f9a6b933ab74c84fff3e14f41f.json create mode 100644 .sqlx/query-87dcb0c3d7fcf546c09d1908196db58274696265b4e07c0737640ad6c16f4d1f.json diff --git a/.sqlx/query-0bab15fb43284f30749c198e059093efcc9014f9a6b933ab74c84fff3e14f41f.json b/.sqlx/query-0bab15fb43284f30749c198e059093efcc9014f9a6b933ab74c84fff3e14f41f.json new file mode 100644 index 0000000..ab17ba7 --- /dev/null +++ b/.sqlx/query-0bab15fb43284f30749c198e059093efcc9014f9a6b933ab74c84fff3e14f41f.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n UPDATE project\n SET status=$2, updated_at=$3\n WHERE id=$1;\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "0bab15fb43284f30749c198e059093efcc9014f9a6b933ab74c84fff3e14f41f" +} diff --git a/.sqlx/query-87dcb0c3d7fcf546c09d1908196db58274696265b4e07c0737640ad6c16f4d1f.json b/.sqlx/query-87dcb0c3d7fcf546c09d1908196db58274696265b4e07c0737640ad6c16f4d1f.json new file mode 100644 index 0000000..a6dd4dc --- /dev/null +++ b/.sqlx/query-87dcb0c3d7fcf546c09d1908196db58274696265b4e07c0737640ad6c16f4d1f.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n UPDATE resource\n SET status=$2, updated_at=$3\n WHERE project_id=$1;\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "87dcb0c3d7fcf546c09d1908196db58274696265b4e07c0737640ad6c16f4d1f" +} diff --git a/Cargo.lock b/Cargo.lock index bdd0140..529517a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,7 +103,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -114,7 +114,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -281,9 +281,12 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.1.8" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" +checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -373,15 +376,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] @@ -476,7 +479,7 @@ dependencies = [ [[package]] name = "dmtri" version = "0.1.0" -source = "git+https://github.com/demeter-run/specs.git#8c0a30775b034be0dfff802011ac28ce254765d2" +source = "git+https://github.com/demeter-run/specs.git#9c20f3e4d1165388eadce082bf5dfd44105db0f1" dependencies = [ "bytes", "pbjson", @@ -738,7 +741,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -812,7 +815,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.3.0", + "indexmap 2.4.0", "slab", "tokio", "tokio-util", @@ -821,9 +824,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ "atomic-waker", "bytes", @@ -831,7 +834,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.3.0", + "indexmap 2.4.0", "slab", "tokio", "tokio-util", @@ -1042,7 +1045,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", "http-body 1.0.1", "httparse", @@ -1199,9 +1202,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -1239,9 +1242,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -1398,9 +1401,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.155" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libm" @@ -1421,9 +1424,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.18" +version = "1.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" +checksum = "fdc53a7799a7496ebc9fd29f31f7df80e83c9bda5299768af5f9e59eeea74647" dependencies = [ "cc", "libc", @@ -1513,9 +1516,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi", "libc", @@ -1547,7 +1550,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -1715,7 +1718,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -1910,7 +1913,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -1931,7 +1934,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.3.0", + "indexmap 2.4.0", ] [[package]] @@ -1951,7 +1954,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -2128,7 +2131,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -2338,16 +2341,16 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", "http-body 1.0.1", "http-body-util", @@ -2381,7 +2384,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots 0.26.3", - "winreg", + "windows-registry", ] [[package]] @@ -2494,9 +2497,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" +checksum = "04182dffc9091a404e0fc069ea5cd60e5b866c3adf881eff99a32d048242dffa" dependencies = [ "openssl-probe", "rustls-pemfile 2.1.3", @@ -2635,9 +2638,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.205" +version = "1.0.208" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" +checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" dependencies = [ "serde_derive", ] @@ -2654,20 +2657,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.205" +version = "1.0.208" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" +checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] name = "serde_json" -version = "1.0.122" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" +checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" dependencies = [ "itoa", "memchr", @@ -2702,7 +2705,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.3.0", + "indexmap 2.4.0", "itoa", "ryu", "serde", @@ -2750,6 +2753,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -2870,7 +2879,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.3.0", + "indexmap 2.4.0", "log", "memchr", "once_cell", @@ -3066,9 +3075,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.72" +version = "2.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" dependencies = [ "proc-macro2", "quote", @@ -3086,23 +3095,26 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -3144,7 +3156,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -3214,9 +3226,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.2" +version = "1.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" dependencies = [ "backtrace", "bytes", @@ -3247,7 +3259,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -3322,7 +3334,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.3.0", + "indexmap 2.4.0", "toml_datetime", "winnow 0.5.40", ] @@ -3333,7 +3345,7 @@ version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.3.0", + "indexmap 2.4.0", "serde", "serde_spanned", "toml_datetime", @@ -3421,15 +3433,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -3451,7 +3463,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] @@ -3534,9 +3546,9 @@ dependencies = [ [[package]] name = "unicode-properties" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" [[package]] name = "unicode-segmentation" @@ -3629,34 +3641,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -3666,9 +3679,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3676,28 +3689,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -3771,6 +3784,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -3937,16 +3980,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "yaml-rust" version = "0.4.5" @@ -3974,7 +4007,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.75", ] [[package]] diff --git a/src/domain/event/mod.rs b/src/domain/event/mod.rs index 77d30a9..128c2c5 100644 --- a/src/domain/event/mod.rs +++ b/src/domain/event/mod.rs @@ -36,6 +36,14 @@ pub struct ProjectUpdated { } into_event!(ProjectUpdated); +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProjectDeleted { + pub id: String, + pub namespace: String, + pub deleted_at: DateTime, +} +into_event!(ProjectDeleted); + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ProjectSecretCreated { pub id: String, @@ -88,6 +96,7 @@ into_event!(ResourceDeleted); pub enum Event { ProjectCreated(ProjectCreated), ProjectUpdated(ProjectUpdated), + ProjectDeleted(ProjectDeleted), ProjectSecretCreated(ProjectSecretCreated), ResourceCreated(ResourceCreated), ResourceUpdated(ResourceUpdated), @@ -98,6 +107,7 @@ impl Event { match self { Event::ProjectCreated(_) => "ProjectCreated".into(), Event::ProjectUpdated(_) => "ProjectUpdated".into(), + Event::ProjectDeleted(_) => "ProjectDeleted".into(), Event::ProjectSecretCreated(_) => "ProjectSecretCreated".into(), Event::ResourceCreated(_) => "ResourceCreated".into(), Event::ResourceUpdated(_) => "ResourceUpdated".into(), @@ -108,6 +118,7 @@ impl Event { match key { "ProjectCreated" => Ok(Self::ProjectCreated(serde_json::from_slice(payload)?)), "ProjectUpdated" => Ok(Self::ProjectUpdated(serde_json::from_slice(payload)?)), + "ProjectDeleted" => Ok(Self::ProjectDeleted(serde_json::from_slice(payload)?)), "ProjectSecretCreated" => { Ok(Self::ProjectSecretCreated(serde_json::from_slice(payload)?)) } diff --git a/src/domain/project/cache.rs b/src/domain/project/cache.rs index 7368057..3c904cc 100644 --- a/src/domain/project/cache.rs +++ b/src/domain/project/cache.rs @@ -1,6 +1,7 @@ +use chrono::{DateTime, Utc}; use std::sync::Arc; -use crate::domain::event::{ProjectCreated, ProjectSecretCreated, ProjectUpdated}; +use crate::domain::event::{ProjectCreated, ProjectDeleted, ProjectSecretCreated, ProjectUpdated}; use crate::domain::Result; use super::{Project, ProjectSecret, ProjectUpdate, ProjectUser}; @@ -12,6 +13,7 @@ pub trait ProjectDrivenCache: Send + Sync { async fn find_by_id(&self, id: &str) -> Result>; async fn create(&self, project: &Project) -> Result<()>; async fn update(&self, project: &ProjectUpdate) -> Result<()>; + async fn delete(&self, id: &str, deleted_at: &DateTime) -> Result<()>; async fn create_secret(&self, secret: &ProjectSecret) -> Result<()>; async fn find_secret_by_project_id(&self, project_id: &str) -> Result>; async fn find_user_permission( @@ -36,6 +38,10 @@ pub async fn update(cache: Arc, evt: ProjectUpdated) -> cache.update(&evt.try_into()?).await } +pub async fn delete(cache: Arc, evt: ProjectDeleted) -> Result<()> { + cache.delete(&evt.id, &evt.deleted_at).await +} + #[cfg(test)] mod tests { use mockall::mock; @@ -52,6 +58,7 @@ mod tests { async fn find_by_id(&self, id: &str) -> Result>; async fn create(&self, project: &Project) -> Result<()>; async fn update(&self, project: &ProjectUpdate) -> Result<()>; + async fn delete(&self, id: &str, deleted_at: &DateTime) -> Result<()>; async fn create_secret(&self, secret: &ProjectSecret) -> Result<()>; async fn find_secret_by_project_id(&self, project_id: &str) -> Result>; async fn find_user_permission(&self,user_id: &str, project_id: &str) -> Result>; diff --git a/src/domain/project/cluster.rs b/src/domain/project/cluster.rs index 646a4b1..1d03a76 100644 --- a/src/domain/project/cluster.rs +++ b/src/domain/project/cluster.rs @@ -4,11 +4,15 @@ use k8s_openapi::api::core::v1::Namespace; use kube::{api::ObjectMeta, ResourceExt}; use tracing::info; -use crate::domain::{event::ProjectCreated, Result}; +use crate::domain::{ + event::{ProjectCreated, ProjectDeleted}, + Result, +}; #[async_trait::async_trait] pub trait ProjectDrivenCluster: Send + Sync { async fn create(&self, namespace: &Namespace) -> Result<()>; + async fn delete(&self, namespace: &Namespace) -> Result<()>; } pub async fn apply_manifest( @@ -30,6 +34,25 @@ pub async fn apply_manifest( Ok(()) } +pub async fn delete_manifest( + cluster: Arc, + evt: ProjectDeleted, +) -> Result<()> { + let namespace = Namespace { + metadata: ObjectMeta { + name: Some(evt.namespace), + ..Default::default() + }, + ..Default::default() + }; + cluster.delete(&namespace).await?; + + //TODO: create event to update cache + info!(namespace = namespace.name_any(), "new namespace created"); + + Ok(()) +} + #[cfg(test)] mod tests { use k8s_openapi::api::core::v1::Namespace; @@ -43,6 +66,7 @@ mod tests { #[async_trait::async_trait] impl ProjectDrivenCluster for FakeProjectDrivenCluster { async fn create(&self, namespace: &Namespace) -> Result<()>; + async fn delete(&self, namespace: &Namespace) -> Result<()>; } } diff --git a/src/domain/project/command.rs b/src/domain/project/command.rs index fd679bc..686c1f8 100644 --- a/src/domain/project/command.rs +++ b/src/domain/project/command.rs @@ -13,7 +13,9 @@ use uuid::Uuid; use crate::domain::{ auth::{Credential, UserId}, error::Error, - event::{EventDrivenBridge, ProjectCreated, ProjectSecretCreated, ProjectUpdated}, + event::{ + EventDrivenBridge, ProjectCreated, ProjectDeleted, ProjectSecretCreated, ProjectUpdated, + }, project::ProjectStatus, utils, Result, MAX_SECRET, PAGE_SIZE_DEFAULT, PAGE_SIZE_MAX, }; @@ -78,6 +80,31 @@ pub async fn update( Ok(project) } +pub async fn delete( + cache: Arc, + event: Arc, + cmd: DeleteCmd, +) -> Result<()> { + assert_credential(&cmd.credential)?; + assert_permission(cache.clone(), &cmd.credential, &cmd.id).await?; + + let project = match cache.find_by_id(&cmd.id).await? { + Some(project) => project, + None => return Err(Error::Unexpected("Failed to locate project.".into())), + }; + + let evt = ProjectDeleted { + id: cmd.id.clone(), + namespace: project.namespace, + deleted_at: Utc::now(), + }; + + event.dispatch(evt.into()).await?; + info!(project = &cmd.id, "project updated"); + + Ok(()) +} + pub async fn create_secret( cache: Arc, event: Arc, @@ -267,6 +294,17 @@ impl UpdateCmd { } } +#[derive(Debug, Clone)] +pub struct DeleteCmd { + pub credential: Credential, + pub id: String, +} +impl DeleteCmd { + pub fn new(credential: Credential, id: String) -> Self { + Self { credential, id } + } +} + #[derive(Debug, Clone)] pub struct CreateSecretCmd { pub credential: Credential, @@ -296,6 +334,7 @@ pub struct VerifySecretCmd { #[cfg(test)] mod tests { + use chrono::DateTime; use mockall::mock; use uuid::Uuid; @@ -316,6 +355,7 @@ mod tests { async fn find_by_id(&self, id: &str) -> Result>; async fn create(&self, project: &Project) -> Result<()>; async fn update(&self, project: &ProjectUpdate) -> Result<()>; + async fn delete(&self, id: &str, deleted_at: &DateTime) -> Result<()>; async fn create_secret(&self, secret: &ProjectSecret) -> Result<()>; async fn find_secret_by_project_id(&self, project_id: &str) -> Result>; async fn find_user_permission(&self,user_id: &str, project_id: &str) -> Result>; diff --git a/src/domain/resource/command.rs b/src/domain/resource/command.rs index a1c3ab9..e5eb2e6 100644 --- a/src/domain/resource/command.rs +++ b/src/domain/resource/command.rs @@ -339,6 +339,7 @@ mod tests { async fn find_by_id(&self, id: &str) -> Result>; async fn create(&self, project: &Project) -> Result<()>; async fn update(&self, project: &ProjectUpdate) -> Result<()>; + async fn delete(&self, id: &str, deleted_at: &DateTime) -> Result<()>; async fn create_secret(&self, secret: &ProjectSecret) -> Result<()>; async fn find_secret_by_project_id(&self, project_id: &str) -> Result>; async fn find_user_permission(&self,user_id: &str, project_id: &str) -> Result>; diff --git a/src/driven/cache/project.rs b/src/driven/cache/project.rs index 5272030..95577c4 100644 --- a/src/driven/cache/project.rs +++ b/src/driven/cache/project.rs @@ -1,3 +1,4 @@ +use chrono::{DateTime, Utc}; use sqlx::{sqlite::SqliteRow, FromRow, Row}; use std::sync::Arc; @@ -7,6 +8,7 @@ use crate::domain::{ cache::ProjectDrivenCache, Project, ProjectSecret, ProjectStatus, ProjectUpdate, ProjectUser, }, + resource::ResourceStatus, Result, }; @@ -203,6 +205,42 @@ impl ProjectDrivenCache for SqliteProjectDrivenCache { (None, None) => Ok(()), } } + + async fn delete(&self, id: &str, deleted_at: &DateTime) -> Result<()> { + let status = ProjectStatus::Deleted.to_string(); + + let mut tx = self.sqlite.db.begin().await?; + sqlx::query!( + r#" + UPDATE project + SET status=$2, updated_at=$3 + WHERE id=$1; + "#, + id, + status, + deleted_at + ) + .execute(&mut *tx) + .await?; + + let status = ResourceStatus::Deleted.to_string(); + sqlx::query!( + r#" + UPDATE resource + SET status=$2, updated_at=$3 + WHERE project_id=$1; + "#, + id, + status, + deleted_at + ) + .execute(&mut *tx) + .await?; + + tx.commit().await?; + Ok(()) + } + async fn create_secret(&self, secret: &ProjectSecret) -> Result<()> { sqlx::query!( r#" diff --git a/src/driven/k8s/mod.rs b/src/driven/k8s/mod.rs index d2474d1..71da043 100644 --- a/src/driven/k8s/mod.rs +++ b/src/driven/k8s/mod.rs @@ -40,6 +40,27 @@ impl ProjectDrivenCluster for K8sCluster { Ok(()) } + + async fn delete(&self, namespace: &Namespace) -> Result<()> { + let api: Api = Api::all(self.client.clone()); + if let Err(err) = api + .delete(&namespace.name_any(), &DeleteParams::default()) + .await + { + match &err { + Error::Api(error_response) => { + if error_response.reason == "NotFound" { + info!("Resource not found in cluster, skipping.") + } else { + return Err(err.into()); + } + } + _ => return Err(err.into()), + } + }; + + Ok(()) + } } #[async_trait::async_trait] diff --git a/src/drivers/cache/mod.rs b/src/drivers/cache/mod.rs index 7998a85..be9c8e1 100644 --- a/src/drivers/cache/mod.rs +++ b/src/drivers/cache/mod.rs @@ -45,6 +45,9 @@ pub async fn subscribe(config: CacheConfig) -> Result<()> { Event::ProjectUpdated(evt) => { project::cache::update(project_cache.clone(), evt.clone()).await } + Event::ProjectDeleted(evt) => { + project::cache::delete(project_cache.clone(), evt.clone()).await + } Event::ProjectSecretCreated(evt) => { project::cache::create_secret(project_cache.clone(), evt.clone()).await } diff --git a/src/drivers/grpc/project.rs b/src/drivers/grpc/project.rs index 7590e8a..79d3b93 100644 --- a/src/drivers/grpc/project.rs +++ b/src/drivers/grpc/project.rs @@ -107,6 +107,23 @@ impl proto::project_service_server::ProjectService for ProjectServiceImpl { Ok(tonic::Response::new(message)) } + async fn delete_project( + &self, + request: tonic::Request, + ) -> Result, tonic::Status> { + let credential = match request.extensions().get::() { + Some(credential) => credential.clone(), + None => return Err(Status::unauthenticated("invalid credential")), + }; + + let req = request.into_inner(); + let cmd = project::command::DeleteCmd::new(credential, req.id); + project::command::delete(self.cache.clone(), self.event.clone(), cmd.clone()).await?; + let message = proto::DeleteProjectResponse {}; + + Ok(tonic::Response::new(message)) + } + async fn create_project_secret( &self, request: tonic::Request, diff --git a/src/drivers/monitor/mod.rs b/src/drivers/monitor/mod.rs index ea4cffe..428d5a3 100644 --- a/src/drivers/monitor/mod.rs +++ b/src/drivers/monitor/mod.rs @@ -32,6 +32,10 @@ pub async fn subscribe(config: MonitorConfig) -> Result<()> { Event::ProjectCreated(evt) => { project::cluster::apply_manifest(cluster.clone(), evt.clone()).await } + Event::ProjectDeleted(evt) => { + project::cluster::delete_manifest(cluster.clone(), evt.clone()) + .await + } Event::ResourceCreated(evt) => { resource::cluster::apply_manifest(cluster.clone(), evt.clone()) .await diff --git a/test/expect b/test/expect index c84329f..c8a1a71 100755 --- a/test/expect +++ b/test/expect @@ -141,3 +141,17 @@ else echo "Failed to update resource" exit 1 fi + +# Delete project +echo "Deleting project..." +./grpcurl -plaintext -H "Authorization: Bearer $TOKEN" -d '{"id": "'"$PROJECT_ID"'"}' "$NODE_IP:30950" demeter.ops.v1alpha.ProjectService.DeleteProject + +OUTPUT=$(./grpcurl -plaintext -H "Authorization: Bearer $TOKEN" "$NODE_IP:30950" demeter.ops.v1alpha.ProjectService.FetchProjects | jq ) +echo "FetchProjects output:" +echo $OUTPUT +if echo "$OUTPUT" | jq '. == []'; then + echo "Succesfuly deleted project" +else + echo "Failed to delete project" + exit 1 +fi