From a1c5fc5ffc3faede4b6bc88fd2ac4445b0a4a87c Mon Sep 17 00:00:00 2001 From: Damien Date: Tue, 25 Oct 2022 21:24:33 +0100 Subject: [PATCH 01/74] feat: shuttle-serenity initial commit poc (#429) * feat: shuttle-serenity initial commit poc * remove shuttle-service * refactor: drop more shuttle_service stuff * refactor: drop default serenity framework * misc: add wasm32-wasi to nix shell * refactor: cargo sort * refactor: cargo fmt Co-authored-by: chesedo --- Cargo.lock | 12 --- Cargo.toml | 1 + plugins/Cargo.toml | 5 + plugins/serenity/Makefile | 13 +++ plugins/serenity/runtime/Cargo.toml | 21 ++++ plugins/serenity/runtime/README.md | 13 +++ plugins/serenity/runtime/src/lib.rs | 153 +++++++++++++++++++++++++++ plugins/serenity/runtime/src/main.rs | 19 ++++ plugins/serenity/wasm/Cargo.toml | 11 ++ plugins/serenity/wasm/src/lib.rs | 37 +++++++ shell.nix | 4 +- 11 files changed, 276 insertions(+), 13 deletions(-) create mode 100644 plugins/Cargo.toml create mode 100644 plugins/serenity/Makefile create mode 100644 plugins/serenity/runtime/Cargo.toml create mode 100644 plugins/serenity/runtime/README.md create mode 100644 plugins/serenity/runtime/src/lib.rs create mode 100644 plugins/serenity/runtime/src/main.rs create mode 100644 plugins/serenity/wasm/Cargo.toml create mode 100644 plugins/serenity/wasm/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 2426dbb41..3dbbf2dd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7376,15 +7376,3 @@ name = "zeroize" version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" - -[[patch.unused]] -name = "shuttle-aws-rds" -version = "0.6.0" - -[[patch.unused]] -name = "shuttle-persist" -version = "0.6.0" - -[[patch.unused]] -name = "shuttle-shared-db" -version = "0.6.0" diff --git a/Cargo.toml b/Cargo.toml index 1e840d978..0c2ad5836 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ members = [ exclude = [ "e2e", "examples", + "plugins", "resources/aws-rds", "resources/persist", "resources/secrets", diff --git a/plugins/Cargo.toml b/plugins/Cargo.toml new file mode 100644 index 000000000..76beb549a --- /dev/null +++ b/plugins/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = [ + "serenity/wasm", + "serenity/runtime" +] diff --git a/plugins/serenity/Makefile b/plugins/serenity/Makefile new file mode 100644 index 000000000..5fd5bade8 --- /dev/null +++ b/plugins/serenity/Makefile @@ -0,0 +1,13 @@ +.PHONY: wasm runtime + +all: wasm runtime + +wasm: + cd wasm; cargo build --target wasm32-wasi + cp ../target/wasm32-wasi/debug/shuttle_serenity.wasm runtime/bot.wasm + +test: wasm + cd runtime; cargo test -- --nocapture + +runtime: + cd runtime; cargo build diff --git a/plugins/serenity/runtime/Cargo.toml b/plugins/serenity/runtime/Cargo.toml new file mode 100644 index 000000000..a13f254ec --- /dev/null +++ b/plugins/serenity/runtime/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "shuttle-runtime" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[[bin]] +name = "shuttle-runtime" + +[dependencies] +async-trait = "0.1.58" + +tokio = { version = "1.20.1", features = [ "full" ] } + +cap-std = "*" +wasmtime = "*" +wasmtime-wasi = "*" +wasi-common = "*" + +serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } diff --git a/plugins/serenity/runtime/README.md b/plugins/serenity/runtime/README.md new file mode 100644 index 000000000..1bc6d03df --- /dev/null +++ b/plugins/serenity/runtime/README.md @@ -0,0 +1,13 @@ +# `shuttle-runtime` + +## How to run + +```bash +$ cd ..; make wasm +$ DISCORD_TOKEN=xxx BOT_SRC=bot.wasm cargo run +``` + +## Running the tests +```bash +$ cd ..; make test +``` diff --git a/plugins/serenity/runtime/src/lib.rs b/plugins/serenity/runtime/src/lib.rs new file mode 100644 index 000000000..d806b4a98 --- /dev/null +++ b/plugins/serenity/runtime/src/lib.rs @@ -0,0 +1,153 @@ +use std::fs::File; +use std::io::{Read, Write}; +use std::os::unix::prelude::RawFd; +use std::path::Path; +use std::sync::Arc; + +use async_trait::async_trait; + +use serenity::{model::prelude::*, prelude::*}; + +use cap_std::os::unix::net::UnixStream; +use wasi_common::file::FileCaps; +use wasmtime::{Engine, Linker, Module, Store}; +use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; +use wasmtime_wasi::{WasiCtx, WasiCtxBuilder}; + +pub struct BotBuilder { + engine: Engine, + store: Store, + linker: Linker, + src: Option, +} + +impl BotBuilder { + pub fn new() -> Self { + let engine = Engine::default(); + + let mut linker: Linker = Linker::new(&engine); + wasmtime_wasi::add_to_linker(&mut linker, |s| s).unwrap(); + + let wasi = WasiCtxBuilder::new() + .inherit_stdio() + .inherit_args() + .unwrap() + .build(); + + let store = Store::new(&engine, wasi); + + Self { + engine, + store, + linker, + src: None, + } + } + + pub fn src>(mut self, src: P) -> Self { + self.src = Some(File::open(src).unwrap()); + self + } + + pub fn build(mut self) -> Bot { + let mut buf = Vec::new(); + self.src.unwrap().read_to_end(&mut buf).unwrap(); + let module = Module::new(&self.engine, buf).unwrap(); + + for export in module.exports() { + println!("export: {}", export.name()); + } + + self.linker.module(&mut self.store, "bot", &module).unwrap(); + let inner = BotInner { + store: self.store, + linker: self.linker, + }; + Bot { + inner: Arc::new(Mutex::new(inner)), + } + } +} + +pub struct BotInner { + store: Store, + linker: Linker, +} + +impl BotInner { + pub async fn message(&mut self, new_message: &str) -> Option { + let (mut host, client) = UnixStream::pair().unwrap(); + let client = WasiUnixStream::from_cap_std(client); + + self.store + .data_mut() + .insert_file(3, Box::new(client), FileCaps::all()); + + host.write_all(new_message.as_bytes()).unwrap(); + host.write(&[0]).unwrap(); + + println!("calling inner EventHandler message"); + self.linker + .get(&mut self.store, "bot", "__SHUTTLE_EventHandler_message") + .unwrap() + .into_func() + .unwrap() + .typed::(&self.store) + .unwrap() + .call(&mut self.store, 3) + .unwrap(); + + let mut resp = String::new(); + host.read_to_string(&mut resp).unwrap(); + + if resp.is_empty() { + None + } else { + Some(resp) + } + } +} + +pub struct Bot { + inner: Arc>, +} + +impl Bot { + pub fn builder() -> BotBuilder { + BotBuilder::new() + } + + pub fn new>(src: P) -> Self { + Self::builder().src(src).build() + } + + pub async fn into_client(self, token: &str, intents: GatewayIntents) -> Client { + Client::builder(&token, intents) + .event_handler(self) + .await + .unwrap() + } +} + +#[async_trait] +impl EventHandler for Bot { + async fn message(&self, ctx: Context, new_message: Message) { + let mut inner = self.inner.lock().await; + if let Some(resp) = inner.message(new_message.content.as_str()).await { + new_message.channel_id.say(&ctx.http, resp).await.unwrap(); + } + } +} + +#[cfg(test)] +pub mod tests { + use super::*; + + #[tokio::test] + async fn bot() { + let bot = Bot::new("bot.wasm"); + let mut inner = bot.inner.lock().await; + assert_eq!(inner.message("not !hello").await, None); + assert_eq!(inner.message("!hello").await, Some("world!".to_string())); + } +} diff --git a/plugins/serenity/runtime/src/main.rs b/plugins/serenity/runtime/src/main.rs new file mode 100644 index 000000000..f98d69e11 --- /dev/null +++ b/plugins/serenity/runtime/src/main.rs @@ -0,0 +1,19 @@ +use std::env; +use std::io; + +use serenity::prelude::*; + +use shuttle_runtime::Bot; + +#[tokio::main] +async fn main() -> io::Result<()> { + let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; + + let token = env::var("DISCORD_TOKEN").unwrap(); + let src = env::var("BOT_SRC").unwrap(); + + let mut client = Bot::new(src).into_client(token.as_str(), intents).await; + client.start().await.unwrap(); + + Ok(()) +} diff --git a/plugins/serenity/wasm/Cargo.toml b/plugins/serenity/wasm/Cargo.toml new file mode 100644 index 000000000..b935b0340 --- /dev/null +++ b/plugins/serenity/wasm/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "shuttle-serenity" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = [ "cdylib" ] + +[dependencies] diff --git a/plugins/serenity/wasm/src/lib.rs b/plugins/serenity/wasm/src/lib.rs new file mode 100644 index 000000000..74c859641 --- /dev/null +++ b/plugins/serenity/wasm/src/lib.rs @@ -0,0 +1,37 @@ +use std::fs::File; +use std::io::{Read, Write}; +use std::os::wasi::prelude::*; + +pub fn handle_message(message: &str) -> Option { + if message == "!hello" { + Some("world!".to_string()) + } else { + None + } +} + +#[no_mangle] +#[allow(non_snake_case)] +pub extern "C" fn __SHUTTLE_EventHandler_message(fd: RawFd) { + println!("inner handler awoken; interacting with fd={fd}"); + + let mut f = unsafe { File::from_raw_fd(fd) }; + + let mut buf = Vec::new(); + let mut c_buf = [0; 1]; + loop { + f.read(&mut c_buf).unwrap(); + if c_buf[0] == 0 { + break; + } else { + buf.push(c_buf[0]); + } + } + + let msg = String::from_utf8(buf).unwrap(); + println!("got message: {msg}"); + + if let Some(resp) = handle_message(msg.as_str()) { + f.write_all(resp.as_bytes()).unwrap(); + } +} diff --git a/shell.nix b/shell.nix index ab73c0578..3dd8886d1 100644 --- a/shell.nix +++ b/shell.nix @@ -11,7 +11,9 @@ in pkg-config ]; buildInputs = with nixpkgs; [ - (rustChannelOf{ channel = "1.63.0"; }).rust + ((rustChannelOf{ channel = "1.63.0"; }).rust.override { + targets = ["wasm32-wasi"]; + }) rust-analyzer cargo-watch terraform From f7e09b6ac594e813668fdfdf15f1ddd6d0306c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 25 Oct 2022 22:26:21 +0200 Subject: [PATCH 02/74] shuttle next wrapper POC (#431) * feat: runtime skeleton * feat: cleanup * feat: update cargo.lock, sort deps * fix: typo --- Cargo.lock | 76 +++++++++++++++++++++++----------- Cargo.toml | 1 + next/Cargo.toml | 24 +++++++++++ next/README.md | 9 ++++ next/src/args.rs | 8 ++++ next/src/error.rs | 12 ++++++ next/src/lib.rs | 2 + next/src/main.rs | 103 ++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 212 insertions(+), 23 deletions(-) create mode 100644 next/Cargo.toml create mode 100644 next/README.md create mode 100644 next/src/args.rs create mode 100644 next/src/error.rs create mode 100644 next/src/lib.rs create mode 100644 next/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 3dbbf2dd1..c97d70c0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -396,9 +396,9 @@ checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" [[package]] name = "async-trait" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" +checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" dependencies = [ "proc-macro2 1.0.43", "quote 1.0.21", @@ -1344,13 +1344,13 @@ dependencies = [ [[package]] name = "clap" -version = "4.0.4" +version = "4.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f78ad8e84aa8e8aa3e821857be40eb4b925ff232de430d4dd2ae6aa058cbd92" +checksum = "335867764ed2de42325fafe6d18b8af74ba97ee0c590fa016f157535b42ab04b" dependencies = [ "atty", "bitflags", - "clap_derive 4.0.1", + "clap_derive 4.0.18", "clap_lex 0.3.0", "once_cell", "strsim", @@ -1372,9 +1372,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.0.1" +version = "4.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca689d7434ce44517a12a89456b2be4d1ea1cafcd8f581978c03d45f5a5c12a7" +checksum = "16a1b0f6422af32d5da0c58e2703320f379216ee70198241c84173a8c5ac28f3" dependencies = [ "heck", "proc-macro-error", @@ -3525,6 +3525,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -3748,6 +3758,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking" version = "2.0.0" @@ -5336,7 +5352,7 @@ dependencies = [ "base64 0.13.0", "bollard", "chrono", - "clap 4.0.4", + "clap 4.0.18", "colored", "fqdn", "futures", @@ -5363,6 +5379,20 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "shuttle-next" +version = "0.1.0" +dependencies = [ + "async-trait", + "clap 4.0.18", + "shuttle-common", + "shuttle-service", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "shuttle-proto" version = "0.7.0" @@ -5503,9 +5533,9 @@ checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc88c725d61fc6c3132893370cac4a0200e3fedf5da8331c570664b1987f5ca2" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "smartstring" @@ -6063,18 +6093,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.32" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" +checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.32" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" +checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ "proc-macro2 1.0.43", "quote 1.0.21", @@ -6553,9 +6583,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.36" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if 1.0.0", "log", @@ -6566,9 +6596,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2 1.0.43", "quote 1.0.21", @@ -6577,9 +6607,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ "once_cell", "valuable", @@ -6622,12 +6652,12 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" +checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" dependencies = [ - "ansi_term", "matchers", + "nu-ansi-term", "once_cell", "regex", "sharded-slab", diff --git a/Cargo.toml b/Cargo.toml index 0c2ad5836..2362b2f89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "common", "deployer", "gateway", + "next", "proto", "provisioner", "service" diff --git a/next/Cargo.toml b/next/Cargo.toml new file mode 100644 index 000000000..2f913a919 --- /dev/null +++ b/next/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "shuttle-next" +version = "0.1.0" +edition = "2021" +publish = false +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1.58" +clap ={ version = "4.0.18", features = ["derive"] } +thiserror = "1.0.37" +tokio = { version = "=1.20.1", features = ["full"] } +tracing = "0.1.37" +tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } + +[dependencies.shuttle-common] +version = "0.7.0" +path = "../common" + +[dependencies.shuttle-service] +version = "0.7.0" +default-features = false +features = ["loader"] +path = "../service" diff --git a/next/README.md b/next/README.md new file mode 100644 index 000000000..3a9c2cabe --- /dev/null +++ b/next/README.md @@ -0,0 +1,9 @@ +## shuttle-next runtime-wrapper + +Load and run an .so library that implements `shuttle_service::Service`. + +To load and run, pass the path to the .so file to load as an argument to the shuttle-next binary: + +```bash +cargo run -- -f "src/libhello_world.so" +``` diff --git a/next/src/args.rs b/next/src/args.rs new file mode 100644 index 000000000..e435a3b2b --- /dev/null +++ b/next/src/args.rs @@ -0,0 +1,8 @@ +use clap::Parser; + +#[derive(Parser, Debug)] +pub struct Args { + /// Uri to the `.so` file to load + #[arg(long, short)] + pub file_path: String, +} diff --git a/next/src/error.rs b/next/src/error.rs new file mode 100644 index 000000000..919dab37d --- /dev/null +++ b/next/src/error.rs @@ -0,0 +1,12 @@ +use shuttle_service::loader::LoaderError; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum Error { + #[error("Load error: {0}")] + Load(#[from] LoaderError), + #[error("Run error: {0}")] + Run(#[from] shuttle_service::Error), +} + +pub type Result = std::result::Result; diff --git a/next/src/lib.rs b/next/src/lib.rs new file mode 100644 index 000000000..177d34b24 --- /dev/null +++ b/next/src/lib.rs @@ -0,0 +1,2 @@ +pub mod args; +pub mod error; diff --git a/next/src/main.rs b/next/src/main.rs new file mode 100644 index 000000000..a29754bc9 --- /dev/null +++ b/next/src/main.rs @@ -0,0 +1,103 @@ +use std::{collections::BTreeMap, net::SocketAddr, path::PathBuf, str::FromStr}; + +use async_trait::async_trait; +use clap::Parser; +use shuttle_common::{database, LogItem}; +use shuttle_next::args::Args; +use shuttle_service::{ + loader::{LoadedService, Loader}, + Factory, Logger, ServiceName, +}; +use tokio::sync::mpsc::{self, UnboundedReceiver}; +use tracing::{info, instrument, trace}; +use tracing_subscriber::{fmt, prelude::*, EnvFilter}; + +#[tokio::main(flavor = "multi_thread")] +async fn main() { + let args = Args::parse(); + + let fmt_layer = fmt::layer(); + let filter_layer = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("info")) + .unwrap(); + + tracing_subscriber::registry() + .with(filter_layer) + .with(fmt_layer) + .init(); + + trace!(args = ?args, "parsed args"); + + let address: SocketAddr = "127.0.0.1:8000".parse().unwrap(); + let mut factory = DummyFactory::new(); + let (logger, _rx) = get_logger(); + let so_path = PathBuf::from(args.file_path.as_str()); + + let service = load_service(address, so_path, &mut factory, logger) + .await + .unwrap(); + + _ = tokio::spawn(run(service, address)).await; +} + +#[instrument(skip(service))] +async fn run(service: LoadedService, addr: SocketAddr) { + let (handle, library) = service; + + info!("starting deployment on {}", addr); + handle.await.unwrap().unwrap(); + + tokio::spawn(async move { + trace!("closing .so file"); + library.close().unwrap(); + }); +} + +#[instrument(skip(addr, so_path, factory, logger))] +async fn load_service( + addr: SocketAddr, + so_path: PathBuf, + factory: &mut dyn Factory, + logger: Logger, +) -> shuttle_next::error::Result { + let loader = Loader::from_so_file(so_path)?; + + Ok(loader.load(factory, addr, logger).await?) +} + +struct DummyFactory { + service_name: ServiceName, +} + +impl DummyFactory { + fn new() -> Self { + Self { + service_name: ServiceName::from_str("next").unwrap(), + } + } +} + +#[async_trait] +impl Factory for DummyFactory { + fn get_service_name(&self) -> ServiceName { + self.service_name.clone() + } + + async fn get_db_connection_string( + &mut self, + _: database::Type, + ) -> Result { + todo!() + } + + async fn get_secrets(&mut self) -> Result, shuttle_service::Error> { + todo!() + } +} + +fn get_logger() -> (Logger, UnboundedReceiver) { + let (tx, rx) = mpsc::unbounded_channel(); + let logger = Logger::new(tx, Default::default()); + + (logger, rx) +} From f6e17660e2334760fcd55cba58009a7743c21413 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 26 Oct 2022 09:18:42 +0200 Subject: [PATCH 03/74] refactor: create runtimes workspace (#432) * refactor: rename plugins to runtimes * refactor: drop serenity folder * refactor: rename runtime to shuttle-next * refactor: prepare shuttle-legacy runtime --- Cargo.toml | 4 ++-- plugins/Cargo.toml | 5 ----- plugins/serenity/Makefile | 13 ------------- runtimes/Cargo.toml | 6 ++++++ runtimes/Makefile | 16 ++++++++++++++++ {next => runtimes/legacy}/Cargo.toml | 2 +- {next => runtimes/legacy}/README.md | 2 +- {next => runtimes/legacy}/src/args.rs | 0 {next => runtimes/legacy}/src/error.rs | 0 {next => runtimes/legacy}/src/lib.rs | 0 {next => runtimes/legacy}/src/main.rs | 0 .../runtime => runtimes/next}/Cargo.toml | 2 +- .../serenity/runtime => runtimes/next}/README.md | 2 +- .../runtime => runtimes/next}/src/lib.rs | 0 .../runtime => runtimes/next}/src/main.rs | 0 {plugins/serenity => runtimes}/wasm/Cargo.toml | 0 {plugins/serenity => runtimes}/wasm/src/lib.rs | 0 17 files changed, 28 insertions(+), 24 deletions(-) delete mode 100644 plugins/Cargo.toml delete mode 100644 plugins/serenity/Makefile create mode 100644 runtimes/Cargo.toml create mode 100644 runtimes/Makefile rename {next => runtimes/legacy}/Cargo.toml (96%) rename {next => runtimes/legacy}/README.md (87%) rename {next => runtimes/legacy}/src/args.rs (100%) rename {next => runtimes/legacy}/src/error.rs (100%) rename {next => runtimes/legacy}/src/lib.rs (100%) rename {next => runtimes/legacy}/src/main.rs (100%) rename {plugins/serenity/runtime => runtimes/next}/Cargo.toml (94%) rename {plugins/serenity/runtime => runtimes/next}/README.md (88%) rename {plugins/serenity/runtime => runtimes/next}/src/lib.rs (100%) rename {plugins/serenity/runtime => runtimes/next}/src/main.rs (100%) rename {plugins/serenity => runtimes}/wasm/Cargo.toml (100%) rename {plugins/serenity => runtimes}/wasm/src/lib.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index 2362b2f89..242c6b9d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,9 +13,9 @@ members = [ exclude = [ "e2e", "examples", - "plugins", "resources/aws-rds", "resources/persist", "resources/secrets", - "resources/shared-db" + "resources/shared-db", + "runtimes" ] diff --git a/plugins/Cargo.toml b/plugins/Cargo.toml deleted file mode 100644 index 76beb549a..000000000 --- a/plugins/Cargo.toml +++ /dev/null @@ -1,5 +0,0 @@ -[workspace] -members = [ - "serenity/wasm", - "serenity/runtime" -] diff --git a/plugins/serenity/Makefile b/plugins/serenity/Makefile deleted file mode 100644 index 5fd5bade8..000000000 --- a/plugins/serenity/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -.PHONY: wasm runtime - -all: wasm runtime - -wasm: - cd wasm; cargo build --target wasm32-wasi - cp ../target/wasm32-wasi/debug/shuttle_serenity.wasm runtime/bot.wasm - -test: wasm - cd runtime; cargo test -- --nocapture - -runtime: - cd runtime; cargo build diff --git a/runtimes/Cargo.toml b/runtimes/Cargo.toml new file mode 100644 index 000000000..025d17a42 --- /dev/null +++ b/runtimes/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +members = [ + "legacy", + "next", + "wasm" +] diff --git a/runtimes/Makefile b/runtimes/Makefile new file mode 100644 index 000000000..8bca54cab --- /dev/null +++ b/runtimes/Makefile @@ -0,0 +1,16 @@ +.PHONY: wasm next + +all: wasm next + +wasm: + cd wasm; cargo build --target wasm32-wasi + cp target/wasm32-wasi/debug/shuttle_serenity.wasm next/bot.wasm + +test: wasm + cd next; cargo test -- --nocapture + +next: + cd next; cargo build + +legacy: + cd legacy; cargo build diff --git a/next/Cargo.toml b/runtimes/legacy/Cargo.toml similarity index 96% rename from next/Cargo.toml rename to runtimes/legacy/Cargo.toml index 2f913a919..57419bcbf 100644 --- a/next/Cargo.toml +++ b/runtimes/legacy/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "shuttle-next" +name = "shuttle-legacy" version = "0.1.0" edition = "2021" publish = false diff --git a/next/README.md b/runtimes/legacy/README.md similarity index 87% rename from next/README.md rename to runtimes/legacy/README.md index 3a9c2cabe..4915ab01f 100644 --- a/next/README.md +++ b/runtimes/legacy/README.md @@ -1,4 +1,4 @@ -## shuttle-next runtime-wrapper +## shuttle-legacy Load and run an .so library that implements `shuttle_service::Service`. diff --git a/next/src/args.rs b/runtimes/legacy/src/args.rs similarity index 100% rename from next/src/args.rs rename to runtimes/legacy/src/args.rs diff --git a/next/src/error.rs b/runtimes/legacy/src/error.rs similarity index 100% rename from next/src/error.rs rename to runtimes/legacy/src/error.rs diff --git a/next/src/lib.rs b/runtimes/legacy/src/lib.rs similarity index 100% rename from next/src/lib.rs rename to runtimes/legacy/src/lib.rs diff --git a/next/src/main.rs b/runtimes/legacy/src/main.rs similarity index 100% rename from next/src/main.rs rename to runtimes/legacy/src/main.rs diff --git a/plugins/serenity/runtime/Cargo.toml b/runtimes/next/Cargo.toml similarity index 94% rename from plugins/serenity/runtime/Cargo.toml rename to runtimes/next/Cargo.toml index a13f254ec..69e96b2fb 100644 --- a/plugins/serenity/runtime/Cargo.toml +++ b/runtimes/next/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "shuttle-runtime" +name = "shuttle-next" version = "0.1.0" edition = "2021" diff --git a/plugins/serenity/runtime/README.md b/runtimes/next/README.md similarity index 88% rename from plugins/serenity/runtime/README.md rename to runtimes/next/README.md index 1bc6d03df..d0da79c83 100644 --- a/plugins/serenity/runtime/README.md +++ b/runtimes/next/README.md @@ -1,4 +1,4 @@ -# `shuttle-runtime` +# `shuttle-next` ## How to run diff --git a/plugins/serenity/runtime/src/lib.rs b/runtimes/next/src/lib.rs similarity index 100% rename from plugins/serenity/runtime/src/lib.rs rename to runtimes/next/src/lib.rs diff --git a/plugins/serenity/runtime/src/main.rs b/runtimes/next/src/main.rs similarity index 100% rename from plugins/serenity/runtime/src/main.rs rename to runtimes/next/src/main.rs diff --git a/plugins/serenity/wasm/Cargo.toml b/runtimes/wasm/Cargo.toml similarity index 100% rename from plugins/serenity/wasm/Cargo.toml rename to runtimes/wasm/Cargo.toml diff --git a/plugins/serenity/wasm/src/lib.rs b/runtimes/wasm/src/lib.rs similarity index 100% rename from plugins/serenity/wasm/src/lib.rs rename to runtimes/wasm/src/lib.rs From e773225441a3f15b9b35db30c3623d821f4e6b9e Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 26 Oct 2022 13:38:06 +0200 Subject: [PATCH 04/74] feat: add --provisioner-address arg to both runtimes (#433) * refactor: fix up dependencies * feat: add --provisioner-address to both runtimes --- Cargo.lock | 14 -------------- Cargo.toml | 1 - runtimes/legacy/Cargo.toml | 5 +++-- runtimes/legacy/src/args.rs | 5 +++++ runtimes/legacy/src/main.rs | 4 ++-- runtimes/next/Cargo.toml | 5 +++-- runtimes/next/src/args.rs | 9 +++++++++ runtimes/next/src/lib.rs | 2 ++ runtimes/next/src/main.rs | 9 +++++---- 9 files changed, 29 insertions(+), 25 deletions(-) create mode 100644 runtimes/next/src/args.rs diff --git a/Cargo.lock b/Cargo.lock index c97d70c0a..da0b4fa99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5379,20 +5379,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "shuttle-next" -version = "0.1.0" -dependencies = [ - "async-trait", - "clap 4.0.18", - "shuttle-common", - "shuttle-service", - "thiserror", - "tokio", - "tracing", - "tracing-subscriber", -] - [[package]] name = "shuttle-proto" version = "0.7.0" diff --git a/Cargo.toml b/Cargo.toml index 242c6b9d4..eae7bbd14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,6 @@ members = [ "common", "deployer", "gateway", - "next", "proto", "provisioner", "service" diff --git a/runtimes/legacy/Cargo.toml b/runtimes/legacy/Cargo.toml index 57419bcbf..20f0833a3 100644 --- a/runtimes/legacy/Cargo.toml +++ b/runtimes/legacy/Cargo.toml @@ -10,15 +10,16 @@ async-trait = "0.1.58" clap ={ version = "4.0.18", features = ["derive"] } thiserror = "1.0.37" tokio = { version = "=1.20.1", features = ["full"] } +tonic = "0.8.0" tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } [dependencies.shuttle-common] version = "0.7.0" -path = "../common" +path = "../../common" [dependencies.shuttle-service] version = "0.7.0" default-features = false features = ["loader"] -path = "../service" +path = "../../service" diff --git a/runtimes/legacy/src/args.rs b/runtimes/legacy/src/args.rs index e435a3b2b..f35e2b96c 100644 --- a/runtimes/legacy/src/args.rs +++ b/runtimes/legacy/src/args.rs @@ -1,8 +1,13 @@ use clap::Parser; +use tonic::transport::Endpoint; #[derive(Parser, Debug)] pub struct Args { /// Uri to the `.so` file to load #[arg(long, short)] pub file_path: String, + + /// Address to reach provisioner at + #[clap(long, default_value = "localhost:5000")] + pub provisioner_address: Endpoint, } diff --git a/runtimes/legacy/src/main.rs b/runtimes/legacy/src/main.rs index a29754bc9..07c308d32 100644 --- a/runtimes/legacy/src/main.rs +++ b/runtimes/legacy/src/main.rs @@ -3,7 +3,7 @@ use std::{collections::BTreeMap, net::SocketAddr, path::PathBuf, str::FromStr}; use async_trait::async_trait; use clap::Parser; use shuttle_common::{database, LogItem}; -use shuttle_next::args::Args; +use shuttle_legacy::args::Args; use shuttle_service::{ loader::{LoadedService, Loader}, Factory, Logger, ServiceName, @@ -59,7 +59,7 @@ async fn load_service( so_path: PathBuf, factory: &mut dyn Factory, logger: Logger, -) -> shuttle_next::error::Result { +) -> shuttle_legacy::error::Result { let loader = Loader::from_so_file(so_path)?; Ok(loader.load(factory, addr, logger).await?) diff --git a/runtimes/next/Cargo.toml b/runtimes/next/Cargo.toml index 69e96b2fb..924cbad3c 100644 --- a/runtimes/next/Cargo.toml +++ b/runtimes/next/Cargo.toml @@ -6,12 +6,13 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [[bin]] -name = "shuttle-runtime" +name = "shuttle-next" [dependencies] async-trait = "0.1.58" - +clap ={ version = "4.0.18", features = ["derive"] } tokio = { version = "1.20.1", features = [ "full" ] } +tonic = "0.8.0" cap-std = "*" wasmtime = "*" diff --git a/runtimes/next/src/args.rs b/runtimes/next/src/args.rs new file mode 100644 index 000000000..2a2455e3a --- /dev/null +++ b/runtimes/next/src/args.rs @@ -0,0 +1,9 @@ +use clap::Parser; +use tonic::transport::Endpoint; + +#[derive(Parser, Debug)] +pub struct Args { + /// Address to reach provisioner at + #[clap(long, default_value = "localhost:5000")] + pub provisioner_address: Endpoint, +} diff --git a/runtimes/next/src/lib.rs b/runtimes/next/src/lib.rs index d806b4a98..cce82eb43 100644 --- a/runtimes/next/src/lib.rs +++ b/runtimes/next/src/lib.rs @@ -1,3 +1,5 @@ +pub mod args; + use std::fs::File; use std::io::{Read, Write}; use std::os::unix::prelude::RawFd; diff --git a/runtimes/next/src/main.rs b/runtimes/next/src/main.rs index f98d69e11..62a00847d 100644 --- a/runtimes/next/src/main.rs +++ b/runtimes/next/src/main.rs @@ -1,12 +1,13 @@ +use clap::Parser; +use serenity::prelude::*; +use shuttle_next::{args::Args, Bot}; use std::env; use std::io; -use serenity::prelude::*; - -use shuttle_runtime::Bot; - #[tokio::main] async fn main() -> io::Result<()> { + let _args = Args::parse(); + let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; let token = env::var("DISCORD_TOKEN").unwrap(); From 37ade4ca7f82bc681b7ff19863a430ea0865587d Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 27 Oct 2022 07:55:07 +0200 Subject: [PATCH 05/74] feat: create a control plane interface (part 1) (#436) * feat: add proto for runtimes * refactor: legacy move main to lib * feat: impl Runtime server for legacy * feat: impl Runtime server for next --- runtimes/Cargo.toml | 1 + runtimes/legacy/Cargo.toml | 5 ++ runtimes/legacy/README.md | 11 ++- runtimes/legacy/src/args.rs | 4 - runtimes/legacy/src/error.rs | 2 + runtimes/legacy/src/lib.rs | 149 +++++++++++++++++++++++++++++++++++ runtimes/legacy/src/main.rs | 90 +++------------------ runtimes/next/Cargo.toml | 6 ++ runtimes/next/README.md | 9 ++- runtimes/next/src/lib.rs | 69 ++++++++++++++-- runtimes/next/src/main.rs | 37 ++++++--- runtimes/proto/Cargo.toml | 12 +++ runtimes/proto/build.rs | 5 ++ runtimes/proto/runtime.proto | 37 +++++++++ runtimes/proto/src/lib.rs | 3 + 15 files changed, 335 insertions(+), 105 deletions(-) create mode 100644 runtimes/proto/Cargo.toml create mode 100644 runtimes/proto/build.rs create mode 100644 runtimes/proto/runtime.proto create mode 100644 runtimes/proto/src/lib.rs diff --git a/runtimes/Cargo.toml b/runtimes/Cargo.toml index 025d17a42..dd0d90a14 100644 --- a/runtimes/Cargo.toml +++ b/runtimes/Cargo.toml @@ -2,5 +2,6 @@ members = [ "legacy", "next", + "proto", "wasm" ] diff --git a/runtimes/legacy/Cargo.toml b/runtimes/legacy/Cargo.toml index 20f0833a3..7626dab6d 100644 --- a/runtimes/legacy/Cargo.toml +++ b/runtimes/legacy/Cargo.toml @@ -6,6 +6,7 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +anyhow = "1.0.62" async-trait = "0.1.58" clap ={ version = "4.0.18", features = ["derive"] } thiserror = "1.0.37" @@ -18,6 +19,10 @@ tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } version = "0.7.0" path = "../../common" +[dependencies.shuttle-runtime-proto] +version = "0.1.0" +path = "../proto" + [dependencies.shuttle-service] version = "0.7.0" default-features = false diff --git a/runtimes/legacy/README.md b/runtimes/legacy/README.md index 4915ab01f..1f9d0b8be 100644 --- a/runtimes/legacy/README.md +++ b/runtimes/legacy/README.md @@ -2,8 +2,15 @@ Load and run an .so library that implements `shuttle_service::Service`. -To load and run, pass the path to the .so file to load as an argument to the shuttle-next binary: +To test, first start this binary using: ```bash -cargo run -- -f "src/libhello_world.so" +cargo run -- +``` + +Then in another shell, load a `.so` file and start it up: + +``` bash +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "../../examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:8000 runtime.Runtime/load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/start ``` diff --git a/runtimes/legacy/src/args.rs b/runtimes/legacy/src/args.rs index f35e2b96c..2a2455e3a 100644 --- a/runtimes/legacy/src/args.rs +++ b/runtimes/legacy/src/args.rs @@ -3,10 +3,6 @@ use tonic::transport::Endpoint; #[derive(Parser, Debug)] pub struct Args { - /// Uri to the `.so` file to load - #[arg(long, short)] - pub file_path: String, - /// Address to reach provisioner at #[clap(long, default_value = "localhost:5000")] pub provisioner_address: Endpoint, diff --git a/runtimes/legacy/src/error.rs b/runtimes/legacy/src/error.rs index 919dab37d..9c57cd4e2 100644 --- a/runtimes/legacy/src/error.rs +++ b/runtimes/legacy/src/error.rs @@ -7,6 +7,8 @@ pub enum Error { Load(#[from] LoaderError), #[error("Run error: {0}")] Run(#[from] shuttle_service::Error), + #[error("Start error: {0}")] + Start(#[from] shuttle_service::error::CustomError), } pub type Result = std::result::Result; diff --git a/runtimes/legacy/src/lib.rs b/runtimes/legacy/src/lib.rs index 177d34b24..1cc4e3ad7 100644 --- a/runtimes/legacy/src/lib.rs +++ b/runtimes/legacy/src/lib.rs @@ -1,2 +1,151 @@ +use std::{ + collections::BTreeMap, + net::{Ipv4Addr, SocketAddr}, + path::PathBuf, + str::FromStr, + sync::Mutex, +}; + +use anyhow::anyhow; +use async_trait::async_trait; +use shuttle_common::{database, LogItem}; +use shuttle_runtime_proto::runtime::{ + runtime_server::Runtime, LoadRequest, LoadResponse, StartRequest, StartResponse, +}; +use shuttle_service::{ + loader::{LoadedService, Loader}, + Factory, Logger, ServiceName, +}; +use tokio::sync::mpsc::{self, UnboundedReceiver}; +use tonic::{Request, Response, Status}; +use tracing::{info, instrument, trace}; + pub mod args; pub mod error; + +pub struct Legacy { + // Mutexes are for interior mutability + so_path: Mutex>, + port: Mutex>, +} + +impl Legacy { + pub fn new() -> Self { + Self { + so_path: Mutex::new(None), + port: Mutex::new(None), + } + } +} + +#[async_trait] +impl Runtime for Legacy { + async fn load(&self, request: Request) -> Result, Status> { + let so_path = request.into_inner().path; + trace!(so_path, "loading"); + + let so_path = PathBuf::from(so_path); + *self.so_path.lock().unwrap() = Some(so_path); + + let message = LoadResponse { success: true }; + Ok(Response::new(message)) + } + + async fn start( + &self, + _request: Request, + ) -> Result, Status> { + let port = 8001; + let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); + let mut factory = DummyFactory::new(); + let (logger, _rx) = get_logger(); + let so_path = self + .so_path + .lock() + .unwrap() + .as_ref() + .ok_or_else(|| -> error::Error { + error::Error::Start(anyhow!("trying to start a service that was not loaded")) + }) + .map_err(|err| Status::from_error(Box::new(err)))? + .clone(); + + trace!(%address, "starting"); + let service = load_service(address, so_path, &mut factory, logger) + .await + .unwrap(); + + _ = tokio::spawn(run(service, address)); + + *self.port.lock().unwrap() = Some(port); + + let message = StartResponse { + success: true, + port: Some(port as u32), + }; + + Ok(Response::new(message)) + } +} + +#[instrument(skip(service))] +async fn run(service: LoadedService, addr: SocketAddr) { + let (handle, library) = service; + + info!("starting deployment on {}", addr); + handle.await.unwrap().unwrap(); + + tokio::spawn(async move { + trace!("closing .so file"); + library.close().unwrap(); + }); +} + +#[instrument(skip(addr, so_path, factory, logger))] +async fn load_service( + addr: SocketAddr, + so_path: PathBuf, + factory: &mut dyn Factory, + logger: Logger, +) -> error::Result { + let loader = Loader::from_so_file(so_path)?; + + Ok(loader.load(factory, addr, logger).await?) +} + +struct DummyFactory { + service_name: ServiceName, +} + +impl DummyFactory { + fn new() -> Self { + Self { + service_name: ServiceName::from_str("legacy").unwrap(), + } + } +} + +#[async_trait] +impl Factory for DummyFactory { + fn get_service_name(&self) -> ServiceName { + self.service_name.clone() + } + + async fn get_db_connection_string( + &mut self, + _: database::Type, + ) -> Result { + todo!() + } + + async fn get_secrets(&mut self) -> Result, shuttle_service::Error> { + todo!() + } +} + +fn get_logger() -> (Logger, UnboundedReceiver) { + let (tx, rx) = mpsc::unbounded_channel(); + let logger = Logger::new(tx, Default::default()); + + (logger, rx) +} diff --git a/runtimes/legacy/src/main.rs b/runtimes/legacy/src/main.rs index 07c308d32..0a9e381e7 100644 --- a/runtimes/legacy/src/main.rs +++ b/runtimes/legacy/src/main.rs @@ -1,15 +1,10 @@ -use std::{collections::BTreeMap, net::SocketAddr, path::PathBuf, str::FromStr}; +use std::net::{Ipv4Addr, SocketAddr}; -use async_trait::async_trait; use clap::Parser; -use shuttle_common::{database, LogItem}; -use shuttle_legacy::args::Args; -use shuttle_service::{ - loader::{LoadedService, Loader}, - Factory, Logger, ServiceName, -}; -use tokio::sync::mpsc::{self, UnboundedReceiver}; -use tracing::{info, instrument, trace}; +use shuttle_legacy::{args::Args, Legacy}; +use shuttle_runtime_proto::runtime::runtime_server::RuntimeServer; +use tonic::transport::Server; +use tracing::trace; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; #[tokio::main(flavor = "multi_thread")] @@ -28,76 +23,11 @@ async fn main() { trace!(args = ?args, "parsed args"); - let address: SocketAddr = "127.0.0.1:8000".parse().unwrap(); - let mut factory = DummyFactory::new(); - let (logger, _rx) = get_logger(); - let so_path = PathBuf::from(args.file_path.as_str()); - - let service = load_service(address, so_path, &mut factory, logger) + let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8000); + let legacy = Legacy::new(); + Server::builder() + .add_service(RuntimeServer::new(legacy)) + .serve(addr) .await .unwrap(); - - _ = tokio::spawn(run(service, address)).await; -} - -#[instrument(skip(service))] -async fn run(service: LoadedService, addr: SocketAddr) { - let (handle, library) = service; - - info!("starting deployment on {}", addr); - handle.await.unwrap().unwrap(); - - tokio::spawn(async move { - trace!("closing .so file"); - library.close().unwrap(); - }); -} - -#[instrument(skip(addr, so_path, factory, logger))] -async fn load_service( - addr: SocketAddr, - so_path: PathBuf, - factory: &mut dyn Factory, - logger: Logger, -) -> shuttle_legacy::error::Result { - let loader = Loader::from_so_file(so_path)?; - - Ok(loader.load(factory, addr, logger).await?) -} - -struct DummyFactory { - service_name: ServiceName, -} - -impl DummyFactory { - fn new() -> Self { - Self { - service_name: ServiceName::from_str("next").unwrap(), - } - } -} - -#[async_trait] -impl Factory for DummyFactory { - fn get_service_name(&self) -> ServiceName { - self.service_name.clone() - } - - async fn get_db_connection_string( - &mut self, - _: database::Type, - ) -> Result { - todo!() - } - - async fn get_secrets(&mut self) -> Result, shuttle_service::Error> { - todo!() - } -} - -fn get_logger() -> (Logger, UnboundedReceiver) { - let (tx, rx) = mpsc::unbounded_channel(); - let logger = Logger::new(tx, Default::default()); - - (logger, rx) } diff --git a/runtimes/next/Cargo.toml b/runtimes/next/Cargo.toml index 924cbad3c..326402a04 100644 --- a/runtimes/next/Cargo.toml +++ b/runtimes/next/Cargo.toml @@ -13,6 +13,8 @@ async-trait = "0.1.58" clap ={ version = "4.0.18", features = ["derive"] } tokio = { version = "1.20.1", features = [ "full" ] } tonic = "0.8.0" +tracing = "0.1.37" +tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } cap-std = "*" wasmtime = "*" @@ -20,3 +22,7 @@ wasmtime-wasi = "*" wasi-common = "*" serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } + +[dependencies.shuttle-runtime-proto] +version = "0.1.0" +path = "../proto" diff --git a/runtimes/next/README.md b/runtimes/next/README.md index d0da79c83..c247e00fc 100644 --- a/runtimes/next/README.md +++ b/runtimes/next/README.md @@ -4,7 +4,14 @@ ```bash $ cd ..; make wasm -$ DISCORD_TOKEN=xxx BOT_SRC=bot.wasm cargo run +$ DISCORD_TOKEN=xxx cargo run +``` + +In another terminal: + +``` bash +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "bot.wasm"}' localhost:8000 runtime.Runtime/load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/start ``` ## Running the tests diff --git a/runtimes/next/src/lib.rs b/runtimes/next/src/lib.rs index cce82eb43..273a2eea0 100644 --- a/runtimes/next/src/lib.rs +++ b/runtimes/next/src/lib.rs @@ -1,5 +1,6 @@ pub mod args; +use std::env; use std::fs::File; use std::io::{Read, Write}; use std::os::unix::prelude::RawFd; @@ -7,16 +8,71 @@ use std::path::Path; use std::sync::Arc; use async_trait::async_trait; - -use serenity::{model::prelude::*, prelude::*}; - use cap_std::os::unix::net::UnixStream; +use serenity::{model::prelude::*, prelude::*}; +use shuttle_runtime_proto::runtime::runtime_server::Runtime; +use shuttle_runtime_proto::runtime::{LoadRequest, LoadResponse, StartRequest, StartResponse}; +use tonic::{Request, Response, Status}; +use tracing::trace; use wasi_common::file::FileCaps; use wasmtime::{Engine, Linker, Module, Store}; use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; use wasmtime_wasi::{WasiCtx, WasiCtxBuilder}; -pub struct BotBuilder { +pub struct Next { + bot: std::sync::Mutex>, +} + +impl Next { + pub fn new() -> Self { + Self { + bot: std::sync::Mutex::new(None), + } + } +} + +#[async_trait] +impl Runtime for Next { + async fn load(&self, request: Request) -> Result, Status> { + let wasm_path = request.into_inner().path; + trace!(wasm_path, "loading"); + + let bot = Bot::new(wasm_path); + + *self.bot.lock().unwrap() = Some(bot); + + let message = LoadResponse { success: true }; + + Ok(Response::new(message)) + } + + async fn start( + &self, + _request: Request, + ) -> Result, Status> { + let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; + let token = env::var("DISCORD_TOKEN").unwrap(); + let bot: Bot = { + let guard = self.bot.lock().unwrap(); + guard.as_ref().unwrap().clone() + }; + let mut client = bot.into_client(token.as_str(), intents).await; + + trace!("starting bot"); + tokio::spawn(async move { + client.start().await.unwrap(); + }); + + let message = StartResponse { + success: true, + port: None, + }; + + Ok(Response::new(message)) + } +} + +struct BotBuilder { engine: Engine, store: Store, linker: Linker, @@ -71,7 +127,7 @@ impl BotBuilder { } } -pub struct BotInner { +struct BotInner { store: Store, linker: Linker, } @@ -110,7 +166,8 @@ impl BotInner { } } -pub struct Bot { +#[derive(Clone)] +struct Bot { inner: Arc>, } diff --git a/runtimes/next/src/main.rs b/runtimes/next/src/main.rs index 62a00847d..6a2f11848 100644 --- a/runtimes/next/src/main.rs +++ b/runtimes/next/src/main.rs @@ -1,20 +1,33 @@ +use std::net::{Ipv4Addr, SocketAddr}; + use clap::Parser; -use serenity::prelude::*; -use shuttle_next::{args::Args, Bot}; -use std::env; -use std::io; +use shuttle_next::{args::Args, Next}; +use shuttle_runtime_proto::runtime::runtime_server::RuntimeServer; +use tonic::transport::Server; +use tracing::trace; +use tracing_subscriber::{fmt, prelude::*, EnvFilter}; #[tokio::main] -async fn main() -> io::Result<()> { - let _args = Args::parse(); +async fn main() { + let args = Args::parse(); - let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; + let fmt_layer = fmt::layer(); + let filter_layer = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("info")) + .unwrap(); - let token = env::var("DISCORD_TOKEN").unwrap(); - let src = env::var("BOT_SRC").unwrap(); + tracing_subscriber::registry() + .with(filter_layer) + .with(fmt_layer) + .init(); - let mut client = Bot::new(src).into_client(token.as_str(), intents).await; - client.start().await.unwrap(); + trace!(args = ?args, "parsed args"); - Ok(()) + let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8000); + let next = Next::new(); + Server::builder() + .add_service(RuntimeServer::new(next)) + .serve(addr) + .await + .unwrap(); } diff --git a/runtimes/proto/Cargo.toml b/runtimes/proto/Cargo.toml new file mode 100644 index 000000000..5e255f65d --- /dev/null +++ b/runtimes/proto/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "shuttle-runtime-proto" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +prost = "0.11.0" +tonic = "0.8.0" + +[build-dependencies] +tonic-build = "0.8.0" diff --git a/runtimes/proto/build.rs b/runtimes/proto/build.rs new file mode 100644 index 000000000..a045f1d57 --- /dev/null +++ b/runtimes/proto/build.rs @@ -0,0 +1,5 @@ +fn main() -> Result<(), Box> { + tonic_build::compile_protos("../proto/runtime.proto")?; + + Ok(()) +} diff --git a/runtimes/proto/runtime.proto b/runtimes/proto/runtime.proto new file mode 100644 index 000000000..d26e0c6c8 --- /dev/null +++ b/runtimes/proto/runtime.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; +package runtime; + +service Runtime { + // Load a service file to be ready to start it + rpc load(LoadRequest) returns (LoadResponse); + + // Start a loaded service file + rpc start(StartRequest) returns (StartResponse); +} + +message LoadRequest { + // Name of service to load + string service_name = 1; + + // Path to compiled file to load for service + string path = 2; +} + +message LoadResponse { + // Could the service be loaded + bool success = 1; +} + +message StartRequest { + // Name of service to start + string service_name = 1; +} + +message StartResponse { + // Was the start successful + bool success = 1; + + // Optional port the service was started on + // This is likely to be None for bots + optional uint32 port = 2; +} diff --git a/runtimes/proto/src/lib.rs b/runtimes/proto/src/lib.rs new file mode 100644 index 000000000..70ee4b5b7 --- /dev/null +++ b/runtimes/proto/src/lib.rs @@ -0,0 +1,3 @@ +pub mod runtime { + tonic::include_proto!("runtime"); +} From da46e602c684548cfd0251b67a46ae7773ae99bc Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 27 Oct 2022 09:49:03 +0200 Subject: [PATCH 06/74] refactor: combine runtimes into one (#438) * feat: add --legacy flag * refactor: merge next and legacy runtimes * refactor: merge proto crates * refactor: rename to runtime * refactor: promote runtime * refactor: update README.md * refactor: cargo sort --- Cargo.lock | 896 +++++++++++++++++- Cargo.toml | 3 +- deployer/Cargo.toml | 2 +- proto/Cargo.toml | 2 +- proto/build.rs | 5 +- {runtimes/proto => proto}/runtime.proto | 0 proto/src/lib.rs | 4 + provisioner/Cargo.toml | 2 +- {runtimes/legacy => runtime}/Cargo.toml | 17 +- runtime/Makefile | 13 + runtime/README.md | 34 + {runtimes/legacy => runtime}/src/args.rs | 4 + .../src => runtime/src/legacy}/error.rs | 0 .../src/lib.rs => runtime/src/legacy/mod.rs | 5 +- runtime/src/lib.rs | 7 + {runtimes/legacy => runtime}/src/main.rs | 21 +- .../src/lib.rs => runtime/src/next/mod.rs | 6 +- runtimes/Cargo.toml | 7 - runtimes/Makefile | 16 - runtimes/legacy/README.md | 16 - runtimes/next/Cargo.toml | 28 - runtimes/next/README.md | 20 - runtimes/next/src/args.rs | 9 - runtimes/next/src/main.rs | 33 - runtimes/proto/Cargo.toml | 12 - runtimes/proto/build.rs | 5 - runtimes/proto/src/lib.rs | 3 - {runtimes => tmp}/wasm/Cargo.toml | 0 {runtimes => tmp}/wasm/src/lib.rs | 0 29 files changed, 985 insertions(+), 185 deletions(-) rename {runtimes/proto => proto}/runtime.proto (100%) rename {runtimes/legacy => runtime}/Cargo.toml (64%) create mode 100644 runtime/Makefile create mode 100644 runtime/README.md rename {runtimes/legacy => runtime}/src/args.rs (72%) rename {runtimes/legacy/src => runtime/src/legacy}/error.rs (100%) rename runtimes/legacy/src/lib.rs => runtime/src/legacy/mod.rs (98%) create mode 100644 runtime/src/lib.rs rename {runtimes/legacy => runtime}/src/main.rs (58%) rename runtimes/next/src/lib.rs => runtime/src/next/mod.rs (96%) delete mode 100644 runtimes/Cargo.toml delete mode 100644 runtimes/Makefile delete mode 100644 runtimes/legacy/README.md delete mode 100644 runtimes/next/Cargo.toml delete mode 100644 runtimes/next/README.md delete mode 100644 runtimes/next/src/args.rs delete mode 100644 runtimes/next/src/main.rs delete mode 100644 runtimes/proto/Cargo.toml delete mode 100644 runtimes/proto/build.rs delete mode 100644 runtimes/proto/src/lib.rs rename {runtimes => tmp}/wasm/Cargo.toml (100%) rename {runtimes => tmp}/wasm/src/lib.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index da0b4fa99..e556fcf2b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,6 +12,15 @@ dependencies = [ "regex", ] +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -142,6 +151,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "ambient-authority" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ad6edb4840b78c5c3d88de606b22252d552b55f3a4699fbb10fc070ec3049" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -178,6 +193,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "async-channel" version = "1.6.1" @@ -460,7 +481,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -874,7 +895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.5.2", "cc", "cfg-if 0.1.10", "constant_time_eq", @@ -1078,6 +1099,71 @@ dependencies = [ "serde", ] +[[package]] +name = "cap-fs-ext" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0e103ce36d217d568903ad27b14ec2238ecb5d65bad2e756a8f3c0d651506e" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes", + "windows-sys", +] + +[[package]] +name = "cap-primitives" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3f336aa91cce16033ed3c94ac91d98956c49b420e6d6cd0dd7d0e386a57085" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes", + "ipnet", + "maybe-owned", + "rustix", + "winapi-util", + "windows-sys", + "winx", +] + +[[package]] +name = "cap-rand" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d14b9606aa9550d34651bc481443203bc014237bdb992d201d2afa62d2ec6dea" +dependencies = [ + "ambient-authority", + "rand 0.8.5", +] + +[[package]] +name = "cap-std" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d6e70b626eceac9d6fc790fe2d72cc3f2f7bc3c35f467690c54a526b0f56db" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes", + "ipnet", + "rustix", +] + +[[package]] +name = "cap-time-ext" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a0524f7c4cff2ea547ae2b652bf7a348fd3e48f76556dc928d8b45ab2f1d50" +dependencies = [ + "cap-primitives", + "once_cell", + "rustix", + "winx", +] + [[package]] name = "cargo" version = "0.64.0" @@ -1550,6 +1636,15 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "cpufeatures" version = "0.2.2" @@ -1565,6 +1660,107 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" +[[package]] +name = "cranelift-bforest" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5e1ee4c22871d24a95196ea7047d58c1d978e46c88037d3d397b3b3e0af360" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f600a52d59eed56a85f33750873b3b42d61e35ca777cd792369893f9e1f9dd" +dependencies = [ + "arrayvec 0.7.2", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "gimli", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8418218d0953d73e9b96e9d9ffec56145efa4f18988251530b5872ae4410563" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f01be0cfd40aba59153236ab4b99062131b5bbe6f9f3d4bcb238bd2f96ff5262" + +[[package]] +name = "cranelift-entity" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddae4fec5d6859233ffa175b61d269443c473b3971a2c3e69008c8d3e83d5825" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-frontend" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cc3deb0df97748434cf9f7e404f1f5134f6a253fc9a6bca25c5cd6804c08d3" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc3bb54287de9c36ba354eb849fefb77b5e73955058745fd08f12cfdfa181866" +dependencies = [ + "rayon", +] + +[[package]] +name = "cranelift-native" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c2a4f2efdce1de1f94e74f12b3b4144e3bcafa6011338b87388325d72d2120" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.89.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f918c37eb01f5b5ccc632e0ef3b4bf9ee03b5d4c267d3d2d3b62720a6bce0180" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] + [[package]] name = "crates-index" version = "0.18.8" @@ -1974,6 +2170,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + [[package]] name = "dirs" version = "4.0.0" @@ -2127,12 +2333,39 @@ dependencies = [ "serde", ] +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "event-listener" version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + [[package]] name = "fastrand" version = "1.7.0" @@ -2172,6 +2405,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "file-per-thread-logger" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e16290574b39ee41c71aeb90ae960c504ebaf1e2a1c87bd52aa56ed6e1a02f" +dependencies = [ + "env_logger", + "log", +] + [[package]] name = "filetime" version = "0.2.16" @@ -2250,6 +2493,17 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1281c1bcf107f1cc25ca345ce4688badf37c6c13c3f193cb4b9efdc057678ae2" +[[package]] +name = "fs-set-times" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a267b6a9304912e018610d53fe07115d8b530b160e85db4d2d3a59f3ddde1aec" +dependencies = [ + "io-lifetimes", + "rustix", + "windows-sys", +] + [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -2381,6 +2635,15 @@ dependencies = [ "termcolor", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generator" version = "0.7.0" @@ -2446,6 +2709,17 @@ dependencies = [ "polyval 0.5.3", ] +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + [[package]] name = "git2" version = "0.14.2" @@ -2602,6 +2876,15 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + [[package]] name = "hex" version = "0.3.2" @@ -2990,6 +3273,26 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "io-extras" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5d8c2ab5becd8720e30fd25f8fa5500d8dc3fceadd8378f05859bd7b46fc49" +dependencies = [ + "io-lifetimes", + "windows-sys", +] + +[[package]] +name = "io-lifetimes" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e481ccbe3dea62107216d0d1138bb8ad8e5e5c43009a098bd1990272c497b0" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "iovec" version = "0.1.4" @@ -3017,6 +3320,18 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" +[[package]] +name = "is-terminal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d508111813f9af3afd2f92758f77e4ed2cc9371b642112c6a48d22eb73105c5" +dependencies = [ + "hermit-abi 0.2.6", + "io-lifetimes", + "rustix", + "windows-sys", +] + [[package]] name = "itertools" version = "0.10.3" @@ -3038,6 +3353,26 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +[[package]] +name = "ittapi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "663fe0550070071ff59e981864a9cd3ee1c869ed0a088140d9ac4dc05ea6b1a1" +dependencies = [ + "anyhow", + "ittapi-sys", + "log", +] + +[[package]] +name = "ittapi-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e21911b7183f38c71d75ab478a527f314e28db51027037ece2e5511ed9410703" +dependencies = [ + "cc", +] + [[package]] name = "jni" version = "0.19.0" @@ -3106,11 +3441,17 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "libc" -version = "0.2.126" +version = "0.2.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" [[package]] name = "libgit2-sys" @@ -3189,6 +3530,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" + [[package]] name = "lock_api" version = "0.4.7" @@ -3234,6 +3581,15 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + [[package]] name = "match_cfg" version = "0.1.0" @@ -3261,6 +3617,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "md-5" version = "0.10.1" @@ -3276,6 +3638,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memfd" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "480b5a5de855d11ff13195950bdc8b98b5e942ef47afc447f6615cdcc4e15d80" +dependencies = [ + "rustix", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -3560,7 +3931,7 @@ version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", ] @@ -3594,6 +3965,18 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "crc32fast", + "hashbrown 0.12.1", + "indexmap", + "memchr", +] + [[package]] name = "once_cell" version = "1.14.0" @@ -4171,6 +4554,15 @@ dependencies = [ "prost", ] +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + [[package]] name = "queues" version = "1.1.0" @@ -4473,6 +4865,18 @@ dependencies = [ "syn 1.0.99", ] +[[package]] +name = "regalloc2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69025b4a161879ba90719837c06621c3d73cffa147a000aeacf458f6a9572485" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + [[package]] name = "regex" version = "1.6.0" @@ -4732,8 +5136,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56770675ebc04927ded3e60633437841581c285dc6236109ea25fbf3beb7b59e" [[package]] -name = "rustc-hash" -version = "1.1.0" +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" @@ -4783,6 +5193,22 @@ dependencies = [ "serde_json", ] +[[package]] +name = "rustix" +version = "0.35.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985947f9b6423159c4726323f373be0a21bdb514c5af06a849cb3d2dce2d01e8" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "itoa 1.0.2", + "libc", + "linux-raw-sys", + "once_cell", + "windows-sys", +] + [[package]] name = "rustls" version = "0.19.1" @@ -5266,6 +5692,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" +[[package]] +name = "shellexpand" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +dependencies = [ + "dirs", +] + [[package]] name = "shuttle-codegen" version = "0.7.0" @@ -5415,6 +5850,28 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "shuttle-runtime" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "cap-std", + "clap 4.0.18", + "serenity", + "shuttle-common", + "shuttle-proto", + "shuttle-service", + "thiserror", + "tokio", + "tonic", + "tracing", + "tracing-subscriber", + "wasi-common", + "wasmtime", + "wasmtime-wasi", +] + [[package]] name = "shuttle-secrets" version = "0.7.0" @@ -5517,6 +5974,12 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.10.0" @@ -5786,6 +6249,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "standback" version = "0.2.17" @@ -5959,6 +6428,22 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" +[[package]] +name = "system-interface" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92adbaf536f5aff6986e1e62ba36cee72b1718c5153eee08b9e728ddde3f6029" +dependencies = [ + "atty", + "bitflags", + "cap-fs-ext", + "cap-std", + "io-lifetimes", + "rustix", + "windows-sys", + "winx", +] + [[package]] name = "take_mut" version = "0.2.2" @@ -5976,6 +6461,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" + [[package]] name = "task-local-extensions" version = "0.1.1" @@ -6453,9 +6944,9 @@ dependencies = [ [[package]] name = "tonic" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498f271adc46acce75d66f639e4d35b31b2394c295c82496727dafa16d465dd2" +checksum = "55b9af819e54b8f33d453655bef9b9acc171568fb49523078d0cc4e7484200ec" dependencies = [ "async-stream", "async-trait", @@ -7018,7 +7509,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983" dependencies = [ - "arrayvec", + "arrayvec 0.5.2", "utf8parse", "vte_generate_state_changes", ] @@ -7108,6 +7599,48 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi-cap-std-sync" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa9ddcfc9d85e89a10c27801376ea57d2e9421ad91336326160c56044049b49" +dependencies = [ + "anyhow", + "async-trait", + "cap-fs-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "io-extras", + "io-lifetimes", + "is-terminal", + "once_cell", + "rustix", + "system-interface", + "tracing", + "wasi-common", + "windows-sys", +] + +[[package]] +name = "wasi-common" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd86a0cd870709441a25d63737bd416db6cf8eb6229c0da08d29d7ab79108bbb" +dependencies = [ + "anyhow", + "bitflags", + "cap-rand", + "cap-std", + "io-extras", + "rustix", + "thiserror", + "tracing", + "wiggle", + "windows-sys", +] + [[package]] name = "wasm-bindgen" version = "0.2.81" @@ -7176,6 +7709,255 @@ version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +[[package]] +name = "wasm-encoder" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5816e88e8ea7335016aa62eb0485747f786136d505a9b3890f8c400211d9b5f" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasmparser" +version = "0.92.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da34cec2a8c23db906cdf8b26e988d7a7f0d549eb5d51299129647af61a1b37" +dependencies = [ + "indexmap", +] + +[[package]] +name = "wasmtime" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5fc5bb3329415030796cfa5530b2481ccef5c4f1e5150733ba94318ab004fe1" +dependencies = [ + "anyhow", + "async-trait", + "bincode", + "cfg-if 1.0.0", + "indexmap", + "libc", + "log", + "object", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-cache", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-fiber", + "wasmtime-jit", + "wasmtime-runtime", + "wat", + "windows-sys", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db36545ff0940ad9bf4e9ab0ec2a4e1eaa5ebe2aa9227bcbc4af905375d9e482" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "wasmtime-cache" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c2101b211d9db7db8bcfb2ffa69e119fa99a20266d0e5f19bb989cb6c3280d7" +dependencies = [ + "anyhow", + "base64 0.13.0", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix", + "serde", + "sha2 0.9.9", + "toml", + "windows-sys", + "zstd", +] + +[[package]] +name = "wasmtime-cranelift" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0409e93b5eceaa4e5f498a4bce1cffc7ebe071d14582b5437c10af4aecc23f54" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli", + "log", + "object", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55240389c604f68d2e1d2573d7d3740246ab9ea2fa4fe79e10ccd51faf9b9500" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli", + "indexmap", + "log", + "object", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-fiber" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb9b7b94f7b40d98665feca2338808cf449fa671d01be7176861f8d9aa4a012" +dependencies = [ + "cc", + "cfg-if 1.0.0", + "rustix", + "wasmtime-asm-macros", + "windows-sys", +] + +[[package]] +name = "wasmtime-jit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc15e285b7073ee566e62ea4b6dd38b80465ade0ea8cd4cee13c7ac2e295cfca" +dependencies = [ + "addr2line", + "anyhow", + "bincode", + "cfg-if 1.0.0", + "cpp_demangle", + "gimli", + "ittapi", + "log", + "object", + "rustc-demangle", + "rustix", + "serde", + "target-lexicon", + "thiserror", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-runtime", + "windows-sys", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee06d206bcf7a875eacd1e1e957c2a63f64a92934d2535dd8e15cde6d3a9ffe" +dependencies = [ + "object", + "once_cell", + "rustix", +] + +[[package]] +name = "wasmtime-runtime" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9969ff36cbf57f18c2d24679db57d0857ea7cc7d839534afc26ecc8003e9914b" +dependencies = [ + "anyhow", + "cc", + "cfg-if 1.0.0", + "indexmap", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "rand 0.8.5", + "rustix", + "thiserror", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-fiber", + "wasmtime-jit-debug", + "windows-sys", +] + +[[package]] +name = "wasmtime-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df64c737fc9b3cdf7617bcc65e8b97cb713ceb9c9c58530b20788a8a3482b5d1" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] + +[[package]] +name = "wasmtime-wasi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb41d16dfd153d2078ea2347d311cee6c74f2a4ecc109cd9acaf860709137fdb" +dependencies = [ + "anyhow", + "wasi-cap-std-sync", + "wasi-common", + "wasmtime", + "wiggle", +] + +[[package]] +name = "wast" +version = "35.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +dependencies = [ + "leb128", +] + +[[package]] +name = "wast" +version = "48.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84825b5ac7164df8260c9e2b2e814075334edbe7ac426f2469b93a5eeac23cce" +dependencies = [ + "leb128", + "memchr", + "unicode-width", + "wasm-encoder", +] + +[[package]] +name = "wat" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129da4a03ec6d2a815f42c88f641824e789d5be0d86d2f90aa8a218c7068e0be" +dependencies = [ + "wast 48.0.0", +] + [[package]] name = "web-sys" version = "0.3.58" @@ -7274,6 +8056,48 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" +[[package]] +name = "wiggle" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2943156975c608cab1b44d28becba4196b07f18be92ea28f1e7f3372a12d81dd" +dependencies = [ + "anyhow", + "async-trait", + "bitflags", + "thiserror", + "tracing", + "wasmtime", + "wiggle-macro", +] + +[[package]] +name = "wiggle-generate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0321263a6b1ba1e0a97174524891a14907cee68cfa183fd5389088dffbeab668" +dependencies = [ + "anyhow", + "heck", + "proc-macro2 1.0.43", + "quote 1.0.21", + "shellexpand", + "syn 1.0.99", + "witx", +] + +[[package]] +name = "wiggle-macro" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa3d3794e5d68ef69f30e65f267c6bf18c920750d3ccd2a3ac04e77d95f66b96" +dependencies = [ + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", + "wiggle-generate", +] + [[package]] name = "winapi" version = "0.3.9" @@ -7366,6 +8190,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "winx" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b01e010390eb263a4518c8cebf86cb67469d1511c00b749a47b64c39e8054d" +dependencies = [ + "bitflags", + "io-lifetimes", + "windows-sys", +] + +[[package]] +name = "witx" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +dependencies = [ + "anyhow", + "log", + "thiserror", + "wast 35.0.2", +] + [[package]] name = "xattr" version = "0.2.3" @@ -7392,3 +8239,32 @@ name = "zeroize" version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.1+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" +dependencies = [ + "cc", + "libc", +] diff --git a/Cargo.toml b/Cargo.toml index eae7bbd14..57fa71713 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "gateway", "proto", "provisioner", + "runtime", "service" ] exclude = [ @@ -16,5 +17,5 @@ exclude = [ "resources/persist", "resources/secrets", "resources/shared-db", - "runtimes" + "tmp" ] diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index 2e6ea3cb8..fa6f90edb 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -33,7 +33,7 @@ tar = "0.4.38" thiserror = "1.0.24" tokio = { version = "1.19.2", features = ["fs"] } toml = "0.5.9" -tonic = "0.8.0" +tonic = "0.8.2" tower = { version = "0.4.12", features = ["make"] } tower-http = { version = "0.3.4", features = ["auth", "trace"] } tracing = "0.1.35" diff --git a/proto/Cargo.toml b/proto/Cargo.toml index 0ae1a34d9..3b64c23d9 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -7,7 +7,7 @@ publish = false [dependencies] prost = "0.11.0" -tonic = "0.8.0" +tonic = "0.8.2" [dependencies.shuttle-common] version = "0.7.0" diff --git a/proto/build.rs b/proto/build.rs index 1502854e9..0edbacf8c 100644 --- a/proto/build.rs +++ b/proto/build.rs @@ -1,5 +1,8 @@ fn main() -> Result<(), Box> { - tonic_build::compile_protos("../proto/provisioner.proto")?; + tonic_build::configure().compile( + &["../proto/provisioner.proto", "../proto/runtime.proto"], + &["../proto"], + )?; Ok(()) } diff --git a/runtimes/proto/runtime.proto b/proto/runtime.proto similarity index 100% rename from runtimes/proto/runtime.proto rename to proto/runtime.proto diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 39e7c501a..6dff3b13e 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -63,3 +63,7 @@ pub mod provisioner { } } } + +pub mod runtime { + tonic::include_proto!("runtime"); +} diff --git a/provisioner/Cargo.toml b/provisioner/Cargo.toml index 69954ecc2..35fd0791a 100644 --- a/provisioner/Cargo.toml +++ b/provisioner/Cargo.toml @@ -18,7 +18,7 @@ rand = "0.8.5" sqlx = { version = "0.6.1", features = ["postgres", "runtime-tokio-native-tls"] } thiserror = "1.0.32" tokio = { version = "1.20.1", features = ["macros", "rt-multi-thread"] } -tonic = "0.8.0" +tonic = "0.8.2" tracing = "0.1.36" tracing-subscriber = "0.3.15" diff --git a/runtimes/legacy/Cargo.toml b/runtime/Cargo.toml similarity index 64% rename from runtimes/legacy/Cargo.toml rename to runtime/Cargo.toml index 7626dab6d..8dab41bc0 100644 --- a/runtimes/legacy/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "shuttle-legacy" +name = "shuttle-runtime" version = "0.1.0" edition = "2021" publish = false @@ -8,23 +8,28 @@ publish = false [dependencies] anyhow = "1.0.62" async-trait = "0.1.58" +cap-std = "0.26.0" clap ={ version = "4.0.18", features = ["derive"] } +serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } thiserror = "1.0.37" tokio = { version = "=1.20.1", features = ["full"] } -tonic = "0.8.0" +tonic = "0.8.2" tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } +wasi-common = "2.0.0" +wasmtime = "2.0.0" +wasmtime-wasi = "2.0.0" [dependencies.shuttle-common] version = "0.7.0" -path = "../../common" +path = "../common" -[dependencies.shuttle-runtime-proto] -version = "0.1.0" +[dependencies.shuttle-proto] +version = "0.7.0" path = "../proto" [dependencies.shuttle-service] version = "0.7.0" default-features = false features = ["loader"] -path = "../../service" +path = "../service" diff --git a/runtime/Makefile b/runtime/Makefile new file mode 100644 index 000000000..18dac0caa --- /dev/null +++ b/runtime/Makefile @@ -0,0 +1,13 @@ +.PHONY: wasm next + +all: wasm next + +wasm: + cd ../tmp/wasm; cargo build --target wasm32-wasi + cp ../tmp/wasm/target/wasm32-wasi/debug/shuttle_serenity.wasm bot.wasm + +test: wasm + cargo test -- --nocapture + +runtime: + cargo build diff --git a/runtime/README.md b/runtime/README.md new file mode 100644 index 000000000..53755c860 --- /dev/null +++ b/runtime/README.md @@ -0,0 +1,34 @@ +## How to run + +```bash +$ make wasm +$ DISCORD_TOKEN=xxx cargo run +``` + +In another terminal: + +``` bash +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "runtime/bot.wasm"}' localhost:8000 runtime.Runtime/load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/start +``` +## shuttle-legacy + +Load and run an .so library that implements `shuttle_service::Service`. + +To test, first start this binary using: + +```bash +cargo run -- --legacy +``` + +Then in another shell, load a `.so` file and start it up: + +``` bash +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:8000 runtime.Runtime/load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/start +``` + +## Running the tests +```bash +$ cd ..; make test +``` diff --git a/runtimes/legacy/src/args.rs b/runtime/src/args.rs similarity index 72% rename from runtimes/legacy/src/args.rs rename to runtime/src/args.rs index 2a2455e3a..084304364 100644 --- a/runtimes/legacy/src/args.rs +++ b/runtime/src/args.rs @@ -6,4 +6,8 @@ pub struct Args { /// Address to reach provisioner at #[clap(long, default_value = "localhost:5000")] pub provisioner_address: Endpoint, + + /// Is this runtime for a legacy service + #[clap(long)] + pub legacy: bool, } diff --git a/runtimes/legacy/src/error.rs b/runtime/src/legacy/error.rs similarity index 100% rename from runtimes/legacy/src/error.rs rename to runtime/src/legacy/error.rs diff --git a/runtimes/legacy/src/lib.rs b/runtime/src/legacy/mod.rs similarity index 98% rename from runtimes/legacy/src/lib.rs rename to runtime/src/legacy/mod.rs index 1cc4e3ad7..2e7c50149 100644 --- a/runtimes/legacy/src/lib.rs +++ b/runtime/src/legacy/mod.rs @@ -9,7 +9,7 @@ use std::{ use anyhow::anyhow; use async_trait::async_trait; use shuttle_common::{database, LogItem}; -use shuttle_runtime_proto::runtime::{ +use shuttle_proto::runtime::{ runtime_server::Runtime, LoadRequest, LoadResponse, StartRequest, StartResponse, }; use shuttle_service::{ @@ -20,8 +20,7 @@ use tokio::sync::mpsc::{self, UnboundedReceiver}; use tonic::{Request, Response, Status}; use tracing::{info, instrument, trace}; -pub mod args; -pub mod error; +mod error; pub struct Legacy { // Mutexes are for interior mutability diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs new file mode 100644 index 000000000..6aa6ae608 --- /dev/null +++ b/runtime/src/lib.rs @@ -0,0 +1,7 @@ +mod args; +mod legacy; +mod next; + +pub use args::Args; +pub use legacy::Legacy; +pub use next::Next; diff --git a/runtimes/legacy/src/main.rs b/runtime/src/main.rs similarity index 58% rename from runtimes/legacy/src/main.rs rename to runtime/src/main.rs index 0a9e381e7..9ee7986a2 100644 --- a/runtimes/legacy/src/main.rs +++ b/runtime/src/main.rs @@ -1,8 +1,8 @@ use std::net::{Ipv4Addr, SocketAddr}; use clap::Parser; -use shuttle_legacy::{args::Args, Legacy}; -use shuttle_runtime_proto::runtime::runtime_server::RuntimeServer; +use shuttle_proto::runtime::runtime_server::RuntimeServer; +use shuttle_runtime::{Args, Legacy, Next}; use tonic::transport::Server; use tracing::trace; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; @@ -24,10 +24,15 @@ async fn main() { trace!(args = ?args, "parsed args"); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8000); - let legacy = Legacy::new(); - Server::builder() - .add_service(RuntimeServer::new(legacy)) - .serve(addr) - .await - .unwrap(); + let router = if args.legacy { + let legacy = Legacy::new(); + let svc = RuntimeServer::new(legacy); + Server::builder().add_service(svc) + } else { + let next = Next::new(); + let svc = RuntimeServer::new(next); + Server::builder().add_service(svc) + }; + + router.serve(addr).await.unwrap(); } diff --git a/runtimes/next/src/lib.rs b/runtime/src/next/mod.rs similarity index 96% rename from runtimes/next/src/lib.rs rename to runtime/src/next/mod.rs index 273a2eea0..b6f15c671 100644 --- a/runtimes/next/src/lib.rs +++ b/runtime/src/next/mod.rs @@ -1,5 +1,3 @@ -pub mod args; - use std::env; use std::fs::File; use std::io::{Read, Write}; @@ -10,8 +8,8 @@ use std::sync::Arc; use async_trait::async_trait; use cap_std::os::unix::net::UnixStream; use serenity::{model::prelude::*, prelude::*}; -use shuttle_runtime_proto::runtime::runtime_server::Runtime; -use shuttle_runtime_proto::runtime::{LoadRequest, LoadResponse, StartRequest, StartResponse}; +use shuttle_proto::runtime::runtime_server::Runtime; +use shuttle_proto::runtime::{LoadRequest, LoadResponse, StartRequest, StartResponse}; use tonic::{Request, Response, Status}; use tracing::trace; use wasi_common::file::FileCaps; diff --git a/runtimes/Cargo.toml b/runtimes/Cargo.toml deleted file mode 100644 index dd0d90a14..000000000 --- a/runtimes/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[workspace] -members = [ - "legacy", - "next", - "proto", - "wasm" -] diff --git a/runtimes/Makefile b/runtimes/Makefile deleted file mode 100644 index 8bca54cab..000000000 --- a/runtimes/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -.PHONY: wasm next - -all: wasm next - -wasm: - cd wasm; cargo build --target wasm32-wasi - cp target/wasm32-wasi/debug/shuttle_serenity.wasm next/bot.wasm - -test: wasm - cd next; cargo test -- --nocapture - -next: - cd next; cargo build - -legacy: - cd legacy; cargo build diff --git a/runtimes/legacy/README.md b/runtimes/legacy/README.md deleted file mode 100644 index 1f9d0b8be..000000000 --- a/runtimes/legacy/README.md +++ /dev/null @@ -1,16 +0,0 @@ -## shuttle-legacy - -Load and run an .so library that implements `shuttle_service::Service`. - -To test, first start this binary using: - -```bash -cargo run -- -``` - -Then in another shell, load a `.so` file and start it up: - -``` bash -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "../../examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:8000 runtime.Runtime/load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/start -``` diff --git a/runtimes/next/Cargo.toml b/runtimes/next/Cargo.toml deleted file mode 100644 index 326402a04..000000000 --- a/runtimes/next/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "shuttle-next" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bin]] -name = "shuttle-next" - -[dependencies] -async-trait = "0.1.58" -clap ={ version = "4.0.18", features = ["derive"] } -tokio = { version = "1.20.1", features = [ "full" ] } -tonic = "0.8.0" -tracing = "0.1.37" -tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } - -cap-std = "*" -wasmtime = "*" -wasmtime-wasi = "*" -wasi-common = "*" - -serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } - -[dependencies.shuttle-runtime-proto] -version = "0.1.0" -path = "../proto" diff --git a/runtimes/next/README.md b/runtimes/next/README.md deleted file mode 100644 index c247e00fc..000000000 --- a/runtimes/next/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# `shuttle-next` - -## How to run - -```bash -$ cd ..; make wasm -$ DISCORD_TOKEN=xxx cargo run -``` - -In another terminal: - -``` bash -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "bot.wasm"}' localhost:8000 runtime.Runtime/load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/start -``` - -## Running the tests -```bash -$ cd ..; make test -``` diff --git a/runtimes/next/src/args.rs b/runtimes/next/src/args.rs deleted file mode 100644 index 2a2455e3a..000000000 --- a/runtimes/next/src/args.rs +++ /dev/null @@ -1,9 +0,0 @@ -use clap::Parser; -use tonic::transport::Endpoint; - -#[derive(Parser, Debug)] -pub struct Args { - /// Address to reach provisioner at - #[clap(long, default_value = "localhost:5000")] - pub provisioner_address: Endpoint, -} diff --git a/runtimes/next/src/main.rs b/runtimes/next/src/main.rs deleted file mode 100644 index 6a2f11848..000000000 --- a/runtimes/next/src/main.rs +++ /dev/null @@ -1,33 +0,0 @@ -use std::net::{Ipv4Addr, SocketAddr}; - -use clap::Parser; -use shuttle_next::{args::Args, Next}; -use shuttle_runtime_proto::runtime::runtime_server::RuntimeServer; -use tonic::transport::Server; -use tracing::trace; -use tracing_subscriber::{fmt, prelude::*, EnvFilter}; - -#[tokio::main] -async fn main() { - let args = Args::parse(); - - let fmt_layer = fmt::layer(); - let filter_layer = EnvFilter::try_from_default_env() - .or_else(|_| EnvFilter::try_new("info")) - .unwrap(); - - tracing_subscriber::registry() - .with(filter_layer) - .with(fmt_layer) - .init(); - - trace!(args = ?args, "parsed args"); - - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8000); - let next = Next::new(); - Server::builder() - .add_service(RuntimeServer::new(next)) - .serve(addr) - .await - .unwrap(); -} diff --git a/runtimes/proto/Cargo.toml b/runtimes/proto/Cargo.toml deleted file mode 100644 index 5e255f65d..000000000 --- a/runtimes/proto/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "shuttle-runtime-proto" -version = "0.1.0" -edition = "2021" -publish = false - -[dependencies] -prost = "0.11.0" -tonic = "0.8.0" - -[build-dependencies] -tonic-build = "0.8.0" diff --git a/runtimes/proto/build.rs b/runtimes/proto/build.rs deleted file mode 100644 index a045f1d57..000000000 --- a/runtimes/proto/build.rs +++ /dev/null @@ -1,5 +0,0 @@ -fn main() -> Result<(), Box> { - tonic_build::compile_protos("../proto/runtime.proto")?; - - Ok(()) -} diff --git a/runtimes/proto/src/lib.rs b/runtimes/proto/src/lib.rs deleted file mode 100644 index 70ee4b5b7..000000000 --- a/runtimes/proto/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod runtime { - tonic::include_proto!("runtime"); -} diff --git a/runtimes/wasm/Cargo.toml b/tmp/wasm/Cargo.toml similarity index 100% rename from runtimes/wasm/Cargo.toml rename to tmp/wasm/Cargo.toml diff --git a/runtimes/wasm/src/lib.rs b/tmp/wasm/src/lib.rs similarity index 100% rename from runtimes/wasm/src/lib.rs rename to tmp/wasm/src/lib.rs From 67a4e91f5a1d50a268e131a31bdbaaea1584b328 Mon Sep 17 00:00:00 2001 From: Alexander Krantz Date: Thu, 27 Oct 2022 23:33:16 -0700 Subject: [PATCH 07/74] feat(deployer): add support for building wasm projects (#437) --- cargo-shuttle/src/lib.rs | 7 ++- deployer/src/deployment/queue.rs | 12 ++-- service/src/loader.rs | 32 ++++++++-- service/tests/integration/build_crate.rs | 74 +++++++++++++++++------- 4 files changed, 94 insertions(+), 31 deletions(-) diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 102b2c3de..415cf0407 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -24,7 +24,7 @@ use crossterm::style::Stylize; use factory::LocalFactory; use futures::StreamExt; use shuttle_common::models::secret; -use shuttle_service::loader::{build_crate, Loader}; +use shuttle_service::loader::{build_crate, Loader, Runtime}; use shuttle_service::Logger; use tokio::sync::mpsc; use tracing::trace; @@ -277,7 +277,10 @@ impl Shuttle { "Building".bold().green(), working_directory.display() ); - let so_path = build_crate(id, working_directory, false, tx).await?; + let so_path = match build_crate(id, working_directory, false, false, tx).await? { + Runtime::Legacy(path) => path, + Runtime::Next(_) => todo!(), + }; trace!("loading secrets"); let secrets_path = working_directory.join("Secrets.toml"); diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index 948597d8c..14f4fe6bd 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -7,7 +7,7 @@ use cargo_metadata::Message; use chrono::Utc; use crossbeam_channel::Sender; use serde_json::json; -use shuttle_service::loader::{build_crate, get_config}; +use shuttle_service::loader::{build_crate, get_config, Runtime}; use tracing::{debug, error, info, instrument, trace}; use uuid::Uuid; @@ -158,7 +158,7 @@ impl Queued { }); let project_path = project_path.canonicalize()?; - let so_path = build_deployment(self.id, &project_path, tx.clone()).await?; + let so_path = build_deployment(self.id, &project_path, false, tx.clone()).await?; if self.will_run_tests { info!( @@ -265,13 +265,17 @@ fn extract_tar_gz_data(data: impl Read, dest: impl AsRef) -> Result<()> { async fn build_deployment( deployment_id: Uuid, project_path: &Path, + wasm: bool, tx: crossbeam_channel::Sender, ) -> Result { - let so_path = build_crate(deployment_id, project_path, true, tx) + let runtime_path = build_crate(deployment_id, project_path, true, wasm, tx) .await .map_err(|e| Error::Build(e.into()))?; - Ok(so_path) + match runtime_path { + Runtime::Legacy(so_path) => Ok(so_path), + Runtime::Next(_) => todo!(), + } } #[instrument(skip(project_path, tx))] diff --git a/service/src/loader.rs b/service/src/loader.rs index f415805f3..109b714c7 100644 --- a/service/src/loader.rs +++ b/service/src/loader.rs @@ -5,7 +5,7 @@ use std::panic::AssertUnwindSafe; use std::path::{Path, PathBuf}; use anyhow::{anyhow, Context}; -use cargo::core::compiler::{CompileMode, MessageFormat}; +use cargo::core::compiler::{CompileKind, CompileMode, CompileTarget, MessageFormat}; use cargo::core::{Manifest, PackageId, Shell, Summary, Verbosity, Workspace}; use cargo::ops::{compile, CompileOptions}; use cargo::util::interning::InternedString; @@ -100,13 +100,20 @@ impl Loader { } } +/// How to run/build the project +pub enum Runtime { + Next(PathBuf), + Legacy(PathBuf), +} + /// Given a project directory path, builds the crate pub async fn build_crate( deployment_id: Uuid, project_path: &Path, release_mode: bool, + wasm: bool, tx: Sender, -) -> anyhow::Result { +) -> anyhow::Result { let (read, write) = pipe::pipe(); let project_path = project_path.to_owned(); @@ -125,10 +132,15 @@ pub async fn build_crate( check_version(summary)?; check_no_panic(&ws)?; - let opts = get_compile_options(&config, release_mode)?; + let opts = get_compile_options(&config, release_mode, wasm)?; let compilation = compile(&ws, &opts); - Ok(compilation?.cdylibs[0].path.clone()) + let path = compilation?.cdylibs[0].path.clone(); + Ok(if wasm { + Runtime::Next(path) + } else { + Runtime::Legacy(path) + }) }); // This needs to be on a separate thread, else deployer will block (reason currently unknown :D) @@ -169,7 +181,11 @@ pub fn get_config(writer: PipeWriter) -> anyhow::Result { } /// Get options to compile in build mode -fn get_compile_options(config: &Config, release_mode: bool) -> anyhow::Result { +fn get_compile_options( + config: &Config, + release_mode: bool, + wasm: bool, +) -> anyhow::Result { let mut opts = CompileOptions::new(config, CompileMode::Build)?; opts.build_config.message_format = MessageFormat::Json { render_diagnostics: false, @@ -183,6 +199,12 @@ fn get_compile_options(config: &Config, release_mode: bool) -> anyhow::Result path, + _ => unreachable!(), + }; assert!( so_path @@ -27,20 +37,32 @@ async fn not_shuttle() { async fn not_lib() { let (tx, _) = crossbeam_channel::unbounded(); let project_path = format!("{}/tests/resources/not-lib", env!("CARGO_MANIFEST_DIR")); - build_crate(Default::default(), Path::new(&project_path), false, tx) - .await - .unwrap(); + build_crate( + Default::default(), + Path::new(&project_path), + false, + false, + tx, + ) + .await + .unwrap(); } #[tokio::test(flavor = "multi_thread")] async fn not_cdylib() { let (tx, _) = crossbeam_channel::unbounded(); let project_path = format!("{}/tests/resources/not-cdylib", env!("CARGO_MANIFEST_DIR")); - assert!( - build_crate(Default::default(), Path::new(&project_path), false, tx) - .await - .is_ok() - ); + assert!(matches!( + build_crate( + Default::default(), + Path::new(&project_path), + false, + false, + tx + ) + .await, + Ok(Runtime::Legacy(_)) + )); assert!(PathBuf::from(project_path) .join("target/debug/libnot_cdylib.so") .exists()); @@ -50,11 +72,17 @@ async fn not_cdylib() { async fn is_cdylib() { let (tx, _) = crossbeam_channel::unbounded(); let project_path = format!("{}/tests/resources/is-cdylib", env!("CARGO_MANIFEST_DIR")); - assert!( - build_crate(Default::default(), Path::new(&project_path), false, tx) - .await - .is_ok() - ); + assert!(matches!( + build_crate( + Default::default(), + Path::new(&project_path), + false, + false, + tx + ) + .await, + Ok(Runtime::Legacy(_)) + )); assert!(PathBuf::from(project_path) .join("target/debug/libis_cdylib.so") .exists()); @@ -68,7 +96,13 @@ async fn not_found() { "{}/tests/resources/non-existing", env!("CARGO_MANIFEST_DIR") ); - build_crate(Default::default(), Path::new(&project_path), false, tx) - .await - .unwrap(); + build_crate( + Default::default(), + Path::new(&project_path), + false, + false, + tx, + ) + .await + .unwrap(); } From 5546fb290fd0e0610982ec60dbf7a0b357ebcb6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 1 Nov 2022 11:34:11 +0100 Subject: [PATCH 08/74] feat: move factory to runtime (#444) * feat: initial commit of moving factory to runtime * feat: replace deployer factory with dummy, clean commented code * feat: update legacy runtime readme --- deployer/src/deployment/mod.rs | 4 +- .../src/deployment/provisioner_factory.rs | 146 +++--------------- deployer/src/deployment/run.rs | 6 +- deployer/src/lib.rs | 6 +- deployer/src/main.rs | 23 +-- runtime/README.md | 10 +- runtime/src/legacy/mod.rs | 61 +++----- runtime/src/lib.rs | 1 + runtime/src/main.rs | 5 +- runtime/src/provisioner_factory.rs | 111 +++++++++++++ 10 files changed, 181 insertions(+), 192 deletions(-) create mode 100644 runtime/src/provisioner_factory.rs diff --git a/deployer/src/deployment/mod.rs b/deployer/src/deployment/mod.rs index 735b004d3..d7f10eeb5 100644 --- a/deployer/src/deployment/mod.rs +++ b/deployer/src/deployment/mod.rs @@ -30,7 +30,7 @@ impl DeploymentManager { /// Create a new deployment manager. Manages one or more 'pipelines' for /// processing service building, loading, and deployment. pub fn new( - abstract_factory: impl provisioner_factory::AbstractFactory, + abstract_dummy_factory: impl provisioner_factory::AbstractFactory, runtime_logger_factory: impl runtime_logger::Factory, build_log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, @@ -42,7 +42,7 @@ impl DeploymentManager { DeploymentManager { pipeline: Pipeline::new( kill_send.clone(), - abstract_factory, + abstract_dummy_factory, runtime_logger_factory, build_log_recorder, secret_recorder, diff --git a/deployer/src/deployment/provisioner_factory.rs b/deployer/src/deployment/provisioner_factory.rs index 33d1bc598..3b923b60a 100644 --- a/deployer/src/deployment/provisioner_factory.rs +++ b/deployer/src/deployment/provisioner_factory.rs @@ -1,162 +1,62 @@ use std::collections::BTreeMap; +use std::str::FromStr; use async_trait::async_trait; -use shuttle_common::{database, DatabaseReadyInfo}; -use shuttle_proto::provisioner::{ - database_request::DbType, provisioner_client::ProvisionerClient, DatabaseRequest, -}; +use shuttle_common::database; use shuttle_service::{Factory, ServiceName}; -use tonic::{transport::Channel, Request}; -use tracing::{debug, info, trace}; -use uuid::Uuid; - -use crate::persistence::{Resource, ResourceRecorder, ResourceType, SecretGetter}; /// Trait to make it easy to get a factory (service locator) for each service being started pub trait AbstractFactory: Send + 'static { type Output: Factory; /// Get a factory for a specific service - fn get_factory(&self, service_name: ServiceName, service_id: Uuid) -> Self::Output; + fn get_factory(&self) -> Self::Output; } /// An abstract factory that makes factories which uses provisioner #[derive(Clone)] -pub struct AbstractProvisionerFactory { - provisioner_client: ProvisionerClient, - resource_recorder: R, - secret_getter: S, -} +pub struct AbstractDummyFactory; -impl AbstractFactory for AbstractProvisionerFactory { - type Output = ProvisionerFactory; +impl AbstractFactory for AbstractDummyFactory { + type Output = DummyFactory; - fn get_factory(&self, service_name: ServiceName, service_id: Uuid) -> Self::Output { - ProvisionerFactory::new( - self.provisioner_client.clone(), - service_name, - service_id, - self.resource_recorder.clone(), - self.secret_getter.clone(), - ) + fn get_factory(&self) -> Self::Output { + DummyFactory::new() } } -impl AbstractProvisionerFactory { - pub fn new( - provisioner_client: ProvisionerClient, - resource_recorder: R, - secret_getter: S, - ) -> Self { - Self { - provisioner_client, - resource_recorder, - secret_getter, - } +impl AbstractDummyFactory { + pub fn new() -> Self { + Self } } -/// A factory (service locator) which goes through the provisioner crate -pub struct ProvisionerFactory { +pub struct DummyFactory { service_name: ServiceName, - service_id: Uuid, - provisioner_client: ProvisionerClient, - info: Option, - resource_recorder: R, - secret_getter: S, - secrets: Option>, } -impl ProvisionerFactory { - pub(crate) fn new( - provisioner_client: ProvisionerClient, - service_name: ServiceName, - service_id: Uuid, - resource_recorder: R, - secret_getter: S, - ) -> Self { +impl DummyFactory { + fn new() -> Self { Self { - provisioner_client, - service_name, - service_id, - info: None, - resource_recorder, - secret_getter, - secrets: None, + service_name: ServiceName::from_str("legacy").unwrap(), } } } #[async_trait] -impl Factory for ProvisionerFactory { +impl Factory for DummyFactory { + fn get_service_name(&self) -> ServiceName { + self.service_name.clone() + } + async fn get_db_connection_string( &mut self, - db_type: database::Type, + _: database::Type, ) -> Result { - info!("Provisioning a {db_type} on the shuttle servers. This can take a while..."); - - if let Some(ref info) = self.info { - debug!("A database has already been provisioned for this deployment, so reusing it"); - return Ok(info.connection_string_private()); - } - - let r#type = ResourceType::Database(db_type.clone().into()); - let db_type: DbType = db_type.into(); - - let request = Request::new(DatabaseRequest { - project_name: self.service_name.to_string(), - db_type: Some(db_type), - }); - - let response = self - .provisioner_client - .provision_database(request) - .await - .map_err(shuttle_service::error::CustomError::new)? - .into_inner(); - - let info: DatabaseReadyInfo = response.into(); - let conn_str = info.connection_string_private(); - - self.resource_recorder - .insert_resource(&Resource { - service_id: self.service_id, - r#type, - data: serde_json::to_value(&info).unwrap(), - }) - .await - .unwrap(); - - self.info = Some(info); - - info!("Done provisioning database"); - trace!("giving a DB connection string: {}", conn_str); - Ok(conn_str) + todo!() } async fn get_secrets(&mut self) -> Result, shuttle_service::Error> { - if let Some(ref secrets) = self.secrets { - debug!("Returning previously fetched secrets"); - Ok(secrets.clone()) - } else { - info!("Fetching secrets for deployment"); - let iter = self - .secret_getter - .get_secrets(&self.service_id) - .await - .map_err(shuttle_service::error::CustomError::new)? - .into_iter() - .map(|secret| (secret.key, secret.value)); - - let secrets = BTreeMap::from_iter(iter); - self.secrets = Some(secrets.clone()); - - info!("Done fetching secrets"); - Ok(secrets) - } - } - - fn get_service_name(&self) -> ServiceName { - self.service_name.clone() + todo!() } } diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index 21901d303..d5c804b3f 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -24,7 +24,7 @@ use crate::error::{Error, Result}; pub async fn task( mut recv: RunReceiver, kill_send: KillSender, - abstract_factory: impl provisioner_factory::AbstractFactory, + abstract_dummy_factory: impl provisioner_factory::AbstractFactory, logger_factory: impl runtime_logger::Factory, active_deployment_getter: impl ActiveDeploymentsGetter, artifacts_path: PathBuf, @@ -55,14 +55,14 @@ pub async fn task( } }; let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); - let service_name = match ServiceName::from_str(&built.service_name) { + let _service_name = match ServiceName::from_str(&built.service_name) { Ok(name) => name, Err(err) => { start_crashed_cleanup(&id, err); continue; } }; - let mut factory = abstract_factory.get_factory(service_name, built.service_id); + let mut factory = abstract_dummy_factory.get_factory(); let logger = logger_factory.get_logger(id); let old_deployments_killer = kill_old_deployments( diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index 30b40a42e..30ee4528d 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -2,7 +2,7 @@ use std::{convert::Infallible, net::SocketAddr}; pub use args::Args; pub use deployment::{ - deploy_layer::DeployLayer, provisioner_factory::AbstractProvisionerFactory, + deploy_layer::DeployLayer, provisioner_factory::AbstractDummyFactory, runtime_logger::RuntimeLoggerFactory, }; use deployment::{provisioner_factory, runtime_logger, Built, DeploymentManager}; @@ -23,13 +23,13 @@ mod persistence; mod proxy; pub async fn start( - abstract_factory: impl provisioner_factory::AbstractFactory, + abstract_dummy_factory: impl provisioner_factory::AbstractFactory, runtime_logger_factory: impl runtime_logger::Factory, persistence: Persistence, args: Args, ) { let deployment_manager = DeploymentManager::new( - abstract_factory, + abstract_dummy_factory, runtime_logger_factory, persistence.clone(), persistence.clone(), diff --git a/deployer/src/main.rs b/deployer/src/main.rs index afc30221f..d473361ad 100644 --- a/deployer/src/main.rs +++ b/deployer/src/main.rs @@ -1,11 +1,8 @@ use clap::Parser; use shuttle_deployer::{ - start, start_proxy, AbstractProvisionerFactory, Args, DeployLayer, Persistence, - RuntimeLoggerFactory, + start, start_proxy, AbstractDummyFactory, Args, DeployLayer, Persistence, RuntimeLoggerFactory, }; -use shuttle_proto::provisioner::provisioner_client::ProvisionerClient; use tokio::select; -use tonic::transport::Endpoint; use tracing::trace; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; @@ -37,26 +34,12 @@ async fn main() { .with(opentelemetry) .init(); - let provisioner_uri = Endpoint::try_from(format!( - "http://{}:{}", - args.provisioner_address, args.provisioner_port - )) - .expect("provisioner uri is not valid"); - - let provisioner_client = ProvisionerClient::connect(provisioner_uri) - .await - .expect("failed to connect to provisioner"); - - let abstract_factory = AbstractProvisionerFactory::new( - provisioner_client, - persistence.clone(), - persistence.clone(), - ); + let abstract_dummy_factory = AbstractDummyFactory::new(); let runtime_logger_factory = RuntimeLoggerFactory::new(persistence.get_log_sender()); select! { _ = start_proxy(args.proxy_address, args.proxy_fqdn.clone(), persistence.clone()) => {}, - _ = start(abstract_factory, runtime_logger_factory, persistence, args) => {}, + _ = start(abstract_dummy_factory, runtime_logger_factory, persistence, args) => {}, } } diff --git a/runtime/README.md b/runtime/README.md index 53755c860..843951e75 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -15,10 +15,16 @@ grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name Load and run an .so library that implements `shuttle_service::Service`. -To test, first start this binary using: +To test, first start a provisioner from the root directory using: ```bash -cargo run -- --legacy +docker-compose -f docker-compose.rendered.yml up provisioner +``` + +Then in another shell, start the runtime using: + +```bash +cargo run -- --legacy --provisioner-address http://localhost:8000 ``` Then in another shell, load a `.so` file and start it up: diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 2e7c50149..89a688f87 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -1,5 +1,4 @@ use std::{ - collections::BTreeMap, net::{Ipv4Addr, SocketAddr}, path::PathBuf, str::FromStr, @@ -8,31 +7,36 @@ use std::{ use anyhow::anyhow; use async_trait::async_trait; -use shuttle_common::{database, LogItem}; -use shuttle_proto::runtime::{ - runtime_server::Runtime, LoadRequest, LoadResponse, StartRequest, StartResponse, +use shuttle_common::LogItem; +use shuttle_proto::{ + provisioner::provisioner_client::ProvisionerClient, + runtime::{runtime_server::Runtime, LoadRequest, LoadResponse, StartRequest, StartResponse}, }; use shuttle_service::{ loader::{LoadedService, Loader}, Factory, Logger, ServiceName, }; use tokio::sync::mpsc::{self, UnboundedReceiver}; -use tonic::{Request, Response, Status}; +use tonic::{transport::Endpoint, Request, Response, Status}; use tracing::{info, instrument, trace}; +use crate::provisioner_factory::{AbstractFactory, AbstractProvisionerFactory}; + mod error; pub struct Legacy { // Mutexes are for interior mutability so_path: Mutex>, port: Mutex>, + provisioner_address: Endpoint, } impl Legacy { - pub fn new() -> Self { + pub fn new(provisioner_address: Endpoint) -> Self { Self { so_path: Mutex::new(None), port: Mutex::new(None), + provisioner_address, } } } @@ -52,12 +56,23 @@ impl Runtime for Legacy { async fn start( &self, - _request: Request, + request: Request, ) -> Result, Status> { let port = 8001; let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); - let mut factory = DummyFactory::new(); + + let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) + .await + .expect("failed to connect to provisioner"); + let abstract_factory = AbstractProvisionerFactory::new(provisioner_client); + + let service_name = ServiceName::from_str(request.into_inner().service_name.as_str()) + .map_err(|err| Status::from_error(Box::new(err)))?; + + let mut factory = abstract_factory.get_factory(service_name); + let (logger, _rx) = get_logger(); + let so_path = self .so_path .lock() @@ -112,36 +127,6 @@ async fn load_service( Ok(loader.load(factory, addr, logger).await?) } -struct DummyFactory { - service_name: ServiceName, -} - -impl DummyFactory { - fn new() -> Self { - Self { - service_name: ServiceName::from_str("legacy").unwrap(), - } - } -} - -#[async_trait] -impl Factory for DummyFactory { - fn get_service_name(&self) -> ServiceName { - self.service_name.clone() - } - - async fn get_db_connection_string( - &mut self, - _: database::Type, - ) -> Result { - todo!() - } - - async fn get_secrets(&mut self) -> Result, shuttle_service::Error> { - todo!() - } -} - fn get_logger() -> (Logger, UnboundedReceiver) { let (tx, rx) = mpsc::unbounded_channel(); let logger = Logger::new(tx, Default::default()); diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 6aa6ae608..7ca426d3a 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,6 +1,7 @@ mod args; mod legacy; mod next; +pub mod provisioner_factory; pub use args::Args; pub use legacy::Legacy; diff --git a/runtime/src/main.rs b/runtime/src/main.rs index 9ee7986a2..b287a7239 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -24,8 +24,11 @@ async fn main() { trace!(args = ?args, "parsed args"); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8000); + + let provisioner_address = args.provisioner_address; + let router = if args.legacy { - let legacy = Legacy::new(); + let legacy = Legacy::new(provisioner_address); let svc = RuntimeServer::new(legacy); Server::builder().add_service(svc) } else { diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs new file mode 100644 index 000000000..6a99d6d4b --- /dev/null +++ b/runtime/src/provisioner_factory.rs @@ -0,0 +1,111 @@ +use std::collections::BTreeMap; + +use async_trait::async_trait; +use shuttle_common::{database, DatabaseReadyInfo}; +use shuttle_proto::provisioner::{ + database_request::DbType, provisioner_client::ProvisionerClient, DatabaseRequest, +}; +use shuttle_service::{Factory, ServiceName}; +use tonic::{transport::Channel, Request}; +use tracing::{debug, info, trace}; + +/// Trait to make it easy to get a factory (service locator) for each service being started +pub trait AbstractFactory: Send + 'static { + type Output: Factory; + + /// Get a factory for a specific service + fn get_factory(&self, service_name: ServiceName) -> Self::Output; +} + +/// An abstract factory that makes factories which uses provisioner +#[derive(Clone)] +pub struct AbstractProvisionerFactory { + provisioner_client: ProvisionerClient, +} + +impl AbstractFactory for AbstractProvisionerFactory { + type Output = ProvisionerFactory; + + fn get_factory(&self, service_name: ServiceName) -> Self::Output { + ProvisionerFactory::new(self.provisioner_client.clone(), service_name) + } +} + +impl AbstractProvisionerFactory { + pub fn new(provisioner_client: ProvisionerClient) -> Self { + Self { provisioner_client } + } +} + +/// A factory (service locator) which goes through the provisioner crate +pub struct ProvisionerFactory { + service_name: ServiceName, + provisioner_client: ProvisionerClient, + info: Option, + secrets: Option>, +} + +impl ProvisionerFactory { + pub(crate) fn new( + provisioner_client: ProvisionerClient, + service_name: ServiceName, + ) -> Self { + Self { + provisioner_client, + service_name, + info: None, + secrets: None, + } + } +} + +#[async_trait] +impl Factory for ProvisionerFactory { + async fn get_db_connection_string( + &mut self, + db_type: database::Type, + ) -> Result { + info!("Provisioning a {db_type} on the shuttle servers. This can take a while..."); + + if let Some(ref info) = self.info { + debug!("A database has already been provisioned for this deployment, so reusing it"); + return Ok(info.connection_string_private()); + } + + let db_type: DbType = db_type.into(); + + let request = Request::new(DatabaseRequest { + project_name: self.service_name.to_string(), + db_type: Some(db_type), + }); + + let response = self + .provisioner_client + .provision_database(request) + .await + .map_err(shuttle_service::error::CustomError::new)? + .into_inner(); + + let info: DatabaseReadyInfo = response.into(); + let conn_str = info.connection_string_private(); + + self.info = Some(info); + + info!("Done provisioning database"); + trace!("giving a DB connection string: {}", conn_str); + Ok(conn_str) + } + + async fn get_secrets(&mut self) -> Result, shuttle_service::Error> { + if let Some(ref secrets) = self.secrets { + debug!("Returning previously fetched secrets"); + Ok(secrets.clone()) + } else { + todo!() + } + } + + fn get_service_name(&self) -> ServiceName { + self.service_name.clone() + } +} From 0e8ce8b6772cc6f3f7eba4fcac96bbf8a77d8afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Fri, 4 Nov 2022 17:24:55 +0100 Subject: [PATCH 09/74] WIP feat: start runtime from deployer (#450) * WIP feat: start runtime from deployer * feat: attempt to start runtime as a child process * fix: add current dir * feat: clean up, update readme * feat: use cargo manifest dir for runtime path * refactor: clean up, fmt * refactor: clippy warnings for Eq Co-authored-by: chesedo --- Cargo.lock | 1 - Makefile | 2 +- deployer/Cargo.toml | 3 +- deployer/src/deployment/deploy_layer.rs | 6 +- deployer/src/deployment/run.rs | 111 ++++++++++-------------- deployer/src/error.rs | 2 - deployer/src/lib.rs | 28 ++++-- proto/runtime.proto | 3 +- proto/src/lib.rs | 8 +- runtime/README.md | 11 ++- runtime/src/legacy/mod.rs | 14 +-- runtime/src/main.rs | 2 +- runtime/src/next/mod.rs | 3 +- 13 files changed, 99 insertions(+), 95 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e556fcf2b..b065cb0f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5754,7 +5754,6 @@ dependencies = [ "opentelemetry", "opentelemetry-datadog", "pipe", - "portpicker", "rand 0.8.5", "serde", "serde_json", diff --git a/Makefile b/Makefile index ac0d31cdc..aa4cb75cc 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ POSTGRES_TAG?=latest RUST_LOG?=debug -DOCKER_COMPOSE_ENV=STACK=$(STACK) BACKEND_TAG=$(TAG) PROVISIONER_TAG=$(TAG) POSTGRES_TAG=latest APPS_FQDN=$(APPS_FQDN) DB_FQDN=$(DB_FQDN) POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) RUST_LOG=$(RUST_LOG) CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) MONGO_INITDB_ROOT_USERNAME=$(MONGO_INITDB_ROOT_USERNAME) MONGO_INITDB_ROOT_PASSWORD=$(MONGO_INITDB_ROOT_PASSWORD) +DOCKER_COMPOSE_ENV=STACK=$(STACK) BACKEND_TAG=$(TAG) PROVISIONER_TAG=$(TAG) POSTGRES_TAG=14 APPS_FQDN=$(APPS_FQDN) DB_FQDN=$(DB_FQDN) POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) RUST_LOG=$(RUST_LOG) CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) MONGO_INITDB_ROOT_USERNAME=$(MONGO_INITDB_ROOT_USERNAME) MONGO_INITDB_ROOT_PASSWORD=$(MONGO_INITDB_ROOT_PASSWORD) .PHONY: images clean src up down deploy shuttle-% postgres docker-compose.rendered.yml test diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index fa6f90edb..d7c575d17 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -24,14 +24,13 @@ once_cell = "1.14.0" opentelemetry = { version = "0.17.0", features = ["rt-tokio"] } opentelemetry-datadog = { version = "0.5.0", features = ["reqwest-client"] } pipe = "0.4.0" -portpicker = "0.1.1" serde = "1.0.137" serde_json = "1.0.81" sqlx = { version = "0.6.0", features = ["runtime-tokio-native-tls", "sqlite", "chrono", "json", "migrate", "uuid"] } strum = { version = "0.24.1", features = ["derive"] } tar = "0.4.38" thiserror = "1.0.24" -tokio = { version = "1.19.2", features = ["fs"] } +tokio = { version = "1.19.2", features = ["fs", "process"] } toml = "0.5.9" tonic = "0.8.2" tower = { version = "0.4.12", features = ["make"] } diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index d6c01b0b2..429ab99d6 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -455,11 +455,7 @@ mod tests { impl provisioner_factory::AbstractFactory for StubAbstractProvisionerFactory { type Output = StubProvisionerFactory; - fn get_factory( - &self, - _project_name: shuttle_common::project::ProjectName, - _service_id: Uuid, - ) -> Self::Output { + fn get_factory(&self) -> Self::Output { StubProvisionerFactory } } diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index d5c804b3f..7ab74a557 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -5,14 +5,12 @@ use std::{ }; use async_trait::async_trait; -use portpicker::pick_unused_port; use shuttle_common::project::ProjectName as ServiceName; -use shuttle_service::{ - loader::{LoadedService, Loader}, - Factory, Logger, -}; +use shuttle_proto::runtime::{runtime_client::RuntimeClient, LoadRequest, StartRequest}; + +use shuttle_service::{Factory, Logger}; use tokio::task::JoinError; -use tracing::{debug, error, info, instrument, trace}; +use tracing::{error, info, instrument, trace}; use uuid::Uuid; use super::{provisioner_factory, runtime_logger, KillReceiver, KillSender, RunReceiver, State}; @@ -42,18 +40,9 @@ pub async fn task( let kill_send = kill_send.clone(); let kill_recv = kill_send.subscribe(); - let port = match pick_unused_port() { - Some(port) => port, - None => { - start_crashed_cleanup( - &id, - Error::PrepareLoad( - "could not find a free port to deploy service on".to_string(), - ), - ); - continue; - } - }; + // todo: this is the port the legacy runtime is hardcoded to start services on + let port = 7001; + let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); let _service_name = match ServiceName::from_str(&built.service_name) { Ok(name) => name, @@ -174,81 +163,77 @@ pub struct Built { } impl Built { - #[instrument(name = "built_handle", skip(self, libs_path, factory, logger, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] + #[instrument(name = "built_handle", skip(self, libs_path, _factory, _logger, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] #[allow(clippy::too_many_arguments)] async fn handle( self, address: SocketAddr, libs_path: PathBuf, - factory: &mut dyn Factory, - logger: Logger, + _factory: &mut dyn Factory, + _logger: Logger, kill_recv: KillReceiver, kill_old_deployments: impl futures::Future>, cleanup: impl FnOnce(std::result::Result, JoinError>) + Send + 'static, ) -> Result<()> { - let service = load_deployment(&self.id, address, libs_path, factory, logger).await?; - + // todo: refactor this? kill_old_deployments.await?; info!("got handle for deployment"); // Execute loaded service - tokio::spawn(run(self.id, service, address, kill_recv, cleanup)); + tokio::spawn(run( + self.id, + self.service_name, + libs_path, + address, + kill_recv, + cleanup, + )); Ok(()) } } -#[instrument(skip(service, kill_recv, cleanup), fields(address = %_address, state = %State::Running))] +#[instrument(skip(_kill_recv, _cleanup), fields(address = %_address, state = %State::Running))] async fn run( id: Uuid, - service: LoadedService, + service_name: String, + libs_path: PathBuf, _address: SocketAddr, - mut kill_recv: KillReceiver, - cleanup: impl FnOnce(std::result::Result, JoinError>) + _kill_recv: KillReceiver, + _cleanup: impl FnOnce(std::result::Result, JoinError>) + Send + 'static, ) { - info!("starting up service"); - let (mut handle, library) = service; - let result; - loop { - tokio::select! { - Ok(kill_id) = kill_recv.recv() => { - if kill_id == id { - debug!("deployment '{id}' killed"); - handle.abort(); - result = handle.await; - break; - } - } - rsl = &mut handle => { - result = rsl; - break; - } - } - } + info!("starting up deployer grpc client"); + let mut client = RuntimeClient::connect("http://127.0.0.1:6001") + .await + .unwrap(); - if let Err(err) = library.close() { - crashed_cleanup(&id, err); - } else { - cleanup(result); - } -} + info!( + "loading project from: {}", + libs_path.clone().into_os_string().into_string().unwrap() + ); -#[instrument(skip(id, addr, libs_path, factory, logger))] -async fn load_deployment( - id: &Uuid, - addr: SocketAddr, - libs_path: PathBuf, - factory: &mut dyn Factory, - logger: Logger, -) -> Result { let so_path = libs_path.join(id.to_string()); - let loader = Loader::from_so_file(so_path)?; + let load_request = tonic::Request::new(LoadRequest { + path: so_path.into_os_string().into_string().unwrap(), + service_name: service_name.clone(), + }); + info!("loading service"); + let response = client.load(load_request).await; + + if let Err(e) = response { + info!("failed to load service: {}", e); + } + + let start_request = tonic::Request::new(StartRequest { service_name }); + + info!("starting service"); + let response = client.start(start_request).await.unwrap(); - Ok(loader.load(factory, addr, logger).await?) + info!(response = ?response, "client response: "); } #[cfg(test)] diff --git a/deployer/src/error.rs b/deployer/src/error.rs index 9a0fd8c29..f7d3ecd45 100644 --- a/deployer/src/error.rs +++ b/deployer/src/error.rs @@ -14,8 +14,6 @@ pub enum Error { InputOutput(#[from] io::Error), #[error("Build error: {0}")] Build(#[source] Box), - #[error("Prepare to load error: {0}")] - PrepareLoad(String), #[error("Load error: {0}")] Load(#[from] LoaderError), #[error("Run error: {0}")] diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index 30ee4528d..f1b325301 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -1,4 +1,4 @@ -use std::{convert::Infallible, net::SocketAddr}; +use std::{convert::Infallible, env, net::SocketAddr, path::PathBuf}; pub use args::Args; pub use deployment::{ @@ -13,6 +13,7 @@ use hyper::{ }; pub use persistence::Persistence; use proxy::AddressGetter; +use tokio::select; use tracing::{error, info}; mod args; @@ -54,12 +55,27 @@ pub async fn start( ); let make_service = router.into_make_service(); - info!("Binding to and listening at address: {}", args.api_address); + let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap() + .to_path_buf(); - axum::Server::bind(&args.api_address) - .serve(make_service) - .await - .unwrap_or_else(|_| panic!("Failed to bind to address: {}", args.api_address)); + let runtime_dir = workspace_root.join("target/debug"); + + let mut runtime = tokio::process::Command::new(runtime_dir.join("shuttle-runtime")) + .args(&["--legacy", "--provisioner-address", "http://localhost:8000"]) + .current_dir(&runtime_dir) + .spawn() + .unwrap(); + + select! { + _ = runtime.wait() => { + info!("Legacy runtime stopped.") + }, + _ = axum::Server::bind(&args.api_address).serve(make_service) => { + info!("Handlers server stopped serving addr: {}", &args.api_address); + }, + } } pub async fn start_proxy( diff --git a/proto/runtime.proto b/proto/runtime.proto index d26e0c6c8..b9c630556 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -31,7 +31,8 @@ message StartResponse { // Was the start successful bool success = 1; + // todo: find a way to add optional flag here // Optional port the service was started on // This is likely to be None for bots - optional uint32 port = 2; + uint32 port = 2; } diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 6dff3b13e..49f39a14a 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -1,8 +1,8 @@ -pub mod provisioner { - // This clippy is disabled as per this prost comment - // https://github.com/tokio-rs/prost/issues/661#issuecomment-1156606409 - #![allow(clippy::derive_partial_eq_without_eq)] +// This clippy is disabled as per this prost comment +// https://github.com/tokio-rs/prost/issues/661#issuecomment-1156606409 +#![allow(clippy::derive_partial_eq_without_eq)] +pub mod provisioner { use std::fmt::Display; use shuttle_common::{ diff --git a/runtime/README.md b/runtime/README.md index 843951e75..af60bc7cf 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -21,12 +21,21 @@ To test, first start a provisioner from the root directory using: docker-compose -f docker-compose.rendered.yml up provisioner ``` -Then in another shell, start the runtime using: +Then in another shell, start the runtime using the clap CLI: ```bash cargo run -- --legacy --provisioner-address http://localhost:8000 ``` +Or directly (this is the path hardcoded in `deployer::start`): +```bash +# first, make sure the shuttle-runtime binary is built +cargo build +# then +/home//target/debug/shuttle-runtime --legacy --provisioner-address http://localhost:8000 +``` + +Pass the path to `deployer::start` Then in another shell, load a `.so` file and start it up: ``` bash diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 89a688f87..1316f2da4 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -58,8 +58,8 @@ impl Runtime for Legacy { &self, request: Request, ) -> Result, Status> { - let port = 8001; - let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); + let service_port = 7001; + let service_address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), service_port); let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) .await @@ -84,18 +84,18 @@ impl Runtime for Legacy { .map_err(|err| Status::from_error(Box::new(err)))? .clone(); - trace!(%address, "starting"); - let service = load_service(address, so_path, &mut factory, logger) + trace!(%service_address, "starting"); + let service = load_service(service_address, so_path, &mut factory, logger) .await .unwrap(); - _ = tokio::spawn(run(service, address)); + _ = tokio::spawn(run(service, service_address)); - *self.port.lock().unwrap() = Some(port); + *self.port.lock().unwrap() = Some(service_port); let message = StartResponse { success: true, - port: Some(port as u32), + port: service_port as u32, }; Ok(Response::new(message)) diff --git a/runtime/src/main.rs b/runtime/src/main.rs index b287a7239..c11ebcdda 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -23,7 +23,7 @@ async fn main() { trace!(args = ?args, "parsed args"); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8000); + let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 6001); let provisioner_address = args.provisioner_address; diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index b6f15c671..86d185c43 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -63,7 +63,8 @@ impl Runtime for Next { let message = StartResponse { success: true, - port: None, + // todo: port set here until I can set the port field to optional in the protobuf + port: 8001, }; Ok(Response::new(message)) From ee342e49b9530f7d9d372f77ff28b87d6857973d Mon Sep 17 00:00:00 2001 From: Pieter Date: Mon, 14 Nov 2022 08:03:48 +0200 Subject: [PATCH 10/74] feat: get logs from runtime (#459) * feat: get logs from runtime * refactor: trim down deployer * refactor: start runtime earlier * refactor: connect to client earlier * refactor: hook runtime logs to persistence * bug: associate deployment id with logs * refactor: cleanup * feat: make sure grpc connection stays open --- Cargo.lock | 7 +- deployer/src/deployment/deploy_layer.rs | 129 +++++++++--------- deployer/src/deployment/mod.rs | 16 +-- .../src/deployment/provisioner_factory.rs | 62 --------- deployer/src/deployment/run.rs | 110 +++++---------- deployer/src/deployment/runtime_logger.rs | 54 -------- deployer/src/lib.rs | 47 ++----- deployer/src/main.rs | 71 ++++++++-- deployer/src/persistence/mod.rs | 2 + docker-compose.dev.yml | 3 + proto/Cargo.toml | 1 + proto/runtime.proto | 45 +++++- proto/src/lib.rs | 47 +++++++ runtime/Cargo.toml | 2 + runtime/README.md | 10 +- runtime/src/legacy/mod.rs | 55 ++++++-- runtime/src/main.rs | 11 +- runtime/src/next/mod.rs | 14 +- 18 files changed, 347 insertions(+), 339 deletions(-) delete mode 100644 deployer/src/deployment/provisioner_factory.rs delete mode 100644 deployer/src/deployment/runtime_logger.rs diff --git a/Cargo.lock b/Cargo.lock index b065cb0f8..d4f089eca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5818,6 +5818,7 @@ name = "shuttle-proto" version = "0.7.0" dependencies = [ "prost", + "prost-types", "shuttle-common", "tonic", "tonic-build", @@ -5863,9 +5864,11 @@ dependencies = [ "shuttle-service", "thiserror", "tokio", + "tokio-stream", "tonic", "tracing", "tracing-subscriber", + "uuid 1.1.2", "wasi-common", "wasmtime", "wasmtime-wasi", @@ -6823,9 +6826,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" +checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" dependencies = [ "futures-core", "pin-project-lite 0.2.9", diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index 429ab99d6..f74d5039d 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -22,7 +22,8 @@ use chrono::{DateTime, Utc}; use serde_json::json; use shuttle_common::STATE_MESSAGE; -use std::{net::SocketAddr, str::FromStr}; +use shuttle_proto::runtime; +use std::{net::SocketAddr, str::FromStr, time::SystemTime}; use tracing::{error, field::Visit, span, warn, Metadata, Subscriber}; use tracing_subscriber::Layer; use uuid::Uuid; @@ -126,6 +127,51 @@ impl From for DeploymentState { } } +impl From for Log { + fn from(log: runtime::LogItem) -> Self { + Self { + id: Uuid::from_slice(&log.id).unwrap(), + state: runtime::LogState::from_i32(log.state).unwrap().into(), + level: runtime::LogLevel::from_i32(log.level).unwrap().into(), + timestamp: DateTime::from(SystemTime::try_from(log.timestamp.unwrap()).unwrap()), + file: log.file, + line: log.line, + target: log.target, + fields: serde_json::from_slice(&log.fields).unwrap(), + r#type: LogType::Event, + address: None, + } + } +} + +impl From for State { + fn from(state: runtime::LogState) -> Self { + match state { + runtime::LogState::Queued => Self::Queued, + runtime::LogState::Building => Self::Building, + runtime::LogState::Built => Self::Built, + runtime::LogState::Loading => Self::Loading, + runtime::LogState::Running => Self::Running, + runtime::LogState::Completed => Self::Completed, + runtime::LogState::Stopped => Self::Stopped, + runtime::LogState::Crashed => Self::Crashed, + runtime::LogState::Unknown => Self::Unknown, + } + } +} + +impl From for LogLevel { + fn from(level: runtime::LogLevel) -> Self { + match level { + runtime::LogLevel::Trace => Self::Trace, + runtime::LogLevel::Debug => Self::Debug, + runtime::LogLevel::Info => Self::Info, + runtime::LogLevel::Warn => Self::Warn, + runtime::LogLevel::Error => Self::Error, + } + } +} + #[derive(Clone, Debug, Eq, PartialEq)] pub enum LogType { Event, @@ -345,7 +391,6 @@ impl Visit for JsonVisitor { #[cfg(test)] mod tests { use std::{ - collections::BTreeMap, fs::read_dir, path::PathBuf, sync::{Arc, Mutex}, @@ -356,15 +401,15 @@ mod tests { use ctor::ctor; use flate2::{write::GzEncoder, Compression}; use futures::FutureExt; - use shuttle_service::Logger; - use tokio::{select, sync::mpsc, time::sleep}; + use shuttle_proto::runtime::runtime_client::RuntimeClient; + use tokio::{select, time::sleep}; + use tonic::transport::Channel; use tracing_subscriber::prelude::*; use uuid::Uuid; use crate::{ deployment::{ - deploy_layer::LogType, provisioner_factory, runtime_logger, ActiveDeploymentsGetter, - Built, DeploymentManager, Queued, + deploy_layer::LogType, ActiveDeploymentsGetter, Built, DeploymentManager, Queued, }, persistence::{SecretRecorder, State}, }; @@ -430,6 +475,12 @@ mod tests { } } + async fn get_runtime_client() -> RuntimeClient { + RuntimeClient::connect("http://127.0.0.1:6001") + .await + .unwrap() + } + #[async_trait::async_trait] impl SecretRecorder for Arc> { type Err = std::io::Error; @@ -450,54 +501,6 @@ mod tests { } } - struct StubAbstractProvisionerFactory; - - impl provisioner_factory::AbstractFactory for StubAbstractProvisionerFactory { - type Output = StubProvisionerFactory; - - fn get_factory(&self) -> Self::Output { - StubProvisionerFactory - } - } - - struct StubProvisionerFactory; - - #[async_trait::async_trait] - impl shuttle_service::Factory for StubProvisionerFactory { - async fn get_db_connection_string( - &mut self, - _db_type: shuttle_common::database::Type, - ) -> Result { - panic!("did not expect any deploy_layer test to connect to the database") - } - - async fn get_secrets( - &mut self, - ) -> Result, shuttle_service::Error> { - panic!("did not expect any deploy_layer test to get secrets") - } - - fn get_service_name(&self) -> shuttle_service::ServiceName { - panic!("did not expect any deploy_layer test to get the service name") - } - } - - struct StubRuntimeLoggerFactory; - - impl runtime_logger::Factory for StubRuntimeLoggerFactory { - fn get_logger(&self, id: Uuid) -> Logger { - let (tx, mut rx) = mpsc::unbounded_channel(); - - tokio::spawn(async move { - while let Some(log) = rx.recv().await { - println!("{log}") - } - }); - - Logger::new(tx, id) - } - } - #[derive(Clone)] struct StubActiveDeploymentGetter; @@ -516,8 +519,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn deployment_to_be_queued() { let deployment_manager = DeploymentManager::new( - StubAbstractProvisionerFactory, - StubRuntimeLoggerFactory, + get_runtime_client().await, RECORDER.clone(), RECORDER.clone(), StubActiveDeploymentGetter, @@ -635,8 +637,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn deployment_self_stop() { let deployment_manager = DeploymentManager::new( - StubAbstractProvisionerFactory, - StubRuntimeLoggerFactory, + get_runtime_client().await, RECORDER.clone(), RECORDER.clone(), StubActiveDeploymentGetter, @@ -715,8 +716,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn deployment_bind_panic() { let deployment_manager = DeploymentManager::new( - StubAbstractProvisionerFactory, - StubRuntimeLoggerFactory, + get_runtime_client().await, RECORDER.clone(), RECORDER.clone(), StubActiveDeploymentGetter, @@ -795,8 +795,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn deployment_main_panic() { let deployment_manager = DeploymentManager::new( - StubAbstractProvisionerFactory, - StubRuntimeLoggerFactory, + get_runtime_client().await, RECORDER.clone(), RECORDER.clone(), StubActiveDeploymentGetter, @@ -870,8 +869,7 @@ mod tests { #[tokio::test] async fn deployment_from_run() { let deployment_manager = DeploymentManager::new( - StubAbstractProvisionerFactory, - StubRuntimeLoggerFactory, + get_runtime_client().await, RECORDER.clone(), RECORDER.clone(), StubActiveDeploymentGetter, @@ -924,8 +922,7 @@ mod tests { #[tokio::test] async fn scope_with_nil_id() { let deployment_manager = DeploymentManager::new( - StubAbstractProvisionerFactory, - StubRuntimeLoggerFactory, + get_runtime_client().await, RECORDER.clone(), RECORDER.clone(), StubActiveDeploymentGetter, diff --git a/deployer/src/deployment/mod.rs b/deployer/src/deployment/mod.rs index d7f10eeb5..549f05ad6 100644 --- a/deployer/src/deployment/mod.rs +++ b/deployer/src/deployment/mod.rs @@ -1,13 +1,13 @@ pub mod deploy_layer; -pub mod provisioner_factory; mod queue; mod run; -pub mod runtime_logger; use std::path::PathBuf; pub use queue::Queued; pub use run::{ActiveDeploymentsGetter, Built}; +use shuttle_proto::runtime::runtime_client::RuntimeClient; +use tonic::transport::Channel; use tracing::instrument; use crate::persistence::{SecretRecorder, State}; @@ -30,8 +30,7 @@ impl DeploymentManager { /// Create a new deployment manager. Manages one or more 'pipelines' for /// processing service building, loading, and deployment. pub fn new( - abstract_dummy_factory: impl provisioner_factory::AbstractFactory, - runtime_logger_factory: impl runtime_logger::Factory, + runtime_client: RuntimeClient, build_log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, active_deployment_getter: impl ActiveDeploymentsGetter, @@ -42,8 +41,7 @@ impl DeploymentManager { DeploymentManager { pipeline: Pipeline::new( kill_send.clone(), - abstract_dummy_factory, - runtime_logger_factory, + runtime_client, build_log_recorder, secret_recorder, active_deployment_getter, @@ -97,8 +95,7 @@ impl Pipeline { /// deployments between the aforementioned tasks. fn new( kill_send: KillSender, - abstract_factory: impl provisioner_factory::AbstractFactory, - runtime_logger_factory: impl runtime_logger::Factory, + runtime_client: RuntimeClient, build_log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, active_deployment_getter: impl ActiveDeploymentsGetter, @@ -118,9 +115,8 @@ impl Pipeline { )); tokio::spawn(run::task( run_recv, + runtime_client, kill_send, - abstract_factory, - runtime_logger_factory, active_deployment_getter, artifacts_path, )); diff --git a/deployer/src/deployment/provisioner_factory.rs b/deployer/src/deployment/provisioner_factory.rs deleted file mode 100644 index 3b923b60a..000000000 --- a/deployer/src/deployment/provisioner_factory.rs +++ /dev/null @@ -1,62 +0,0 @@ -use std::collections::BTreeMap; -use std::str::FromStr; - -use async_trait::async_trait; -use shuttle_common::database; -use shuttle_service::{Factory, ServiceName}; - -/// Trait to make it easy to get a factory (service locator) for each service being started -pub trait AbstractFactory: Send + 'static { - type Output: Factory; - - /// Get a factory for a specific service - fn get_factory(&self) -> Self::Output; -} - -/// An abstract factory that makes factories which uses provisioner -#[derive(Clone)] -pub struct AbstractDummyFactory; - -impl AbstractFactory for AbstractDummyFactory { - type Output = DummyFactory; - - fn get_factory(&self) -> Self::Output { - DummyFactory::new() - } -} - -impl AbstractDummyFactory { - pub fn new() -> Self { - Self - } -} - -pub struct DummyFactory { - service_name: ServiceName, -} - -impl DummyFactory { - fn new() -> Self { - Self { - service_name: ServiceName::from_str("legacy").unwrap(), - } - } -} - -#[async_trait] -impl Factory for DummyFactory { - fn get_service_name(&self) -> ServiceName { - self.service_name.clone() - } - - async fn get_db_connection_string( - &mut self, - _: database::Type, - ) -> Result { - todo!() - } - - async fn get_secrets(&mut self) -> Result, shuttle_service::Error> { - todo!() - } -} diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index 7ab74a557..cf35d4e33 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -8,12 +8,12 @@ use async_trait::async_trait; use shuttle_common::project::ProjectName as ServiceName; use shuttle_proto::runtime::{runtime_client::RuntimeClient, LoadRequest, StartRequest}; -use shuttle_service::{Factory, Logger}; use tokio::task::JoinError; +use tonic::transport::Channel; use tracing::{error, info, instrument, trace}; use uuid::Uuid; -use super::{provisioner_factory, runtime_logger, KillReceiver, KillSender, RunReceiver, State}; +use super::{KillReceiver, KillSender, RunReceiver, State}; use crate::error::{Error, Result}; /// Run a task which takes runnable deploys from a channel and starts them up with a factory provided by the @@ -21,9 +21,8 @@ use crate::error::{Error, Result}; /// A deploy is killed when it receives a signal from the kill channel pub async fn task( mut recv: RunReceiver, + runtime_client: RuntimeClient, kill_send: KillSender, - abstract_dummy_factory: impl provisioner_factory::AbstractFactory, - logger_factory: impl runtime_logger::Factory, active_deployment_getter: impl ActiveDeploymentsGetter, artifacts_path: PathBuf, ) { @@ -51,8 +50,6 @@ pub async fn task( continue; } }; - let mut factory = abstract_dummy_factory.get_factory(); - let logger = logger_factory.get_logger(id); let old_deployments_killer = kill_old_deployments( built.service_id, @@ -73,14 +70,14 @@ pub async fn task( }; let libs_path = libs_path.clone(); + let runtime_client = runtime_client.clone(); tokio::spawn(async move { if let Err(err) = built .handle( addr, libs_path, - &mut factory, - logger, + runtime_client, kill_recv, old_deployments_killer, cleanup, @@ -163,14 +160,13 @@ pub struct Built { } impl Built { - #[instrument(name = "built_handle", skip(self, libs_path, _factory, _logger, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] + #[instrument(name = "built_handle", skip(self, libs_path, runtime_client, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] #[allow(clippy::too_many_arguments)] async fn handle( self, address: SocketAddr, libs_path: PathBuf, - _factory: &mut dyn Factory, - _logger: Logger, + runtime_client: RuntimeClient, kill_recv: KillReceiver, kill_old_deployments: impl futures::Future>, cleanup: impl FnOnce(std::result::Result, JoinError>) @@ -186,6 +182,7 @@ impl Built { self.id, self.service_name, libs_path, + runtime_client, address, kill_recv, cleanup, @@ -195,22 +192,18 @@ impl Built { } } -#[instrument(skip(_kill_recv, _cleanup), fields(address = %_address, state = %State::Running))] +#[instrument(skip(runtime_client, _kill_recv, _cleanup), fields(address = %_address, state = %State::Running))] async fn run( id: Uuid, service_name: String, libs_path: PathBuf, + mut runtime_client: RuntimeClient, _address: SocketAddr, _kill_recv: KillReceiver, _cleanup: impl FnOnce(std::result::Result, JoinError>) + Send + 'static, ) { - info!("starting up deployer grpc client"); - let mut client = RuntimeClient::connect("http://127.0.0.1:6001") - .await - .unwrap(); - info!( "loading project from: {}", libs_path.clone().into_os_string().into_string().unwrap() @@ -222,24 +215,26 @@ async fn run( service_name: service_name.clone(), }); info!("loading service"); - let response = client.load(load_request).await; + let response = runtime_client.load(load_request).await; if let Err(e) = response { info!("failed to load service: {}", e); } - let start_request = tonic::Request::new(StartRequest { service_name }); + let start_request = tonic::Request::new(StartRequest { + deployment_id: id.as_bytes().to_vec(), + service_name, + }); info!("starting service"); - let response = client.start(start_request).await.unwrap(); + let response = runtime_client.start(start_request).await.unwrap(); - info!(response = ?response, "client response: "); + info!(response = ?response.into_inner(), "client response: "); } #[cfg(test)] mod tests { use std::{ - collections::BTreeMap, fs, net::{Ipv4Addr, SocketAddr}, path::PathBuf, @@ -247,13 +242,13 @@ mod tests { time::Duration, }; - use shuttle_common::database; - use shuttle_service::{Factory, Logger}; + use shuttle_proto::runtime::runtime_client::RuntimeClient; use tokio::{ - sync::{broadcast, mpsc, oneshot}, + sync::{broadcast, oneshot}, task::JoinError, time::sleep, }; + use tonic::transport::Channel; use uuid::Uuid; use crate::error::Error; @@ -263,44 +258,16 @@ mod tests { const RESOURCES_PATH: &str = "tests/resources"; const LIBS_PATH: &str = "/tmp/shuttle-libs-tests"; - struct StubFactory; - - #[async_trait::async_trait] - impl Factory for StubFactory { - async fn get_db_connection_string( - &mut self, - _db_type: database::Type, - ) -> Result { - panic!("no run test should get an sql connection"); - } - - async fn get_secrets( - &mut self, - ) -> Result, shuttle_service::Error> { - panic!("no test should get any secrets"); - } - - fn get_service_name(&self) -> shuttle_service::ServiceName { - panic!("no test should get the service name"); - } - } - - fn get_logger(id: Uuid) -> Logger { - let (tx, mut rx) = mpsc::unbounded_channel(); - - tokio::spawn(async move { - while let Some(log) = rx.recv().await { - println!("{log}"); - } - }); - - Logger::new(tx, id) - } - async fn kill_old_deployments() -> crate::error::Result<()> { Ok(()) } + async fn get_runtime_client() -> RuntimeClient { + RuntimeClient::connect("http://127.0.0.1:6001") + .await + .unwrap() + } + // This test uses the kill signal to make sure a service does stop when asked to #[tokio::test] async fn can_be_killed() { @@ -321,15 +288,12 @@ mod tests { cleanup_send.send(()).unwrap(); }; let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let mut factory = StubFactory; - let logger = get_logger(built.id); built .handle( addr, PathBuf::from(LIBS_PATH), - &mut factory, - logger, + get_runtime_client().await, kill_recv, kill_old_deployments(), handle_cleanup, @@ -369,15 +333,12 @@ mod tests { cleanup_send.send(()).unwrap(); }; let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let mut factory = StubFactory; - let logger = get_logger(built.id); built .handle( addr, PathBuf::from(LIBS_PATH), - &mut factory, - logger, + get_runtime_client().await, kill_recv, kill_old_deployments(), handle_cleanup, @@ -411,15 +372,12 @@ mod tests { cleanup_send.send(()).unwrap(); }; let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let mut factory = StubFactory; - let logger = get_logger(built.id); built .handle( addr, PathBuf::from(LIBS_PATH), - &mut factory, - logger, + get_runtime_client().await, kill_recv, kill_old_deployments(), handle_cleanup, @@ -441,15 +399,12 @@ mod tests { let handle_cleanup = |_result| panic!("the service shouldn't even start"); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let mut factory = StubFactory; - let logger = get_logger(built.id); let result = built .handle( addr, PathBuf::from(LIBS_PATH), - &mut factory, - logger, + get_runtime_client().await, kill_recv, kill_old_deployments(), handle_cleanup, @@ -474,15 +429,12 @@ mod tests { let handle_cleanup = |_result| panic!("no service means no cleanup"); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let mut factory = StubFactory; - let logger = get_logger(built.id); let result = built .handle( addr, PathBuf::from(LIBS_PATH), - &mut factory, - logger, + get_runtime_client().await, kill_recv, kill_old_deployments(), handle_cleanup, diff --git a/deployer/src/deployment/runtime_logger.rs b/deployer/src/deployment/runtime_logger.rs deleted file mode 100644 index 266805fed..000000000 --- a/deployer/src/deployment/runtime_logger.rs +++ /dev/null @@ -1,54 +0,0 @@ -use shuttle_common::LogItem; -use shuttle_service::Logger; -use tokio::sync::mpsc::{self, UnboundedSender}; -use uuid::Uuid; - -use super::deploy_layer::{self, LogType}; - -pub trait Factory: Send + 'static { - fn get_logger(&self, id: Uuid) -> Logger; -} - -/// Factory to create runtime loggers for deployments -pub struct RuntimeLoggerFactory { - log_send: crossbeam_channel::Sender, -} - -impl RuntimeLoggerFactory { - pub fn new(log_send: crossbeam_channel::Sender) -> Self { - Self { log_send } - } -} - -impl Factory for RuntimeLoggerFactory { - fn get_logger(&self, id: Uuid) -> Logger { - let (tx, mut rx): (UnboundedSender, _) = mpsc::unbounded_channel(); - - let sender = self.log_send.clone(); - - tokio::spawn(async move { - while let Some(log) = rx.recv().await { - sender.send(log.into()).expect("to send log to persistence"); - } - }); - - Logger::new(tx, id) - } -} - -impl From for deploy_layer::Log { - fn from(log: LogItem) -> Self { - Self { - id: log.id, - state: log.state.into(), - level: log.level.into(), - timestamp: log.timestamp, - file: log.file, - line: log.line, - target: log.target, - fields: serde_json::from_slice(&log.fields).unwrap(), - r#type: LogType::Event, - address: None, - } - } -} diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index f1b325301..16dcd9992 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -1,11 +1,8 @@ -use std::{convert::Infallible, env, net::SocketAddr, path::PathBuf}; +use std::{convert::Infallible, net::SocketAddr}; pub use args::Args; -pub use deployment::{ - deploy_layer::DeployLayer, provisioner_factory::AbstractDummyFactory, - runtime_logger::RuntimeLoggerFactory, -}; -use deployment::{provisioner_factory, runtime_logger, Built, DeploymentManager}; +pub use deployment::deploy_layer::DeployLayer; +use deployment::{Built, DeploymentManager}; use fqdn::FQDN; use hyper::{ server::conn::AddrStream, @@ -13,7 +10,8 @@ use hyper::{ }; pub use persistence::Persistence; use proxy::AddressGetter; -use tokio::select; +use shuttle_proto::runtime::runtime_client::RuntimeClient; +use tonic::transport::Channel; use tracing::{error, info}; mod args; @@ -23,15 +21,9 @@ mod handlers; mod persistence; mod proxy; -pub async fn start( - abstract_dummy_factory: impl provisioner_factory::AbstractFactory, - runtime_logger_factory: impl runtime_logger::Factory, - persistence: Persistence, - args: Args, -) { +pub async fn start(persistence: Persistence, runtime_client: RuntimeClient, args: Args) { let deployment_manager = DeploymentManager::new( - abstract_dummy_factory, - runtime_logger_factory, + runtime_client, persistence.clone(), persistence.clone(), persistence.clone(), @@ -55,27 +47,10 @@ pub async fn start( ); let make_service = router.into_make_service(); - let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .parent() - .unwrap() - .to_path_buf(); - - let runtime_dir = workspace_root.join("target/debug"); - - let mut runtime = tokio::process::Command::new(runtime_dir.join("shuttle-runtime")) - .args(&["--legacy", "--provisioner-address", "http://localhost:8000"]) - .current_dir(&runtime_dir) - .spawn() - .unwrap(); - - select! { - _ = runtime.wait() => { - info!("Legacy runtime stopped.") - }, - _ = axum::Server::bind(&args.api_address).serve(make_service) => { - info!("Handlers server stopped serving addr: {}", &args.api_address); - }, - } + axum::Server::bind(&args.api_address) + .serve(make_service) + .await + .unwrap_or_else(|_| panic!("Failed to bind to address: {}", args.api_address)); } pub async fn start_proxy( diff --git a/deployer/src/main.rs b/deployer/src/main.rs index d473361ad..eac473365 100644 --- a/deployer/src/main.rs +++ b/deployer/src/main.rs @@ -1,9 +1,14 @@ +use std::path::PathBuf; +use std::process::exit; +use std::time::Duration; + use clap::Parser; -use shuttle_deployer::{ - start, start_proxy, AbstractDummyFactory, Args, DeployLayer, Persistence, RuntimeLoggerFactory, -}; +use shuttle_deployer::{start, start_proxy, Args, DeployLayer, Persistence}; +use shuttle_proto::runtime::runtime_client::RuntimeClient; +use shuttle_proto::runtime::SubscribeLogsRequest; use tokio::select; -use tracing::trace; +use tonic::transport::Endpoint; +use tracing::{error, info, trace}; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; @@ -34,12 +39,62 @@ async fn main() { .with(opentelemetry) .init(); - let abstract_dummy_factory = AbstractDummyFactory::new(); + let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap() + .to_path_buf(); + let runtime_dir = workspace_root.join("target/debug"); + + let mut runtime = tokio::process::Command::new(runtime_dir.join("shuttle-runtime")) + .args(&[ + "--legacy", + "--provisioner-address", + "https://localhost:5000", + ]) + .current_dir(&runtime_dir) + .spawn() + .unwrap(); + + // Sleep because the timeout below does not seem to work + // TODO: investigate why + tokio::time::sleep(Duration::from_secs(2)).await; - let runtime_logger_factory = RuntimeLoggerFactory::new(persistence.get_log_sender()); + info!("connecting runtime client"); + let conn = Endpoint::new("http://127.0.0.1:6001") + .unwrap() + .connect_timeout(Duration::from_secs(5)) + .connect() + .await + .unwrap(); + let mut runtime_client = RuntimeClient::new(conn); + + let sender = persistence.get_log_sender(); + let mut stream = runtime_client + .subscribe_logs(tonic::Request::new(SubscribeLogsRequest {})) + .await + .unwrap() + .into_inner(); + + let logs_task = tokio::spawn(async move { + while let Some(log) = stream.message().await.unwrap() { + sender.send(log.into()).expect("to send log to persistence"); + } + }); select! { - _ = start_proxy(args.proxy_address, args.proxy_fqdn.clone(), persistence.clone()) => {}, - _ = start(abstract_dummy_factory, runtime_logger_factory, persistence, args) => {}, + _ = start_proxy(args.proxy_address, args.proxy_fqdn.clone(), persistence.clone()) => { + error!("Proxy stopped.") + }, + _ = start(persistence, runtime_client, args) => { + error!("Deployment service stopped.") + }, + _ = runtime.wait() => { + error!("Legacy runtime stopped.") + }, + _ = logs_task => { + error!("Logs task stopped") + }, } + + exit(1); } diff --git a/deployer/src/persistence/mod.rs b/deployer/src/persistence/mod.rs index 28be90397..8786142ea 100644 --- a/deployer/src/persistence/mod.rs +++ b/deployer/src/persistence/mod.rs @@ -277,10 +277,12 @@ impl Persistence { get_deployment_logs(&self.pool, id).await } + /// Get a broadcast channel for listening to logs that are being stored into persistence pub fn get_log_subscriber(&self) -> Receiver { self.stream_log_send.subscribe() } + /// Returns a sender for sending logs to persistence storage pub fn get_log_sender(&self) -> crossbeam_channel::Sender { self.log_send.clone() } diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index dcfe18a19..15928d045 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -21,3 +21,6 @@ services: >&2 echo "DBs are available - starting provisioner" exec /usr/local/bin/service "$${@:0}" + ports: + - published: 5000 + target: 8000 diff --git a/proto/Cargo.toml b/proto/Cargo.toml index 3b64c23d9..bfe263cc4 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -7,6 +7,7 @@ publish = false [dependencies] prost = "0.11.0" +prost-types = "0.11.0" tonic = "0.8.2" [dependencies.shuttle-common] diff --git a/proto/runtime.proto b/proto/runtime.proto index b9c630556..b6b0b19e1 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -1,12 +1,16 @@ syntax = "proto3"; package runtime; +import "google/protobuf/timestamp.proto"; + service Runtime { // Load a service file to be ready to start it - rpc load(LoadRequest) returns (LoadResponse); + rpc Load(LoadRequest) returns (LoadResponse); // Start a loaded service file - rpc start(StartRequest) returns (StartResponse); + rpc Start(StartRequest) returns (StartResponse); + + rpc SubscribeLogs(SubscribeLogsRequest) returns (stream LogItem); } message LoadRequest { @@ -23,8 +27,10 @@ message LoadResponse { } message StartRequest { + // Id to associate with the deployment being started + bytes deployment_id = 1; // Name of service to start - string service_name = 1; + string service_name = 2; } message StartResponse { @@ -36,3 +42,36 @@ message StartResponse { // This is likely to be None for bots uint32 port = 2; } + +message SubscribeLogsRequest {} + +message LogItem { + bytes id = 1; + google.protobuf.Timestamp timestamp = 2; + LogState state = 3; + LogLevel level = 4; + optional string file = 5; + optional uint32 line = 6; + string target = 7; + bytes fields = 8; +} + +enum LogState { + Queued = 0; + Building = 1; + Built = 2; + Loading = 3; + Running = 4; + Completed = 5; + Stopped = 6; + Crashed = 7; + Unknown = 50; +} + +enum LogLevel { + Trace = 0; + Debug = 1; + Info = 2; + Warn = 3; + Error = 4; +} diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 49f39a14a..6d820a561 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -65,5 +65,52 @@ pub mod provisioner { } pub mod runtime { + use std::time::SystemTime; + + use prost_types::Timestamp; + tonic::include_proto!("runtime"); + + impl From for LogItem { + fn from(log: shuttle_common::LogItem) -> Self { + Self { + id: log.id.into_bytes().to_vec(), + timestamp: Some(Timestamp::from(SystemTime::from(log.timestamp))), + state: LogState::from(log.state) as i32, + level: LogLevel::from(log.level) as i32, + file: log.file, + line: log.line, + target: log.target, + fields: log.fields, + } + } + } + + impl From for LogState { + fn from(state: shuttle_common::deployment::State) -> Self { + match state { + shuttle_common::deployment::State::Queued => Self::Queued, + shuttle_common::deployment::State::Building => Self::Building, + shuttle_common::deployment::State::Built => Self::Built, + shuttle_common::deployment::State::Loading => Self::Loading, + shuttle_common::deployment::State::Running => Self::Running, + shuttle_common::deployment::State::Completed => Self::Completed, + shuttle_common::deployment::State::Stopped => Self::Stopped, + shuttle_common::deployment::State::Crashed => Self::Crashed, + shuttle_common::deployment::State::Unknown => Self::Unknown, + } + } + } + + impl From for LogLevel { + fn from(level: shuttle_common::log::Level) -> Self { + match level { + shuttle_common::log::Level::Trace => Self::Trace, + shuttle_common::log::Level::Debug => Self::Debug, + shuttle_common::log::Level::Info => Self::Info, + shuttle_common::log::Level::Warn => Self::Warn, + shuttle_common::log::Level::Error => Self::Error, + } + } + } } diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 8dab41bc0..04e03b72d 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -13,9 +13,11 @@ clap ={ version = "4.0.18", features = ["derive"] } serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } thiserror = "1.0.37" tokio = { version = "=1.20.1", features = ["full"] } +tokio-stream = "0.1.11" tonic = "0.8.2" tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } +uuid = { version = "1.1.2", features = ["v4"] } wasi-common = "2.0.0" wasmtime = "2.0.0" wasmtime-wasi = "2.0.0" diff --git a/runtime/README.md b/runtime/README.md index af60bc7cf..193ee80f7 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -8,8 +8,9 @@ $ DISCORD_TOKEN=xxx cargo run In another terminal: ``` bash -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "runtime/bot.wasm"}' localhost:8000 runtime.Runtime/load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/start +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "runtime/bot.wasm"}' localhost:8000 runtime.Runtime/Load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/Start +grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:8000 runtime.Runtime/SubscribeLogs ``` ## shuttle-legacy @@ -39,8 +40,9 @@ Pass the path to `deployer::start` Then in another shell, load a `.so` file and start it up: ``` bash -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:8000 runtime.Runtime/load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/start +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:8000 runtime.Runtime/Load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/Start +grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:8000 runtime.Runtime/SubscribeLogs ``` ## Running the tests diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 1316f2da4..2d3a8faad 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -1,5 +1,6 @@ use std::{ net::{Ipv4Addr, SocketAddr}, + ops::DerefMut, path::PathBuf, str::FromStr, sync::Mutex, @@ -10,15 +11,20 @@ use async_trait::async_trait; use shuttle_common::LogItem; use shuttle_proto::{ provisioner::provisioner_client::ProvisionerClient, - runtime::{runtime_server::Runtime, LoadRequest, LoadResponse, StartRequest, StartResponse}, + runtime::{ + self, runtime_server::Runtime, LoadRequest, LoadResponse, StartRequest, StartResponse, + SubscribeLogsRequest, + }, }; use shuttle_service::{ loader::{LoadedService, Loader}, Factory, Logger, ServiceName, }; -use tokio::sync::mpsc::{self, UnboundedReceiver}; +use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender}; +use tokio_stream::wrappers::ReceiverStream; use tonic::{transport::Endpoint, Request, Response, Status}; use tracing::{info, instrument, trace}; +use uuid::Uuid; use crate::provisioner_factory::{AbstractFactory, AbstractProvisionerFactory}; @@ -28,14 +34,20 @@ pub struct Legacy { // Mutexes are for interior mutability so_path: Mutex>, port: Mutex>, + logs_rx: Mutex>>, + logs_tx: Mutex>, provisioner_address: Endpoint, } impl Legacy { pub fn new(provisioner_address: Endpoint) -> Self { + let (tx, rx) = mpsc::unbounded_channel(); + Self { so_path: Mutex::new(None), port: Mutex::new(None), + logs_rx: Mutex::new(Some(rx)), + logs_tx: Mutex::new(tx), provisioner_address, } } @@ -61,17 +73,21 @@ impl Runtime for Legacy { let service_port = 7001; let service_address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), service_port); + let request = request.into_inner(); + let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) .await .expect("failed to connect to provisioner"); let abstract_factory = AbstractProvisionerFactory::new(provisioner_client); - let service_name = ServiceName::from_str(request.into_inner().service_name.as_str()) + let service_name = ServiceName::from_str(request.service_name.as_str()) .map_err(|err| Status::from_error(Box::new(err)))?; let mut factory = abstract_factory.get_factory(service_name); - let (logger, _rx) = get_logger(); + let logs_tx = self.logs_tx.lock().unwrap().clone(); + let deployment_id = Uuid::from_slice(&request.deployment_id).unwrap(); + let logger = Logger::new(logs_tx, deployment_id); let so_path = self .so_path @@ -100,6 +116,30 @@ impl Runtime for Legacy { Ok(Response::new(message)) } + + type SubscribeLogsStream = ReceiverStream>; + + async fn subscribe_logs( + &self, + _request: Request, + ) -> Result, Status> { + let logs_rx = self.logs_rx.lock().unwrap().deref_mut().take(); + + if let Some(mut logs_rx) = logs_rx { + let (tx, rx) = mpsc::channel(1); + + // Move logger items into stream to be returned + tokio::spawn(async move { + while let Some(log) = logs_rx.recv().await { + tx.send(Ok(log.into())).await.unwrap(); + } + }); + + Ok(Response::new(ReceiverStream::new(rx))) + } else { + Err(Status::internal("logs have already been subscribed to")) + } + } } #[instrument(skip(service))] @@ -126,10 +166,3 @@ async fn load_service( Ok(loader.load(factory, addr, logger).await?) } - -fn get_logger() -> (Logger, UnboundedReceiver) { - let (tx, rx) = mpsc::unbounded_channel(); - let logger = Logger::new(tx, Default::default()); - - (logger, rx) -} diff --git a/runtime/src/main.rs b/runtime/src/main.rs index c11ebcdda..d2eae6557 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -1,4 +1,7 @@ -use std::net::{Ipv4Addr, SocketAddr}; +use std::{ + net::{Ipv4Addr, SocketAddr}, + time::Duration, +}; use clap::Parser; use shuttle_proto::runtime::runtime_server::RuntimeServer; @@ -26,15 +29,17 @@ async fn main() { let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 6001); let provisioner_address = args.provisioner_address; + let mut server_builder = + Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); let router = if args.legacy { let legacy = Legacy::new(provisioner_address); let svc = RuntimeServer::new(legacy); - Server::builder().add_service(svc) + server_builder.add_service(svc) } else { let next = Next::new(); let svc = RuntimeServer::new(next); - Server::builder().add_service(svc) + server_builder.add_service(svc) }; router.serve(addr).await.unwrap(); diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index 86d185c43..e0d03db45 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -9,7 +9,10 @@ use async_trait::async_trait; use cap_std::os::unix::net::UnixStream; use serenity::{model::prelude::*, prelude::*}; use shuttle_proto::runtime::runtime_server::Runtime; -use shuttle_proto::runtime::{LoadRequest, LoadResponse, StartRequest, StartResponse}; +use shuttle_proto::runtime::{ + self, LoadRequest, LoadResponse, StartRequest, StartResponse, SubscribeLogsRequest, +}; +use tokio_stream::wrappers::ReceiverStream; use tonic::{Request, Response, Status}; use tracing::trace; use wasi_common::file::FileCaps; @@ -69,6 +72,15 @@ impl Runtime for Next { Ok(Response::new(message)) } + + type SubscribeLogsStream = ReceiverStream>; + + async fn subscribe_logs( + &self, + _request: Request, + ) -> Result, Status> { + todo!() + } } struct BotBuilder { From 019764eba6f4bcea36ab76be207199c60bc598a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 21 Nov 2022 14:54:45 +0100 Subject: [PATCH 11/74] feat(shuttle-next): first edition of axum-wasm router (#472) * feat(shuttle-next): POC of axum wasm router * feat: use std mutex * feat: serialize/deserialize http requests to rmp this serializes/deserializes http requests across the ffi to the axum-wasm router, using the rust messagepack dataformat. sending the body is still a wip * feat: serialize the full HTTP req/res to rmp * fix: comment typo * feat: start hyper with tonic and serve wasm router * feat: clone inner router arc * feat: send request body without serialization * docs: todo comment * feat: write response body * fix: serialize response parts * feat: deserialize parts directly from reader this also adds a new fd to separate streaming of body and parts * feat: add axum-wasm to runtime cli * refactor: remove unused method * refactor: typo Co-authored-by: Pieter * refactor: comments, clean up wrappers * refactor: move axum-wasm utils to shuttle-common * refactor: fmt * refactor: clippy Co-authored-by: Pieter --- Cargo.lock | 148 +++++++++++------- common/Cargo.toml | 4 + common/src/lib.rs | 2 + common/src/wasm.rs | 160 +++++++++++++++++++ runtime/Cargo.toml | 6 + runtime/Makefile | 4 + runtime/README.md | 55 ++++++- runtime/src/args.rs | 6 +- runtime/src/axum/mod.rs | 324 +++++++++++++++++++++++++++++++++++++++ runtime/src/lib.rs | 2 + runtime/src/main.rs | 6 +- tmp/axum-wasm/Cargo.toml | 22 +++ tmp/axum-wasm/src/lib.rs | 93 +++++++++++ 13 files changed, 767 insertions(+), 65 deletions(-) create mode 100644 common/src/wasm.rs create mode 100644 runtime/src/axum/mod.rs create mode 100644 tmp/axum-wasm/Cargo.toml create mode 100644 tmp/axum-wasm/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index d4f089eca..014ded2a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -517,7 +517,7 @@ dependencies = [ "aws-smithy-json", "aws-smithy-types", "aws-types", - "bytes 1.1.0", + "bytes 1.2.1", "hex 0.4.3", "http 0.2.8", "hyper", @@ -551,7 +551,7 @@ dependencies = [ "aws-smithy-http", "aws-smithy-types", "aws-types", - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "http-body", "lazy_static", @@ -577,7 +577,7 @@ dependencies = [ "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "tokio-stream", "tower", @@ -599,7 +599,7 @@ dependencies = [ "aws-smithy-json", "aws-smithy-types", "aws-types", - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "tokio-stream", "tower", @@ -622,7 +622,7 @@ dependencies = [ "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "tower", ] @@ -680,7 +680,7 @@ dependencies = [ "aws-smithy-http", "aws-smithy-http-tower", "aws-smithy-types", - "bytes 1.1.0", + "bytes 1.2.1", "fastrand", "http 0.2.8", "http-body", @@ -700,7 +700,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cc1af50eac644ab6f58e5bae29328ba3092851fc2ce648ad139134699b2b66f" dependencies = [ "aws-smithy-types", - "bytes 1.1.0", + "bytes 1.2.1", "bytes-utils", "futures-core", "http 0.2.8", @@ -721,7 +721,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1bf4c4664dff2febf91f8796505c5bc8f38a0bff0d1397d1d3fdda17bd5c5d1" dependencies = [ "aws-smithy-http", - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "http-body", "pin-project-lite 0.2.9", @@ -795,7 +795,7 @@ dependencies = [ "axum-core", "base64 0.13.0", "bitflags", - "bytes 1.1.0", + "bytes 1.2.1", "futures-util", "headers", "http 0.2.8", @@ -827,7 +827,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4f44a0e6200e9d11a1cdc989e4b358f6e3d354fbf48478f345a17f4e43f8635" dependencies = [ "async-trait", - "bytes 1.1.0", + "bytes 1.2.1", "futures-util", "http 0.2.8", "http-body", @@ -943,7 +943,7 @@ checksum = "d82e7850583ead5f8bbef247e2a3c37a19bd576e8420cd262a6711921827e1e5" dependencies = [ "base64 0.13.0", "bollard-stubs", - "bytes 1.1.0", + "bytes 1.2.1", "futures-core", "futures-util", "hex 0.4.3", @@ -1064,9 +1064,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" [[package]] name = "bytes-utils" @@ -1074,7 +1074,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1934a3ef9cac8efde4966a92781e77713e1ba329f1d42e446c7d7eba340d8ef1" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "either", ] @@ -1513,7 +1513,7 @@ version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a604e93b79d1808327a6fca85a6f2d69de66461e7620f5a4cbf5fb4d1d7c948" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "memchr", ] @@ -2784,7 +2784,7 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "fnv", "futures-core", "futures-sink", @@ -2841,7 +2841,7 @@ checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ "base64 0.13.0", "bitflags", - "bytes 1.1.0", + "bytes 1.2.1", "headers-core", "http 0.2.8", "httpdate", @@ -2985,7 +2985,7 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "fnv", "itoa 1.0.2", ] @@ -2996,7 +2996,7 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "pin-project-lite 0.2.9", ] @@ -3019,6 +3019,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" +[[package]] +name = "http-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e272971f774ba29341db2f686255ff8a979365a26fb9e4277f6b6d9ec0cdd5e" +dependencies = [ + "http 0.2.8", + "serde", +] + [[package]] name = "http-types" version = "2.12.0" @@ -3043,9 +3053,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" @@ -3061,11 +3071,11 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.20" +version = "0.14.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" +checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "futures-channel", "futures-core", "futures-util", @@ -3153,7 +3163,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "hyper", "native-tls", "tokio", @@ -3760,7 +3770,7 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f8f35e687561d5c1667590911e6698a8cb714a134a7505718a182e7bc9d3836" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "encoding_rs", "futures-util", "http 0.2.8", @@ -4091,7 +4101,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "449048140ee61e28f57abe6e9975eedc1f3a29855c7407bd6c12b18578863379" dependencies = [ "async-trait", - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "opentelemetry", "reqwest", @@ -4321,7 +4331,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16d0fec4acc8779b696e3ff25527884fb17cda6cf59a249c57aa1af1e2f65b36" dependencies = [ "async-trait", - "bytes 1.1.0", + "bytes 1.2.1", "futures-util", "headers", "http 0.2.8", @@ -4507,7 +4517,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "399c3c31cdec40583bb68f0b18403400d01ec4289c383aa047560439952c4dd7" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "prost-derive", ] @@ -4517,7 +4527,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f835c582e6bd972ba8347313300219fed5bfa52caf175298d860b61ff6069bb" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "heck", "itertools", "lazy_static", @@ -4550,7 +4560,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dfaa718ad76a44b3415e6c4d53b17c8f99160dcb3a99b10470fce8ad43f6e3e" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "prost", ] @@ -4919,7 +4929,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" dependencies = [ "base64 0.13.0", - "bytes 1.1.0", + "bytes 1.2.1", "encoding_rs", "futures-core", "futures-util", @@ -5048,6 +5058,17 @@ dependencies = [ "paste", ] +[[package]] +name = "rmp-serde" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b13be192e0220b8afb7222aa5813cb62cc269ebb5cac346ca6487681d2913e" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rocket" version = "0.5.0-rc.2" @@ -5059,7 +5080,7 @@ dependencies = [ "atomic", "atty", "binascii", - "bytes 1.1.0", + "bytes 1.2.1", "either", "figment", "futures", @@ -5317,7 +5338,7 @@ dependencies = [ "async-compression", "async-trait", "base64 0.13.0", - "bytes 1.1.0", + "bytes 1.2.1", "cookie 0.16.0", "encoding_rs", "enumflags2", @@ -5463,9 +5484,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.143" +version = "1.0.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" +checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" dependencies = [ "serde_derive", ] @@ -5491,9 +5512,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.143" +version = "1.0.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391" +checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" dependencies = [ "proc-macro2 1.0.43", "quote 1.0.21", @@ -5585,7 +5606,7 @@ dependencies = [ "async-tungstenite", "base64 0.13.0", "bitflags", - "bytes 1.1.0", + "bytes 1.2.1", "cfg-if 1.0.0", "flate2", "futures", @@ -5721,7 +5742,10 @@ dependencies = [ "comfy-table", "crossterm", "http 0.2.8", + "http-serde", + "hyper", "once_cell", + "rmp-serde", "rustrict", "serde", "serde_json", @@ -5737,7 +5761,7 @@ dependencies = [ "anyhow", "async-trait", "axum", - "bytes 1.1.0", + "bytes 1.2.1", "cargo", "cargo_metadata", "chrono", @@ -5858,6 +5882,8 @@ dependencies = [ "async-trait", "cap-std", "clap 4.0.18", + "hyper", + "rmp-serde", "serenity", "shuttle-common", "shuttle-proto", @@ -6012,9 +6038,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", "winapi", @@ -6087,7 +6113,7 @@ dependencies = [ "atoi 0.4.0", "bitflags", "byteorder", - "bytes 1.1.0", + "bytes 1.2.1", "crc 2.1.0", "crossbeam-queue", "either", @@ -6135,7 +6161,7 @@ dependencies = [ "base64 0.13.0", "bitflags", "byteorder", - "bytes 1.1.0", + "bytes 1.2.1", "chrono", "crc 3.0.0", "crossbeam-queue", @@ -6607,7 +6633,7 @@ checksum = "4bc22b1c2267be6d1769c6d787936201341f03c915456ed8a8db8d40d665215f" dependencies = [ "async-trait", "bytes 0.5.6", - "bytes 1.1.0", + "bytes 1.2.1", "fnv", "futures", "http 0.1.21", @@ -6757,7 +6783,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" dependencies = [ "autocfg 1.1.0", - "bytes 1.1.0", + "bytes 1.2.1", "libc", "memchr", "mio", @@ -6842,7 +6868,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53474327ae5e166530d17f2d956afcb4f8a004de581b3cae10f12006bc8163e3" dependencies = [ "async-stream", - "bytes 1.1.0", + "bytes 1.2.1", "futures-core", "tokio", "tokio-stream", @@ -6881,7 +6907,7 @@ version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "futures-core", "futures-io", "futures-sink", @@ -6897,7 +6923,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "futures-core", "futures-sink", "pin-project-lite 0.2.9", @@ -6954,7 +6980,7 @@ dependencies = [ "async-trait", "axum", "base64 0.13.0", - "bytes 1.1.0", + "bytes 1.2.1", "futures-core", "futures-util", "h2", @@ -7016,7 +7042,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" dependencies = [ "bitflags", - "bytes 1.1.0", + "bytes 1.2.1", "futures-core", "futures-util", "http 0.2.8", @@ -7035,7 +7061,7 @@ checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba" dependencies = [ "base64 0.13.0", "bitflags", - "bytes 1.1.0", + "bytes 1.2.1", "futures-core", "futures-util", "http 0.2.8", @@ -7221,7 +7247,7 @@ checksum = "a0b2d8558abd2e276b0a8df5c05a2ec762609344191e5fd23e292c910e9165b5" dependencies = [ "base64 0.13.0", "byteorder", - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "httparse", "log", @@ -7240,7 +7266,7 @@ checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" dependencies = [ "base64 0.13.0", "byteorder", - "bytes 1.1.0", + "bytes 1.2.1", "http 0.2.8", "httparse", "log", @@ -7559,7 +7585,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cef4e1e9114a4b7f1ac799f16ce71c14de5778500c5450ec6b7b920c55b587e" dependencies = [ - "bytes 1.1.0", + "bytes 1.2.1", "futures-channel", "futures-util", "headers", @@ -8270,3 +8296,15 @@ dependencies = [ "cc", "libc", ] + +[[patch.unused]] +name = "shuttle-aws-rds" +version = "0.7.0" + +[[patch.unused]] +name = "shuttle-persist" +version = "0.7.0" + +[[patch.unused]] +name = "shuttle-shared-db" +version = "0.7.0" diff --git a/common/Cargo.toml b/common/Cargo.toml index 8b10d111a..c54827c57 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -11,7 +11,10 @@ chrono = { version = "0.4.22", features = ["serde"] } comfy-table = { version = "6.1.0", optional = true } crossterm = { version = "0.25.0", optional = true } http = { version = "0.2.8", optional = true } +http-serde = { version = "1.1.2", optional = true } +hyper = { version = "0.14.23", optional = true } once_cell = "1.13.1" +rmp-serde = { version = "1.1.1", optional = true } rustrict = "0.5.0" serde = { version = "1.0.143", features = ["derive"] } serde_json = { version = "1.0.85", optional = true } @@ -24,3 +27,4 @@ default = ["models"] models = ["display", "serde_json", "http"] display = ["comfy-table", "crossterm"] +axum-wasm = ["http-serde", "hyper", "rmp-serde"] diff --git a/common/src/lib.rs b/common/src/lib.rs index bd7e50afc..6d44adf67 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -4,6 +4,8 @@ pub mod log; #[cfg(feature = "models")] pub mod models; pub mod project; +#[cfg(feature = "axum-wasm")] +pub mod wasm; use serde::{Deserialize, Serialize}; use uuid::Uuid; diff --git a/common/src/wasm.rs b/common/src/wasm.rs new file mode 100644 index 000000000..9a3512c9b --- /dev/null +++ b/common/src/wasm.rs @@ -0,0 +1,160 @@ +use hyper::http::{HeaderMap, Method, Request, Response, StatusCode, Uri, Version}; +use rmps::Serializer; +use serde::{Deserialize, Serialize}; + +extern crate rmp_serde as rmps; + +// todo: add http extensions field +#[derive(Serialize, Deserialize, Debug)] +pub struct RequestWrapper { + #[serde(with = "http_serde::method")] + pub method: Method, + + #[serde(with = "http_serde::uri")] + pub uri: Uri, + + #[serde(with = "http_serde::version")] + pub version: Version, + + #[serde(with = "http_serde::header_map")] + pub headers: HeaderMap, +} + +impl From for RequestWrapper { + fn from(parts: hyper::http::request::Parts) -> Self { + RequestWrapper { + method: parts.method, + uri: parts.uri, + version: parts.version, + headers: parts.headers, + } + } +} + +impl RequestWrapper { + /// Serialize a RequestWrapper to the Rust MessagePack data format + pub fn into_rmp(self) -> Vec { + let mut buf = Vec::new(); + self.serialize(&mut Serializer::new(&mut buf)).unwrap(); + + buf + } + + /// Consume the wrapper and return a request builder with `Parts` set + pub fn into_request_builder(self) -> hyper::http::request::Builder { + let mut request = Request::builder() + .method(self.method) + .version(self.version) + .uri(self.uri); + + request + .headers_mut() + .unwrap() + .extend(self.headers.into_iter()); + + request + } +} + +// todo: add http extensions field +#[derive(Serialize, Deserialize, Debug)] +pub struct ResponseWrapper { + #[serde(with = "http_serde::status_code")] + pub status: StatusCode, + + #[serde(with = "http_serde::version")] + pub version: Version, + + #[serde(with = "http_serde::header_map")] + pub headers: HeaderMap, +} + +impl From for ResponseWrapper { + fn from(parts: hyper::http::response::Parts) -> Self { + ResponseWrapper { + status: parts.status, + version: parts.version, + headers: parts.headers, + } + } +} + +impl ResponseWrapper { + /// Serialize a ResponseWrapper into the Rust MessagePack data format + pub fn into_rmp(self) -> Vec { + let mut buf = Vec::new(); + self.serialize(&mut Serializer::new(&mut buf)).unwrap(); + + buf + } + + /// Consume the wrapper and return a response builder with `Parts` set + pub fn into_response_builder(self) -> hyper::http::response::Builder { + let mut response = Response::builder() + .status(self.status) + .version(self.version); + + response + .headers_mut() + .unwrap() + .extend(self.headers.into_iter()); + + response + } +} + +#[cfg(test)] +mod test { + use super::*; + use hyper::body::Body; + use hyper::http::HeaderValue; + + #[test] + fn request_roundtrip() { + let request: Request = Request::builder() + .method(Method::PUT) + .version(Version::HTTP_11) + .header("test", HeaderValue::from_static("request")) + .uri(format!("https://axum-wasm.example/hello")) + .body(Body::empty()) + .unwrap(); + + let (parts, _) = request.into_parts(); + let rmp = RequestWrapper::from(parts).into_rmp(); + + let back: RequestWrapper = rmps::from_slice(&rmp).unwrap(); + + assert_eq!( + back.headers.get("test").unwrap(), + HeaderValue::from_static("request") + ); + assert_eq!(back.method, Method::PUT); + assert_eq!(back.version, Version::HTTP_11); + assert_eq!( + back.uri.to_string(), + "https://axum-wasm.example/hello".to_string() + ); + } + + #[test] + fn response_roundtrip() { + let response: Response = Response::builder() + .version(Version::HTTP_11) + .header("test", HeaderValue::from_static("response")) + .status(StatusCode::NOT_MODIFIED) + .body(Body::empty()) + .unwrap(); + + let (parts, _) = response.into_parts(); + let rmp = ResponseWrapper::from(parts).into_rmp(); + + let back: ResponseWrapper = rmps::from_slice(&rmp).unwrap(); + + assert_eq!( + back.headers.get("test").unwrap(), + HeaderValue::from_static("response") + ); + assert_eq!(back.status, StatusCode::NOT_MODIFIED); + assert_eq!(back.version, Version::HTTP_11); + } +} diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 04e03b72d..5ea9e6003 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -10,6 +10,8 @@ anyhow = "1.0.62" async-trait = "0.1.58" cap-std = "0.26.0" clap ={ version = "4.0.18", features = ["derive"] } +hyper = { version = "0.14.23", features = ["full"] } +rmp-serde = { version = "1.1.1" } serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } thiserror = "1.0.37" tokio = { version = "=1.20.1", features = ["full"] } @@ -35,3 +37,7 @@ version = "0.7.0" default-features = false features = ["loader"] path = "../service" + +[features] +shuttle-axum = ["shuttle-common/axum-wasm"] + diff --git a/runtime/Makefile b/runtime/Makefile index 18dac0caa..458f6ad3b 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -6,6 +6,10 @@ wasm: cd ../tmp/wasm; cargo build --target wasm32-wasi cp ../tmp/wasm/target/wasm32-wasi/debug/shuttle_serenity.wasm bot.wasm +axum: + cd ../tmp/axum-wasm; cargo build --target wasm32-wasi + cp ../tmp/axum-wasm/target/wasm32-wasi/debug/shuttle_axum.wasm axum.wasm + test: wasm cargo test -- --nocapture diff --git a/runtime/README.md b/runtime/README.md index 193ee80f7..f38778c44 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -1,5 +1,6 @@ -## How to run +# How to run +## shuttle-next ```bash $ make wasm $ DISCORD_TOKEN=xxx cargo run @@ -8,9 +9,47 @@ $ DISCORD_TOKEN=xxx cargo run In another terminal: ``` bash -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "runtime/bot.wasm"}' localhost:8000 runtime.Runtime/Load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/Start -grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:8000 runtime.Runtime/SubscribeLogs +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "runtime/bot.wasm"}' localhost:6001 runtime.Runtime/Load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:6001 runtime.Runtime/Start +grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs +``` + +## axum-wasm + +Compile the wasm axum router: + +```bash +make axum +``` + +Run the test: + +```bash +cargo test axum --features shuttle-axum -- --nocapture +``` + +Load and run: + +```bash +cargo run --features shuttle-axum -- --axum --provisioner-address http://localhost:8000 +``` + +In another terminal: + +``` bash +# a full, absolute path from home was needed for me in the load request +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "runtime/axum.wasm"}' localhost:6001 runtime.Runtime/Load + +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:6001 runtime.Runtime/Start + +# grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs +``` + +Curl the service: +```bash +curl localhost:7002/hello + +curl localhost:7002/goodbye ``` ## shuttle-legacy @@ -33,16 +72,16 @@ Or directly (this is the path hardcoded in `deployer::start`): # first, make sure the shuttle-runtime binary is built cargo build # then -/home//target/debug/shuttle-runtime --legacy --provisioner-address http://localhost:8000 +/home//target/debug/shuttle-runtime --legacy --provisioner-address http://localhost:6001 ``` Pass the path to `deployer::start` Then in another shell, load a `.so` file and start it up: ``` bash -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:8000 runtime.Runtime/Load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:8000 runtime.Runtime/Start -grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:8000 runtime.Runtime/SubscribeLogs +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:6001 runtime.Runtime/Load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:6001 runtime.Runtime/Start +grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs ``` ## Running the tests diff --git a/runtime/src/args.rs b/runtime/src/args.rs index 084304364..2e123f4e8 100644 --- a/runtime/src/args.rs +++ b/runtime/src/args.rs @@ -8,6 +8,10 @@ pub struct Args { pub provisioner_address: Endpoint, /// Is this runtime for a legacy service - #[clap(long)] + #[clap(long, conflicts_with("axum"))] pub legacy: bool, + + /// Is this runtime for an axum-wasm service + #[clap(long, conflicts_with("legacy"))] + pub axum: bool, } diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs new file mode 100644 index 000000000..40aaa06db --- /dev/null +++ b/runtime/src/axum/mod.rs @@ -0,0 +1,324 @@ +use std::convert::Infallible; +use std::fs::File; +use std::io::{BufReader, Read, Write}; +use std::net::{Ipv4Addr, SocketAddr}; +use std::os::unix::prelude::RawFd; +use std::path::Path; +use std::sync::{Arc, Mutex}; + +use async_trait::async_trait; +use cap_std::os::unix::net::UnixStream; +use hyper::service::{make_service_fn, service_fn}; +use hyper::{Body, Request, Response}; +use shuttle_common::wasm::{RequestWrapper, ResponseWrapper}; +use shuttle_proto::runtime::runtime_server::Runtime; +use shuttle_proto::runtime::{ + self, LoadRequest, LoadResponse, StartRequest, StartResponse, SubscribeLogsRequest, +}; +use tokio_stream::wrappers::ReceiverStream; +use tonic::Status; +use tracing::info; +use wasi_common::file::FileCaps; +use wasmtime::{Engine, Linker, Module, Store}; +use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; +use wasmtime_wasi::{WasiCtx, WasiCtxBuilder}; + +extern crate rmp_serde as rmps; + +pub struct AxumWasm { + router: std::sync::Mutex>, + port: Mutex>, +} + +impl AxumWasm { + pub fn new() -> Self { + Self { + router: std::sync::Mutex::new(None), + port: std::sync::Mutex::new(None), + } + } +} + +#[async_trait] +impl Runtime for AxumWasm { + async fn load( + &self, + request: tonic::Request, + ) -> Result, Status> { + let wasm_path = request.into_inner().path; + info!(wasm_path, "loading"); + + let router = Router::new(wasm_path); + + *self.router.lock().unwrap() = Some(router); + + let message = LoadResponse { success: true }; + + Ok(tonic::Response::new(message)) + } + + async fn start( + &self, + _request: tonic::Request, + ) -> Result, Status> { + let port = 7002; + let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); + + let router = self.router.lock().unwrap().take().unwrap().inner; + + let make_service = make_service_fn(move |_conn| { + let router = router.clone(); + async move { + Ok::<_, Infallible>(service_fn(move |req: Request| { + let router = router.clone(); + async move { + Ok::<_, Infallible>(router.lock().await.send_request(req).await.unwrap()) + } + })) + } + }); + + info!("starting hyper server on: {}", &address); + let server = hyper::Server::bind(&address).serve(make_service); + + _ = tokio::spawn(server); + + *self.port.lock().unwrap() = Some(port); + + let message = StartResponse { + success: true, + port: port as u32, + }; + + Ok(tonic::Response::new(message)) + } + + type SubscribeLogsStream = ReceiverStream>; + + async fn subscribe_logs( + &self, + _request: tonic::Request, + ) -> Result, Status> { + todo!() + } +} + +struct RouterBuilder { + engine: Engine, + store: Store, + linker: Linker, + src: Option, +} + +impl RouterBuilder { + pub fn new() -> Self { + let engine = Engine::default(); + + let mut linker: Linker = Linker::new(&engine); + wasmtime_wasi::add_to_linker(&mut linker, |s| s).unwrap(); + + let wasi = WasiCtxBuilder::new() + .inherit_stdio() + .inherit_args() + .unwrap() + .build(); + + let store = Store::new(&engine, wasi); + + Self { + engine, + store, + linker, + src: None, + } + } + + pub fn src>(mut self, src: P) -> Self { + self.src = Some(File::open(src).unwrap()); + self + } + + pub fn build(mut self) -> Router { + let mut buf = Vec::new(); + self.src.unwrap().read_to_end(&mut buf).unwrap(); + let module = Module::new(&self.engine, buf).unwrap(); + + for export in module.exports() { + println!("export: {}", export.name()); + } + + self.linker + .module(&mut self.store, "axum", &module) + .unwrap(); + let inner = RouterInner { + store: self.store, + linker: self.linker, + }; + Router { + inner: Arc::new(tokio::sync::Mutex::new(inner)), + } + } +} + +struct RouterInner { + store: Store, + linker: Linker, +} + +impl RouterInner { + /// Send a HTTP request with body to given endpoint on the axum-wasm router and return the response + pub async fn send_request( + &mut self, + req: hyper::Request, + ) -> Result, Infallible> { + let (mut parts_stream, parts_client) = UnixStream::pair().unwrap(); + let (mut body_stream, body_client) = UnixStream::pair().unwrap(); + + let parts_client = WasiUnixStream::from_cap_std(parts_client); + let body_client = WasiUnixStream::from_cap_std(body_client); + + self.store + .data_mut() + .insert_file(3, Box::new(parts_client), FileCaps::all()); + + self.store + .data_mut() + .insert_file(4, Box::new(body_client), FileCaps::all()); + + let (parts, body) = req.into_parts(); + + // serialise request parts to rmp + let request_rmp = RequestWrapper::from(parts).into_rmp(); + + // write request parts + parts_stream.write_all(&request_rmp).unwrap(); + + // write body + body_stream + .write_all(hyper::body::to_bytes(body).await.unwrap().as_ref()) + .unwrap(); + // signal to the receiver that end of file has been reached + body_stream.write_all(&[0]).unwrap(); + + println!("calling inner Router"); + self.linker + .get(&mut self.store, "axum", "__SHUTTLE_Axum_call") + .unwrap() + .into_func() + .unwrap() + .typed::<(RawFd, RawFd), (), _>(&self.store) + .unwrap() + .call(&mut self.store, (3, 4)) + .unwrap(); + + // read response parts from host + let reader = BufReader::new(&mut parts_stream); + + // deserialize response parts from rust messagepack + let wrapper: ResponseWrapper = rmps::from_read(reader).unwrap(); + + // read response body from wasm router + let mut body_buf = Vec::new(); + let mut c_buf: [u8; 1] = [0; 1]; + loop { + body_stream.read_exact(&mut c_buf).unwrap(); + if c_buf[0] == 0 { + break; + } else { + body_buf.push(c_buf[0]); + } + } + + let response: Response = wrapper + .into_response_builder() + .body(body_buf.into()) + .unwrap(); + + Ok(response) + } +} + +#[derive(Clone)] +struct Router { + inner: Arc>, +} + +impl Router { + pub fn builder() -> RouterBuilder { + RouterBuilder::new() + } + + pub fn new>(src: P) -> Self { + Self::builder().src(src).build() + } +} + +#[cfg(test)] +pub mod tests { + use super::*; + use hyper::{http::HeaderValue, Method, Request, StatusCode, Version}; + + #[tokio::test] + async fn axum() { + let axum = Router::new("axum.wasm"); + let mut inner = axum.inner.lock().await; + + // GET /hello + let request: Request = Request::builder() + .method(Method::GET) + .version(Version::HTTP_11) + .uri(format!("https://axum-wasm.example/hello")) + .body(Body::empty()) + .unwrap(); + + let res = inner.send_request(request).await.unwrap(); + + assert_eq!(res.status(), StatusCode::OK); + assert_eq!( + &hyper::body::to_bytes(res.into_body()) + .await + .unwrap() + .iter() + .cloned() + .collect::>() + .as_ref(), + b"Hello, World!" + ); + + // GET /goodbye + let request: Request = Request::builder() + .method(Method::GET) + .version(Version::HTTP_11) + .header("test", HeaderValue::from_static("goodbye")) + .uri(format!("https://axum-wasm.example/goodbye")) + .body(Body::from("Goodbye world body")) + .unwrap(); + + let res = inner.send_request(request).await.unwrap(); + + assert_eq!(res.status(), StatusCode::OK); + assert_eq!( + &hyper::body::to_bytes(res.into_body()) + .await + .unwrap() + .iter() + .cloned() + .collect::>() + .as_ref(), + b"Goodbye, World!" + ); + + // GET /invalid + let request: Request = Request::builder() + .method(Method::GET) + .version(Version::HTTP_11) + .header("test", HeaderValue::from_static("invalid")) + .uri(format!("https://axum-wasm.example/invalid")) + .body(Body::empty()) + .unwrap(); + + let res = inner.send_request(request).await.unwrap(); + + assert_eq!(res.status(), StatusCode::NOT_FOUND); + } +} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 7ca426d3a..1119bf890 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,8 +1,10 @@ mod args; +mod axum; mod legacy; mod next; pub mod provisioner_factory; pub use args::Args; +pub use axum::AxumWasm; pub use legacy::Legacy; pub use next::Next; diff --git a/runtime/src/main.rs b/runtime/src/main.rs index d2eae6557..f7a5dc597 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -5,7 +5,7 @@ use std::{ use clap::Parser; use shuttle_proto::runtime::runtime_server::RuntimeServer; -use shuttle_runtime::{Args, Legacy, Next}; +use shuttle_runtime::{Args, AxumWasm, Legacy, Next}; use tonic::transport::Server; use tracing::trace; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; @@ -36,6 +36,10 @@ async fn main() { let legacy = Legacy::new(provisioner_address); let svc = RuntimeServer::new(legacy); server_builder.add_service(svc) + } else if args.axum { + let axum = AxumWasm::new(); + let svc = RuntimeServer::new(axum); + server_builder.add_service(svc) } else { let next = Next::new(); let svc = RuntimeServer::new(next); diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml new file mode 100644 index 000000000..52c5418cf --- /dev/null +++ b/tmp/axum-wasm/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "shuttle-axum" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = [ "cdylib" ] + +[dependencies] +# most axum features can be enabled, but "tokio" and "ws" depend on socket2 +# via "hyper/tcp" which is not compatible with wasi +axum = { version = "0.6.0-rc.4", default-features = false } +futures-executor = "0.3.21" +http = "0.2.7" +tower-service = "0.3.1" +rmp-serde = { version = "1.1.1" } + +[dependencies.shuttle-common] +path = "../../common" +default-features = false +features = ["axum-wasm"] +version = "0.7.0" diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs new file mode 100644 index 000000000..e0a8b6542 --- /dev/null +++ b/tmp/axum-wasm/src/lib.rs @@ -0,0 +1,93 @@ +use axum::body::{Body, HttpBody}; +use axum::{response::Response, routing::get, Router}; +use futures_executor::block_on; +use http::Request; +use shuttle_common::wasm::{RequestWrapper, ResponseWrapper}; +use std::fs::File; +use std::io::BufReader; +use std::io::{Read, Write}; +use std::os::wasi::prelude::*; +use tower_service::Service; + +extern crate rmp_serde as rmps; + +pub fn handle_request(req: Request) -> Response +where + B: HttpBody + Send + 'static, +{ + block_on(app(req)) +} + +async fn app(request: Request) -> Response +where + B: HttpBody + Send + 'static, +{ + let mut router = Router::new() + .route("/hello", get(hello)) + .route("/goodbye", get(goodbye)) + .into_service(); + + let response = router.call(request).await.unwrap(); + + response +} + +async fn hello() -> &'static str { + "Hello, World!" +} + +async fn goodbye() -> &'static str { + "Goodbye, World!" +} + +#[no_mangle] +#[allow(non_snake_case)] +pub extern "C" fn __SHUTTLE_Axum_call(fd_3: RawFd, fd_4: RawFd) { + println!("inner handler awoken; interacting with fd={fd_3},{fd_4}"); + + // file descriptor 3 for reading and writing http parts + let mut parts_fd = unsafe { File::from_raw_fd(fd_3) }; + + let reader = BufReader::new(&mut parts_fd); + + // deserialize request parts from rust messagepack + let wrapper: RequestWrapper = rmps::from_read(reader).unwrap(); + + // file descriptor 4 for reading and writing http body + let mut body_fd = unsafe { File::from_raw_fd(fd_4) }; + + // read body from host + let mut body_buf = Vec::new(); + let mut c_buf: [u8; 1] = [0; 1]; + loop { + body_fd.read(&mut c_buf).unwrap(); + if c_buf[0] == 0 { + break; + } else { + body_buf.push(c_buf[0]); + } + } + + let request: Request = wrapper + .into_request_builder() + .body(body_buf.into()) + .unwrap(); + + println!("inner router received request: {:?}", &request); + let res = handle_request(request); + + let (parts, mut body) = res.into_parts(); + + // wrap and serialize response parts as rmp + let response_parts = ResponseWrapper::from(parts).into_rmp(); + + // write response parts + parts_fd.write_all(&response_parts).unwrap(); + + // write body if there is one + if let Some(body) = block_on(body.data()) { + body_fd.write_all(body.unwrap().as_ref()).unwrap(); + } + // signal to the reader that end of file has been reached + body_fd.write(&[0]).unwrap(); +} From f913b8a7f7f46bcf8908e77cbe939c23620219a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Thu, 24 Nov 2022 10:42:02 +0100 Subject: [PATCH 12/74] Feat(shuttle-next): stop runtime services (#481) * feat: add tonic endpoint to stop runtime services * refactor: use tracing * feat: implement stop method for serenity bot * feat: install protoc 21.9 in dockerfile * refactor: comment * feat: convert uuid bytes to string then uuid * docs: update readme * docs: update readme for serenity bot * feat: implement stop for axum-wasm and document it * ci: install newer protoc in CI * feat: remove axum-wasm feature in runtime for now we will come back to this later and likely split the runtime by features * docs: remove feature flags from readme * fix: clippy * fix: clippy * fix: clippy * feat: send kill signal without spawning task * feat: return error response on kill_tx err --- .circleci/config.yml | 15 +++- Containerfile | 7 +- common/src/wasm.rs | 2 +- deployer/src/deployment/queue.rs | 4 +- deployer/src/handlers/mod.rs | 2 +- deployer/src/main.rs | 2 +- deployer/src/persistence/mod.rs | 14 ++-- deployer/src/proxy.rs | 4 +- gateway/src/api/latest.rs | 2 +- proto/runtime.proto | 15 ++++ runtime/Cargo.toml | 5 +- runtime/Makefile | 16 ++--- runtime/README.md | 74 +++++++++++++++---- runtime/src/axum/mod.rs | 118 ++++++++++++++++++++++++------- runtime/src/legacy/mod.rs | 65 +++++++++++++++-- runtime/src/main.rs | 4 +- runtime/src/next/mod.rs | 74 ++++++++++++++++--- 17 files changed, 334 insertions(+), 89 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 756822a70..40c7baceb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -97,6 +97,15 @@ commands: command: | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y sudo apt update && sudo apt install -y libssl1.1 + install-protoc: + steps: + - run: + name: Install protoc + command: | + curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.9/protoc-21.9-linux-x86_64.zip &&\ + sudo unzip -o protoc-21.9-linux-x86_64.zip -d /usr bin/protoc &&\ + sudo unzip -o protoc-21.9-linux-x86_64.zip -d /usr/ 'include/*' &&\ + rm -f protoc-21.9-linux-x86_64.zip jobs: workspace-fmt: @@ -104,7 +113,7 @@ jobs: steps: - checkout - restore-cargo-cache - - run: sudo apt install -y protobuf-compiler + - install-protoc - run: cargo fmt --all --check - run: cargo install cargo-sort - run: cargo sort --check --workspace @@ -119,7 +128,7 @@ jobs: steps: - checkout - restore-cargo-cache - - run: sudo apt install -y protobuf-compiler + - install-protoc - run: | cargo clippy --tests \ --all-targets \ @@ -138,7 +147,7 @@ jobs: steps: - checkout - restore-cargo-cache - - run: sudo apt install -y protobuf-compiler + - install-protoc - apply-patches - run: cargo fmt --all --check --manifest-path << parameters.path >>/Cargo.toml - run: cargo install cargo-sort diff --git a/Containerfile b/Containerfile index 2989c9800..0d7f05959 100644 --- a/Containerfile +++ b/Containerfile @@ -1,7 +1,12 @@ #syntax=docker/dockerfile-upstream:1.4.0-rc1 FROM rust:1.63.0-buster as shuttle-build RUN apt-get update &&\ - apt-get install -y curl protobuf-compiler + apt-get install -y curl +# download protoc binary and unzip it in usr/bin +RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.9/protoc-21.9-linux-x86_64.zip &&\ + unzip -o protoc-21.9-linux-x86_64.zip -d /usr bin/protoc &&\ + unzip -o protoc-21.9-linux-x86_64.zip -d /usr/ 'include/*' &&\ + rm -f protoc-21.9-linux-x86_64.zip RUN cargo install cargo-chef WORKDIR /build diff --git a/common/src/wasm.rs b/common/src/wasm.rs index 9a3512c9b..34e19d5e3 100644 --- a/common/src/wasm.rs +++ b/common/src/wasm.rs @@ -115,7 +115,7 @@ mod test { .method(Method::PUT) .version(Version::HTTP_11) .header("test", HeaderValue::from_static("request")) - .uri(format!("https://axum-wasm.example/hello")) + .uri("https://axum-wasm.example/hello") .body(Body::empty()) .unwrap(); diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index 14f4fe6bd..7b1222451 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -380,7 +380,7 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", ) .unwrap(); - super::extract_tar_gz_data(test_data.as_slice(), &p).unwrap(); + super::extract_tar_gz_data(test_data.as_slice(), p).unwrap(); assert!(fs::read_to_string(p.join("world.txt")) .await .unwrap() @@ -391,7 +391,7 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", .starts_with("def")); // Can we extract again without error? - super::extract_tar_gz_data(test_data.as_slice(), &p).unwrap(); + super::extract_tar_gz_data(test_data.as_slice(), p).unwrap(); } #[tokio::test(flavor = "multi_thread")] diff --git a/deployer/src/handlers/mod.rs b/deployer/src/handlers/mod.rs index 90855581b..e3873838e 100644 --- a/deployer/src/handlers/mod.rs +++ b/deployer/src/handlers/mod.rs @@ -63,7 +63,7 @@ pub fn make_router( }) .on_response( |response: &Response, latency: Duration, span: &Span| { - span.record("http.status_code", &response.status().as_u16()); + span.record("http.status_code", response.status().as_u16()); debug!(latency = format_args!("{} ns", latency.as_nanos()), "finished processing request"); }, ), diff --git a/deployer/src/main.rs b/deployer/src/main.rs index eac473365..0259843b8 100644 --- a/deployer/src/main.rs +++ b/deployer/src/main.rs @@ -46,7 +46,7 @@ async fn main() { let runtime_dir = workspace_root.join("target/debug"); let mut runtime = tokio::process::Command::new(runtime_dir.join("shuttle-runtime")) - .args(&[ + .args([ "--legacy", "--provisioner-address", "https://localhost:5000", diff --git a/deployer/src/persistence/mod.rs b/deployer/src/persistence/mod.rs index 8786142ea..9ae1d8fc9 100644 --- a/deployer/src/persistence/mod.rs +++ b/deployer/src/persistence/mod.rs @@ -352,7 +352,7 @@ impl ResourceRecorder for Persistence { async fn insert_resource(&self, resource: &Resource) -> Result<()> { sqlx::query("INSERT OR REPLACE INTO resources (service_id, type, data) VALUES (?, ?, ?)") - .bind(&resource.service_id) + .bind(resource.service_id) .bind(resource.r#type) .bind(&resource.data) .execute(&self.pool) @@ -965,19 +965,19 @@ mod tests { ) // This running item should match .bind(Uuid::new_v4()) - .bind(&service_id) + .bind(service_id) .bind(State::Running) .bind(Utc::now()) .bind("10.0.0.5:12356") // A stopped item should not match .bind(Uuid::new_v4()) - .bind(&service_id) + .bind(service_id) .bind(State::Stopped) .bind(Utc::now()) .bind("10.0.0.5:9876") // Another service should not match .bind(Uuid::new_v4()) - .bind(&service_other_id) + .bind(service_other_id) .bind(State::Running) .bind(Utc::now()) .bind("10.0.0.5:5678") @@ -1053,8 +1053,8 @@ mod tests { sqlx::query( "INSERT INTO deployments (id, service_id, state, last_update) VALUES (?, ?, ?, ?)", ) - .bind(&deployment_id) - .bind(&service_id) + .bind(deployment_id) + .bind(service_id) .bind(State::Running) .bind(Utc::now()) .execute(pool) @@ -1071,7 +1071,7 @@ mod tests { let service_id = Uuid::new_v4(); sqlx::query("INSERT INTO services (id, name) VALUES (?, ?)") - .bind(&service_id) + .bind(service_id) .bind(name) .execute(pool) .await?; diff --git a/deployer/src/proxy.rs b/deployer/src/proxy.rs index 72de43909..7a7dcf9f0 100644 --- a/deployer/src/proxy.rs +++ b/deployer/src/proxy.rs @@ -48,7 +48,7 @@ pub async fn handle( }; // Record current service for tracing purposes - Span::current().record("service", &service); + Span::current().record("service", service); let proxy_address = match address_getter.get_address_for_service(service).await { Ok(Some(address)) => address, @@ -73,7 +73,7 @@ pub async fn handle( match reverse_proxy(remote_address.ip(), &proxy_address.to_string(), req).await { Ok(response) => { - Span::current().record("http.status_code", &response.status().as_u16()); + Span::current().record("http.status_code", response.status().as_u16()); Ok(response) } Err(error) => { diff --git a/gateway/src/api/latest.rs b/gateway/src/api/latest.rs index 69ca3cfdb..2d760368d 100644 --- a/gateway/src/api/latest.rs +++ b/gateway/src/api/latest.rs @@ -162,7 +162,7 @@ pub fn make_api(service: Arc, sender: Sender) -> Router, latency: Duration, span: &Span| { - span.record("http.status_code", &response.status().as_u16()); + span.record("http.status_code", response.status().as_u16()); debug!(latency = format_args!("{} ns", latency.as_nanos()), "finished processing request"); }, ), diff --git a/proto/runtime.proto b/proto/runtime.proto index b6b0b19e1..e3fadf1a6 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -9,6 +9,9 @@ service Runtime { // Start a loaded service file rpc Start(StartRequest) returns (StartResponse); + + // Stop a started service + rpc Stop(StopRequest) returns (StopResponse); rpc SubscribeLogs(SubscribeLogsRequest) returns (stream LogItem); } @@ -43,6 +46,18 @@ message StartResponse { uint32 port = 2; } +message StopRequest { + // Id to associate with the deployment being stopped + bytes deployment_id = 1; + // Name of service to stop + string service_name = 2; +} + +message StopResponse { + // Was the stop successful + bool success = 1; +} + message SubscribeLogsRequest {} message LogItem { diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 5ea9e6003..2aea4596c 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -27,6 +27,7 @@ wasmtime-wasi = "2.0.0" [dependencies.shuttle-common] version = "0.7.0" path = "../common" +features = ["axum-wasm"] [dependencies.shuttle-proto] version = "0.7.0" @@ -37,7 +38,3 @@ version = "0.7.0" default-features = false features = ["loader"] path = "../service" - -[features] -shuttle-axum = ["shuttle-common/axum-wasm"] - diff --git a/runtime/Makefile b/runtime/Makefile index 458f6ad3b..51f33e409 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -1,17 +1,17 @@ -.PHONY: wasm next +.PHONY: axum serenity -all: wasm next - -wasm: - cd ../tmp/wasm; cargo build --target wasm32-wasi - cp ../tmp/wasm/target/wasm32-wasi/debug/shuttle_serenity.wasm bot.wasm +all: axum serenity axum: cd ../tmp/axum-wasm; cargo build --target wasm32-wasi cp ../tmp/axum-wasm/target/wasm32-wasi/debug/shuttle_axum.wasm axum.wasm -test: wasm - cargo test -- --nocapture +serenity: + cd ../tmp/wasm; cargo build --target wasm32-wasi + cp ../tmp/wasm/target/wasm32-wasi/debug/shuttle_serenity.wasm serenity.wasm + +test: serenity axum + cargo test --all-features -- --nocapture runtime: cargo build diff --git a/runtime/README.md b/runtime/README.md index f38778c44..c78b61f19 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -1,17 +1,46 @@ # How to run +## serenity-wasm + +Build and run: + ## shuttle-next + +Compile the shuttle-next serenity runtime: + +```bash +make serenity +``` + +Run the test: + +```bash +cargo test serenity -- --nocapture + +# or, run tests for both axum and serenity: +make test +``` + +Start the shuttle-next runtime: + ```bash -$ make wasm -$ DISCORD_TOKEN=xxx cargo run +DISCORD_TOKEN=xxx cargo run ``` In another terminal: ``` bash -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "runtime/bot.wasm"}' localhost:6001 runtime.Runtime/Load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:6001 runtime.Runtime/Start +# load wasm module +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//runtime/serenity.wasm"}' localhost:6001 runtime.Runtime/Load + +# start bot (the deployment ID is needed in the StartRequest, but it isn't used by the serenity bot currently) +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Start + +# subscribe to logs (unimplemented) grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs + +# stop (the deployment ID is needed in the StopRequest, but it isn't used by the serenity bot currently) +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Stop ``` ## axum-wasm @@ -25,24 +54,32 @@ make axum Run the test: ```bash -cargo test axum --features shuttle-axum -- --nocapture +cargo test axum -- --nocapture + +# or, run tests for both axum and serenity: +make test ``` Load and run: ```bash -cargo run --features shuttle-axum -- --axum --provisioner-address http://localhost:8000 +cargo run -- --axum --provisioner-address http://localhost:5000 ``` In another terminal: ``` bash -# a full, absolute path from home was needed for me in the load request -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "runtime/axum.wasm"}' localhost:6001 runtime.Runtime/Load +# load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//runtime/axum.wasm"}' localhost:6001 runtime.Runtime/Load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:6001 runtime.Runtime/Start +# start +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Start -# grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs +# subscribe to logs (unimplemented) +grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs + +# stop +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Stop ``` Curl the service: @@ -51,6 +88,7 @@ curl localhost:7002/hello curl localhost:7002/goodbye ``` + ## shuttle-legacy Load and run an .so library that implements `shuttle_service::Service`. @@ -64,7 +102,7 @@ docker-compose -f docker-compose.rendered.yml up provisioner Then in another shell, start the runtime using the clap CLI: ```bash -cargo run -- --legacy --provisioner-address http://localhost:8000 +cargo run -- --legacy --provisioner-address http://localhost:5000 ``` Or directly (this is the path hardcoded in `deployer::start`): @@ -72,16 +110,24 @@ Or directly (this is the path hardcoded in `deployer::start`): # first, make sure the shuttle-runtime binary is built cargo build # then -/home//target/debug/shuttle-runtime --legacy --provisioner-address http://localhost:6001 +/home//target/debug/shuttle-runtime --legacy --provisioner-address http://localhost:5000 ``` Pass the path to `deployer::start` Then in another shell, load a `.so` file and start it up: ``` bash -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:6001 runtime.Runtime/Load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:6001 runtime.Runtime/Start +# load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:6001 runtime.Runtime/Load + +# run (this deployment id is default uuid encoded as base64) +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Start + +# subscribe to logs grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs + +# stop (the service started in the legacy runtime can't currently be stopped) +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:6001 runtime.Runtime/Stop ``` ## Running the tests diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 40aaa06db..4424748d5 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -2,8 +2,10 @@ use std::convert::Infallible; use std::fs::File; use std::io::{BufReader, Read, Write}; use std::net::{Ipv4Addr, SocketAddr}; +use std::ops::DerefMut; use std::os::unix::prelude::RawFd; use std::path::Path; +use std::str::FromStr; use std::sync::{Arc, Mutex}; use async_trait::async_trait; @@ -13,11 +15,14 @@ use hyper::{Body, Request, Response}; use shuttle_common::wasm::{RequestWrapper, ResponseWrapper}; use shuttle_proto::runtime::runtime_server::Runtime; use shuttle_proto::runtime::{ - self, LoadRequest, LoadResponse, StartRequest, StartResponse, SubscribeLogsRequest, + self, LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, + SubscribeLogsRequest, }; +use shuttle_service::ServiceName; +use tokio::sync::oneshot; use tokio_stream::wrappers::ReceiverStream; use tonic::Status; -use tracing::info; +use tracing::{error, trace}; use wasi_common::file::FileCaps; use wasmtime::{Engine, Linker, Module, Store}; use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; @@ -28,6 +33,7 @@ extern crate rmp_serde as rmps; pub struct AxumWasm { router: std::sync::Mutex>, port: Mutex>, + kill_tx: std::sync::Mutex>>, } impl AxumWasm { @@ -35,10 +41,17 @@ impl AxumWasm { Self { router: std::sync::Mutex::new(None), port: std::sync::Mutex::new(None), + kill_tx: std::sync::Mutex::new(None), } } } +impl Default for AxumWasm { + fn default() -> Self { + Self::new() + } +} + #[async_trait] impl Runtime for AxumWasm { async fn load( @@ -46,7 +59,7 @@ impl Runtime for AxumWasm { request: tonic::Request, ) -> Result, Status> { let wasm_path = request.into_inner().path; - info!(wasm_path, "loading"); + trace!(wasm_path, "loading"); let router = Router::new(wasm_path); @@ -64,24 +77,14 @@ impl Runtime for AxumWasm { let port = 7002; let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); - let router = self.router.lock().unwrap().take().unwrap().inner; + let router = self.router.lock().unwrap().take().unwrap(); - let make_service = make_service_fn(move |_conn| { - let router = router.clone(); - async move { - Ok::<_, Infallible>(service_fn(move |req: Request| { - let router = router.clone(); - async move { - Ok::<_, Infallible>(router.lock().await.send_request(req).await.unwrap()) - } - })) - } - }); + let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); - info!("starting hyper server on: {}", &address); - let server = hyper::Server::bind(&address).serve(make_service); + *self.kill_tx.lock().unwrap() = Some(kill_tx); - _ = tokio::spawn(server); + // TODO: split `into_server` up into build and run functions + tokio::spawn(router.into_server(address, kill_rx)); *self.port.lock().unwrap() = Some(port); @@ -101,6 +104,32 @@ impl Runtime for AxumWasm { ) -> Result, Status> { todo!() } + + async fn stop( + &self, + request: tonic::Request, + ) -> Result, Status> { + let request = request.into_inner(); + + let service_name = ServiceName::from_str(request.service_name.as_str()) + .map_err(|err| Status::from_error(Box::new(err)))?; + + let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); + + if let Some(kill_tx) = kill_tx { + if kill_tx + .send(format!("stopping deployment: {}", &service_name)) + .is_err() + { + error!("the receiver dropped"); + return Err(Status::internal("failed to stop deployment")); + } + + Ok(tonic::Response::new(StopResponse { success: true })) + } else { + Err(Status::internal("failed to stop deployment")) + } + } } struct RouterBuilder { @@ -167,7 +196,7 @@ struct RouterInner { impl RouterInner { /// Send a HTTP request with body to given endpoint on the axum-wasm router and return the response - pub async fn send_request( + pub async fn handle_request( &mut self, req: hyper::Request, ) -> Result, Infallible> { @@ -251,6 +280,45 @@ impl Router { pub fn new>(src: P) -> Self { Self::builder().src(src).build() } + + /// Consume the router, build and run server until a stop signal is received via the + /// kill receiver + // TODO: figure out how to handle the complicated generics for hyper::Server and + // hyper::MakeServiceFn and split this up into `build` and `run_until_stopped` functions + pub async fn into_server( + self, + address: SocketAddr, + kill_rx: tokio::sync::oneshot::Receiver, + ) { + let router = self.inner; + + let make_service = make_service_fn(move |_conn| { + let router = router.clone(); + async move { + Ok::<_, Infallible>(service_fn(move |req: Request| { + let router = router.clone(); + async move { + Ok::<_, Infallible>(router.lock().await.handle_request(req).await.unwrap()) + } + })) + } + }); + + let server = hyper::Server::bind(&address).serve(make_service); + + trace!("starting hyper server on: {}", &address); + tokio::select! { + _ = server => { + trace!("axum wasm server stopped"); + }, + message = kill_rx => { + match message { + Ok(msg) => trace!("{msg}"), + Err(_) => trace!("the sender dropped") + } + } + }; + } } #[cfg(test)] @@ -267,11 +335,11 @@ pub mod tests { let request: Request = Request::builder() .method(Method::GET) .version(Version::HTTP_11) - .uri(format!("https://axum-wasm.example/hello")) + .uri("https://axum-wasm.example/hello") .body(Body::empty()) .unwrap(); - let res = inner.send_request(request).await.unwrap(); + let res = inner.handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( @@ -290,11 +358,11 @@ pub mod tests { .method(Method::GET) .version(Version::HTTP_11) .header("test", HeaderValue::from_static("goodbye")) - .uri(format!("https://axum-wasm.example/goodbye")) + .uri("https://axum-wasm.example/goodbye") .body(Body::from("Goodbye world body")) .unwrap(); - let res = inner.send_request(request).await.unwrap(); + let res = inner.handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( @@ -313,11 +381,11 @@ pub mod tests { .method(Method::GET) .version(Version::HTTP_11) .header("test", HeaderValue::from_static("invalid")) - .uri(format!("https://axum-wasm.example/invalid")) + .uri("https://axum-wasm.example/invalid") .body(Body::empty()) .unwrap(); - let res = inner.send_request(request).await.unwrap(); + let res = inner.handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::NOT_FOUND); } diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 2d3a8faad..0960136ce 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -13,7 +13,7 @@ use shuttle_proto::{ provisioner::provisioner_client::ProvisionerClient, runtime::{ self, runtime_server::Runtime, LoadRequest, LoadResponse, StartRequest, StartResponse, - SubscribeLogsRequest, + StopRequest, StopResponse, SubscribeLogsRequest, }, }; use shuttle_service::{ @@ -21,9 +21,10 @@ use shuttle_service::{ Factory, Logger, ServiceName, }; use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender}; +use tokio::sync::oneshot; use tokio_stream::wrappers::ReceiverStream; use tonic::{transport::Endpoint, Request, Response, Status}; -use tracing::{info, instrument, trace}; +use tracing::{error, instrument, trace}; use uuid::Uuid; use crate::provisioner_factory::{AbstractFactory, AbstractProvisionerFactory}; @@ -37,6 +38,7 @@ pub struct Legacy { logs_rx: Mutex>>, logs_tx: Mutex>, provisioner_address: Endpoint, + kill_tx: Mutex>>, } impl Legacy { @@ -48,6 +50,7 @@ impl Legacy { port: Mutex::new(None), logs_rx: Mutex::new(Some(rx)), logs_tx: Mutex::new(tx), + kill_tx: Mutex::new(None), provisioner_address, } } @@ -86,7 +89,10 @@ impl Runtime for Legacy { let mut factory = abstract_factory.get_factory(service_name); let logs_tx = self.logs_tx.lock().unwrap().clone(); - let deployment_id = Uuid::from_slice(&request.deployment_id).unwrap(); + + let deployment_id = + Uuid::from_str(std::str::from_utf8(&request.deployment_id).unwrap()).unwrap(); + let logger = Logger::new(logs_tx, deployment_id); let so_path = self @@ -105,7 +111,12 @@ impl Runtime for Legacy { .await .unwrap(); - _ = tokio::spawn(run(service, service_address)); + let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); + + *self.kill_tx.lock().unwrap() = Some(kill_tx); + + // start service as a background task with a kill receiver + tokio::spawn(run_until_stopped(service, service_address, kill_rx)); *self.port.lock().unwrap() = Some(service_port); @@ -140,14 +151,54 @@ impl Runtime for Legacy { Err(Status::internal("logs have already been subscribed to")) } } + + // todo: this doesn't currently stop the service, since we can't stop the tokio runtime it + // is started on. + async fn stop(&self, request: Request) -> Result, Status> { + let request = request.into_inner(); + + let service_name = ServiceName::from_str(request.service_name.as_str()) + .map_err(|err| Status::from_error(Box::new(err)))?; + + let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); + + if let Some(kill_tx) = kill_tx { + if kill_tx + .send(format!("stopping deployment: {}", &service_name)) + .is_err() + { + error!("the receiver dropped"); + return Err(Status::internal("failed to stop deployment")); + } + + Ok(Response::new(StopResponse { success: true })) + } else { + Err(Status::internal("failed to stop deployment")) + } + } } +/// Run the service until a stop signal is received #[instrument(skip(service))] -async fn run(service: LoadedService, addr: SocketAddr) { +async fn run_until_stopped( + service: LoadedService, + addr: SocketAddr, + kill_rx: tokio::sync::oneshot::Receiver, +) { let (handle, library) = service; - info!("starting deployment on {}", addr); - handle.await.unwrap().unwrap(); + trace!("starting deployment on {}", &addr); + tokio::select! { + _ = handle => { + trace!("deployment stopped on {}", &addr); + }, + message = kill_rx => { + match message { + Ok(msg) => trace!("{msg}"), + Err(_) => trace!("the sender dropped") + } + } + } tokio::spawn(async move { trace!("closing .so file"); diff --git a/runtime/src/main.rs b/runtime/src/main.rs index f7a5dc597..f01d95ac0 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -37,11 +37,11 @@ async fn main() { let svc = RuntimeServer::new(legacy); server_builder.add_service(svc) } else if args.axum { - let axum = AxumWasm::new(); + let axum = AxumWasm::default(); let svc = RuntimeServer::new(axum); server_builder.add_service(svc) } else { - let next = Next::new(); + let next = Next::default(); let svc = RuntimeServer::new(next); server_builder.add_service(svc) }; diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index e0d03db45..da703189a 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -1,8 +1,10 @@ use std::env; use std::fs::File; use std::io::{Read, Write}; +use std::ops::DerefMut; use std::os::unix::prelude::RawFd; use std::path::Path; +use std::str::FromStr; use std::sync::Arc; use async_trait::async_trait; @@ -10,11 +12,14 @@ use cap_std::os::unix::net::UnixStream; use serenity::{model::prelude::*, prelude::*}; use shuttle_proto::runtime::runtime_server::Runtime; use shuttle_proto::runtime::{ - self, LoadRequest, LoadResponse, StartRequest, StartResponse, SubscribeLogsRequest, + self, LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, + SubscribeLogsRequest, }; +use shuttle_service::ServiceName; +use tokio::sync::oneshot; use tokio_stream::wrappers::ReceiverStream; use tonic::{Request, Response, Status}; -use tracing::trace; +use tracing::{error, trace}; use wasi_common::file::FileCaps; use wasmtime::{Engine, Linker, Module, Store}; use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; @@ -22,16 +27,24 @@ use wasmtime_wasi::{WasiCtx, WasiCtxBuilder}; pub struct Next { bot: std::sync::Mutex>, + kill_tx: std::sync::Mutex>>, } impl Next { pub fn new() -> Self { Self { bot: std::sync::Mutex::new(None), + kill_tx: std::sync::Mutex::new(None), } } } +impl Default for Next { + fn default() -> Self { + Self::new() + } +} + #[async_trait] impl Runtime for Next { async fn load(&self, request: Request) -> Result, Status> { @@ -57,12 +70,15 @@ impl Runtime for Next { let guard = self.bot.lock().unwrap(); guard.as_ref().unwrap().clone() }; - let mut client = bot.into_client(token.as_str(), intents).await; + let client = bot.into_client(token.as_str(), intents).await; + + let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); + + *self.kill_tx.lock().unwrap() = Some(kill_tx); + // start bot as a background task with a kill receiver trace!("starting bot"); - tokio::spawn(async move { - client.start().await.unwrap(); - }); + tokio::spawn(run_until_stopped(client, kill_rx)); let message = StartResponse { success: true, @@ -81,6 +97,44 @@ impl Runtime for Next { ) -> Result, Status> { todo!() } + + async fn stop(&self, request: Request) -> Result, Status> { + let request = request.into_inner(); + + let service_name = ServiceName::from_str(request.service_name.as_str()) + .map_err(|err| Status::from_error(Box::new(err)))?; + + let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); + + if let Some(kill_tx) = kill_tx { + if kill_tx + .send(format!("stopping deployment: {}", &service_name)) + .is_err() + { + error!("the receiver dropped"); + return Err(Status::internal("failed to stop deployment")); + } + + Ok(Response::new(StopResponse { success: true })) + } else { + Err(Status::internal("failed to stop deployment")) + } + } +} + +/// Run the bot until a stop signal is received +async fn run_until_stopped(mut client: Client, kill_rx: tokio::sync::oneshot::Receiver) { + tokio::select! { + _ = client.start() => { + trace!("serenity bot stopped"); + }, + message = kill_rx => { + match message { + Ok(msg) => trace!("{msg}"), + Err(_) => trace!("the sender dropped") + } + } + } } struct BotBuilder { @@ -153,7 +207,7 @@ impl BotInner { .insert_file(3, Box::new(client), FileCaps::all()); host.write_all(new_message.as_bytes()).unwrap(); - host.write(&[0]).unwrap(); + host.write_all(&[0]).unwrap(); println!("calling inner EventHandler message"); self.linker @@ -192,7 +246,7 @@ impl Bot { } pub async fn into_client(self, token: &str, intents: GatewayIntents) -> Client { - Client::builder(&token, intents) + Client::builder(token, intents) .event_handler(self) .await .unwrap() @@ -214,8 +268,8 @@ pub mod tests { use super::*; #[tokio::test] - async fn bot() { - let bot = Bot::new("bot.wasm"); + async fn serenity() { + let bot = Bot::new("serenity.wasm"); let mut inner = bot.inner.lock().await; assert_eq!(inner.message("not !hello").await, None); assert_eq!(inner.message("!hello").await, Some("world!".to_string())); From c2b0f63d7b58847a36c82a3a9c229cb01b6b09e2 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 24 Nov 2022 12:32:36 +0200 Subject: [PATCH 13/74] feat(next): expand macro into axum routes (#488) * feat: app codegen model * refactor: qualify all namespaces * feat: low-level wasi export fn * refactor: restrict to supported axum methods --- codegen/src/lib.rs | 1 + codegen/src/next/mod.rs | 192 +++++++++++++++++++++++++++++++++++++++ tmp/axum-wasm/src/lib.rs | 54 +++++------ 3 files changed, 218 insertions(+), 29 deletions(-) create mode 100644 codegen/src/next/mod.rs diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index 3541c3c41..c96d2f96c 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -1,4 +1,5 @@ mod main; +mod next; use proc_macro::TokenStream; use proc_macro_error::proc_macro_error; diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs new file mode 100644 index 000000000..f996cfed3 --- /dev/null +++ b/codegen/src/next/mod.rs @@ -0,0 +1,192 @@ +use proc_macro_error::emit_error; +use quote::{quote, ToTokens}; +use syn::{Ident, LitStr}; + +struct Endpoint { + route: LitStr, + method: Ident, + function: Ident, +} + +impl ToTokens for Endpoint { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let Self { + route, + method, + function, + } = self; + + match method.to_string().as_str() { + "get" | "post" | "delete" | "put" | "options" | "head" | "trace" | "patch" => {} + _ => { + emit_error!( + method, + "method is not supported"; + hint = "Try one of the following: `get`, `post`, `delete`, `put`, `options`, `head`, `trace` or `patch`" + ) + } + }; + + let route = quote!(.route(#route, axum::routing::#method(#function))); + + route.to_tokens(tokens); + } +} + +pub(crate) struct App { + endpoints: Vec, +} + +impl ToTokens for App { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let Self { endpoints } = self; + + let app = quote!( + async fn __app(request: http::Request) -> axum::response::Response + where + B: axum::body::HttpBody + Send + 'static, + { + use tower_service::Service; + + let mut router = axum::Router::new() + #(#endpoints)* + .into_service(); + + let response = router.call(request).await.unwrap(); + + response + } + ); + + app.to_tokens(tokens); + } +} + +pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { + quote!( + #app + + #[no_mangle] + #[allow(non_snake_case)] + pub extern "C" fn __SHUTTLE_Axum_call( + fd_3: std::os::wasi::prelude::RawFd, + fd_4: std::os::wasi::prelude::RawFd, + ) { + use axum::body::HttpBody; + use std::io::{Read, Write}; + use std::os::wasi::io::FromRawFd; + + println!("inner handler awoken; interacting with fd={fd_3},{fd_4}"); + + // file descriptor 3 for reading and writing http parts + let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; + + let reader = std::io::BufReader::new(&mut parts_fd); + + // deserialize request parts from rust messagepack + let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); + + // file descriptor 4 for reading and writing http body + let mut body_fd = unsafe { std::fs::File::from_raw_fd(fd_4) }; + + // read body from host + let mut body_buf = Vec::new(); + let mut c_buf: [u8; 1] = [0; 1]; + loop { + body_fd.read(&mut c_buf).unwrap(); + if c_buf[0] == 0 { + break; + } else { + body_buf.push(c_buf[0]); + } + } + + let request: http::Request = wrapper + .into_request_builder() + .body(body_buf.into()) + .unwrap(); + + println!("inner router received request: {:?}", &request); + let res = futures_executor::block_on(__app(request)); + + let (parts, mut body) = res.into_parts(); + + // wrap and serialize response parts as rmp + let response_parts = shuttle_common::wasm::ResponseWrapper::from(parts).into_rmp(); + + // write response parts + parts_fd.write_all(&response_parts).unwrap(); + + // write body if there is one + if let Some(body) = futures_executor::block_on(body.data()) { + body_fd.write_all(body.unwrap().as_ref()).unwrap(); + } + // signal to the reader that end of file has been reached + body_fd.write(&[0]).unwrap(); + } + ) +} + +#[cfg(test)] +mod tests { + use pretty_assertions::assert_eq; + use quote::quote; + use syn::parse_quote; + + use crate::next::App; + + use super::Endpoint; + + #[test] + fn endpoint_to_token() { + let endpoint = Endpoint { + route: parse_quote!("/hello"), + method: parse_quote!(get), + function: parse_quote!(hello), + }; + + let actual = quote!(#endpoint); + let expected = quote!(.route("/hello", axum::routing::get(hello))); + + assert_eq!(actual.to_string(), expected.to_string()); + } + + #[test] + fn app_to_token() { + let app = App { + endpoints: vec![ + Endpoint { + route: parse_quote!("/hello"), + method: parse_quote!(get), + function: parse_quote!(hello), + }, + Endpoint { + route: parse_quote!("/goodbye"), + method: parse_quote!(post), + function: parse_quote!(goodbye), + }, + ], + }; + + let actual = quote!(#app); + let expected = quote!( + async fn __app(request: http::Request) -> axum::response::Response + where + B: axum::body::HttpBody + Send + 'static, + { + use tower_service::Service; + + let mut router = axum::Router::new() + .route("/hello", axum::routing::get(hello)) + .route("/goodbye", axum::routing::post(goodbye)) + .into_service(); + + let response = router.call(request).await.unwrap(); + + response + } + ); + + assert_eq!(actual.to_string(), expected.to_string()); + } +} diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs index e0a8b6542..00c3778c2 100644 --- a/tmp/axum-wasm/src/lib.rs +++ b/tmp/axum-wasm/src/lib.rs @@ -1,30 +1,19 @@ -use axum::body::{Body, HttpBody}; -use axum::{response::Response, routing::get, Router}; -use futures_executor::block_on; -use http::Request; -use shuttle_common::wasm::{RequestWrapper, ResponseWrapper}; -use std::fs::File; -use std::io::BufReader; -use std::io::{Read, Write}; -use std::os::wasi::prelude::*; -use tower_service::Service; - -extern crate rmp_serde as rmps; - -pub fn handle_request(req: Request) -> Response +pub fn handle_request(req: http::Request) -> axum::response::Response where - B: HttpBody + Send + 'static, + B: axum::body::HttpBody + Send + 'static, { - block_on(app(req)) + futures_executor::block_on(app(req)) } -async fn app(request: Request) -> Response +async fn app(request: http::Request) -> axum::response::Response where - B: HttpBody + Send + 'static, + B: axum::body::HttpBody + Send + 'static, { - let mut router = Router::new() - .route("/hello", get(hello)) - .route("/goodbye", get(goodbye)) + use tower_service::Service; + + let mut router = axum::Router::new() + .route("/hello", axum::routing::get(hello)) + .route("/goodbye", axum::routing::get(goodbye)) .into_service(); let response = router.call(request).await.unwrap(); @@ -42,19 +31,26 @@ async fn goodbye() -> &'static str { #[no_mangle] #[allow(non_snake_case)] -pub extern "C" fn __SHUTTLE_Axum_call(fd_3: RawFd, fd_4: RawFd) { +pub extern "C" fn __SHUTTLE_Axum_call( + fd_3: std::os::wasi::prelude::RawFd, + fd_4: std::os::wasi::prelude::RawFd, +) { + use axum::body::HttpBody; + use std::io::{Read, Write}; + use std::os::wasi::io::FromRawFd; + println!("inner handler awoken; interacting with fd={fd_3},{fd_4}"); // file descriptor 3 for reading and writing http parts - let mut parts_fd = unsafe { File::from_raw_fd(fd_3) }; + let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; - let reader = BufReader::new(&mut parts_fd); + let reader = std::io::BufReader::new(&mut parts_fd); // deserialize request parts from rust messagepack - let wrapper: RequestWrapper = rmps::from_read(reader).unwrap(); + let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); // file descriptor 4 for reading and writing http body - let mut body_fd = unsafe { File::from_raw_fd(fd_4) }; + let mut body_fd = unsafe { std::fs::File::from_raw_fd(fd_4) }; // read body from host let mut body_buf = Vec::new(); @@ -68,7 +64,7 @@ pub extern "C" fn __SHUTTLE_Axum_call(fd_3: RawFd, fd_4: RawFd) { } } - let request: Request = wrapper + let request: http::Request = wrapper .into_request_builder() .body(body_buf.into()) .unwrap(); @@ -79,13 +75,13 @@ pub extern "C" fn __SHUTTLE_Axum_call(fd_3: RawFd, fd_4: RawFd) { let (parts, mut body) = res.into_parts(); // wrap and serialize response parts as rmp - let response_parts = ResponseWrapper::from(parts).into_rmp(); + let response_parts = shuttle_common::wasm::ResponseWrapper::from(parts).into_rmp(); // write response parts parts_fd.write_all(&response_parts).unwrap(); // write body if there is one - if let Some(body) = block_on(body.data()) { + if let Some(body) = futures_executor::block_on(body.data()) { body_fd.write_all(body.unwrap().as_ref()).unwrap(); } // signal to the reader that end of file has been reached From 16abe40d109a2361bfb5313a5f73d1f9170c1348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Sun, 4 Dec 2022 18:01:29 +0100 Subject: [PATCH 14/74] Feat: parse shuttle::endpoint macro (#490) * feat: parse params * feat: parse app * feat: add test for missing endpoint attribute * test: invalid args, params and syntax * feat: check for and test no params * feat: don't emit error for missing annotation this way users can create separate functions for their endpoint logic * fix: remove missing attribute error, not param * refactor: reword comment Co-authored-by: Pieter * feat: duplicate param test, address review * feat: only strip endpoint attributes * feat: check for extra endpoint attributes * refactor: clearer error span for extra endpoints * feat: has_err variable to group param errors * refactor: remove optional hint Co-authored-by: Pieter * docs: add TODO for multiple endpoint attributes Co-authored-by: Pieter --- codegen/src/lib.rs | 16 + codegen/src/main/mod.rs | 2 +- codegen/src/next/mod.rs | 343 +++++++++++++++++- .../tests/ui/next/duplicate-endpoint-param.rs | 11 + .../ui/next/duplicate-endpoint-param.stderr | 41 +++ .../ui/next/extra-endpoint-attributes.rs | 7 + .../ui/next/extra-endpoint-attributes.stderr | 18 + .../tests/ui/next/invalid-endpoint-param.rs | 6 + .../ui/next/invalid-endpoint-param.stderr | 14 + .../tests/ui/next/invalid-endpoint-syntax.rs | 11 + .../ui/next/invalid-endpoint-syntax.stderr | 23 ++ .../tests/ui/next/missing-endpoint-param.rs | 16 + .../ui/next/missing-endpoint-param.stderr | 32 ++ 13 files changed, 536 insertions(+), 4 deletions(-) create mode 100644 codegen/tests/ui/next/duplicate-endpoint-param.rs create mode 100644 codegen/tests/ui/next/duplicate-endpoint-param.stderr create mode 100644 codegen/tests/ui/next/extra-endpoint-attributes.rs create mode 100644 codegen/tests/ui/next/extra-endpoint-attributes.stderr create mode 100644 codegen/tests/ui/next/invalid-endpoint-param.rs create mode 100644 codegen/tests/ui/next/invalid-endpoint-param.stderr create mode 100644 codegen/tests/ui/next/invalid-endpoint-syntax.rs create mode 100644 codegen/tests/ui/next/invalid-endpoint-syntax.stderr create mode 100644 codegen/tests/ui/next/missing-endpoint-param.rs create mode 100644 codegen/tests/ui/next/missing-endpoint-param.stderr diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index c96d2f96c..384e19373 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -1,11 +1,27 @@ mod main; mod next; +use next::App; use proc_macro::TokenStream; use proc_macro_error::proc_macro_error; +use syn::{parse_macro_input, File}; #[proc_macro_error] #[proc_macro_attribute] pub fn main(attr: TokenStream, item: TokenStream) -> TokenStream { main::r#impl(attr, item) } + +#[proc_macro_error] +#[proc_macro] +pub fn app(item: TokenStream) -> TokenStream { + let mut file = parse_macro_input!(item as File); + + let app = App::from_file(&mut file); + + quote::quote!( + #file + #app + ) + .into() +} diff --git a/codegen/src/main/mod.rs b/codegen/src/main/mod.rs index a3ec3200a..be3939920 100644 --- a/codegen/src/main/mod.rs +++ b/codegen/src/main/mod.rs @@ -652,6 +652,6 @@ mod tests { #[test] fn ui() { let t = trybuild::TestCases::new(); - t.compile_fail("tests/ui/*.rs"); + t.compile_fail("tests/ui/main/*.rs"); } } diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index f996cfed3..27dc3a71f 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -1,13 +1,192 @@ use proc_macro_error::emit_error; use quote::{quote, ToTokens}; -use syn::{Ident, LitStr}; +use syn::{ + parenthesized, parse::Parse, parse2, punctuated::Punctuated, token::Paren, Expr, File, Ident, + Item, ItemFn, Lit, LitStr, Token, +}; +#[derive(Debug, Eq, PartialEq)] struct Endpoint { route: LitStr, method: Ident, function: Ident, } +#[derive(Debug, Eq, PartialEq)] +struct Parameter { + key: Ident, + equals: Token![=], + value: Expr, +} + +#[derive(Debug, Eq, PartialEq)] +struct Params { + params: Punctuated, + paren_token: Paren, +} + +impl Parse for Parameter { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + Ok(Self { + key: input.parse()?, + equals: input.parse()?, + value: input.parse()?, + }) + } +} + +impl Parse for Params { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + let content; + Ok(Self { + paren_token: parenthesized!(content in input), + params: content.parse_terminated(Parameter::parse)?, + }) + } +} + +impl Endpoint { + fn from_item_fn(item: &mut ItemFn) -> Option { + let function = item.sig.ident.clone(); + + let mut endpoint_index = None; + + // Find the index of an attribute that is an endpoint + for index in 0..item.attrs.len() { + // The endpoint ident should be the last segment in the path + if let Some(segment) = item.attrs[index].path.segments.last() { + if segment.ident.to_string().as_str() == "endpoint" { + // TODO: we should allow multiple endpoint attributes per handler. + // We could refactor this to return a Vec and then check + // that the combination of endpoints is valid. + if endpoint_index.is_some() { + emit_error!( + item, + "extra endpoint attribute"; + hint = "There should only be one endpoint annotation per handler function." + ); + return None; + } + endpoint_index = Some(index); + } + } else { + return None; + } + } + + // Strip the endpoint attribute if it exists + let endpoint = if let Some(index) = endpoint_index { + item.attrs.remove(index) + } else { + // This item does not have an endpoint attribute + return None; + }; + + // Parse the endpoint's parameters + let params: Params = match parse2(endpoint.tokens) { + Ok(params) => params, + Err(err) => { + // This will error on invalid parameter syntax + emit_error!( + err.span(), + err + ); + return None; + } + }; + + // We'll use the paren span for errors later + let paren = params.paren_token; + + if params.params.is_empty() { + emit_error!( + paren.span, + "missing endpoint arguments"; + hint = "The endpoint takes two arguments: `endpoint(method = get, route = \"/hello\")`" + ); + return None; + } + + // At this point an endpoint with params and valid syntax exists, so we will check for + // all errors before returning + let mut has_err = false; + + let mut route = None; + let mut method = None; + + for Parameter { key, value, .. } in params.params { + let key_ident = key.clone(); + match key.to_string().as_str() { + "method" => { + if method.is_some() { + emit_error!( + key_ident, + "duplicate endpoint method"; + hint = "The endpoint `method` should only be set once." + ); + has_err = true; + } + if let Expr::Path(path) = value { + method = Some(path.path.segments[0].ident.clone()); + }; + } + "route" => { + if route.is_some() { + emit_error!( + key_ident, + "duplicate endpoint route"; + hint = "The endpoint `route` should only be set once." + ); + has_err = true; + } + if let Expr::Lit(literal) = value { + if let Some(Lit::Str(literal)) = Some(literal.lit) { + route = Some(literal); + } + } + } + _ => { + emit_error!( + key_ident, + "invalid endpoint argument"; + hint = "Only `method` and `route` are valid endpoint arguments." + ); + has_err = true; + } + } + } + + if route.is_none() { + emit_error!( + paren.span, + "no route provided"; + hint = "Add a route to your endpoint: `route = \"/hello\")`" + ); + has_err = true; + }; + + if method.is_none() { + emit_error!( + paren.span, + "no method provided"; + hint = "Add a method to your endpoint: `method = get`" + ); + has_err = true; + }; + + if has_err { + None + } else { + // Safe to unwrap because `has_err` is true if `route` or `method` is `None` + Some(Endpoint { + route: route.unwrap(), + method: method.unwrap(), + function, + }) + } + } +} + impl ToTokens for Endpoint { fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { let Self { @@ -33,10 +212,30 @@ impl ToTokens for Endpoint { } } +#[derive(Debug, Eq, PartialEq)] pub(crate) struct App { endpoints: Vec, } +impl App { + pub(crate) fn from_file(file: &mut File) -> Self { + let endpoints = file + .items + .iter_mut() + .filter_map(|item| { + if let Item::Fn(item_fn) = item { + Some(item_fn) + } else { + None + } + }) + .filter_map(Endpoint::from_item_fn) + .collect(); + + Self { endpoints } + } +} + impl ToTokens for App { fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { let Self { endpoints } = self; @@ -62,6 +261,7 @@ impl ToTokens for App { } } +#[allow(dead_code)] pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { quote!( #app @@ -133,9 +333,9 @@ mod tests { use quote::quote; use syn::parse_quote; - use crate::next::App; + use crate::next::{App, Parameter}; - use super::Endpoint; + use super::{Endpoint, Params}; #[test] fn endpoint_to_token() { @@ -189,4 +389,141 @@ mod tests { assert_eq!(actual.to_string(), expected.to_string()); } + + #[test] + fn parse_endpoint() { + let cases = vec![ + ( + parse_quote! { + #[shuttle_codegen::endpoint(method = get, route = "/hello")] + async fn hello() -> &'static str { + "Hello, World!" + }}, + Some(Endpoint { + route: parse_quote!("/hello"), + method: parse_quote!(get), + function: parse_quote!(hello), + }), + 0, + ), + ( + parse_quote! { + #[doc = r" This attribute is not an endpoint so keep it"] + #[shuttle_codegen::endpoint(method = get, route = "/hello")] + async fn hello() -> &'static str { + "Hello, World!" + }}, + Some(Endpoint { + route: parse_quote!("/hello"), + method: parse_quote!(get), + function: parse_quote!(hello), + }), + 1, + ), + ( + parse_quote! { + /// This attribute is not an endpoint so keep it + async fn say_hello() -> &'static str { + "Hello, World!" + } + }, + None, + 1, + ), + ]; + + for (mut input, expected, remaining_attributes) in cases { + let actual = Endpoint::from_item_fn(&mut input); + + assert_eq!(actual, expected); + + // Verify that only endpoint attributes have been stripped + assert_eq!(input.attrs.len(), remaining_attributes); + } + } + + #[test] + fn parse_parameter() { + // test method param + let cases: Vec<(Parameter, Parameter)> = vec![ + ( + // parsing an identifier + parse_quote! { + method = get + }, + Parameter { + key: parse_quote!(method), + equals: parse_quote!(=), + value: parse_quote!(get), + }, + ), + ( + // parsing a string literal + parse_quote! { + route = "/hello" + }, + Parameter { + key: parse_quote!(route), + equals: parse_quote!(=), + value: parse_quote!("/hello"), + }, + ), + ]; + for (actual, expected) in cases { + assert_eq!(actual, expected); + } + } + + #[test] + fn parse_params() { + let actual: Params = parse_quote![(method = get, route = "/hello")]; + + let mut expected = Params { + params: Default::default(), + paren_token: Default::default(), + }; + expected.params.push(parse_quote!(method = get)); + expected.params.push(parse_quote!(route = "/hello")); + + assert_eq!(actual, expected); + } + + #[test] + fn parse_app() { + let mut input = parse_quote! { + #[shuttle_codegen::endpoint(method = get, route = "/hello")] + async fn hello() -> &'static str { + "Hello, World!" + } + + #[shuttle_codegen::endpoint(method = post, route = "/goodbye")] + async fn goodbye() -> &'static str { + "Goodbye, World!" + } + }; + + let actual = App::from_file(&mut input); + let expected = App { + endpoints: vec![ + Endpoint { + route: parse_quote!("/hello"), + method: parse_quote!(get), + function: parse_quote!(hello), + }, + Endpoint { + route: parse_quote!("/goodbye"), + method: parse_quote!(post), + function: parse_quote!(goodbye), + }, + ], + }; + + assert_eq!(actual, expected); + } + + #[test] + fn ui() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/ui/next/*.rs"); + } } diff --git a/codegen/tests/ui/next/duplicate-endpoint-param.rs b/codegen/tests/ui/next/duplicate-endpoint-param.rs new file mode 100644 index 000000000..7830c9ad3 --- /dev/null +++ b/codegen/tests/ui/next/duplicate-endpoint-param.rs @@ -0,0 +1,11 @@ +shuttle_codegen::app! { + #[shuttle_codegen::endpoint(method = get, method = get)] + async fn hello() -> &'static str { + "Hello, World!" + } + + #[shuttle_codegen::endpoint(route = "/goodbye", route = "/goodbye")] + async fn goodbye() -> &'static str { + "Goodbye, World!" + } +} diff --git a/codegen/tests/ui/next/duplicate-endpoint-param.stderr b/codegen/tests/ui/next/duplicate-endpoint-param.stderr new file mode 100644 index 000000000..25dd13f7e --- /dev/null +++ b/codegen/tests/ui/next/duplicate-endpoint-param.stderr @@ -0,0 +1,41 @@ +error: duplicate endpoint method + + = help: The endpoint `method` should only be set once. + + --> tests/ui/next/duplicate-endpoint-param.rs:2:47 + | +2 | #[shuttle_codegen::endpoint(method = get, method = get)] + | ^^^^^^ + +error: no route provided + + = help: Add a route to your endpoint: `route = "/hello")` + + --> tests/ui/next/duplicate-endpoint-param.rs:2:32 + | +2 | #[shuttle_codegen::endpoint(method = get, method = get)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: duplicate endpoint route + + = help: The endpoint `route` should only be set once. + + --> tests/ui/next/duplicate-endpoint-param.rs:7:53 + | +7 | #[shuttle_codegen::endpoint(route = "/goodbye", route = "/goodbye")] + | ^^^^^ + +error: no method provided + + = help: Add a method to your endpoint: `method = get` + + --> tests/ui/next/duplicate-endpoint-param.rs:7:32 + | +7 | #[shuttle_codegen::endpoint(route = "/goodbye", route = "/goodbye")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> tests/ui/next/duplicate-endpoint-param.rs:11:2 + | +11 | } + | ^ consider adding a `main` function to `$DIR/tests/ui/next/duplicate-endpoint-param.rs` diff --git a/codegen/tests/ui/next/extra-endpoint-attributes.rs b/codegen/tests/ui/next/extra-endpoint-attributes.rs new file mode 100644 index 000000000..bafa5b92b --- /dev/null +++ b/codegen/tests/ui/next/extra-endpoint-attributes.rs @@ -0,0 +1,7 @@ +shuttle_codegen::app! { + #[shuttle_codegen::endpoint(method = get, route = "/hello")] + #[shuttle_codegen::endpoint(method = post, route = "/hello")] + async fn hello() -> &'static str { + "Hello, World!" + } +} diff --git a/codegen/tests/ui/next/extra-endpoint-attributes.stderr b/codegen/tests/ui/next/extra-endpoint-attributes.stderr new file mode 100644 index 000000000..4bcc17574 --- /dev/null +++ b/codegen/tests/ui/next/extra-endpoint-attributes.stderr @@ -0,0 +1,18 @@ +error: extra endpoint attribute + + = help: There should only be one endpoint annotation per handler function. + + --> tests/ui/next/extra-endpoint-attributes.rs:2:5 + | +2 | / #[shuttle_codegen::endpoint(method = get, route = "/hello")] +3 | | #[shuttle_codegen::endpoint(method = post, route = "/hello")] +4 | | async fn hello() -> &'static str { +5 | | "Hello, World!" +6 | | } + | |_____^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> tests/ui/next/extra-endpoint-attributes.rs:7:2 + | +7 | } + | ^ consider adding a `main` function to `$DIR/tests/ui/next/extra-endpoint-attributes.rs` diff --git a/codegen/tests/ui/next/invalid-endpoint-param.rs b/codegen/tests/ui/next/invalid-endpoint-param.rs new file mode 100644 index 000000000..e77b39f99 --- /dev/null +++ b/codegen/tests/ui/next/invalid-endpoint-param.rs @@ -0,0 +1,6 @@ +shuttle_codegen::app! { + #[shuttle_codegen::endpoint(method = get, route = "/goodbye", invalid = bad)] + async fn goodbye() -> &'static str { + "Goodbye, World!" + } +} diff --git a/codegen/tests/ui/next/invalid-endpoint-param.stderr b/codegen/tests/ui/next/invalid-endpoint-param.stderr new file mode 100644 index 000000000..f52aa0858 --- /dev/null +++ b/codegen/tests/ui/next/invalid-endpoint-param.stderr @@ -0,0 +1,14 @@ +error: invalid endpoint argument + + = help: Only `method` and `route` are valid endpoint arguments. + + --> tests/ui/next/invalid-endpoint-param.rs:2:67 + | +2 | #[shuttle_codegen::endpoint(method = get, route = "/goodbye", invalid = bad)] + | ^^^^^^^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> tests/ui/next/invalid-endpoint-param.rs:6:2 + | +6 | } + | ^ consider adding a `main` function to `$DIR/tests/ui/next/invalid-endpoint-param.rs` diff --git a/codegen/tests/ui/next/invalid-endpoint-syntax.rs b/codegen/tests/ui/next/invalid-endpoint-syntax.rs new file mode 100644 index 000000000..9bf7a2d8c --- /dev/null +++ b/codegen/tests/ui/next/invalid-endpoint-syntax.rs @@ -0,0 +1,11 @@ +shuttle_codegen::app! { + #[shuttle_codegen::endpoint(method = get, route = "/hello" extra = abundant)] + async fn hello() -> &'static str { + "Hello, World!" + } + + #[shuttle_codegen::endpoint(method = get, route = "/goodbye", invalid)] + async fn goodbye() -> &'static str { + "Goodbye, World!" + } +} diff --git a/codegen/tests/ui/next/invalid-endpoint-syntax.stderr b/codegen/tests/ui/next/invalid-endpoint-syntax.stderr new file mode 100644 index 000000000..478bd56aa --- /dev/null +++ b/codegen/tests/ui/next/invalid-endpoint-syntax.stderr @@ -0,0 +1,23 @@ +error: expected `,` + + = help: + + --> tests/ui/next/invalid-endpoint-syntax.rs:2:64 + | +2 | #[shuttle_codegen::endpoint(method = get, route = "/hello" extra = abundant)] + | ^^^^^ + +error: expected `=` + + = help: + + --> tests/ui/next/invalid-endpoint-syntax.rs:7:74 + | +7 | #[shuttle_codegen::endpoint(method = get, route = "/goodbye", invalid)] + | ^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> tests/ui/next/invalid-endpoint-syntax.rs:11:2 + | +11 | } + | ^ consider adding a `main` function to `$DIR/tests/ui/next/invalid-endpoint-syntax.rs` diff --git a/codegen/tests/ui/next/missing-endpoint-param.rs b/codegen/tests/ui/next/missing-endpoint-param.rs new file mode 100644 index 000000000..a4fa91bf4 --- /dev/null +++ b/codegen/tests/ui/next/missing-endpoint-param.rs @@ -0,0 +1,16 @@ +shuttle_codegen::app! { + #[shuttle_codegen::endpoint(method = get)] + async fn only_method_param() -> &'static str { + "Hello, World!" + } + + #[shuttle_codegen::endpoint(route = "/goodbye")] + async fn only_route_param() -> &'static str { + "Goodbye, World!" + } + + #[shuttle_codegen::endpoint()] + async fn no_params() -> &'static str { + "Goodbye, World!" + } +} diff --git a/codegen/tests/ui/next/missing-endpoint-param.stderr b/codegen/tests/ui/next/missing-endpoint-param.stderr new file mode 100644 index 000000000..99150e32f --- /dev/null +++ b/codegen/tests/ui/next/missing-endpoint-param.stderr @@ -0,0 +1,32 @@ +error: no route provided + + = help: Add a route to your endpoint: `route = "/hello")` + + --> tests/ui/next/missing-endpoint-param.rs:2:32 + | +2 | #[shuttle_codegen::endpoint(method = get)] + | ^^^^^^^^^^^^^^ + +error: no method provided + + = help: Add a method to your endpoint: `method = get` + + --> tests/ui/next/missing-endpoint-param.rs:7:32 + | +7 | #[shuttle_codegen::endpoint(route = "/goodbye")] + | ^^^^^^^^^^^^^^^^^^^^ + +error: missing endpoint arguments + + = help: The endpoint takes two arguments: `endpoint(method = get, route = "/hello")` + + --> tests/ui/next/missing-endpoint-param.rs:12:32 + | +12 | #[shuttle_codegen::endpoint()] + | ^^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> tests/ui/next/missing-endpoint-param.rs:16:2 + | +16 | } + | ^ consider adding a `main` function to `$DIR/tests/ui/next/missing-endpoint-param.rs` From b6e668bbf3c7d2b4e202bee07474dec0e6520293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Wed, 21 Dec 2022 11:57:12 +0100 Subject: [PATCH 15/74] feat: merge main into shuttle-next (#543) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(blog): add missing sqlx migration code to auth blog post (#408) * feat(blog): add missing sqlx migration code * fix: nit * misc: 0.7.0 (#407) * misc: drop patches * infra: pin postgres to version 14 * refactor: fix thruster example app name * infra: db_fqdn fix * tests: warp hello world * fix(cargo-shuttle): prevent crash when config owned by root (#409) * fix: use correct timeout start point (#410) * fix: use correct timeout start point * tweak health check frequency * fmt * feat(deployer): implement container memory limits (#411) * feat(deployer): implement container memory limits * test: fix warp integration test * bug: `transport error` when trying to connect to provisioner (#416) * bug: keep provisioner connections alive * refactor: reduce scope provisioner client is running * feat: gateway admin revive (#412) * feat: gateway admin command (revive) * fmt * clippy * refactor: revive deployers using GatewayService * tests: add ContextArgs * refactor: simplify passing around of fqdn * tests: update test archive * refactor: remove stray exec.rs file * refactor: unused is_error() Co-authored-by: chesedo * bug: timeout curl health check on deployer (#415) * Article/beta article (#420) * updated docs url * beta article w/ damiens corrections * Feat(www): shuttle beta signup (#421) * feat(www): add beta signup form * feat: add formspree endpoint * feat: remove socials footer from beta page * feat: add dummy text above sign up form * feat: placeholder gif * feat: align dummy text left * feat: remove gif, add text * feat: update beta page text * feat: update the rest of the site * bug: Fix thruster postgres example (#414) * feat: shell completions (#343) * bug: package Secrets.toml (#422) * bug: package Secrets.toml * refactor: clippy suggestion * bug: big archives being cut off at 32 768 bytes (#423) * refactor: set chunked header * refactor: don't send stream across threads Doing this is causing us to loose everything after 32 768 bytes. Don't know the reason why 🤷 * refactor: fix health check * refactor: remove unused use * chore: v0.7.1 (#424) * chore: v0.7.1 * chore: resources v0.7.1 * docs: v0.7.1 * tests: v0.7.1 * tests: fix warp test * tests: fix warp test * tests: fix secrets e2e test * ci: remove hard coded DD env * misc: unintended shell changes * refactor: cargo check suggestion * refactor: provide better context for errors (#430) * refactor: do our own health checks on deployer containers (#427) * refactor: do our own health checks on deployer containers We are doing this because the docker health checks eats up 25% of a single CPU core and we are spinning up many of these containers. https://www.reddit.com/r/docker/comments/b68r53/healtchecks_add_high_cpu_load/ https://github.com/moby/moby/issues/39102 * refactor: clippy suggestion * bug: clear build folder before extracting (#428) * refactor: make sure extract directory is created * tests: test build folder is cleared * bug: clear the build directory * added some images (#435) * feat(www): beta blog updates (#434) * feat: add captioned image component (#440) * feat: add captioned image component * feat: update images * feat: add header caption * fix: quotes in header * www: post small tweaks (#439) * a few tweaks to the article * feat: update gif Co-authored-by: oddgrd <29732646+oddgrd@users.noreply.github.com> * feat: replace cursed gif (#441) * Feat/update contributing (#426) * feat(docs): update contributing.md * feat(e2e): make e2e admin user unique * feat(e2e): clean up e2e test projects on test complete * feat(e2e): don't fail on superuser conflict * feat: add section about contributing to docs * feat: remove unwrap, add comment to drop impl * tests: update e2e test key Co-authored-by: chesedo * chore: v0.7.2 (#442) * chore: v0.7.2 * chore: resources v0.7.2 * docs: v0.7.2 * misc: v0.7.2 * misc: script to deploy all examples * misc: targets for publishing crates * misc: remove old scripts * misc: instructions for next steps * misc: get Cargo.lock changes * misc: update .PHONY * misc: show usage * feat: link the tracing spans between services (#445) * ci: DD environments * refactor: try lowering broadcast channel for quicker feedback * refactor: propagate tracing across threads in deployer * refactor: propagate tracing between gateway and deployer * refactor: trace account name * refactor: associate project with each container * feat: trace and propagate proxy in gateway * feat: gateway record project * refactor: tracing use 'error' for errors * refactor: fix comment * refactor: drop recording unused field * Add docker-compose extra flags param in Makefile (#446) * Add docker-compose extra flags param * rename to avoid confusion * misc: restructure repo (#453) * misc: only run e2e on production * misc: move www to shuttle-hq/www repo * misc: move examples to shuttle-hq/examples repo * refactor: update links to examples repo * ci: remove checking fmt of examples * ci: checkout submodules * refactor: tf files have been moved to shuttle-hq/terraform-aws-shuttle * fix: wrap around common::ProjectName for parsing (#451) * fix: gateway state drifts, health checks and project recreation (#447) * misc: add more helpful flags to Makefile * misc: remove old migrator (#463) * feat: add account_tier column (#458) * feat: prefetch shuttle-service crates (#461) * feat: prefetch shuttle-service crates * refactor: add comment to prepare.sh files * Feat: revive via gateway endpoint (#460) * feat: revive via gateway api initial commit * feat: cleanup, document gateway testing * refactor: use post for revive endpoint Co-authored-by: Damien * feat: send task to global queue Co-authored-by: Damien * feat: create a new admin cli binary crate (#462) * feat: init shuttle-admin * feat: add args * feat: simple client * feat: read api_key * refactor: hook it all together * refactor: switch to post * fix: broken link (#467) * fix: add timeout to health checks (#468) * fix: add timeout to health checks * Parameterise the timeout * rollback on inadvertent circleci change * misc: log out a warning when a task has been running for a long time * longer timeouts * Address review * Fmt * feat(gateway): add custom domains table and routing (#465) * WIP feat: count recent start events before restart (#469) * feat: count recent start events before restart * feat: try_collect and handle error in start counter * fix: clippy * refactor: gateway clippy * feat: make deployer only answer its own project (#466) * feat: make deployer only answer its own project * bug: use correct project name * refactor: make backwards compatible * Fixed Links in Readme (#477) * refactor: base client error off response status code (#470) * refactor: base client error off response status code * Update common/src/models/error.rs Co-authored-by: Oddbjørn Grødem <29732646+oddgrd@users.noreply.github.com> * refactor: use tracing Co-authored-by: Oddbjørn Grødem <29732646+oddgrd@users.noreply.github.com> * feat: verify project exists before sending destroy task (#474) * feat: add a custom domains admin route (#473) Co-authored-by: Alex Krantz * bug: deployer freezes (#478) * bug: reduce spawning to have deployer lock up less * refactor: don't return cargo logs * ci: green (#482) * tests: allow longer time for build * refactor: trim dependencies on persist * refactor: clippy suggestion * feat: TLS acceptor with SNI resolver (#471) * fix: custom domain routing (#484) * refactor: more metrics (#475) * feat: add more metric dimensions to deployer * feat: add more metric dimensions to gateway * refactor: common metrics code * refactor: forward account name * refactor: add backend feature to deployer * refactor: standardize naming * refactor: cargo sort * misc: configurable deployment tags (#486) * feat: gateway restores removed containers (#485) * fix: backend bumps and hot fixes (#487) * Feature/support actix web (#491) * Support actix-web: impl Service * Support actix-web: cli + boilerplate code * Support actix-web: add framework to doc comment * Support actix-web: add e2e test * Support actix-web: fmt * Support actix-web: sorting toml deps * Support actix-web: add actix-web to ci * Support actix-web: formatted boilerplate code for actix-web hello world example * Support actix-web: formatted boilerplate code for actix-web hello world example Support actix-web: update cargo lock zstd dep * Support actix-web: simplify example * Support actix-web: add test, change example dependency * fix: e2e test assert, reset example module Co-authored-by: maksim Co-authored-by: oddgrd <29732646+oddgrd@users.noreply.github.com> * Doc: Fix command to prime database with docker-compose (#502) Signed-off-by: Federico Guerinoni Signed-off-by: Federico Guerinoni * Doc: Improve contributing documentation (#499) In the doc it mentions to go to subfolder of examples but it was not there :). Signed-off-by: Federico Guerinoni Signed-off-by: Federico Guerinoni * feat: static file support for a single folder (#501) * feat: static-folder resource * refactor: make local client work * refactor: make local deployer work * feat: storage_manager * refactor: comments * refactor: remove unwraps and expects * refactor: update tests * refactor: clippy suggestion * refactor: update version * refactor: update readme * refactor: update comment * refactor: change public to static * ci: add static-folder * refactor: code fixes * refactor: update tests * refactor: update description Co-authored-by: Damien Co-authored-by: Damien * ci: build binary (#483) * ci: build binary * ci: make tar archive * ci: make GH draft release with artifacts * ci: add aarch64 * ci: get version from tag * ci: rename to linux builds * ci: add windows * ci: add macos * ci: test all * ci: put all the artifacts under a command * ci: only on tagged * ci: restore old * ci: fix windows * ci: put archive in separate folder * ci: switch to tar * ci: restore old * refactor: better `cargo-binstall` support Co-authored-by: Isaiah Gamble <77396670+tsar-boomba@users.noreply.github.com> * refactor: binary name Co-authored-by: Isaiah Gamble <77396670+tsar-boomba@users.noreply.github.com> Co-authored-by: Isaiah Gamble <77396670+tsar-boomba@users.noreply.github.com> * feat: bump rust to 1.64, bump dependencies (#495) * feat: bump rust to 1.64, correct contributing.md bug * feat: bump service deps, change example branch * fix: pin chrono to 4.22 * chore: upgrade workspace dependencies * feat: remove aws-smithy-types ref: https://github.com/awslabs/smithy-rs/issues/1760 * feat: upgrade axum to 0.6 in common * feat: upgrade to axum 0.6.0 in deployer * feat: upgrade gateway to axum 0.6.0 * feat: upgrde sqlx to 0.6.2 in gateway * feat: bump chrono to 0.4.23 * feat: replace deprecated chrono functions in deployer * feat: bump chrono in common * feat: ignore actix integration test * feat: implement new state extractor in gateway * feat: interactive project initialization (#498) * feat: bump pinned rust version to 1.65 (#504) * feat: bump pinned rust version to 1.65 lockfile update is from binary dist PR #483 * ci: install newer protoc * fix: special module name warning * fix: clippy * feat: install newer protoc in dockerfile as well * misc: env updates (#509) * ci: update toolchain for binaries * misc: update dev environment * misc: remove patches from Cargo.lock * feat: make the folder configurable (#508) * feat: make the folder configurable * Update resources/static-folder/README.md Co-authored-by: Damien Co-authored-by: Damien * feat: implement workspace inheritance (#506) * refactor: switch away from cargo package (#507) * feat: add spinner wait for `project new` and `project status --follow` (#503) Signed-off-by: Federico Guerinoni Co-authored-by: oddgrd <29732646+oddgrd@users.noreply.github.com> * fix: capitalise correctly (#511) * fix: make nice (#512) * feat: find (soon to be) invalid project names (#479) * feat: find (soon to be) invalid project names * refactor: move logic to admin client * refactor: missed axum 0.6 update (#513) * feat: build tests in release profile, limit build workers (#514) * feat: build tests in release profile, limit build workers * fix: typo in manifests * feat: create `init` project from correct dir (#518) * misc: interactive init gif (#519) * Feat/set examples submodule to main (#520) * feat: revert examples submodule back to main * feat: un-ignore actix tests * chore: 0.8.0 (#521) * chore: bump examples (#522) * bug: hacking static folders (#524) * fix: actix integration with state (#523) * feat(gateway,deployer): add more tracing events (#500) * feat(deployer): add more tracing events * feat(gateway): add more tracing events * feat: canonicalize before trace (#531) * feat: 'clean' subcommand (#530) * feat: 'clean' subcommand * refactor: output cleaning is done * Feat/set cpu limit (#529) * feat: remove redundant actix worker limit * feat: remove redundant build job limit * feat: set cpu limit for deployer container * fix: limit actix worker and build jobs to 4 * feat: add panamax for mirroring crates.io (#525) * feat: build queue (#532) * feat: per-project parallelism (#533) * feat: temp validation of project name in gateway (#534) * fix(deployer): keep Cargo.lock between deployments (#517) * ci: remove build and push req on build binaries (#535) * refactor: don't crash when failing to release slot (#536) * refactor: release build slot parse type correctly (#538) * refactor: remove prefetch (#539) * feat: add cron job for syncing mirror (#537) * chore: bump cargo-shuttle to 0.8.1 (#540) * chore: bump cargo-shuttle to 0.8.1 * chore: cargo.lock * refactor: update manifests and lockfile implement workspace inheritance for runtime, and remove default-features from shuttle-service * refactor: fmt * fix: unused imports, add runtime to deploymentmanager * feat: move storagemanager to common * fix: storage manager imports * fix: codegen test with outdated expected error * fix: service tests after removing service default features * fix: deployer tests after removing service default features * fix: typo * ci: attempt to fix protoc error * fix: deployer runtime client connection * refactor: remove redundant feature flags * refactor: remove storage_manager from deployer crate Signed-off-by: Federico Guerinoni Co-authored-by: Pieter Co-authored-by: Alexander Krantz Co-authored-by: Damien Co-authored-by: Ivan Co-authored-by: Peter Mertz Co-authored-by: XyLyXyRR <39663597+XyLyXyRR@users.noreply.github.com> Co-authored-by: Damien Co-authored-by: Nereuxofficial <37740907+Nereuxofficial@users.noreply.github.com> Co-authored-by: Maxim <59533214+biryukovmaxim@users.noreply.github.com> Co-authored-by: maksim Co-authored-by: Federico Guerinoni <41150432+guerinoni@users.noreply.github.com> Co-authored-by: Isaiah Gamble <77396670+tsar-boomba@users.noreply.github.com> Co-authored-by: Stijn ("stain") Seghers --- .circleci/config.yml | 192 +- .github/workflows/www.yml | 33 - .gitignore | 7 + .gitmodules | 3 + CONTRIBUTING.md | 87 +- Cargo.lock | 2215 ++++--- Cargo.toml | 29 +- Containerfile | 22 +- Makefile | 154 +- README.md | 8 +- admin/Cargo.toml | 20 + admin/README.md | 34 + admin/src/args.rs | 71 + admin/src/client.rs | 114 + admin/src/config.rs | 18 + admin/src/lib.rs | 3 + admin/src/main.rs | 161 + assets/v0.8.0-interactive-init.gif | Bin 0 -> 2284963 bytes cargo-shuttle/Cargo.toml | 72 +- cargo-shuttle/README.md | 2 +- cargo-shuttle/src/args.rs | 134 +- cargo-shuttle/src/client.rs | 58 +- cargo-shuttle/src/config.rs | 16 +- cargo-shuttle/src/factory.rs | 17 +- cargo-shuttle/src/init.rs | 222 +- cargo-shuttle/src/lib.rs | 542 +- cargo-shuttle/src/main.rs | 2 +- cargo-shuttle/tests/integration/init.rs | 220 +- cargo-shuttle/tests/integration/main.rs | 1 + cargo-shuttle/tests/integration/run.rs | 18 +- codegen/Cargo.toml | 14 +- codegen/src/lib.rs | 4 +- codegen/src/next/mod.rs | 5 +- codegen/src/{main => shuttle_main}/mod.rs | 47 +- .../ui/next/invalid-endpoint-syntax.stderr | 6 - common/Cargo.toml | 31 +- common/src/backends/metrics.rs | 35 + common/src/backends/mod.rs | 1 + common/src/lib.rs | 3 + common/src/models/error.rs | 64 +- common/src/models/mod.rs | 43 + common/src/models/project.rs | 6 + common/src/models/stats.rs | 13 + common/src/storage_manager.rs | 69 + deployer/Cargo.toml | 71 +- deployer/prepare.sh | 28 + deployer/src/args.rs | 11 +- deployer/src/deployment/deploy_layer.rs | 98 +- deployer/src/deployment/gateway_client.rs | 108 + deployer/src/deployment/mod.rs | 198 +- deployer/src/deployment/queue.rs | 310 +- deployer/src/deployment/run.rs | 136 +- deployer/src/error.rs | 6 +- deployer/src/handlers/error.rs | 4 + deployer/src/handlers/mod.rs | 127 +- deployer/src/handlers/project.rs | 56 + deployer/src/lib.rs | 29 +- deployer/src/main.rs | 11 +- deployer/src/persistence/log.rs | 12 +- deployer/src/persistence/mod.rs | 43 +- deployer/src/proxy.rs | 50 +- .../tests/deploy_layer/bind-panic/Cargo.toml | 2 +- .../tests/deploy_layer/main-panic/Cargo.toml | 2 +- .../tests/deploy_layer/self-stop/Cargo.toml | 2 +- .../tests/deploy_layer/sleep-async/Cargo.toml | 2 +- .../tests/resources/bind-panic/Cargo.toml | 2 +- .../tests/resources/main-panic/Cargo.toml | 2 +- .../tests/resources/sleep-async/Cargo.toml | 2 +- .../tests/resources/tests-fail/Cargo.toml | 4 +- .../tests/resources/tests-pass/Cargo.toml | 4 +- docker-compose.yml | 40 +- e2e/README.md | 10 +- e2e/tests/integration/actix_web.rs | 23 + e2e/tests/integration/axum.rs | 5 +- e2e/tests/integration/helpers/mod.rs | 87 +- e2e/tests/integration/main.rs | 1 + e2e/tests/integration/poem.rs | 13 +- e2e/tests/integration/rocket.rs | 24 +- e2e/tests/integration/salvo.rs | 5 +- e2e/tests/integration/thruster.rs | 8 +- e2e/tests/integration/tide.rs | 5 +- e2e/tests/integration/tower.rs | 8 +- e2e/tests/integration/warp.rs | 9 +- examples | 1 + examples/README.md | 25 - examples/axum/hello-world/Cargo.toml | 11 - examples/axum/hello-world/Shuttle.toml | 1 - examples/axum/hello-world/src/lib.rs | 14 - examples/axum/websocket/Cargo.toml | 18 - examples/axum/websocket/Shuttle.toml | 1 - examples/axum/websocket/index.html | 75 - examples/axum/websocket/src/lib.rs | 132 - examples/poem/hello-world/Cargo.toml | 10 - examples/poem/hello-world/Shuttle.toml | 1 - examples/poem/hello-world/src/lib.rs | 13 - examples/poem/mongodb/Cargo.toml | 12 - examples/poem/mongodb/Shuttle.toml | 1 - examples/poem/mongodb/src/lib.rs | 73 - examples/poem/postgres/Cargo.toml | 13 - examples/poem/postgres/Shuttle.toml | 1 - examples/poem/postgres/schema.sql | 6 - examples/poem/postgres/src/lib.rs | 60 - examples/rocket/authentication/Cargo.toml | 14 - examples/rocket/authentication/README.md | 60 - examples/rocket/authentication/Shuttle.toml | 1 - examples/rocket/authentication/src/claims.rs | 135 - examples/rocket/authentication/src/lib.rs | 77 - examples/rocket/hello-world/Cargo.toml | 10 - examples/rocket/hello-world/Shuttle.toml | 1 - examples/rocket/hello-world/src/lib.rs | 14 - examples/rocket/persist/Cargo.toml | 12 - examples/rocket/persist/README.md | 36 - examples/rocket/persist/Shuttle.toml | 1 - examples/rocket/persist/src/lib.rs | 63 - examples/rocket/postgres/Cargo.toml | 13 - examples/rocket/postgres/Shuttle.toml | 1 - examples/rocket/postgres/schema.sql | 6 - examples/rocket/postgres/src/lib.rs | 63 - examples/rocket/secrets/Cargo.toml | 12 - examples/rocket/secrets/Secrets.toml | 1 - examples/rocket/secrets/Shuttle.toml | 1 - examples/rocket/secrets/src/lib.rs | 33 - examples/rocket/url-shortener/Cargo.toml | 15 - examples/rocket/url-shortener/README.md | 61 - examples/rocket/url-shortener/Shuttle.toml | 1 - .../migrations/20220324143837_urls.sql | 4 - examples/rocket/url-shortener/src/lib.rs | 83 - examples/salvo/hello-world/Cargo.toml | 10 - examples/salvo/hello-world/Shuttle.toml | 1 - examples/salvo/hello-world/src/lib.rs | 13 - examples/serenity/hello-world/Cargo.toml | 13 - examples/serenity/hello-world/README.md | 16 - examples/serenity/hello-world/Secrets.toml | 1 - examples/serenity/hello-world/Shuttle.toml | 1 - examples/serenity/hello-world/src/lib.rs | 46 - examples/serenity/postgres/Cargo.toml | 16 - examples/serenity/postgres/README.md | 23 - examples/serenity/postgres/Secrets.toml | 2 - examples/serenity/postgres/Shuttle.toml | 1 - examples/serenity/postgres/schema.sql | 7 - examples/serenity/postgres/src/db.rs | 54 - examples/serenity/postgres/src/lib.rs | 155 - examples/thruster/hello-world/Cargo.toml | 10 - examples/thruster/hello-world/Shuttle.toml | 1 - examples/thruster/hello-world/src/lib.rs | 17 - examples/thruster/postgres/Cargo.toml | 17 - examples/thruster/postgres/Shuttle.toml | 1 - examples/thruster/postgres/schema.sql | 6 - examples/thruster/postgres/src/lib.rs | 111 - examples/tide/hello-world/Cargo.toml | 10 - examples/tide/hello-world/Shuttle.toml | 1 - examples/tide/hello-world/src/lib.rs | 9 - examples/tide/postgres/Cargo.toml | 15 - examples/tide/postgres/Shuttle.toml | 1 - examples/tide/postgres/schema.sql | 6 - examples/tide/postgres/src/lib.rs | 56 - examples/tower/hello-world/Cargo.toml | 11 - examples/tower/hello-world/Shuttle.toml | 1 - examples/tower/hello-world/src/lib.rs | 34 - examples/warp/hello-world/Cargo.toml | 10 - examples/warp/hello-world/Shuttle.toml | 1 - examples/warp/hello-world/src/lib.rs | 8 - extras/panamax/Containerfile | 7 + extras/panamax/mirror.toml | 128 + gateway/Cargo.toml | 72 +- gateway/README.md | 8 + .../0001_add_top_level_account_perms.sql | 1 + gateway/migrations/0002_custom_domains.sql | 6 + gateway/prepare.sh | 8 + gateway/src/acme.rs | 402 ++ gateway/src/api/latest.rs | 484 +- gateway/src/api/mod.rs | 1 - gateway/src/args.rs | 58 +- gateway/src/auth.rs | 183 +- gateway/src/lib.rs | 289 +- gateway/src/main.rs | 243 +- gateway/src/project.rs | 614 +- gateway/src/proxy.rs | 378 +- gateway/src/service.rs | 521 +- gateway/src/task.rs | 556 ++ gateway/src/tls.rs | 165 + gateway/src/worker.rs | 248 +- gateway/tests/hello_world.crate | Bin 933 -> 934 bytes migrator/.gitignore | 3 - migrator/Cargo.toml | 11 - migrator/db_script.sh | 10 - migrator/script.sh | 8 - migrator/src/main.rs | 185 - proto/Cargo.toml | 15 +- provisioner/Cargo.toml | 39 +- provisioner/prepare.sh | 8 + provisioner/src/lib.rs | 9 +- provisioner/src/main.rs | 3 +- resources/aws-rds/Cargo.toml | 6 +- resources/aws-rds/README.md | 2 +- resources/persist/Cargo.toml | 6 +- resources/persist/README.md | 2 +- resources/secrets/Cargo.toml | 4 +- resources/secrets/README.md | 2 +- resources/shared-db/Cargo.toml | 6 +- resources/shared-db/README.md | 2 +- resources/static-folder/Cargo.toml | 17 + resources/static-folder/README.md | 29 + resources/static-folder/src/lib.rs | 229 + runtime/Cargo.toml | 28 +- runtime/src/legacy/mod.rs | 35 +- runtime/src/provisioner_factory.rs | 44 +- scripts/publish.sh | 44 - scripts/release.sh | 79 - service/Cargo.toml | 68 +- service/src/lib.rs | 56 +- service/src/loader.rs | 106 +- service/tests/integration/loader.rs | 8 + service/tests/resources/bind-panic/Cargo.toml | 2 +- .../tests/resources/build-panic/Cargo.toml | 2 +- service/tests/resources/is-cdylib/Cargo.toml | 2 +- service/tests/resources/not-cdylib/Cargo.toml | 2 +- .../tests/resources/not-shuttle/Cargo.toml | 2 +- .../tests/resources/sleep-async/Cargo.toml | 4 +- service/tests/resources/sleep/Cargo.toml | 2 +- service/tests/resources/sqlx-pool/Cargo.toml | 4 +- shell.nix | 8 +- terraform/.gitignore | 1 - terraform/backend.tf | 40 - terraform/containers.tf | 15 - terraform/modules/shuttle/README.md | 67 - terraform/modules/shuttle/api.tf | 68 - terraform/modules/shuttle/certs.tf | 150 - terraform/modules/shuttle/load-balancing.tf | 197 - terraform/modules/shuttle/locals.tf | 8 - terraform/modules/shuttle/main.tf | 16 - .../modules/shuttle/misc/cloud-config.yaml | 85 - terraform/modules/shuttle/networking.tf | 72 - terraform/modules/shuttle/output.tf | 29 - terraform/modules/shuttle/rds.tf | 5 - terraform/modules/shuttle/service.tf | 170 - terraform/modules/shuttle/service_x86.tf | 98 - terraform/modules/shuttle/storage.tf | 59 - .../systemd/system/opt-shuttle.mount.tftpl | 10 - .../system/shuttle-backend.service.tftpl | 34 - .../system/shuttle-mongodb.service.tftpl | 22 - .../systemd/system/shuttle-pg.service.tftpl | 23 - .../system/shuttle-provisioner.service.tftpl | 28 - terraform/modules/shuttle/variables.tf | 59 - terraform/variables.tf | 14 - www/.editorconfig | 9 - www/.env.local.example | 7 - www/.gitignore | 8 - www/.prettierrc.yaml | 0 www/README.md | 44 - ...021-10-08-building-a-startup-with-rust.mdx | 154 - www/_blog/2022-03-13-url-shortener.mdx | 271 - www/_blog/2022-04-22-dev-log-0.mdx | 78 - www/_blog/2022-04-27-dev-log-1.mdx | 162 - www/_blog/2022-05-09-ifc.mdx | 60 - www/_blog/2022-06-01-hyper-vs-rocket.mdx | 251 - www/_blog/2022-06-09-the-builder-pattern.mdx | 495 -- ...-16-a-short-introduction-to-async-rust.mdx | 169 - .../2022-06-23-generative-metatag-images.mdx | 297 - www/_blog/2022-06-30-error-handling.mdx | 523 -- .../2022-07-28-patterns-with-rust-types.mdx | 332 -- www/_blog/2022-08-04-middleware.mdx | 422 -- .../2022-08-11-authentication-tutorial.mdx | 701 --- .../2022-09-14-serentity-discord-bot.mdx | 488 -- www/app-env.d.ts | 0 www/components/AnnouncementBar/index.tsx | 41 - .../AnnouncementBar/styles.module.css | 46 - www/components/ApiKeyModal.tsx | 139 - www/components/Code.tsx | 56 - www/components/CodeBlock.tsx | 58 - www/components/CodeSnippets.tsx | 210 - www/components/Copy.tsx | 54 - www/components/Examples.tsx | 82 - www/components/ExternalLink.tsx | 16 - www/components/Features.tsx | 73 - www/components/Footer.tsx | 232 - www/components/Header.tsx | 91 - www/components/HeightMagic.tsx | 24 - www/components/Hero.tsx | 77 - www/components/InternalLink.tsx | 62 - www/components/LoginButton.tsx | 51 - www/components/NoSsr.tsx | 11 - www/components/ThemeSwitch.tsx | 43 - www/components/blog/BlogListItem.tsx | 70 - www/lib/authors.ts | 57 - www/lib/constants.ts | 18 - www/lib/gtag.ts | 36 - www/lib/helpers.ts | 11 - www/lib/make-rss.ts | 36 - www/lib/posts.ts | 161 - www/lib/shuttle.ts | 75 - www/next-env.d.ts | 5 - www/next-sitemap.js | 4 - www/next.config.js | 17 - www/package.json | 58 - www/pages/404.tsx | 16 - www/pages/_app.tsx | 119 - www/pages/_document.tsx | 31 - www/pages/api/auth/[...auth0].ts | 40 - www/pages/blog.tsx | 214 - .../blog/[year]/[month]/[day]/[slug].tsx | 416 -- www/pages/blog/tags/[tag].tsx | 68 - www/pages/index.tsx | 16 - www/pages/login.tsx | 17 - www/pages/pricing.tsx | 280 - www/postcss.config.js | 6 - www/public/favicon.ico | Bin 15406 -> 0 bytes www/public/images/blog/0959.png | Bin 19650 -> 0 bytes .../images/blog/authentication-banner.png | Bin 55744 -> 0 bytes .../blog/authentication-demo-screenshot.png | Bin 11530 -> 0 bytes www/public/images/blog/crab-builder.png | Bin 79045 -> 0 bytes .../application-registration.png | Bin 226072 -> 0 bytes .../application_id.png | Bin 226135 -> 0 bytes .../bot-is-offline.png | Bin 34080 -> 0 bytes .../discord-bot-screenshots/bot-is-online.png | Bin 13787 -> 0 bytes .../blog/discord-bot-screenshots/bot-name.png | Bin 104132 -> 0 bytes .../command-description.png | Bin 22753 -> 0 bytes .../command-result.png | Bin 25035 -> 0 bytes .../blog/discord-bot-screenshots/guild-id.png | Bin 38025 -> 0 bytes .../discord-bot-screenshots/weather-error.png | Bin 23508 -> 0 bytes .../weather-forecast.png | Bin 51256 -> 0 bytes .../discord-bot-screenshots/weather-input.png | Bin 26093 -> 0 bytes .../images/blog/discord-bot-thumbnail.png | Bin 54808 -> 0 bytes .../images/blog/ferris-error-handling.png | Bin 96005 -> 0 bytes www/public/images/blog/ferris.png | Bin 55143 -> 0 bytes .../images/blog/generative-meta-images.png | Bin 130574 -> 0 bytes www/public/images/blog/hyper-vs-rocket.png | Bin 77478 -> 0 bytes .../blog/infrastructure-from-code-trans.png | Bin 208044 -> 0 bytes .../images/blog/infrastructure-from-code.png | Bin 1429040 -> 0 bytes .../blog/introduction-to-async-snippet.png | Bin 652613 -> 0 bytes www/public/images/blog/metatag-discord.png | Bin 129936 -> 0 bytes www/public/images/blog/metatag-ferris.png | Bin 20094 -> 0 bytes www/public/images/blog/metatag-shapes.png | Bin 9540 -> 0 bytes www/public/images/blog/metatag-test-text.png | Bin 7104 -> 0 bytes www/public/images/blog/middleware-banner.png | Bin 58724 -> 0 bytes www/public/images/blog/rocket-logs.png | Bin 93309 -> 0 bytes .../images/blog/rust-programming-language.jpg | Bin 63155 -> 0 bytes .../images/blog/rust-trait-rules-diagram.png | Bin 70564 -> 0 bytes .../images/blog/rust-type-patterns-banner.png | Bin 261938 -> 0 bytes www/public/images/blog/rust.jpeg | Bin 122058 -> 0 bytes .../images/blog/shuttle-logo-rectangle.png | Bin 182336 -> 0 bytes .../blog/shuttle-logo-square-rocket.png | Bin 308352 -> 0 bytes .../images/blog/shuttle-logo-square.png | Bin 183588 -> 0 bytes www/public/images/blog/state-machine.jpeg | Bin 41086 -> 0 bytes www/public/images/icon1.svg | 31 - www/public/images/icon2.svg | 29 - www/public/images/icon3.svg | 16 - www/public/images/icon4.svg | 19 - www/public/images/logo.png | Bin 20689 -> 0 bytes www/public/robots.txt | 9 - www/styles/index.css | 10 - www/tailwind.config.js | 131 - www/tsconfig.json | 20 - www/vercel.json | 1 - www/yarn.lock | 5120 ----------------- 355 files changed, 8643 insertions(+), 19330 deletions(-) delete mode 100644 .github/workflows/www.yml create mode 100644 .gitmodules create mode 100644 admin/Cargo.toml create mode 100644 admin/README.md create mode 100644 admin/src/args.rs create mode 100644 admin/src/client.rs create mode 100644 admin/src/config.rs create mode 100644 admin/src/lib.rs create mode 100644 admin/src/main.rs create mode 100644 assets/v0.8.0-interactive-init.gif rename codegen/src/{main => shuttle_main}/mod.rs (91%) create mode 100644 common/src/backends/metrics.rs create mode 100644 common/src/backends/mod.rs create mode 100644 common/src/models/stats.rs create mode 100644 common/src/storage_manager.rs create mode 100755 deployer/prepare.sh create mode 100644 deployer/src/deployment/gateway_client.rs create mode 100644 deployer/src/handlers/project.rs create mode 100644 e2e/tests/integration/actix_web.rs create mode 160000 examples delete mode 100644 examples/README.md delete mode 100644 examples/axum/hello-world/Cargo.toml delete mode 100644 examples/axum/hello-world/Shuttle.toml delete mode 100644 examples/axum/hello-world/src/lib.rs delete mode 100644 examples/axum/websocket/Cargo.toml delete mode 100644 examples/axum/websocket/Shuttle.toml delete mode 100644 examples/axum/websocket/index.html delete mode 100644 examples/axum/websocket/src/lib.rs delete mode 100644 examples/poem/hello-world/Cargo.toml delete mode 100644 examples/poem/hello-world/Shuttle.toml delete mode 100644 examples/poem/hello-world/src/lib.rs delete mode 100644 examples/poem/mongodb/Cargo.toml delete mode 100644 examples/poem/mongodb/Shuttle.toml delete mode 100644 examples/poem/mongodb/src/lib.rs delete mode 100644 examples/poem/postgres/Cargo.toml delete mode 100644 examples/poem/postgres/Shuttle.toml delete mode 100644 examples/poem/postgres/schema.sql delete mode 100644 examples/poem/postgres/src/lib.rs delete mode 100644 examples/rocket/authentication/Cargo.toml delete mode 100644 examples/rocket/authentication/README.md delete mode 100644 examples/rocket/authentication/Shuttle.toml delete mode 100644 examples/rocket/authentication/src/claims.rs delete mode 100644 examples/rocket/authentication/src/lib.rs delete mode 100644 examples/rocket/hello-world/Cargo.toml delete mode 100644 examples/rocket/hello-world/Shuttle.toml delete mode 100644 examples/rocket/hello-world/src/lib.rs delete mode 100644 examples/rocket/persist/Cargo.toml delete mode 100644 examples/rocket/persist/README.md delete mode 100644 examples/rocket/persist/Shuttle.toml delete mode 100644 examples/rocket/persist/src/lib.rs delete mode 100644 examples/rocket/postgres/Cargo.toml delete mode 100644 examples/rocket/postgres/Shuttle.toml delete mode 100644 examples/rocket/postgres/schema.sql delete mode 100644 examples/rocket/postgres/src/lib.rs delete mode 100644 examples/rocket/secrets/Cargo.toml delete mode 100644 examples/rocket/secrets/Secrets.toml delete mode 100644 examples/rocket/secrets/Shuttle.toml delete mode 100644 examples/rocket/secrets/src/lib.rs delete mode 100644 examples/rocket/url-shortener/Cargo.toml delete mode 100644 examples/rocket/url-shortener/README.md delete mode 100644 examples/rocket/url-shortener/Shuttle.toml delete mode 100644 examples/rocket/url-shortener/migrations/20220324143837_urls.sql delete mode 100644 examples/rocket/url-shortener/src/lib.rs delete mode 100644 examples/salvo/hello-world/Cargo.toml delete mode 100644 examples/salvo/hello-world/Shuttle.toml delete mode 100644 examples/salvo/hello-world/src/lib.rs delete mode 100644 examples/serenity/hello-world/Cargo.toml delete mode 100644 examples/serenity/hello-world/README.md delete mode 100644 examples/serenity/hello-world/Secrets.toml delete mode 100644 examples/serenity/hello-world/Shuttle.toml delete mode 100644 examples/serenity/hello-world/src/lib.rs delete mode 100644 examples/serenity/postgres/Cargo.toml delete mode 100644 examples/serenity/postgres/README.md delete mode 100644 examples/serenity/postgres/Secrets.toml delete mode 100644 examples/serenity/postgres/Shuttle.toml delete mode 100644 examples/serenity/postgres/schema.sql delete mode 100644 examples/serenity/postgres/src/db.rs delete mode 100644 examples/serenity/postgres/src/lib.rs delete mode 100644 examples/thruster/hello-world/Cargo.toml delete mode 100644 examples/thruster/hello-world/Shuttle.toml delete mode 100644 examples/thruster/hello-world/src/lib.rs delete mode 100644 examples/thruster/postgres/Cargo.toml delete mode 100644 examples/thruster/postgres/Shuttle.toml delete mode 100644 examples/thruster/postgres/schema.sql delete mode 100644 examples/thruster/postgres/src/lib.rs delete mode 100644 examples/tide/hello-world/Cargo.toml delete mode 100644 examples/tide/hello-world/Shuttle.toml delete mode 100644 examples/tide/hello-world/src/lib.rs delete mode 100644 examples/tide/postgres/Cargo.toml delete mode 100644 examples/tide/postgres/Shuttle.toml delete mode 100644 examples/tide/postgres/schema.sql delete mode 100644 examples/tide/postgres/src/lib.rs delete mode 100644 examples/tower/hello-world/Cargo.toml delete mode 100644 examples/tower/hello-world/Shuttle.toml delete mode 100644 examples/tower/hello-world/src/lib.rs delete mode 100644 examples/warp/hello-world/Cargo.toml delete mode 100644 examples/warp/hello-world/Shuttle.toml delete mode 100644 examples/warp/hello-world/src/lib.rs create mode 100644 extras/panamax/Containerfile create mode 100644 extras/panamax/mirror.toml create mode 100644 gateway/README.md create mode 100644 gateway/migrations/0001_add_top_level_account_perms.sql create mode 100644 gateway/migrations/0002_custom_domains.sql create mode 100755 gateway/prepare.sh create mode 100644 gateway/src/acme.rs create mode 100644 gateway/src/task.rs create mode 100644 gateway/src/tls.rs delete mode 100644 migrator/.gitignore delete mode 100644 migrator/Cargo.toml delete mode 100755 migrator/db_script.sh delete mode 100755 migrator/script.sh delete mode 100644 migrator/src/main.rs create mode 100755 provisioner/prepare.sh create mode 100644 resources/static-folder/Cargo.toml create mode 100644 resources/static-folder/README.md create mode 100644 resources/static-folder/src/lib.rs delete mode 100755 scripts/publish.sh delete mode 100755 scripts/release.sh delete mode 100644 terraform/.gitignore delete mode 100644 terraform/backend.tf delete mode 100644 terraform/containers.tf delete mode 100644 terraform/modules/shuttle/README.md delete mode 100644 terraform/modules/shuttle/api.tf delete mode 100644 terraform/modules/shuttle/certs.tf delete mode 100644 terraform/modules/shuttle/load-balancing.tf delete mode 100644 terraform/modules/shuttle/locals.tf delete mode 100644 terraform/modules/shuttle/main.tf delete mode 100644 terraform/modules/shuttle/misc/cloud-config.yaml delete mode 100644 terraform/modules/shuttle/networking.tf delete mode 100644 terraform/modules/shuttle/output.tf delete mode 100644 terraform/modules/shuttle/rds.tf delete mode 100644 terraform/modules/shuttle/service.tf delete mode 100644 terraform/modules/shuttle/service_x86.tf delete mode 100644 terraform/modules/shuttle/storage.tf delete mode 100644 terraform/modules/shuttle/systemd/system/opt-shuttle.mount.tftpl delete mode 100644 terraform/modules/shuttle/systemd/system/shuttle-backend.service.tftpl delete mode 100644 terraform/modules/shuttle/systemd/system/shuttle-mongodb.service.tftpl delete mode 100644 terraform/modules/shuttle/systemd/system/shuttle-pg.service.tftpl delete mode 100644 terraform/modules/shuttle/systemd/system/shuttle-provisioner.service.tftpl delete mode 100644 terraform/modules/shuttle/variables.tf delete mode 100644 terraform/variables.tf delete mode 100644 www/.editorconfig delete mode 100644 www/.env.local.example delete mode 100644 www/.gitignore delete mode 100644 www/.prettierrc.yaml delete mode 100644 www/README.md delete mode 100644 www/_blog/2021-10-08-building-a-startup-with-rust.mdx delete mode 100644 www/_blog/2022-03-13-url-shortener.mdx delete mode 100644 www/_blog/2022-04-22-dev-log-0.mdx delete mode 100644 www/_blog/2022-04-27-dev-log-1.mdx delete mode 100644 www/_blog/2022-05-09-ifc.mdx delete mode 100644 www/_blog/2022-06-01-hyper-vs-rocket.mdx delete mode 100644 www/_blog/2022-06-09-the-builder-pattern.mdx delete mode 100644 www/_blog/2022-06-16-a-short-introduction-to-async-rust.mdx delete mode 100644 www/_blog/2022-06-23-generative-metatag-images.mdx delete mode 100644 www/_blog/2022-06-30-error-handling.mdx delete mode 100644 www/_blog/2022-07-28-patterns-with-rust-types.mdx delete mode 100644 www/_blog/2022-08-04-middleware.mdx delete mode 100644 www/_blog/2022-08-11-authentication-tutorial.mdx delete mode 100644 www/_blog/2022-09-14-serentity-discord-bot.mdx delete mode 100644 www/app-env.d.ts delete mode 100644 www/components/AnnouncementBar/index.tsx delete mode 100644 www/components/AnnouncementBar/styles.module.css delete mode 100644 www/components/ApiKeyModal.tsx delete mode 100644 www/components/Code.tsx delete mode 100644 www/components/CodeBlock.tsx delete mode 100644 www/components/CodeSnippets.tsx delete mode 100644 www/components/Copy.tsx delete mode 100644 www/components/Examples.tsx delete mode 100644 www/components/ExternalLink.tsx delete mode 100644 www/components/Features.tsx delete mode 100644 www/components/Footer.tsx delete mode 100644 www/components/Header.tsx delete mode 100644 www/components/HeightMagic.tsx delete mode 100644 www/components/Hero.tsx delete mode 100644 www/components/InternalLink.tsx delete mode 100644 www/components/LoginButton.tsx delete mode 100644 www/components/NoSsr.tsx delete mode 100644 www/components/ThemeSwitch.tsx delete mode 100644 www/components/blog/BlogListItem.tsx delete mode 100644 www/lib/authors.ts delete mode 100644 www/lib/constants.ts delete mode 100644 www/lib/gtag.ts delete mode 100644 www/lib/helpers.ts delete mode 100644 www/lib/make-rss.ts delete mode 100644 www/lib/posts.ts delete mode 100644 www/lib/shuttle.ts delete mode 100644 www/next-env.d.ts delete mode 100644 www/next-sitemap.js delete mode 100644 www/next.config.js delete mode 100644 www/package.json delete mode 100644 www/pages/404.tsx delete mode 100644 www/pages/_app.tsx delete mode 100644 www/pages/_document.tsx delete mode 100644 www/pages/api/auth/[...auth0].ts delete mode 100644 www/pages/blog.tsx delete mode 100644 www/pages/blog/[year]/[month]/[day]/[slug].tsx delete mode 100644 www/pages/blog/tags/[tag].tsx delete mode 100644 www/pages/index.tsx delete mode 100644 www/pages/login.tsx delete mode 100644 www/pages/pricing.tsx delete mode 100644 www/postcss.config.js delete mode 100644 www/public/favicon.ico delete mode 100644 www/public/images/blog/0959.png delete mode 100644 www/public/images/blog/authentication-banner.png delete mode 100644 www/public/images/blog/authentication-demo-screenshot.png delete mode 100644 www/public/images/blog/crab-builder.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/application-registration.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/application_id.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/bot-is-offline.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/bot-is-online.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/bot-name.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/command-description.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/command-result.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/guild-id.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/weather-error.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/weather-forecast.png delete mode 100644 www/public/images/blog/discord-bot-screenshots/weather-input.png delete mode 100644 www/public/images/blog/discord-bot-thumbnail.png delete mode 100644 www/public/images/blog/ferris-error-handling.png delete mode 100644 www/public/images/blog/ferris.png delete mode 100644 www/public/images/blog/generative-meta-images.png delete mode 100644 www/public/images/blog/hyper-vs-rocket.png delete mode 100644 www/public/images/blog/infrastructure-from-code-trans.png delete mode 100644 www/public/images/blog/infrastructure-from-code.png delete mode 100644 www/public/images/blog/introduction-to-async-snippet.png delete mode 100644 www/public/images/blog/metatag-discord.png delete mode 100644 www/public/images/blog/metatag-ferris.png delete mode 100644 www/public/images/blog/metatag-shapes.png delete mode 100644 www/public/images/blog/metatag-test-text.png delete mode 100644 www/public/images/blog/middleware-banner.png delete mode 100644 www/public/images/blog/rocket-logs.png delete mode 100644 www/public/images/blog/rust-programming-language.jpg delete mode 100644 www/public/images/blog/rust-trait-rules-diagram.png delete mode 100644 www/public/images/blog/rust-type-patterns-banner.png delete mode 100644 www/public/images/blog/rust.jpeg delete mode 100644 www/public/images/blog/shuttle-logo-rectangle.png delete mode 100644 www/public/images/blog/shuttle-logo-square-rocket.png delete mode 100644 www/public/images/blog/shuttle-logo-square.png delete mode 100644 www/public/images/blog/state-machine.jpeg delete mode 100644 www/public/images/icon1.svg delete mode 100644 www/public/images/icon2.svg delete mode 100644 www/public/images/icon3.svg delete mode 100644 www/public/images/icon4.svg delete mode 100644 www/public/images/logo.png delete mode 100644 www/public/robots.txt delete mode 100644 www/styles/index.css delete mode 100644 www/tailwind.config.js delete mode 100644 www/tsconfig.json delete mode 100644 www/vercel.json delete mode 100644 www/yarn.lock diff --git a/.circleci/config.yml b/.circleci/config.yml index 40c7baceb..01a31a151 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,11 +3,12 @@ version: 2.1 orbs: docker-buildx: sensu/docker-buildx@1.1.1 aws-ecr: circleci/aws-ecr@8.1.2 + win: circleci/windows@5.0 executors: docker-rust: docker: - - image: cimg/rust:1.63.0 + - image: cimg/rust:1.65.0 image-ubuntu: machine: image: ubuntu-2204:2022.04.1 @@ -89,6 +90,7 @@ commands: shuttle-persist = { path = "$PWD/resources/persist" } shuttle-shared-db = { path = "$PWD/resources/shared-db" } shuttle-secrets = { path = "$PWD/resources/secrets" } + shuttle-static-folder = { path = "$PWD/resources/static-folder" } EOF install-rust: steps: @@ -106,6 +108,29 @@ commands: sudo unzip -o protoc-21.9-linux-x86_64.zip -d /usr bin/protoc &&\ sudo unzip -o protoc-21.9-linux-x86_64.zip -d /usr/ 'include/*' &&\ rm -f protoc-21.9-linux-x86_64.zip + make-artifact: + parameters: + target: + description: "Rust target to put in artifact" + type: string + suffix: + description: "Suffix that is on the binary" + type: string + default: "" + steps: + - run: + name: Make artifact + command: | + mkdir shuttle + mv target/<< parameters.target >>/release/cargo-shuttle<< parameters.suffix >> shuttle/cargo-shuttle<< parameters.suffix >> + mv LICENSE shuttle/ + mv README.md shuttle/ + mkdir artifacts + tar -cvzf artifacts/cargo-shuttle-${CIRCLE_TAG}-<< parameters.target >>.tar.gz shuttle + - persist_to_workspace: + root: artifacts + paths: + - cargo-shuttle-${CIRCLE_TAG}-<< parameters.target >>.tar.gz jobs: workspace-fmt: @@ -116,7 +141,9 @@ jobs: - install-protoc - run: cargo fmt --all --check - run: cargo install cargo-sort - - run: cargo sort --check --workspace + # TODO: this is incompatible with workspace inheritance, uncomment when + # https://github.com/DevinR528/cargo-sort/pull/29 is merged + # - run: cargo sort --check --workspace - run: cargo check --workspace --all-targets - save-cargo-cache workspace-clippy: @@ -151,7 +178,9 @@ jobs: - apply-patches - run: cargo fmt --all --check --manifest-path << parameters.path >>/Cargo.toml - run: cargo install cargo-sort - - run: cargo sort --check << parameters.path >> + # TODO: this is incompatible with workspace inheritance, uncomment when + # https://github.com/DevinR528/cargo-sort/pull/29 is merged + # - run: cargo sort --check << parameters.path >> - run: | cargo clippy --tests \ --all-targets \ @@ -186,7 +215,10 @@ jobs: executor: image-ubuntu steps: - install-rust + - install-protoc - checkout + - run: git submodule sync + - run: git submodule update --init - restore-cargo-cache - apply-patches - run: @@ -205,6 +237,8 @@ jobs: steps: - install-rust - checkout + - run: git submodule sync + - run: git submodule update --init - restore-buildx-cache - run: name: Make images for tests @@ -244,6 +278,89 @@ jobs: command: | PUSH=true PLATFORMS=linux/amd64 make images - save-buildx-cache + build-binaries-linux: + machine: + image: << parameters.image >> + resource_class: << parameters.resource_class >> + parameters: + target: + description: "Linux target to build for" + type: string + image: + description: "Machine image to use" + type: string + resource_class: + description: "The resource type to use for the machine" + type: string + steps: + - checkout + - run: sudo apt update && sudo DEBIAN_FRONTEND=noninteractive apt install -y libssl-dev musl-tools clang + - run: + name: Install Rust + command: curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | bash -s -- -y --default-toolchain 1.65.0 --target << parameters.target >> + - run: + name: Build + command: | + # From https://github.com/briansmith/ring/issues/1414#issuecomment-1055177218 + export CC_aarch64_unknown_linux_musl=clang + # "vendored-openssl" is from https://github.com/cross-rs/cross/issues/229#issuecomment-597898074 + cargo build --release --package cargo-shuttle --features vendored-openssl --target << parameters.target >> + - make-artifact: + target: << parameters.target >> + build-binaries-windows: + executor: + name: win/server-2022 + size: medium + environment: + CARGO_NET_GIT_FETCH_WITH_CLI: "true" + steps: + - checkout + - run: choco install -y strawberryperl + - run: + name: Install Rust + command: | + wget -OutFile "C:\rustup-init.exe" https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe + C:\rustup-init.exe -y --default-toolchain 1.65.0 --target x86_64-pc-windows-msvc + - run: + name: Build + command: | + # From https://github.com/alexcrichton/openssl-src-rs/issues/45 + # Because of https://github.com/openssl/openssl/issues/9048 + $env:OPENSSL_SRC_PERL="C:\Strawberry\perl\bin\perl.exe" + # "vendored-openssl" is from https://github.com/cross-rs/cross/issues/229#issuecomment-597898074 + ..\.cargo\bin\cargo.exe build --release --package cargo-shuttle --features vendored-openssl --target x86_64-pc-windows-msvc + - make-artifact: + target: x86_64-pc-windows-msvc + suffix: ".exe" + build-binaries-mac: + macos: + xcode: 12.5.1 + resource_class: medium + steps: + - checkout + - run: + name: Install Rust + command: curl --proto '=https' https://sh.rustup.rs -sSf | bash -s -- -y --default-toolchain 1.65.0 --target x86_64-apple-darwin + - run: + name: Build + command: | + # "vendored-openssl" is from https://github.com/cross-rs/cross/issues/229#issuecomment-597898074 + cargo build --release --package cargo-shuttle --features vendored-openssl --target x86_64-apple-darwin + - make-artifact: + target: x86_64-apple-darwin + publish-github-release: + docker: + - image: cimg/go:1.19.3 + steps: + - attach_workspace: + at: artifacts + - run: + name: "Publish Release on GitHub" + environment: + GITHUB_TOKEN: $GITHUB_TOKEN + command: | + go install github.com/tcnksm/ghr@v0.16.0 + ghr -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete -draft ${CIRCLE_TAG} artifacts/ workflows: version: 2 @@ -256,33 +373,16 @@ workflows: - workspace-fmt matrix: parameters: - framework: ["web-axum", "web-rocket", "web-poem", "web-thruster", "web-tide", "web-tower","web-warp", "web-salvo", "bot-serenity"] + framework: ["web-actix-web", "web-axum", "web-rocket", "web-poem", "web-thruster", "web-tide", "web-tower","web-warp", "web-salvo", "bot-serenity"] - check-standalone: matrix: parameters: path: - - examples/axum/hello-world - - examples/axum/websocket - - examples/poem/hello-world - - examples/poem/mongodb - - examples/poem/postgres - - examples/rocket/authentication - - examples/rocket/hello-world - - examples/rocket/postgres - - examples/rocket/url-shortener - - examples/thruster/hello-world - - examples/thruster/postgres - - examples/salvo/hello-world - - examples/serenity/hello-world - - examples/serenity/postgres - - examples/tide/hello-world - - examples/tide/postgres - - examples/tower/hello-world - - resources/aws-rds - resources/persist - resources/secrets - resources/shared-db + - resources/static-folder - service-test: requires: - workspace-clippy @@ -297,9 +397,55 @@ workflows: - service-test - platform-test - check-standalone + filters: + branches: + only: production - build-and-push: requires: - e2e-test filters: branches: - only: main + only: production + - build-binaries-linux: + name: build-binaries-x86_64 + image: ubuntu-2204:2022.04.1 + target: x86_64-unknown-linux-musl + resource_class: medium + filters: + tags: + only: /^v.*/ + branches: + only: production + - build-binaries-linux: + name: build-binaries-aarch64 + image: ubuntu-2004:202101-01 + target: aarch64-unknown-linux-musl + resource_class: arm.medium + filters: + tags: + only: /^v.*/ + branches: + only: production + - build-binaries-windows: + filters: + tags: + only: /^v.*/ + branches: + only: production + - build-binaries-mac: + filters: + tags: + only: /^v.*/ + branches: + only: production + - publish-github-release: + requires: + - build-binaries-x86_64 + - build-binaries-aarch64 + - build-binaries-windows + - build-binaries-mac + filters: + tags: + only: /^v.*/ + branches: + only: production diff --git a/.github/workflows/www.yml b/.github/workflows/www.yml deleted file mode 100644 index e91145498..000000000 --- a/.github/workflows/www.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: website - -on: - push: - branches: - - main - paths: - - '.github/workflows/www.yml' - - 'www/**' - -jobs: - deploy-vercel: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: SpicyPizza/create-envfile@v1.3 - with: - directory: www - envkey_AUTH0_SECRET: ${{ secrets.AUTH0_SECRET }} - envkey_AUTH0_BASE_URL: https://www.shuttle.rs - envkey_AUTH0_ISSUER_BASE_URL: https://shuttle-prod.eu.auth0.com - envkey_AUTH0_CLIENT_ID: X77iwzR3Qm60kSIxxDEUVKOMFIQcDodp - envkey_AUTH0_CLIENT_SECRET: ${{ secrets.AUTH0_CLIENT_SECRET }} - envkey_SHUTTLE_API_BASE_URL: https://api.shuttle.rs - envkey_SHUTTLE_ADMIN_SECRET: ${{ secrets.SHUTTLE_ADMIN_SECRET }} - - uses: amondnet/vercel-action@v20 - with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} - vercel-args: --prod - vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} - vercel-project-id: ${{ secrets.VERCEL_WWW_PROJECT_ID }} - working-directory: ./www - scope: ${{ secrets.VERCEL_ORG_ID }} diff --git a/.gitignore b/.gitignore index 7a493cd6c..bb3141ba0 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,10 @@ e2e/users.toml .shuttle-* docker-compose.rendered.yml + +.env +node_modules/ +package.json +yarn.lock + +*.wasm diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..77e658142 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "examples"] + path = examples + url = git@github.com:shuttle-hq/examples.git diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 276d489e2..145a72150 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,29 +4,41 @@ Raising [issues](https://github.com/shuttle-hq/shuttle/issues) is encouraged. We have some templates to help you get started. +## Docs + +If you found an error in our docs, or you simply want to make them better, contributions to our [docs](https://github.com/shuttle-hq/shuttle-docs) +are always appreciated! + ## Running Locally You can use Docker and docker-compose to test shuttle locally during development. See the [Docker install](https://docs.docker.com/get-docker/) and [docker-compose install](https://docs.docker.com/compose/install/) instructions if you do not have them installed already. +```bash +git clone git@github.com:shuttle-hq/shuttle.git +cd shuttle +``` + You should now be ready to setup a local environment to test code changes to core `shuttle` packages as follows: Build the required images with: ```bash -$ make images +make images ``` +> Note: The current [Makefile](https://github.com/shuttle-hq/shuttle/blob/main/Makefile) does not work on Windows systems, if you want to build the local environment on Windows you could use [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install). + The images get built with [cargo-chef](https://github.com/LukeMathWalker/cargo-chef) and therefore support incremental builds (most of the time). So they will be much faster to re-build after an incremental change in your code - should you wish to deploy it locally straight away. You can now start a local deployment of shuttle and the required containers with: ```bash -$ make up +make up ``` -*Note*: Other useful commands can be found within the [Makefile](https://github.com/shuttle-hq/shuttle/blob/main/Makefile). +> Note: Other useful commands can be found within the [Makefile](https://github.com/shuttle-hq/shuttle/blob/main/Makefile). -The API is now accessible on `localhost:8000` (for app proxies) and `localhost:8001` (for the control plane). When running `cargo run --bin cargo-shuttle` (in a debug build), the CLI will point itself to `localhost` for its API calls. The deployment parameters can be tweaked by changing values in the [.env](./.env) file. +The API is now accessible on `localhost:8000` (for app proxies) and `localhost:8001` (for the control plane). When running `cargo run --bin cargo-shuttle` (in a debug build), the CLI will point itself to `localhost` for its API calls. In order to test local changes to the `shuttle-service` crate, you may want to add the below to a `.cargo/config.toml` file. (See [Overriding Dependencies](https://doc.rust-lang.org/cargo/reference/overriding-dependencies.html) for more) @@ -37,6 +49,13 @@ shuttle-aws-rds = { path = "[base]/shuttle/resources/aws-rds" } shuttle-persist = { path = "[base]/shuttle/resources/persist" } shuttle-shared-db = { path = "[base]/shuttle/resources/shared-db" } shuttle-secrets = { path = "[base]/shuttle/resources/secrets" } +shuttle-static-folder = { path = "[base]/shuttle/resources/static-folder" } +``` + +Prime gateway database with an admin user: + +```bash +docker compose --file docker-compose.rendered.yml --project-name shuttle-dev exec gateway /usr/local/bin/service --state=/var/lib/shuttle init --name admin --key test-key ``` Login to shuttle service in a new terminal window from the main shuttle directory: @@ -48,21 +67,42 @@ cargo run --bin cargo-shuttle -- login --api-key "test-key" cd into one of the examples: ```bash +git submodule init +git submodule update cd examples/rocket/hello-world/ ``` -Deploy the example: +Create a new project, this will start a deployer container: ```bash # the --manifest-path is used to locate the root of the shuttle workspace +cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- project new +``` + +Verify that the deployer is healthy and in the ready state: + +```bash +cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- project status +``` + +Deploy the example: + +```bash cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- deploy ``` Test if the deploy is working: ```bash -# (the Host header should match the Host from the deploy output) -curl --header "Host: {app}.localhost.local" localhost:8000/hello +# the Host header should match the Host from the deploy output +curl --header "Host: {app}.unstable.shuttleapp.rs" localhost:8000/hello +``` + +View logs from the current deployment: + +```bash +# append `--follow` to this command for a live feed of logs +cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- logs ``` ### Testing deployer only @@ -76,10 +116,10 @@ This prevents `gateway` from starting up. Now you can start deployer only using: ```bash provisioner_address=$(docker inspect --format '{{(index .NetworkSettings.Networks "shuttle_default").IPAddress}}' shuttle_prod_hello-world-rocket-app_run) -cargo run -p shuttle-deployer -- --provisioner-address $provisioner_address --provisioner-port 8000 --proxy-fqdn local.rs --admin-secret test-key +cargo run -p shuttle-deployer -- --provisioner-address $provisioner_address --provisioner-port 8000 --proxy-fqdn local.rs --admin-secret test-key --project ``` -The `--admin-secret` can safely be changed to your api-key to make testing easier. +The `--admin-secret` can safely be changed to your api-key to make testing easier. While `` needs to match the name of the project that will be deployed to this deployer. This is the `Cargo.toml` or `Shuttle.toml` name for the project. ### Using Podman instead of Docker If you are using Podman over Docker, then expose a rootless socket of Podman using the following command: @@ -96,7 +136,7 @@ export DOCKER_HOST=unix:///tmp/podman.sock shuttle can now be run locally using the steps shown earlier. -*NOTE*: Testing the `gateway` with a rootless Podman does not work since Podman does not allow access to the `deployer` containers via IP address! +> Note: Testing the `gateway` with a rootless Podman does not work since Podman does not allow access to the `deployer` containers via IP address! ## Running Tests @@ -104,15 +144,38 @@ shuttle has reasonable test coverage - and we are working on improving this every day. We encourage PRs to come with tests. If you're not sure about what a test should look like, feel free to [get in touch](https://discord.gg/H33rRDTm3p). -To run the test suite - just run `make test` at the root of the repository. +To run the unit tests for a spesific crate, from the root of the repository run: + +```bash +# replace with the name of the crate to test, e.g. `shuttle-common` +cargo test --package --all-features --lib -- --nocapture +``` + +To run the integration tests for a spesific crate (if it has any), from the root of the repository run: + +```bash +# replace with the name of the crate to test, e.g. `cargo-shuttle` +cargo test --package --all-features --test '*' -- --nocapture +``` + +To run the end-to-end tests, from the root of the repository run: + +```bash +make test +``` +> Note: Running all the end-to-end tests may take a long time, so it is recommended to run individual tests shipped as part of each crate in the workspace first. ## Committing We use the [Angular Commit Guidelines](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit). We expect all commits to conform to these guidelines. Furthermore, commits should be squashed before being merged to master. -Also, make sure your commits don't trigger any warnings from Clippy by running: `cargo clippy --tests --all-targets`. If you have a good reason to contradict Clippy, insert an #allow[] macro, so that it won't complain. +Before committing: +- Make sure your commits don't trigger any warnings from Clippy by running: `cargo clippy --tests --all-targets`. If you have a good reason to contradict Clippy, insert an `#[allow(clippy::)]` macro, so that it won't complain. +- Make sure your code is correctly formatted: `cargo fmt --all --check`. +- Make sure your `Cargo.toml`'s are sorted: `cargo sort --workspace`. This command uses the [cargo-sort crate](https://crates.io/crates/cargo-sort) to sort the `Cargo.toml` dependencies alphabetically. +- If you've made changes to examples, make sure the above commands are ran there as well. ## Project Layout The folders in this repository relate to each other as follow: diff --git a/Cargo.lock b/Cargo.lock index 014ded2a6..4ab269fbc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,13 +3,200 @@ version = 3 [[package]] -name = "Inflector" -version = "0.11.4" +name = "acme2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +checksum = "453e534d4f46dcdddd7aa8619e9a664e153f34383d14710db0b0d76c2964db89" dependencies = [ - "lazy_static", + "base64 0.13.1", + "hyper", + "openssl", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "actix-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +dependencies = [ + "bitflags", + "bytes 1.3.0", + "futures-core", + "futures-sink", + "log", + "memchr", + "pin-project-lite 0.2.9", + "tokio", + "tokio-util 0.7.3", +] + +[[package]] +name = "actix-http" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c83abf9903e1f0ad9973cc4f7b9767fd5a03a583f51a5b7a339e07987cd2724" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "ahash", + "base64 0.13.1", + "bitflags", + "brotli", + "bytes 1.3.0", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "futures-core", + "h2", + "http 0.2.8", + "httparse", + "httpdate", + "itoa 1.0.2", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite 0.2.9", + "rand 0.8.5", + "sha1 0.10.4", + "smallvec", + "tracing", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" +dependencies = [ + "quote 1.0.21", + "syn 1.0.104", +] + +[[package]] +name = "actix-router" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" +dependencies = [ + "bytestring", + "http 0.2.8", + "regex", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "num_cpus", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +dependencies = [ + "futures-core", + "paste", + "pin-project-lite 0.2.9", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite 0.2.9", +] + +[[package]] +name = "actix-web" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d48f7b6534e06c7bfc72ee91db7917d4af6afe23e7d223b51e68fffbb21e96b9" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "ahash", + "bytes 1.3.0", + "bytestring", + "cfg-if 1.0.0", + "cookie 0.16.0", + "derive_more", + "encoding_rs", + "futures-core", + "futures-util", + "http 0.2.8", + "itoa 1.0.2", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite 0.2.9", "regex", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time 0.3.11", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa9362663c8643d67b2d5eafba49e4cb2c8a053a29ed00a0bea121f17c76b13" +dependencies = [ + "actix-router", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.104", ] [[package]] @@ -167,19 +354,16 @@ dependencies = [ ] [[package]] -name = "ansi_term" -version = "0.12.1" +name = "anyhow" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] +checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" [[package]] -name = "anyhow" -version = "1.0.62" +name = "arc-swap" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305" +checksum = "983cd8b9d4b02a6dc6ffa557262eb5858a27a0038ffffe21a0f133eaa819a164" [[package]] name = "arrayref" @@ -199,6 +383,20 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "assert_cmd" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba45b8163c49ab5f972e59a8a5a03b6d2972619d486e19ec9fe744f7c2753d3c" +dependencies = [ + "bstr 1.0.1", + "doc-comment", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + [[package]] name = "async-channel" version = "1.6.1" @@ -404,9 +602,9 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -421,9 +619,9 @@ version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -437,18 +635,9 @@ dependencies = [ "log", "pin-project-lite 0.2.9", "tokio", - "tokio-rustls 0.23.4", - "tungstenite 0.17.3", - "webpki-roots 0.22.3", -] - -[[package]] -name = "atoi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" -dependencies = [ - "num-traits", + "tokio-rustls", + "tungstenite", + "webpki-roots", ] [[package]] @@ -503,9 +692,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a3ad9e793335d75b2d2faad583487efcc0df9154aff06f299a5c1fc8795698" +checksum = "56a636c44c77fa18bdba56126a34d30cfe5538fe88f7d34988fa731fee143ddd" dependencies = [ "aws-http", "aws-sdk-sso", @@ -517,7 +706,7 @@ dependencies = [ "aws-smithy-json", "aws-smithy-types", "aws-types", - "bytes 1.2.1", + "bytes 1.3.0", "hex 0.4.3", "http 0.2.8", "hyper", @@ -531,11 +720,12 @@ dependencies = [ [[package]] name = "aws-endpoint" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd4e9dad553017821ee529f186e033700e8d61dd5c4b60066b4d8fe805b8cfc" +checksum = "6ca8f374874f6459aaa88dc861d7f5d834ca1ff97668eae190e97266b5f6c3fb" dependencies = [ "aws-smithy-http", + "aws-smithy-types", "aws-types", "http 0.2.8", "regex", @@ -544,14 +734,14 @@ dependencies = [ [[package]] name = "aws-http" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef5a579a51d352b628b76f4855ba716be686305e5e59970c476d1ae2214e90d" +checksum = "78d41e19e779b73463f5f0c21b3aacc995f4ba783ab13a7ae9f5dfb159a551b4" dependencies = [ "aws-smithy-http", "aws-smithy-types", "aws-types", - "bytes 1.2.1", + "bytes 1.3.0", "http 0.2.8", "http-body", "lazy_static", @@ -562,9 +752,9 @@ dependencies = [ [[package]] name = "aws-sdk-rds" -version = "0.17.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59834848e38d12a46013354ea27bb44ef4686121f8cda2611daea0fea3e8eac1" +checksum = "0420bd9b4043fa26b87ee18af3b98c5cc960ff439456a091cd4dd044cbbcc046" dependencies = [ "aws-endpoint", "aws-http", @@ -577,7 +767,7 @@ dependencies = [ "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes 1.2.1", + "bytes 1.3.0", "http 0.2.8", "tokio-stream", "tower", @@ -585,9 +775,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "0.17.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f014b8ad3178b414bf732b36741325ef659fc40752f8c292400fb7c4ecb7fdd0" +checksum = "86dcb1cb71aa8763b327542ead410424515cff0cde5b753eedd2917e09c63734" dependencies = [ "aws-endpoint", "aws-http", @@ -599,7 +789,7 @@ dependencies = [ "aws-smithy-json", "aws-smithy-types", "aws-types", - "bytes 1.2.1", + "bytes 1.3.0", "http 0.2.8", "tokio-stream", "tower", @@ -607,9 +797,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "0.17.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37e45fdce84327c69fb924b9188fd889056c6afafbd494e8dd0daa400f9c082" +checksum = "fdfcf584297c666f6b472d5368a78de3bc714b6e0a53d7fbf76c3e347c292ab1" dependencies = [ "aws-endpoint", "aws-http", @@ -622,16 +812,16 @@ dependencies = [ "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes 1.2.1", + "bytes 1.3.0", "http 0.2.8", "tower", ] [[package]] name = "aws-sig-auth" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6530e72945c11439e9b3c423c95a656a233d73c3a7d4acaf9789048e1bdf7da7" +checksum = "12cbe7b2be9e185c1fbce27fc9c41c66b195b32d89aa099f98768d9544221308" dependencies = [ "aws-sigv4", "aws-smithy-http", @@ -642,9 +832,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6351c3ba468b04bd819f64ea53538f5f53e3d6b366b27deabee41e73c9edb3af" +checksum = "03ff4cff8c4a101962d593ba94e72cd83891aecd423f0c6e3146bff6fb92c9e3" dependencies = [ "aws-smithy-http", "form_urlencoded", @@ -660,9 +850,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fc23ad8d050c241bdbfa74ae360be94a844ace8e218f64a2b2de77bfa9a707" +checksum = "7b3442b4c5d3fc39891a2e5e625735fba6b24694887d49c6518460fde98247a9" dependencies = [ "futures-util", "pin-project-lite 0.2.9", @@ -672,20 +862,20 @@ dependencies = [ [[package]] name = "aws-smithy-client" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e147b157f49ce77f2a86ec693a14c84b2441fa28be58ffb2febb77d5726c934" +checksum = "ff28d553714f8f54cd921227934fc13a536a1c03f106e56b362fd57e16d450ad" dependencies = [ "aws-smithy-async", "aws-smithy-http", "aws-smithy-http-tower", "aws-smithy-types", - "bytes 1.2.1", + "bytes 1.3.0", "fastrand", "http 0.2.8", "http-body", "hyper", - "hyper-rustls 0.22.1", + "hyper-rustls", "lazy_static", "pin-project-lite 0.2.9", "tokio", @@ -695,12 +885,12 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc1af50eac644ab6f58e5bae29328ba3092851fc2ce648ad139134699b2b66f" +checksum = "bf58ed4fefa61dbf038e5421a521cbc2c448ef69deff0ab1d915d8a10eda5664" dependencies = [ "aws-smithy-types", - "bytes 1.2.1", + "bytes 1.3.0", "bytes-utils", "futures-core", "http 0.2.8", @@ -709,6 +899,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite 0.2.9", + "pin-utils", "tokio", "tokio-util 0.7.3", "tracing", @@ -716,12 +907,12 @@ dependencies = [ [[package]] name = "aws-smithy-http-tower" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1bf4c4664dff2febf91f8796505c5bc8f38a0bff0d1397d1d3fdda17bd5c5d1" +checksum = "20c96d7bd35e7cf96aca1134b2f81b1b59ffe493f7c6539c051791cbbf7a42d3" dependencies = [ "aws-smithy-http", - "bytes 1.2.1", + "bytes 1.3.0", "http 0.2.8", "http-body", "pin-project-lite 0.2.9", @@ -731,18 +922,18 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e6ebc76c3c108dd2a96506bf47dc31f75420811a19f1a09907524d1451789d2" +checksum = "d8324ba98c8a94187723cc16c37aefa09504646ee65c3d2c3af495bab5ea701b" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-query" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2956f1385c4daa883907a2c81d32256af8f95834c9de1bc0613fa68db63b88c4" +checksum = "83834ed2ff69ea6f6657baf205267dc2c0abe940703503a3e5d60ce23be3d306" dependencies = [ "aws-smithy-types", "urlencoding", @@ -750,9 +941,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "352fb335ec1d57160a17a13e87aaa0a172ab780ddf58bfc85caedd3b7e47caed" +checksum = "8b02e06ea63498c43bc0217ea4d16605d4e58d85c12fc23f6572ff6d0a840c61" dependencies = [ "itoa 1.0.2", "num-integer", @@ -762,18 +953,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cf2807fa715a5a3296feffb06ce45252bd0dfd48f52838128c48fb339ddbf5c" +checksum = "246e9f83dd1fdf5d347fa30ae4ad30a9d1d42ce4cd74a93d94afa874646f94cd" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "0.47.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8140b89d76f67be2c136d7393e7e6d8edd65424eb58214839efbf4a2e4f7e8a3" +checksum = "05701d32da168b44f7ee63147781aed8723e792cc131cb9b18363b5393f17f70" dependencies = [ "aws-smithy-async", "aws-smithy-client", @@ -787,15 +978,15 @@ dependencies = [ [[package]] name = "axum" -version = "0.5.15" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de18bc5f2e9df8f52da03856bf40e29b747de5a84e43aefff90e3dc4a21529b" +checksum = "744864363a200a5e724a7e61bc8c11b6628cf2e3ec519c8a1a48e609a8156b40" dependencies = [ "async-trait", "axum-core", - "base64 0.13.0", + "base64 0.13.1", "bitflags", - "bytes 1.2.1", + "bytes 1.3.0", "futures-util", "headers", "http 0.2.8", @@ -807,13 +998,15 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite 0.2.9", + "rustversion", "serde", "serde_json", + "serde_path_to_error", "serde_urlencoded", - "sha-1 0.10.0", + "sha-1", "sync_wrapper", "tokio", - "tokio-tungstenite 0.17.2", + "tokio-tungstenite", "tower", "tower-http 0.3.4", "tower-layer", @@ -822,29 +1015,46 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.2.7" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f44a0e6200e9d11a1cdc989e4b358f6e3d354fbf48478f345a17f4e43f8635" +checksum = "79b8558f5a0581152dc94dcd289132a1d377494bdeafcd41869b3258e3e2ad92" dependencies = [ "async-trait", - "bytes 1.2.1", + "bytes 1.3.0", "futures-util", "http 0.2.8", "http-body", "mime", + "rustversion", + "tower-layer", + "tower-service", ] [[package]] -name = "base-x" -version = "0.2.11" +name = "axum-server" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" +checksum = "8456dab8f11484979a86651da8e619b355ede5d61a160755155f6c344bd18c47" +dependencies = [ + "arc-swap", + "bytes 1.3.0", + "futures-util", + "http 0.2.8", + "http-body", + "hyper", + "pin-project-lite 0.2.9", + "rustls", + "rustls-pemfile 1.0.1", + "tokio", + "tokio-rustls", + "tower-service", +] [[package]] -name = "base64" -version = "0.11.0" +name = "base-x" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] name = "base64" @@ -854,9 +1064,9 @@ checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "binascii" @@ -941,9 +1151,9 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d82e7850583ead5f8bbef247e2a3c37a19bd576e8420cd262a6711921827e1e5" dependencies = [ - "base64 0.13.0", + "base64 0.13.1", "bollard-stubs", - "bytes 1.2.1", + "bytes 1.3.0", "futures-core", "futures-util", "hex 0.4.3", @@ -1001,7 +1211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d76085681585d39016f4d3841eb019201fc54d2dd0d92ad1e4fab3bfb32754" dependencies = [ "ahash", - "base64 0.13.0", + "base64 0.13.1", "hex 0.4.3", "indexmap", "lazy_static", @@ -1010,7 +1220,7 @@ dependencies = [ "serde_bytes", "serde_json", "time 0.3.11", - "uuid 1.1.2", + "uuid 1.2.2", ] [[package]] @@ -1024,6 +1234,18 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "bstr" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca0852af221f458706eb0725c03e4ed6c46af9ac98e6a689d5e634215d594dd" +dependencies = [ + "memchr", + "once_cell", + "regex-automata", + "serde", +] + [[package]] name = "buf_redux" version = "0.8.4" @@ -1064,9 +1286,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" [[package]] name = "bytes-utils" @@ -1074,7 +1296,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1934a3ef9cac8efde4966a92781e77713e1ba329f1d42e446c7d7eba340d8ef1" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "either", ] @@ -1084,6 +1306,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70" +[[package]] +name = "bytestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7f83e57d9154148e355404702e2694463241880b939570d7c97c014da7a69a1" +dependencies = [ + "bytes 1.3.0", +] + [[package]] name = "cache-padded" version = "1.2.0" @@ -1107,8 +1338,8 @@ checksum = "0b0e103ce36d217d568903ad27b14ec2238ecb5d65bad2e756a8f3c0d651506e" dependencies = [ "cap-primitives", "cap-std", - "io-lifetimes", - "windows-sys", + "io-lifetimes 0.7.4", + "windows-sys 0.36.1", ] [[package]] @@ -1120,12 +1351,12 @@ dependencies = [ "ambient-authority", "fs-set-times", "io-extras", - "io-lifetimes", + "io-lifetimes 0.7.4", "ipnet", "maybe-owned", - "rustix", + "rustix 0.35.12", "winapi-util", - "windows-sys", + "windows-sys 0.36.1", "winx", ] @@ -1147,9 +1378,9 @@ checksum = "c9d6e70b626eceac9d6fc790fe2d72cc3f2f7bc3c35f467690c54a526b0f56db" dependencies = [ "cap-primitives", "io-extras", - "io-lifetimes", + "io-lifetimes 0.7.4", "ipnet", - "rustix", + "rustix 0.35.12", ] [[package]] @@ -1160,22 +1391,22 @@ checksum = "c3a0524f7c4cff2ea547ae2b652bf7a348fd3e48f76556dc928d8b45ab2f1d50" dependencies = [ "cap-primitives", "once_cell", - "rustix", + "rustix 0.35.12", "winx", ] [[package]] name = "cargo" -version = "0.64.0" +version = "0.65.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7019448b7d0ffe19d4ab26a340d2efe6da8cf86c8cc01a352b90853e31cd8f7c" +checksum = "988ba7aa82c0944fd91d119ee24a5c1f865eb2797e0edd90f6c08c7252857ca5" dependencies = [ "anyhow", "atty", "bytesize", "cargo-platform", "cargo-util", - "clap 3.2.17", + "clap 3.2.23", "crates-io", "crossbeam-utils", "curl", @@ -1217,7 +1448,7 @@ dependencies = [ "tar", "tempfile", "termcolor", - "toml_edit", + "toml_edit 0.14.4", "unicode-width", "unicode-xid 0.2.3", "url", @@ -1227,13 +1458,13 @@ dependencies = [ [[package]] name = "cargo-edit" -version = "0.10.4" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a055abd7d5cdb5a4e0aad89962b2f172eaad613374056cab74124ff2cf978ea7" +checksum = "e3a5eba325b274fc14e17df48888c3c45146e03be7331cdbd585c377a2bc8058" dependencies = [ "anyhow", "cargo_metadata", - "clap 3.2.17", + "clap 4.0.27", "concolor-control", "crates-index", "dirs-next", @@ -1251,7 +1482,7 @@ dependencies = [ "serde_json", "subprocess", "termcolor", - "toml_edit", + "toml_edit 0.14.4", "ureq", "url", ] @@ -1267,44 +1498,55 @@ dependencies = [ [[package]] name = "cargo-shuttle" -version = "0.7.0" +version = "0.8.1" dependencies = [ "anyhow", + "assert_cmd", "async-trait", "bollard", "cargo", "cargo-edit", "cargo_metadata", "chrono", - "clap 3.2.17", + "clap 3.2.23", + "clap_complete", "crossbeam-channel", "crossterm", + "dialoguer", "dirs", + "flate2", "futures", + "git2", "headers", + "ignore", + "indicatif", "indoc", "log", + "openssl", "portpicker", "reqwest", "reqwest-middleware", "reqwest-retry", + "rexpect", "serde", "serde_json", "shuttle-common", "shuttle-secrets", "shuttle-service", - "sqlx 0.6.1", + "sqlx", + "strum", + "tar", "tempfile", "test-context", "tokio", - "tokio-tungstenite 0.17.2", + "tokio-tungstenite", "tokiotest-httpserver", "toml", - "toml_edit", + "toml_edit 0.15.0", "tracing", "tracing-subscriber", "url", - "uuid 1.1.2", + "uuid 1.2.2", "webbrowser", ] @@ -1332,15 +1574,16 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3abb7553d5b9b8421c6de7cb02606ff15e0c6eea7d8eadd75ef013fd636bec36" +checksum = "982a0cf6a99c350d7246035613882e376d58cebe571785abc5da4f648d53ac0a" dependencies = [ "camino", "cargo-platform", "semver 1.0.14", "serde", "serde_json", + "thiserror", ] [[package]] @@ -1372,9 +1615,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ "iana-time-zone", "js-sys", @@ -1412,61 +1655,70 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.17" +version = "3.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e724a68d9319343bb3328c9cc2dfde263f4b3142ee1059a9980580171c954b" +checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" dependencies = [ "atty", "bitflags", - "clap_derive 3.2.17", + "clap_derive 3.2.18", "clap_lex 0.2.4", "indexmap", "once_cell", "strsim", "termcolor", - "terminal_size", "textwrap", ] [[package]] name = "clap" -version = "4.0.18" +version = "4.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335867764ed2de42325fafe6d18b8af74ba97ee0c590fa016f157535b42ab04b" +checksum = "0acbd8d28a0a60d7108d7ae850af6ba34cf2d1257fc646980e5f97ce14275966" dependencies = [ - "atty", "bitflags", - "clap_derive 4.0.18", + "clap_derive 4.0.21", "clap_lex 0.3.0", + "is-terminal 0.4.0", "once_cell", "strsim", "termcolor", + "terminal_size 0.2.3", +] + +[[package]] +name = "clap_complete" +version = "3.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f7a2e0a962c45ce25afce14220bc24f9dade0a1787f185cecf96bfba7847cd8" +dependencies = [ + "clap 3.2.23", ] [[package]] name = "clap_derive" -version = "3.2.17" +version = "3.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13547f7012c01ab4a0e8f8967730ada8f9fdf419e8b6c792788f39cf4e46eefa" +checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" dependencies = [ "heck", "proc-macro-error", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] name = "clap_derive" -version = "4.0.18" +version = "4.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a1b0f6422af32d5da0c58e2703320f379216ee70198241c84173a8c5ac28f3" +checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" dependencies = [ "heck", "proc-macro-error", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -1509,19 +1761,19 @@ dependencies = [ [[package]] name = "combine" -version = "4.6.4" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a604e93b79d1808327a6fca85a6f2d69de66461e7620f5a4cbf5fb4d1d7c948" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "memchr", ] [[package]] name = "comfy-table" -version = "6.1.0" +version = "6.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85914173c2f558d61613bfbbf1911f14e630895087a7ed2fafc0f5319e1536e7" +checksum = "e621e7e86c46fd8a14c32c6ae3cb95656621b4743a27d0cffedb831d46e7ad21" dependencies = [ "crossterm", "strum", @@ -1529,6 +1781,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "comma" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b672471b4e9f9e95499ea597ff64941a309b2cdbffcc46f2cc5e2d971fd335" + [[package]] name = "commoncrypto" version = "0.2.0" @@ -1573,6 +1831,20 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "console" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "terminal_size 0.1.17", + "unicode-width", + "winapi", +] + [[package]] name = "const_fn" version = "0.4.9" @@ -1585,6 +1857,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "cookie" version = "0.14.4" @@ -1592,7 +1870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" dependencies = [ "aes-gcm 0.8.0", - "base64 0.13.0", + "base64 0.13.1", "hkdf 0.10.0", "hmac 0.10.1", "percent-encoding", @@ -1609,7 +1887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" dependencies = [ "aes-gcm 0.9.4", - "base64 0.13.0", + "base64 0.13.1", "hkdf 0.12.3", "hmac 0.12.1", "percent-encoding", @@ -1763,9 +2041,9 @@ dependencies = [ [[package]] name = "crates-index" -version = "0.18.8" +version = "0.18.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2519c91ad7a6e3250a64fb71162d2db1afe7bcf826a465f84d2052fd69639b7a" +checksum = "599f67b56f40863598cb30450427049935d05de2e36c61d33c050f04d7ec8cf2" dependencies = [ "git2", "hex 0.4.3", @@ -1779,6 +2057,7 @@ dependencies = [ "serde_derive", "serde_json", "smartstring", + "toml", ] [[package]] @@ -1795,30 +2074,15 @@ dependencies = [ "url", ] -[[package]] -name = "crc" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" -dependencies = [ - "crc-catalog 1.1.1", -] - [[package]] name = "crc" version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" dependencies = [ - "crc-catalog 2.1.0", + "crc-catalog", ] -[[package]] -name = "crc-catalog" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" - [[package]] name = "crc-catalog" version = "2.1.0" @@ -1846,9 +2110,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", @@ -1857,15 +2121,14 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.9" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ "autocfg 1.1.0", "cfg-if 1.0.0", "crossbeam-utils", - "memoffset", - "once_cell", + "memoffset 0.7.1", "scopeguard", ] @@ -1914,6 +2177,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "cruet" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d174765c7d11eb16f70a4213583aac2ca5ae1ebd1e233c6d5104bfb70fce3" +dependencies = [ + "once_cell", + "regex", +] + [[package]] name = "crypto-common" version = "0.1.3" @@ -1956,23 +2229,14 @@ dependencies = [ "subtle", ] -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct 0.6.1", -] - [[package]] name = "ctor" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" dependencies = [ "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -1993,6 +2257,12 @@ dependencies = [ "cipher 0.3.0", ] +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + [[package]] name = "curl" version = "0.4.43" @@ -2052,10 +2322,10 @@ checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "strsim", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -2066,10 +2336,10 @@ checksum = "649c91bc01e8b1eac09fb91e8dbc7d517684ca6be8ebc75bb9cafc894f9fdb6f" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "strsim", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -2080,7 +2350,7 @@ checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core 0.13.4", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -2091,7 +2361,19 @@ checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5" dependencies = [ "darling_core 0.14.1", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", +] + +[[package]] +name = "dashmap" +version = "5.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3495912c9c1ccf2e18976439f4443f3fee0fd61f424ff99fde6a66b15ecb448f" +dependencies = [ + "cfg-if 1.0.0", + "hashbrown", + "lock_api", + "parking_lot_core 0.9.3", ] [[package]] @@ -2106,9 +2388,22 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2 1.0.47", + "quote 1.0.21", + "rustc_version 0.4.0", + "syn 1.0.104", ] [[package]] @@ -2138,10 +2433,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" dependencies = [ "bitflags", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "proc-macro2-diagnostics", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", +] + +[[package]] +name = "dialoguer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92e7e37ecef6857fdc0c0c5d42fd5b0938e46590c2183cc92dd310a6d078eb1" +dependencies = [ + "console", + "fuzzy-matcher", + "tempfile", + "zeroize", ] [[package]] @@ -2150,6 +2457,12 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.9.0" @@ -2233,12 +2546,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - [[package]] name = "dotenvy" version = "0.15.2" @@ -2250,9 +2557,9 @@ dependencies = [ [[package]] name = "dunce" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453440c271cf5577fd2a40e4942540cb7d0d2f85e27c8d07dd0023c925a67541" +checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" [[package]] name = "either" @@ -2260,6 +2567,12 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.31" @@ -2276,9 +2589,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" dependencies = [ "heck", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -2296,9 +2609,9 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -2435,9 +2748,9 @@ checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" [[package]] name = "flate2" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", "libz-sys", @@ -2479,19 +2792,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] [[package]] name = "fqdn" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1281c1bcf107f1cc25ca345ce4688badf37c6c13c3f193cb4b9efdc057678ae2" +checksum = "3b5dd19b048b2dfde153588594b4f3da47b18afd18d171bb8d1d27741256bbaa" [[package]] name = "fs-set-times" @@ -2499,9 +2811,9 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a267b6a9304912e018610d53fe07115d8b530b160e85db4d2d3a59f3ddde1aec" dependencies = [ - "io-lifetimes", - "rustix", - "windows-sys", + "io-lifetimes 0.7.4", + "rustix 0.35.12", + "windows-sys 0.36.1", ] [[package]] @@ -2512,9 +2824,9 @@ checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "futures" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab30e97ab6aacfe635fad58f22c2bb06c8b685f7421eb1e064a729e2a5f481fa" +checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" dependencies = [ "futures-channel", "futures-core", @@ -2527,9 +2839,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" +checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" dependencies = [ "futures-core", "futures-sink", @@ -2537,15 +2849,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2acedae88d38235936c3922476b10fced7b2b68136f5e3c03c2d5be348a1115" +checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" [[package]] name = "futures-executor" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d11aa21b5b587a64682c0094c2bdd4df0076c5324961a40cc3abd7f37930528" +checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" dependencies = [ "futures-core", "futures-task", @@ -2565,9 +2877,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a66fc6d035a26a3ae255a6d2bca35eda63ae4c5512bef54449113f7a1228e5" +checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" [[package]] name = "futures-lite" @@ -2586,32 +2898,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0db9cce532b0eae2ccf2766ab246f114b56b9cf6d445e00c2549fbc100ca045d" +checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] name = "futures-sink" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0bae1fe9752cf7fd9b0064c674ae63f97b37bc714d745cbde0afb7ec4e6765" +checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" [[package]] name = "futures-task" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "842fc63b931f4056a24d59de13fb1272134ce261816e063e634ad0c15cdc5306" +checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" [[package]] name = "futures-util" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" +checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" dependencies = [ "futures-channel", "futures-core", @@ -2625,6 +2937,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + [[package]] name = "fwdansi" version = "1.1.0" @@ -2722,9 +3043,9 @@ dependencies = [ [[package]] name = "git2" -version = "0.14.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3826a6e0e2215d7a41c2bfc7c9244123969273f3476b939a226aac0ab56e9e3c" +checksum = "d0155506aab710a86160ddb504a480d2964d7ab5b9e62419be69e0032bc5931c" dependencies = [ "bitflags", "libc", @@ -2760,7 +3081,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" dependencies = [ "aho-corasick", - "bstr", + "bstr 0.2.17", "fnv", "log", "regex", @@ -2784,7 +3105,7 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "fnv", "futures-core", "futures-sink", @@ -2797,15 +3118,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - [[package]] name = "hashbrown" version = "0.12.1" @@ -2815,22 +3127,13 @@ dependencies = [ "ahash", ] -[[package]] -name = "hashlink" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" -dependencies = [ - "hashbrown 0.11.2", -] - [[package]] name = "hashlink" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d452c155cb93fecdfb02a73dd57b5d8e442c2063bd7aac72f1bc5e4263a43086" dependencies = [ - "hashbrown 0.12.1", + "hashbrown", ] [[package]] @@ -2839,9 +3142,9 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ - "base64 0.13.0", + "base64 0.13.1", "bitflags", - "bytes 1.2.1", + "bytes 1.3.0", "headers-core", "http 0.2.8", "httpdate", @@ -2950,9 +3253,9 @@ dependencies = [ [[package]] name = "home" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" +checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" dependencies = [ "winapi", ] @@ -2985,7 +3288,7 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "fnv", "itoa 1.0.2", ] @@ -2996,7 +3299,7 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "http 0.2.8", "pin-project-lite 0.2.9", ] @@ -3038,7 +3341,7 @@ dependencies = [ "anyhow", "async-channel", "async-std", - "base64 0.13.0", + "base64 0.13.1", "cookie 0.14.4", "futures-lite", "infer", @@ -3075,7 +3378,7 @@ version = "0.14.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "futures-channel", "futures-core", "futures-util", @@ -3115,23 +3418,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "hyper-rustls" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" -dependencies = [ - "ct-logs", - "futures-util", - "hyper", - "log", - "rustls 0.19.1", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.22.0", - "webpki 0.21.4", -] - [[package]] name = "hyper-rustls" version = "0.23.0" @@ -3140,9 +3426,11 @@ checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" dependencies = [ "http 0.2.8", "hyper", - "rustls 0.20.6", + "log", + "rustls", + "rustls-native-certs", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls", ] [[package]] @@ -3163,7 +3451,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "hyper", "native-tls", "tokio", @@ -3213,6 +3501,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "ignore" version = "0.4.18" @@ -3252,10 +3550,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg 1.1.0", - "hashbrown 0.12.1", + "hashbrown", "serde", ] +[[package]] +name = "indicatif" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4295cbb7573c16d310e99e713cf9e75101eb190ab31fccd35f2d2691b4352b19" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", +] + [[package]] name = "indoc" version = "1.0.7" @@ -3283,14 +3593,29 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "instant-acme" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c6a5dc426fcc25b99d91e4a283a8f5518339a0f63bf28588a6c5f31e089f8a" +dependencies = [ + "base64 0.13.1", + "hyper", + "hyper-rustls", + "ring", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "io-extras" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5d8c2ab5becd8720e30fd25f8fa5500d8dc3fceadd8378f05859bd7b46fc49" dependencies = [ - "io-lifetimes", - "windows-sys", + "io-lifetimes 0.7.4", + "windows-sys 0.36.1", ] [[package]] @@ -3300,7 +3625,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e481ccbe3dea62107216d0d1138bb8ad8e5e5c43009a098bd1990272c497b0" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.36.1", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +dependencies = [ + "libc", + "windows-sys 0.42.0", ] [[package]] @@ -3337,16 +3672,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d508111813f9af3afd2f92758f77e4ed2cc9371b642112c6a48d22eb73105c5" dependencies = [ "hermit-abi 0.2.6", - "io-lifetimes", - "rustix", - "windows-sys", + "io-lifetimes 0.7.4", + "rustix 0.35.12", + "windows-sys 0.36.1", +] + +[[package]] +name = "is-terminal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae5bc6e2eb41c9def29a3e0f1306382807764b9b53112030eff57435667352d" +dependencies = [ + "hermit-abi 0.2.6", + "io-lifetimes 1.0.3", + "rustix 0.36.3", + "windows-sys 0.42.0", ] [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] @@ -3385,9 +3732,9 @@ dependencies = [ [[package]] name = "jni" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" dependencies = [ "cesu8", "combine", @@ -3439,6 +3786,12 @@ dependencies = [ "log", ] +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + [[package]] name = "lazy_static" version = "1.4.0" @@ -3465,9 +3818,9 @@ checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" [[package]] name = "libgit2-sys" -version = "0.13.2+1.4.2" +version = "0.13.4+1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a42de9a51a5c12e00fc0e4ca6bc2ea43582fc6418488e8f615e905d886f258b" +checksum = "d0fa6563431ede25f5cc7f6d803c6afbc1c5d3ad3d4925d12c882bf2b526f5d1" dependencies = [ "cc", "libc", @@ -3479,9 +3832,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -3546,6 +3899,30 @@ version = "0.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" +[[package]] +name = "linux-raw-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f9f08d8963a6c613f4b1a78f4f4a4dbfadf8e6545b2d72861731e4858b8b47f" + +[[package]] +name = "local-channel" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" +dependencies = [ + "futures-core", + "futures-sink", + "futures-util", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" + [[package]] name = "lock_api" version = "0.4.7" @@ -3600,6 +3977,15 @@ dependencies = [ "libc", ] +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "match_cfg" version = "0.1.0" @@ -3623,9 +4009,9 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "matchit" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" +checksum = "3dfc802da7b1cf80aefffa0c7b2f77247c8b32206cc83c270b61264f5b360a80" [[package]] name = "maybe-owned" @@ -3654,7 +4040,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "480b5a5de855d11ff13195950bdc8b98b5e942ef47afc447f6615cdcc4e15d80" dependencies = [ - "rustix", + "rustix 0.35.12", ] [[package]] @@ -3666,6 +4052,15 @@ dependencies = [ "autocfg 1.1.0", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg 1.1.0", +] + [[package]] name = "mime" version = "0.3.16" @@ -3690,9 +4085,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.5.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] @@ -3706,7 +4101,7 @@ dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -3720,12 +4115,12 @@ dependencies = [ [[package]] name = "mongodb" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95afe97b0c799fdf69cd960272a2cb9662d077bd6efd84eb722bb9805d47554" +checksum = "b5a1df476ac9541b0e4fdc8e2cc48884e66c92c933cd17a1fd75e68caf75752e" dependencies = [ "async-trait", - "base64 0.13.0", + "base64 0.13.1", "bitflags", "bson", "chrono", @@ -3742,12 +4137,12 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "rustc_version_runtime", - "rustls 0.20.6", + "rustls", "rustls-pemfile 0.3.0", "serde", "serde_bytes", "serde_with", - "sha-1 0.10.0", + "sha-1", "sha2 0.10.2", "socket2", "stringprep", @@ -3755,13 +4150,13 @@ dependencies = [ "take_mut", "thiserror", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls", "tokio-util 0.7.3", "trust-dns-proto", "trust-dns-resolver", "typed-builder", "uuid 0.8.2", - "webpki-roots 0.22.3", + "webpki-roots", ] [[package]] @@ -3770,7 +4165,7 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f8f35e687561d5c1667590911e6698a8cb714a134a7505718a182e7bc9d3836" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "encoding_rs", "futures-util", "http 0.2.8", @@ -3829,19 +4224,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "ndk" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" -dependencies = [ - "bitflags", - "jni-sys", - "ndk-sys", - "num_enum", - "thiserror", -] - [[package]] name = "ndk-context" version = "0.1.1" @@ -3849,51 +4231,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] -name = "ndk-glue" -version = "0.6.2" +name = "net2" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0c4a7b83860226e6b4183edac21851f05d5a51756e97a1144b7f5a6b63e65f" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" dependencies = [ - "lazy_static", + "cfg-if 0.1.10", "libc", - "log", - "ndk", - "ndk-context", - "ndk-macro", - "ndk-sys", -] - -[[package]] -name = "ndk-macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" -dependencies = [ - "darling 0.13.4", - "proc-macro-crate", - "proc-macro2 1.0.43", - "quote 1.0.21", - "syn 1.0.99", -] - -[[package]] -name = "ndk-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" -dependencies = [ - "jni-sys", + "winapi", ] [[package]] -name = "net2" -version = "0.2.37" +name = "nix" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" dependencies = [ - "cfg-if 0.1.10", + "autocfg 1.1.0", + "bitflags", + "cfg-if 1.0.0", "libc", - "winapi", + "memoffset 0.6.5", + "pin-utils", ] [[package]] @@ -3937,42 +4296,36 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ "hermit-abi 0.1.19", "libc", ] [[package]] -name = "num_enum" -version = "0.5.7" +name = "num_threads" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ - "num_enum_derive", + "libc", ] [[package]] -name = "num_enum_derive" -version = "0.5.7" +name = "number_prefix" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.43", - "quote 1.0.21", - "syn 1.0.99", -] +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] -name = "num_threads" -version = "0.1.6" +name = "objc" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ - "libc", + "malloc_buf", ] [[package]] @@ -3982,16 +4335,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" dependencies = [ "crc32fast", - "hashbrown 0.12.1", + "hashbrown", "indexmap", "memchr", ] [[package]] name = "once_cell" -version = "1.14.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "opaque-debug" @@ -4005,7 +4358,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea3ebcd72a54701f56345f16785a6d3ac2df7e986d273eb4395c0b01db17952" dependencies = [ - "bstr", + "bstr 0.2.17", "winapi", ] @@ -4030,9 +4383,9 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -4041,6 +4394,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "111.24.0+1.1.1s" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.74" @@ -4050,72 +4412,102 @@ dependencies = [ "autocfg 1.1.0", "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] [[package]] name = "opentelemetry" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +checksum = "69d6c3d7288a106c0a363e4b0e8d308058d56902adefb16f4936f417ffef086e" dependencies = [ - "async-trait", - "crossbeam-channel", - "futures-channel", - "futures-executor", - "futures-util", - "js-sys", - "lazy_static", - "percent-encoding", - "pin-project", - "rand 0.8.5", - "thiserror", - "tokio", - "tokio-stream", + "opentelemetry_api", + "opentelemetry_sdk", ] [[package]] name = "opentelemetry-datadog" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "457462dc4cd365992c574c79181ff11ee6f66c5cbfb15a352217b4e0b35eac34" +checksum = "171770efa142d2a19455b7e985037f560b2e75461f822dd1688bfd83c14856f6" dependencies = [ "async-trait", + "futures-core", "http 0.2.8", "indexmap", "itertools", - "lazy_static", + "once_cell", "opentelemetry", "opentelemetry-http", "opentelemetry-semantic-conventions", "reqwest", "rmp", "thiserror", + "url", ] [[package]] name = "opentelemetry-http" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449048140ee61e28f57abe6e9975eedc1f3a29855c7407bd6c12b18578863379" +checksum = "1edc79add46364183ece1a4542592ca593e6421c60807232f5b8f7a31703825d" dependencies = [ "async-trait", - "bytes 1.2.1", + "bytes 1.3.0", "http 0.2.8", - "opentelemetry", + "opentelemetry_api", "reqwest", ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985cc35d832d412224b2cffe2f9194b1b89b6aa5d0bef76d080dce09d90e62bd" +checksum = "9b02e0230abb0ab6636d18e2ba8fa02903ea63772281340ccac18e0af3ec9eeb" dependencies = [ "opentelemetry", ] +[[package]] +name = "opentelemetry_api" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c24f96e21e7acc813c7a8394ee94978929db2bcc46cf6b5014fc612bf7760c22" +dependencies = [ + "fnv", + "futures-channel", + "futures-util", + "indexmap", + "js-sys", + "once_cell", + "pin-project-lite 0.2.9", + "thiserror", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca41c4933371b61c2a2f214bf16931499af4ec90543604ec828f7a625c09113" +dependencies = [ + "async-trait", + "crossbeam-channel", + "dashmap", + "fnv", + "futures-channel", + "futures-executor", + "futures-util", + "once_cell", + "opentelemetry_api", + "percent-encoding", + "rand 0.8.5", + "thiserror", + "tokio", + "tokio-stream", +] + [[package]] name = "ordered-float" version = "2.10.0" @@ -4127,9 +4519,9 @@ dependencies = [ [[package]] name = "os_info" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eca3ecae1481e12c3d9379ec541b238a16f0b75c9a409942daa8ec20dbfdb62" +checksum = "c4750134fb6a5d49afc80777394ad5d95b04bc12068c6abb92fae8f43817270f" dependencies = [ "log", "serde", @@ -4208,7 +4600,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -4249,17 +4641,26 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "proc-macro2-diagnostics", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", +] + +[[package]] +name = "pem" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c64931a1a212348ec4f3b4362585eca7159d0d09cbdf4a7f74f02173596fd4" +dependencies = [ + "base64 0.13.1", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "petgraph" @@ -4273,22 +4674,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -4326,12 +4727,12 @@ checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "poem" -version = "1.3.40" +version = "1.3.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d0fec4acc8779b696e3ff25527884fb17cda6cf59a249c57aa1af1e2f65b36" +checksum = "dc88a96f338947991534ac756e28bd05665a7dd40ad9c0c143cc5503ef5635e8" dependencies = [ "async-trait", - "bytes 1.2.1", + "bytes 1.3.0", "futures-util", "headers", "http 0.2.8", @@ -4352,19 +4753,18 @@ dependencies = [ "tokio-stream", "tokio-util 0.7.3", "tracing", - "typed-headers", ] [[package]] name = "poem-derive" -version = "1.3.40" +version = "1.3.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee7e20b5c7c573862cbc21e8f85682cc1f04766a318691837e8aa27df66857e6" +checksum = "d9bfb3ddf3eb162c2a2dc4dbdc610eaf56417cd4000fcda2686ccb354e2a1b2b" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -4403,6 +4803,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15eb2c6e362923af47e13c23ca5afb859e83d54452c55b0b9ac763b8f7c1ac16" + [[package]] name = "portpicker" version = "0.1.1" @@ -4418,16 +4824,43 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +[[package]] +name = "predicates" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6bd09a7f7e68f3f0bf710fb7ab9c4615a488b58b5f653382a687701e458c92" +dependencies = [ + "difflib", + "itertools", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f883590242d3c6fc5bf50299011695fa6590c2c70eac95ee1bdb9a733ad1a2" + +[[package]] +name = "predicates-tree" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54ff541861505aabf6ea722d2131ee980b8276e10a1297b94e896dd8b621850d" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "pretty_assertions" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89f989ac94207d048d92db058e4f6ec7342b0971fc58d1271ca148b799b3563" +checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" dependencies = [ - "ansi_term", "ctor", "diff", "output_vt100", + "yansi", ] [[package]] @@ -4436,8 +4869,8 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1516508b396cefe095485fdce673007422f5e48e82934b7b423dc26aa5e6a4" dependencies = [ - "proc-macro2 1.0.43", - "syn 1.0.99", + "proc-macro2 1.0.47", + "syn 1.0.104", ] [[package]] @@ -4457,9 +4890,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", "version_check", ] @@ -4469,7 +4902,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "version_check", ] @@ -4491,9 +4924,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.43" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ "unicode-ident", ] @@ -4504,39 +4937,41 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", "version_check", "yansi", ] [[package]] name = "prost" -version = "0.11.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399c3c31cdec40583bb68f0b18403400d01ec4289c383aa047560439952c4dd7" +checksum = "a0841812012b2d4a6145fae9a6af1534873c32aa67fff26bd09f8fa42c83f95a" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "prost-derive", ] [[package]] name = "prost-build" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f835c582e6bd972ba8347313300219fed5bfa52caf175298d860b61ff6069bb" +checksum = "1d8b442418ea0822409d9e7d047cbf1e7e9e1760b172bf9982cf29d517c93511" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "heck", "itertools", "lazy_static", "log", "multimap", "petgraph", + "prettyplease", "prost", "prost-types", "regex", + "syn 1.0.104", "tempfile", "which", ] @@ -4549,9 +4984,9 @@ checksum = "7345d5f0e08c0536d7ac7229952590239e77abf0a0100a1b1d890add6ea96364" dependencies = [ "anyhow", "itertools", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -4560,7 +4995,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dfaa718ad76a44b3415e6c4d53b17c8f99160dcb3a99b10470fce8ad43f6e3e" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "prost", ] @@ -4600,7 +5035,7 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", ] [[package]] @@ -4802,13 +5237,21 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "raw-window-handle" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" +dependencies = [ + "cty", +] + [[package]] name = "rayon" -version = "1.5.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +checksum = "1e060280438193c554f654141c9ea9417886713b7acd75974c85b18a69a88e0b" dependencies = [ - "autocfg 1.1.0", "crossbeam-deque", "either", "rayon-core", @@ -4816,9 +5259,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.3" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -4826,6 +5269,18 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring", + "time 0.3.11", + "yasna", +] + [[package]] name = "rdrand" version = "0.4.0" @@ -4870,9 +5325,9 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a043824e29c94169374ac5183ac0ed43f5724dc4556b19568007486bd840fa1f" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -4924,12 +5379,12 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.11" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" +checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" dependencies = [ - "base64 0.13.0", - "bytes 1.2.1", + "base64 0.13.1", + "bytes 1.3.0", "encoding_rs", "futures-core", "futures-util", @@ -4937,44 +5392,43 @@ dependencies = [ "http 0.2.8", "http-body", "hyper", - "hyper-rustls 0.23.0", + "hyper-rustls", "hyper-tls", "ipnet", "js-sys", - "lazy_static", "log", "mime", "mime_guess", "native-tls", + "once_cell", "percent-encoding", "pin-project-lite 0.2.9", - "rustls 0.20.6", + "rustls", "rustls-pemfile 1.0.1", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", - "tokio-rustls 0.23.4", + "tokio-rustls", "tokio-util 0.7.3", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.22.3", + "webpki-roots", "winreg 0.10.1", ] [[package]] name = "reqwest-middleware" -version = "0.1.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69539cea4148dce683bec9dc95be3f0397a9bb2c248a49c8296a9d21659a8cdd" +checksum = "4a1c03e9011a8c59716ad13115550469e081e2e9892656b0ba6a47c907921894" dependencies = [ "anyhow", "async-trait", - "futures", "http 0.2.8", "reqwest", "serde", @@ -4984,9 +5438,9 @@ dependencies = [ [[package]] name = "reqwest-retry" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce246a729eaa6aff5e215aee42845bf5fed9893cc6cd51aeeb712f34e04dd9f3" +checksum = "e29d842a94e8ab9b581fd3b906053872aef2fb3e474cbd88712047895d2deee4" dependencies = [ "anyhow", "async-trait", @@ -5023,6 +5477,19 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "rexpect" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01ff60778f96fb5a48adbe421d21bf6578ed58c0872d712e7e08593c195adff8" +dependencies = [ + "comma", + "nix", + "regex", + "tempfile", + "thiserror", +] + [[package]] name = "rfc7239" version = "0.1.0" @@ -5080,7 +5547,7 @@ dependencies = [ "atomic", "atty", "binascii", - "bytes 1.2.1", + "bytes 1.3.0", "either", "figment", "futures", @@ -5116,10 +5583,10 @@ dependencies = [ "devise", "glob", "indexmap", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "rocket_http", - "syn 1.0.99", + "syn 1.0.104", "unicode-xid 0.2.3", ] @@ -5222,58 +5689,68 @@ checksum = "985947f9b6423159c4726323f373be0a21bdb514c5af06a849cb3d2dce2d01e8" dependencies = [ "bitflags", "errno", - "io-lifetimes", + "io-lifetimes 0.7.4", "itoa 1.0.2", "libc", - "linux-raw-sys", + "linux-raw-sys 0.0.46", "once_cell", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] -name = "rustls" -version = "0.19.1" +name = "rustix" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "0b1fbb4dfc4eb1d390c02df47760bb19a84bb80b301ecc947ab5406394d8223e" dependencies = [ - "base64 0.13.0", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", + "bitflags", + "errno", + "io-lifetimes 1.0.3", + "libc", + "linux-raw-sys 0.1.3", + "windows-sys 0.42.0", ] [[package]] name = "rustls" -version = "0.20.6" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" +checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" dependencies = [ "log", "ring", - "sct 0.7.0", - "webpki 0.22.0", + "sct", + "webpki", ] [[package]] name = "rustls-native-certs" -version = "0.5.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" dependencies = [ "openssl-probe", - "rustls 0.19.1", + "rustls-pemfile 1.0.1", "schannel", "security-framework", ] +[[package]] +name = "rustls-pemfile" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +dependencies = [ + "base64 0.13.1", +] + [[package]] name = "rustls-pemfile" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" dependencies = [ - "base64 0.13.0", + "base64 0.13.1", ] [[package]] @@ -5282,14 +5759,14 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" dependencies = [ - "base64 0.13.0", + "base64 0.13.1", ] [[package]] name = "rustrict" -version = "0.5.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ab6d404f2f6170969bf27865e33d708cbfed94a3b5def842c77394178bd7881" +checksum = "294846357ffbadaaa82996006626376f97b6327a3990da95458bbcb7c9f2e116" dependencies = [ "bitflags", "doc-comment", @@ -5303,9 +5780,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a5f7c728f5d284929a1cccb5bc19884422bfe6ef4d6c409da2c41838983fcf" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" [[package]] name = "ryu" @@ -5321,25 +5798,25 @@ checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "salvo" -version = "0.34.3" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0d5860968c3504a1d13618078d2c833b23b2c7b194ce23e999891953d04b20c" +checksum = "b290f01b3b881afd34408b5823cb44f6717ed6b93a6e16a0113e9a49645ea8a7" dependencies = [ "salvo_core", ] [[package]] name = "salvo_core" -version = "0.34.3" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e104409bf6168999cae0d11d4340fdcb333592ddce2a5bd2c45e300e6a8e6f68" +checksum = "2fea63014bacaaaef1eaa1f28d90921cfbbee73a379974fca30fc698f64a8853" dependencies = [ - "Inflector", "async-compression", "async-trait", - "base64 0.13.0", - "bytes 1.2.1", + "base64 0.13.1", + "bytes 1.3.0", "cookie 0.16.0", + "cruet", "encoding_rs", "enumflags2", "fastrand", @@ -5371,17 +5848,17 @@ dependencies = [ [[package]] name = "salvo_macros" -version = "0.34.3" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1fe2ec840671e1427625d4dfb1c00177c64052fe0bfacf26964ab6d75446f45" +checksum = "b305a54f28b92483eabbfc91dd39bba62c840095b5513e83d31582c7e6bd8d44" dependencies = [ - "Inflector", + "cruet", "darling 0.14.1", "proc-macro-crate", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "regex", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -5400,7 +5877,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -5415,16 +5892,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sct" version = "0.7.0" @@ -5484,9 +5951,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc" dependencies = [ "serde_derive", ] @@ -5512,13 +5979,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -5541,9 +6008,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074" +checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ "indexmap", "itoa 1.0.2", @@ -5551,6 +6018,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "184c643044780f7ceb59104cef98a5a6f12cb2288a7bc701ab93a362b49fd47d" +dependencies = [ + "serde", +] + [[package]] name = "serde_qs" version = "0.8.5" @@ -5591,9 +6067,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ "darling 0.13.4", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -5604,9 +6080,9 @@ checksum = "82fd5e7b5858ad96e99d440138f34f5b98e1b959ebcd3a1036203b30e78eb788" dependencies = [ "async-trait", "async-tungstenite", - "base64 0.13.0", + "base64 0.13.1", "bitflags", - "bytes 1.2.1", + "bytes 1.3.0", "cfg-if 1.0.0", "flate2", "futures", @@ -5624,19 +6100,6 @@ dependencies = [ "url", ] -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha-1" version = "0.10.0" @@ -5722,22 +6185,42 @@ dependencies = [ "dirs", ] +[[package]] +name = "shuttle-admin" +version = "0.8.0" +dependencies = [ + "anyhow", + "clap 4.0.27", + "dirs", + "reqwest", + "serde", + "serde_json", + "shuttle-common", + "tokio", + "toml", + "tracing", + "tracing-subscriber", +] + [[package]] name = "shuttle-codegen" -version = "0.7.0" +version = "0.8.0" dependencies = [ "pretty_assertions", "proc-macro-error", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", "trybuild", ] [[package]] name = "shuttle-common" -version = "0.7.0" +version = "0.8.0" dependencies = [ + "anyhow", + "async-trait", + "axum", "chrono", "comfy-table", "crossterm", @@ -5745,27 +6228,28 @@ dependencies = [ "http-serde", "hyper", "once_cell", + "reqwest", "rmp-serde", "rustrict", "serde", "serde_json", "strum", "tracing", - "uuid 1.1.2", + "uuid 1.2.2", ] [[package]] name = "shuttle-deployer" -version = "0.7.0" +version = "0.8.0" dependencies = [ "anyhow", "async-trait", "axum", - "bytes 1.2.1", + "bytes 1.3.0", "cargo", "cargo_metadata", "chrono", - "clap 3.2.17", + "clap 3.2.23", "crossbeam-channel", "ctor", "flate2", @@ -5777,6 +6261,7 @@ dependencies = [ "once_cell", "opentelemetry", "opentelemetry-datadog", + "opentelemetry-http", "pipe", "rand 0.8.5", "serde", @@ -5784,7 +6269,7 @@ dependencies = [ "shuttle-common", "shuttle-proto", "shuttle-service", - "sqlx 0.6.1", + "sqlx", "strum", "tar", "tempdir", @@ -5797,37 +6282,47 @@ dependencies = [ "tracing", "tracing-opentelemetry", "tracing-subscriber", - "uuid 1.1.2", + "uuid 1.2.2", ] [[package]] name = "shuttle-gateway" -version = "0.7.0" +version = "0.8.0" dependencies = [ + "acme2", "anyhow", "async-trait", "axum", - "base64 0.13.0", + "axum-server", + "base64 0.13.1", "bollard", "chrono", - "clap 4.0.18", + "clap 4.0.27", "colored", "fqdn", "futures", "http 0.2.8", "hyper", "hyper-reverse-proxy 0.5.2-dev (git+https://github.com/chesedo/hyper-reverse-proxy?branch=bug/host_header)", + "instant-acme", + "lazy_static", + "num_cpus", "once_cell", "opentelemetry", "opentelemetry-datadog", + "opentelemetry-http", + "pem", "portpicker", "rand 0.8.5", - "regex", + "rcgen", + "rustls", + "rustls-pemfile 1.0.1", "serde", "serde_json", "shuttle-common", "snailquote", - "sqlx 0.5.13", + "sqlx", + "strum", "tempfile", "tokio", "tower", @@ -5835,11 +6330,13 @@ dependencies = [ "tracing", "tracing-opentelemetry", "tracing-subscriber", + "ttl_cache", + "uuid 1.2.2", ] [[package]] name = "shuttle-proto" -version = "0.7.0" +version = "0.8.0" dependencies = [ "prost", "prost-types", @@ -5850,12 +6347,11 @@ dependencies = [ [[package]] name = "shuttle-provisioner" -version = "0.7.0" +version = "0.8.0" dependencies = [ "aws-config", "aws-sdk-rds", - "aws-smithy-types", - "clap 3.2.17", + "clap 3.2.23", "ctor", "fqdn", "mongodb", @@ -5865,7 +6361,7 @@ dependencies = [ "rand 0.8.5", "serde_json", "shuttle-proto", - "sqlx 0.6.1", + "sqlx", "thiserror", "tokio", "tonic", @@ -5881,7 +6377,7 @@ dependencies = [ "anyhow", "async-trait", "cap-std", - "clap 4.0.18", + "clap 4.0.27", "hyper", "rmp-serde", "serenity", @@ -5894,7 +6390,7 @@ dependencies = [ "tonic", "tracing", "tracing-subscriber", - "uuid 1.1.2", + "uuid 1.2.2", "wasi-common", "wasmtime", "wasmtime-wasi", @@ -5902,7 +6398,7 @@ dependencies = [ [[package]] name = "shuttle-secrets" -version = "0.7.0" +version = "0.8.0" dependencies = [ "async-trait", "shuttle-service", @@ -5911,8 +6407,9 @@ dependencies = [ [[package]] name = "shuttle-service" -version = "0.7.0" +version = "0.8.0" dependencies = [ + "actix-web", "anyhow", "async-std", "async-trait", @@ -5925,6 +6422,7 @@ dependencies = [ "futures", "hyper", "libloading", + "num_cpus", "pipe", "poem", "portpicker", @@ -5934,7 +6432,7 @@ dependencies = [ "serenity", "shuttle-codegen", "shuttle-common", - "sqlx 0.6.1", + "sqlx", "sync_wrapper", "thiserror", "thruster", @@ -5943,7 +6441,7 @@ dependencies = [ "tower", "tracing", "tracing-subscriber", - "uuid 1.1.2", + "uuid 1.2.2", "warp", ] @@ -6074,9 +6572,9 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.1.8" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" +checksum = "f87e292b4291f154971a43c3774364e2cbcaec599d3f5bf6fa9d122885dbc38a" dependencies = [ "itertools", "nom", @@ -6085,85 +6583,28 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b" -dependencies = [ - "sqlx-core 0.5.13", - "sqlx-macros 0.5.13", -] - -[[package]] -name = "sqlx" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "788841def501aabde58d3666fcea11351ec3962e6ea75dbcd05c84a71d68bcd1" -dependencies = [ - "sqlx-core 0.6.1", - "sqlx-macros 0.6.1", -] - -[[package]] -name = "sqlx-core" -version = "0.5.13" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" +checksum = "9249290c05928352f71c077cc44a464d880c63f26f7534728cca008e135c0428" dependencies = [ - "ahash", - "atoi 0.4.0", - "bitflags", - "byteorder", - "bytes 1.2.1", - "crc 2.1.0", - "crossbeam-queue", - "either", - "event-listener", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "hashlink 0.7.0", - "hex 0.4.3", - "indexmap", - "itoa 1.0.2", - "libc", - "libsqlite3-sys", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.19.1", - "serde", - "serde_json", - "sha2 0.10.2", - "smallvec", - "sqlformat", - "sqlx-rt 0.5.13", - "stringprep", - "thiserror", - "tokio-stream", - "url", - "webpki 0.21.4", - "webpki-roots 0.21.1", + "sqlx-core", + "sqlx-macros", ] [[package]] name = "sqlx-core" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d3b5e7cadfe9ba7cdc1295f72cc556c750b4419c27c219c0693198901f8e" +checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" dependencies = [ "ahash", - "atoi 1.0.0", - "base64 0.13.0", + "atoi", + "base64 0.13.1", "bitflags", "byteorder", - "bytes 1.2.1", + "bytes 1.3.0", "chrono", - "crc 3.0.0", + "crc", "crossbeam-queue", "dirs", "dotenvy", @@ -6175,7 +6616,7 @@ dependencies = [ "futures-executor", "futures-intrusive", "futures-util", - "hashlink 0.8.0", + "hashlink", "hex 0.4.3", "hkdf 0.12.3", "hmac 0.12.1", @@ -6192,75 +6633,44 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha-1 0.10.0", + "sha1 0.10.4", "sha2 0.10.2", "smallvec", "sqlformat", - "sqlx-rt 0.6.1", + "sqlx-rt", "stringprep", "thiserror", "tokio-stream", "url", - "uuid 1.1.2", + "uuid 1.2.2", "whoami", ] [[package]] name = "sqlx-macros" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1" -dependencies = [ - "dotenv", - "either", - "heck", - "once_cell", - "proc-macro2 1.0.43", - "quote 1.0.21", - "serde_json", - "sha2 0.10.2", - "sqlx-core 0.5.13", - "sqlx-rt 0.5.13", - "syn 1.0.99", - "url", -] - -[[package]] -name = "sqlx-macros" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4adfd2df3557bddd3b91377fc7893e8fa899e9b4061737cbade4e1bb85f1b45c" +checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" dependencies = [ "dotenvy", "either", "heck", "once_cell", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "serde_json", "sha2 0.10.2", - "sqlx-core 0.6.1", - "sqlx-rt 0.6.1", - "syn 1.0.99", + "sqlx-core", + "sqlx-rt", + "syn 1.0.104", "url", ] [[package]] name = "sqlx-rt" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" -dependencies = [ - "once_cell", - "tokio", - "tokio-rustls 0.22.0", -] - -[[package]] -name = "sqlx-rt" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be52fc7c96c136cedea840ed54f7d446ff31ad670c9dea95ebcb998530971a3" +checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396" dependencies = [ "native-tls", "once_cell", @@ -6327,11 +6737,11 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "serde", "serde_derive", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -6341,13 +6751,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" dependencies = [ "base-x", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "serde", "serde_derive", "serde_json", "sha1 0.6.1", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -6397,10 +6807,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4faebde00e8ff94316c01800f9054fd2ba77d30d9e922541913051d1d978918b" dependencies = [ "heck", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "rustversion", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -6441,11 +6851,11 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.99" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +checksum = "4ae548ec36cf198c0ef7710d3c230987c2d6d7bd98ad6edc0274462724c585ce" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "unicode-ident", ] @@ -6466,9 +6876,9 @@ dependencies = [ "bitflags", "cap-fs-ext", "cap-std", - "io-lifetimes", - "rustix", - "windows-sys", + "io-lifetimes 0.7.4", + "rustix 0.35.12", + "windows-sys 0.36.1", "winx", ] @@ -6556,6 +6966,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "terminal_size" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb20089a8ba2b69debd491f8d2d023761cbf196e999218c591fa1e7e15a21907" +dependencies = [ + "rustix 0.36.3", + "windows-sys 0.42.0", +] + +[[package]] +name = "termtree" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059e91184749cb66be6dc994f67f182b6d897cb3df74a5bf66b5e709295fd8" + [[package]] name = "test-context" version = "0.1.4" @@ -6574,7 +7000,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8901a55b0a7a06ebc4a674dcca925170da8e613fa3b163a1df804ed10afb154d" dependencies = [ "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -6589,12 +7015,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" -dependencies = [ - "terminal_size", -] +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" @@ -6611,9 +7034,9 @@ version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -6627,13 +7050,13 @@ dependencies = [ [[package]] name = "thruster" -version = "1.2.6" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bc22b1c2267be6d1769c6d787936201341f03c915456ed8a8db8d40d665215f" +checksum = "910effe6fa8063f44f9f2f4d15d758270a679562414235c6781bf3b606b72682" dependencies = [ "async-trait", "bytes 0.5.6", - "bytes 1.2.1", + "bytes 1.3.0", "fnv", "futures", "http 0.1.21", @@ -6755,10 +7178,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" dependencies = [ "proc-macro-hack", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "standback", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -6778,17 +7201,16 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.20.1" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" +checksum = "d76ce4a75fb488c605c54bf610f221cea8b0dafb53333c1a67e8ee199dcd2ae3" dependencies = [ "autocfg 1.1.0", - "bytes 1.2.1", + "bytes 1.3.0", "libc", "memchr", "mio", "num_cpus", - "once_cell", "parking_lot 0.12.1", "pin-project-lite 0.2.9", "signal-hook-registry", @@ -6813,9 +7235,9 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -6828,26 +7250,15 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls 0.19.1", - "tokio", - "webpki 0.21.4", -] - [[package]] name = "tokio-rustls" version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.20.6", + "rustls", "tokio", - "webpki 0.22.0", + "webpki", ] [[package]] @@ -6868,25 +7279,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53474327ae5e166530d17f2d956afcb4f8a004de581b3cae10f12006bc8163e3" dependencies = [ "async-stream", - "bytes 1.2.1", + "bytes 1.3.0", "futures-core", "tokio", "tokio-stream", ] -[[package]] -name = "tokio-tungstenite" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511de3f85caf1c98983545490c3d09685fa8eb634e57eec22bb4db271f46cbd8" -dependencies = [ - "futures-util", - "log", - "pin-project", - "tokio", - "tungstenite 0.14.0", -] - [[package]] name = "tokio-tungstenite" version = "0.17.2" @@ -6898,7 +7296,7 @@ dependencies = [ "native-tls", "tokio", "tokio-native-tls", - "tungstenite 0.17.3", + "tungstenite", ] [[package]] @@ -6907,7 +7305,7 @@ version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "futures-core", "futures-io", "futures-sink", @@ -6923,7 +7321,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "futures-core", "futures-sink", "pin-project-lite 0.2.9", @@ -6957,6 +7355,12 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808b51e57d0ef8f71115d8f3a01e7d3750d01c79cac4b3eda910f4389fdf92fd" + [[package]] name = "toml_edit" version = "0.14.4" @@ -6970,17 +7374,29 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1541ba70885967e662f69d31ab3aeca7b1aaecfcd58679590b893e9239c3646" +dependencies = [ + "combine", + "indexmap", + "itertools", + "toml_datetime", +] + [[package]] name = "tonic" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b9af819e54b8f33d453655bef9b9acc171568fb49523078d0cc4e7484200ec" +checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.13.0", - "bytes 1.2.1", + "base64 0.13.1", + "bytes 1.3.0", "futures-core", "futures-util", "h2", @@ -7004,15 +7420,15 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbcd2800e34e743b9ae795867d5f77b535d3a3be69fd731e39145719752df8c" +checksum = "31fa2c5e870bdce133847d15e075333e6e1ca3fff913001fede6754f3060e367" dependencies = [ "prettyplease", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "prost-build", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -7042,7 +7458,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" dependencies = [ "bitflags", - "bytes 1.2.1", + "bytes 1.3.0", "futures-core", "futures-util", "http 0.2.8", @@ -7059,9 +7475,9 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba" dependencies = [ - "base64 0.13.0", + "base64 0.13.1", "bitflags", - "bytes 1.2.1", + "bytes 1.3.0", "futures-core", "futures-util", "http 0.2.8", @@ -7076,9 +7492,9 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" [[package]] name = "tower-service" @@ -7105,9 +7521,9 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", ] [[package]] @@ -7143,9 +7559,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.17.4" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +checksum = "21ebb87a95ea13271332df069020513ab70bdb5637ca42d6e492dc3bbbad48de" dependencies = [ "once_cell", "opentelemetry", @@ -7186,7 +7602,7 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna", + "idna 0.2.3", "ipnet", "lazy_static", "log", @@ -7226,9 +7642,9 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "trybuild" -version = "1.0.64" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f408301c7480f9e6294eb779cfc907f54bd901a9660ef24d7f233ed5376485" +checksum = "db29f438342820400f2d9acfec0d363e987a38b2950bdb50a7069ed17b2148ee" dependencies = [ "glob", "once_cell", @@ -7240,22 +7656,12 @@ dependencies = [ ] [[package]] -name = "tungstenite" -version = "0.14.0" +name = "ttl_cache" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b2d8558abd2e276b0a8df5c05a2ec762609344191e5fd23e292c910e9165b5" +checksum = "4189890526f0168710b6ee65ceaedf1460c48a14318ceec933cb26baa492096a" dependencies = [ - "base64 0.13.0", - "byteorder", - "bytes 1.2.1", - "http 0.2.8", - "httparse", - "log", - "rand 0.8.5", - "sha-1 0.9.8", - "thiserror", - "url", - "utf-8", + "linked-hash-map", ] [[package]] @@ -7264,20 +7670,20 @@ version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" dependencies = [ - "base64 0.13.0", + "base64 0.13.1", "byteorder", - "bytes 1.2.1", + "bytes 1.3.0", "http 0.2.8", "httparse", "log", "native-tls", "rand 0.8.5", - "rustls 0.20.6", - "sha-1 0.10.0", + "rustls", + "sha-1", "thiserror", "url", "utf-8", - "webpki 0.22.0", + "webpki", ] [[package]] @@ -7295,22 +7701,9 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", -] - -[[package]] -name = "typed-headers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3179a61e9eccceead5f1574fd173cf2e162ac42638b9bf214c6ad0baf7efa24a" -dependencies = [ - "base64 0.11.0", - "bytes 0.5.6", - "chrono", - "http 0.2.8", - "mime", + "syn 1.0.104", ] [[package]] @@ -7422,33 +7815,32 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "ureq" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9399fa2f927a3d327187cbd201480cee55bee6ac5d3c77dd27f0c6814cff16d5" +checksum = "b97acb4c28a254fd7a4aeec976c46a7fa404eac4d7c134b30c75144846d7cb8f" dependencies = [ - "base64 0.13.0", + "base64 0.13.1", "chunked_transfer", "log", "native-tls", "once_cell", - "rustls 0.20.6", + "rustls", "serde", "serde_json", "socks", "url", - "webpki 0.22.0", - "webpki-roots 0.22.3", + "webpki", + "webpki-roots", ] [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", - "idna", - "matches", + "idna 0.3.0", "percent-encoding", "serde", ] @@ -7491,9 +7883,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.1.2" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" +checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" dependencies = [ "getrandom 0.2.7", "serde", @@ -7548,10 +7940,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", ] +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "waker-fn" version = "1.1.0" @@ -7581,11 +7982,11 @@ dependencies = [ [[package]] name = "warp" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cef4e1e9114a4b7f1ac799f16ce71c14de5778500c5450ec6b7b920c55b587e" +checksum = "ed7b8be92646fc3d18b06147664ebc5f48d222686cb11a8755e561a735aacc6d" dependencies = [ - "bytes 1.2.1", + "bytes 1.3.0", "futures-channel", "futures-util", "headers", @@ -7597,14 +7998,15 @@ dependencies = [ "multipart", "percent-encoding", "pin-project", + "rustls-pemfile 0.2.1", "scoped-tls", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-stream", - "tokio-tungstenite 0.15.0", - "tokio-util 0.6.10", + "tokio-tungstenite", + "tokio-util 0.7.3", "tower-service", "tracing", ] @@ -7641,14 +8043,14 @@ dependencies = [ "cap-time-ext", "fs-set-times", "io-extras", - "io-lifetimes", - "is-terminal", + "io-lifetimes 0.7.4", + "is-terminal 0.3.0", "once_cell", - "rustix", + "rustix 0.35.12", "system-interface", "tracing", "wasi-common", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -7662,11 +8064,11 @@ dependencies = [ "cap-rand", "cap-std", "io-extras", - "rustix", + "rustix 0.35.12", "thiserror", "tracing", "wiggle", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -7690,9 +8092,9 @@ dependencies = [ "bumpalo", "lazy_static", "log", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", "wasm-bindgen-shared", ] @@ -7724,9 +8126,9 @@ version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7783,7 +8185,7 @@ dependencies = [ "wasmtime-jit", "wasmtime-runtime", "wat", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -7802,16 +8204,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c2101b211d9db7db8bcfb2ffa69e119fa99a20266d0e5f19bb989cb6c3280d7" dependencies = [ "anyhow", - "base64 0.13.0", + "base64 0.13.1", "bincode", "directories-next", "file-per-thread-logger", "log", - "rustix", + "rustix 0.35.12", "serde", "sha2 0.9.9", "toml", - "windows-sys", + "windows-sys 0.36.1", "zstd", ] @@ -7863,9 +8265,9 @@ checksum = "abb9b7b94f7b40d98665feca2338808cf449fa671d01be7176861f8d9aa4a012" dependencies = [ "cc", "cfg-if 1.0.0", - "rustix", + "rustix 0.35.12", "wasmtime-asm-macros", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -7884,14 +8286,14 @@ dependencies = [ "log", "object", "rustc-demangle", - "rustix", + "rustix 0.35.12", "serde", "target-lexicon", "thiserror", "wasmtime-environ", "wasmtime-jit-debug", "wasmtime-runtime", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -7902,7 +8304,7 @@ checksum = "bee06d206bcf7a875eacd1e1e957c2a63f64a92934d2535dd8e15cde6d3a9ffe" dependencies = [ "object", "once_cell", - "rustix", + "rustix 0.35.12", ] [[package]] @@ -7919,16 +8321,16 @@ dependencies = [ "log", "mach", "memfd", - "memoffset", + "memoffset 0.6.5", "paste", "rand 0.8.5", - "rustix", + "rustix 0.35.12", "thiserror", "wasmtime-asm-macros", "wasmtime-environ", "wasmtime-fiber", "wasmtime-jit-debug", - "windows-sys", + "windows-sys 0.36.1", ] [[package]] @@ -7998,28 +8400,20 @@ dependencies = [ [[package]] name = "webbrowser" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a3cffdb686fbb24d9fb8f03a213803277ed2300f11026a3afe1f108dc021b" +checksum = "2a0cc7962b5aaa0dfcebaeef0161eec6edf5f4606c12e6777fd7d392f52033a5" dependencies = [ "jni", - "ndk-glue", + "ndk-context", + "objc", + "raw-window-handle", "url", "web-sys", "widestring", "winapi", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki" version = "0.22.0" @@ -8030,22 +8424,13 @@ dependencies = [ "untrusted", ] -[[package]] -name = "webpki-roots" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" -dependencies = [ - "webpki 0.21.4", -] - [[package]] name = "webpki-roots" version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf" dependencies = [ - "webpki 0.22.0", + "webpki", ] [[package]] @@ -8107,10 +8492,10 @@ checksum = "0321263a6b1ba1e0a97174524891a14907cee68cfa183fd5389088dffbeab668" dependencies = [ "anyhow", "heck", - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", "shellexpand", - "syn 1.0.99", + "syn 1.0.104", "witx", ] @@ -8120,9 +8505,9 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa3d3794e5d68ef69f30e65f267c6bf18c920750d3ccd2a3ac04e77d95f66b96" dependencies = [ - "proc-macro2 1.0.43", + "proc-macro2 1.0.47", "quote 1.0.21", - "syn 1.0.99", + "syn 1.0.104", "wiggle-generate", ] @@ -8163,43 +8548,100 @@ version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.0", + "windows_i686_gnu 0.42.0", + "windows_i686_msvc 0.42.0", + "windows_x86_64_gnu 0.42.0", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + [[package]] name = "windows_aarch64_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" + [[package]] name = "windows_i686_gnu" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +[[package]] +name = "windows_i686_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" + [[package]] name = "windows_i686_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +[[package]] +name = "windows_i686_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" + [[package]] name = "windows_x86_64_gnu" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" + [[package]] name = "windows_x86_64_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" + [[package]] name = "winreg" version = "0.7.0" @@ -8225,8 +8667,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7b01e010390eb263a4518c8cebf86cb67469d1511c00b749a47b64c39e8054d" dependencies = [ "bitflags", - "io-lifetimes", - "windows-sys", + "io-lifetimes 0.7.4", + "windows-sys 0.36.1", ] [[package]] @@ -8252,9 +8694,9 @@ dependencies = [ [[package]] name = "xmlparser" -version = "0.13.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" +checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" [[package]] name = "yansi" @@ -8262,6 +8704,15 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "yasna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c" +dependencies = [ + "time 0.3.11", +] + [[package]] name = "zeroize" version = "1.5.5" @@ -8299,12 +8750,12 @@ dependencies = [ [[patch.unused]] name = "shuttle-aws-rds" -version = "0.7.0" +version = "0.8.0" [[patch.unused]] name = "shuttle-persist" -version = "0.7.0" +version = "0.8.0" [[patch.unused]] name = "shuttle-shared-db" -version = "0.7.0" +version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 57fa71713..5b2ed622d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "admin", "cargo-shuttle", "codegen", "common", @@ -10,6 +11,7 @@ members = [ "runtime", "service" ] + exclude = [ "e2e", "examples", @@ -17,5 +19,30 @@ exclude = [ "resources/persist", "resources/secrets", "resources/shared-db", - "tmp" + "tmp", + "resources/static-folder" ] + +[workspace.package] +version = "0.8.0" +edition = "2021" +license = "Apache-2.0" + +# https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacedependencies-table +[workspace.dependencies] +shuttle-codegen = { path = "codegen", version = "0.8.0" } +shuttle-common = { path = "common", version = "0.8.0" } +shuttle-proto = { path = "proto", version = "0.8.0" } +shuttle-service = { path = "service", version = "0.8.0" } + +anyhow = "1.0.66" +async-trait = "0.1.58" +axum = "0.6.0" +chrono = "0.4.23" +once_cell = "1.16.0" +uuid = "1.2.2" +thiserror = "1.0.37" +serde = "1.0.148" +serde_json = "1.0.89" +tracing = "0.1.37" +tracing-subscriber = "0.3.16" diff --git a/Containerfile b/Containerfile index 0d7f05959..b866f55b4 100644 --- a/Containerfile +++ b/Containerfile @@ -1,5 +1,5 @@ #syntax=docker/dockerfile-upstream:1.4.0-rc1 -FROM rust:1.63.0-buster as shuttle-build +FROM rust:1.65.0-buster as shuttle-build RUN apt-get update &&\ apt-get install -y curl # download protoc binary and unzip it in usr/bin @@ -23,24 +23,18 @@ FROM shuttle-build AS builder COPY --from=planner /build/recipe.json recipe.json RUN cargo chef cook --recipe-path recipe.json COPY --from=cache /build . -ARG crate -RUN cargo build --bin ${crate} +ARG folder +RUN cargo build --bin shuttle-${folder} -FROM rust:1.63.0-buster as shuttle-common +FROM rust:1.65.0-buster as shuttle-common RUN apt-get update &&\ apt-get install -y curl RUN rustup component add rust-src COPY --from=cache /build/ /usr/src/shuttle/ FROM shuttle-common -ARG crate -SHELL ["/bin/bash", "-c"] -RUN mkdir -p $CARGO_HOME; \ -echo $'[patch.crates-io] \n\ -shuttle-service = { path = "/usr/src/shuttle/service" } \n\ -shuttle-aws-rds = { path = "/usr/src/shuttle/resources/aws-rds" } \n\ -shuttle-persist = { path = "/usr/src/shuttle/resources/persist" } \n\ -shuttle-shared-db = { path = "/usr/src/shuttle/resources/shared-db" } \n\ -shuttle-secrets = { path = "/usr/src/shuttle/resources/secrets" }' > $CARGO_HOME/config.toml -COPY --from=builder /build/target/debug/${crate} /usr/local/bin/service +ARG folder +COPY ${folder}/prepare.sh /prepare.sh +RUN /prepare.sh +COPY --from=builder /build/target/debug/shuttle-${folder} /usr/local/bin/service ENTRYPOINT ["/usr/local/bin/service"] diff --git a/Makefile b/Makefile index aa4cb75cc..ee94af8f2 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,9 @@ endif BUILDX_FLAGS=$(BUILDX_OP) $(PLATFORM_FLAGS) $(CACHE_FLAGS) TAG?=$(shell git describe --tags) +BACKEND_TAG?=$(TAG) +DEPLOYER_TAG?=$(TAG) +PROVISIONER_TAG?=$(TAG) DOCKER?=docker @@ -37,30 +40,38 @@ ifeq ($(PROD),true) DOCKER_COMPOSE_FILES=-f docker-compose.yml STACK=shuttle-prod APPS_FQDN=shuttleapp.rs -DB_FQDN=pg.shuttle.rs +DB_FQDN=db.shuttle.rs CONTAINER_REGISTRY=public.ecr.aws/shuttle +DD_ENV=production +# make sure we only ever go to production with `--tls=enable` +USE_TLS=enable else DOCKER_COMPOSE_FILES=-f docker-compose.yml -f docker-compose.dev.yml -STACK=shuttle-dev +STACK?=shuttle-dev APPS_FQDN=unstable.shuttleapp.rs -DB_FQDN=pg.unstable.shuttle.rs +DB_FQDN=db.unstable.shuttle.rs CONTAINER_REGISTRY=public.ecr.aws/shuttle-dev +DD_ENV=unstable +USE_TLS?=disable endif POSTGRES_EXTRA_PATH?=./extras/postgres -POSTGRES_TAG?=latest +POSTGRES_TAG?=14 + +PANAMAX_EXTRA_PATH?=./extras/panamax +PANAMAX_TAG?=1.0.6 RUST_LOG?=debug -DOCKER_COMPOSE_ENV=STACK=$(STACK) BACKEND_TAG=$(TAG) PROVISIONER_TAG=$(TAG) POSTGRES_TAG=14 APPS_FQDN=$(APPS_FQDN) DB_FQDN=$(DB_FQDN) POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) RUST_LOG=$(RUST_LOG) CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) MONGO_INITDB_ROOT_USERNAME=$(MONGO_INITDB_ROOT_USERNAME) MONGO_INITDB_ROOT_PASSWORD=$(MONGO_INITDB_ROOT_PASSWORD) +DOCKER_COMPOSE_ENV=STACK=$(STACK) BACKEND_TAG=$(BACKEND_TAG) DEPLOYER_TAG=$(DEPLOYER_TAG) PROVISIONER_TAG=$(PROVISIONER_TAG) POSTGRES_TAG=${POSTGRES_TAG} PANAMAX_TAG=${PANAMAX_TAG} APPS_FQDN=$(APPS_FQDN) DB_FQDN=$(DB_FQDN) POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) RUST_LOG=$(RUST_LOG) CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) MONGO_INITDB_ROOT_USERNAME=$(MONGO_INITDB_ROOT_USERNAME) MONGO_INITDB_ROOT_PASSWORD=$(MONGO_INITDB_ROOT_PASSWORD) DD_ENV=$(DD_ENV) USE_TLS=$(USE_TLS) -.PHONY: images clean src up down deploy shuttle-% postgres docker-compose.rendered.yml test +.PHONY: images clean src up down deploy shuttle-% postgres docker-compose.rendered.yml test bump-% deploy-examples publish publish-% --validate-version clean: rm .shuttle-* rm docker-compose.rendered.yml -images: shuttle-provisioner shuttle-deployer shuttle-gateway postgres +images: shuttle-provisioner shuttle-deployer shuttle-gateway postgres panamax postgres: docker buildx build \ @@ -70,8 +81,16 @@ postgres: -f $(POSTGRES_EXTRA_PATH)/Containerfile \ $(POSTGRES_EXTRA_PATH) +panamax: + docker buildx build \ + --build-arg PANAMAX_TAG=$(PANAMAX_TAG) \ + --tag $(CONTAINER_REGISTRY)/panamax:$(PANAMAX_TAG) \ + $(BUILDX_FLAGS) \ + -f $(PANAMAX_EXTRA_PATH)/Containerfile \ + $(PANAMAX_EXTRA_PATH) + docker-compose.rendered.yml: docker-compose.yml docker-compose.dev.yml - $(DOCKER_COMPOSE_ENV) $(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) -p $(STACK) config > $@ + $(DOCKER_COMPOSE_ENV) $(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) $(DOCKER_COMPOSE_CONFIG_FLAGS) -p $(STACK) config > $@ deploy: docker-compose.yml $(DOCKER_COMPOSE_ENV) docker stack deploy -c $< $(STACK) @@ -79,18 +98,129 @@ deploy: docker-compose.yml test: cd e2e; POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) APPS_FQDN=$(APPS_FQDN) cargo test $(CARGO_TEST_FLAGS) -- --nocapture -up: docker-compose.rendered.yml images - CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) $(DOCKER_COMPOSE) -f $< -p $(STACK) up -d +up: docker-compose.rendered.yml + CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) $(DOCKER_COMPOSE) -f $< -p $(STACK) up -d $(DOCKER_COMPOSE_FLAGS) down: docker-compose.rendered.yml - CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) $(DOCKER_COMPOSE) -f $< -p $(STACK) down + CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) $(DOCKER_COMPOSE) -f $< -p $(STACK) down $(DOCKER_COMPOSE_FLAGS) shuttle-%: ${SRC} Cargo.lock docker buildx build \ - --build-arg crate=shuttle-$(*) \ + --build-arg folder=$(*) \ --tag $(CONTAINER_REGISTRY)/$(*):$(COMMIT_SHA) \ --tag $(CONTAINER_REGISTRY)/$(*):$(TAG) \ --tag $(CONTAINER_REGISTRY)/$(*):latest \ $(BUILDX_FLAGS) \ -f Containerfile \ . + +# Bunch of targets to make bumping the shuttle version easier +# +# Dependencies: git, cargo-edit, fastmod, ripgrep +# Usage: make bump-version current=0.6.3 version=0.7.0 +bump-version: --validate-version + git checkout development + git fetch --all + git pull upstream + git checkout -b "chore/v$(version)" + cargo set-version --workspace "$(version)" + + $(call next, bump-resources) + +bump-resources: + git commit -m "chore: v$(version)" + fastmod --fixed-strings $(current) $(version) resources + + $(call next, bump-examples) + +bump-examples: + git commit -m "chore: resources v$(version)" + fastmod --fixed-strings $(current) $(version) examples + + $(call next, bump-misc) + +bump-misc: + git commit -m "docs: v$(version)" + fastmod --fixed-strings $(current) $(version) + + $(call next, bump-final) + +bump-final: + git commit -m "misc: v$(version)" + git push --set-upstream origin $$(git rev-parse --abbrev-ref HEAD) + + echo "Make pull request and confirm everything is okay. Then run:" + echo "make publish" + +# Deploy all our example using the command set in shuttle-command +# Usage: make deploy-example shuttle-command="cargo shuttle" -j 2 +deploy-examples: deploy-examples/rocket/hello-world \ + deploy-examples/rocket/persist \ + deploy-examples/rocket/postgres \ + deploy-examples/rocket/secrets \ + deploy-examples/rocket/authentication \ + deploy-examples/axum/hello-world \ + deploy-examples/axum/websocket \ + deploy-examples/poem/hello-world \ + deploy-examples/poem/mongodb \ + deploy-examples/poem/postgres \ + deploy-examples/salvo/hello-world \ + deploy-examples/tide/hello-world \ + deploy-examples/tide/postgres \ + deploy-examples/tower/hello-world \ + deploy-examples/warp/hello-world \ + + echo "All example have been redeployed" + +deploy-examples/%: + cd examples/$(*); $(shuttle-command) project rm || echo -e "\x1B[33m>> Nothing to remove for $*\x1B[39m" + sleep 5 + cd examples/$(*); $(shuttle-command) project new + sleep 5 + cd examples/$(*); $(shuttle-command) deploy + +define next + cargo check # To update Cargo.lock + git add --all + git --no-pager diff --staged + + echo -e "\x1B[36m>> Is this correct?\x1B[39m" + read yn; if [ $$yn != "y" ]; then echo "Fix the issues then continue with:"; echo "make version=$(version) current=$(current) $1"; exit 2; fi + + make $1 +endef + +# Publish all our crates to crates.io +# See CONTRIBUTING.md for the dependency graph +# Usage: make publish -j 4 +publish: publish-resources publish-cargo-shuttle + echo "The branch can now be safely merged" + +publish-resources: publish-resources/aws-rds \ + publish-resources/persist \ + publish-resources/shared-db + publish-resources/static-folder + +publish-cargo-shuttle: publish-resources/secrets + cd cargo-shuttle; cargo publish + sleep 10 # Wait for crates.io to update + +publish-service: publish-codegen publish-common + cd service; cargo publish + sleep 10 # Wait for crates.io to update + +publish-codegen: + cd codegen; cargo publish + sleep 10 # Wait for crates.io to update + +publish-common: + cd common; cargo publish + sleep 10 # Wait for crates.io to update + +publish-resources/%: publish-service + cd resources/$(*); cargo publish + sleep 10 # Wait for crates.io to update + +--validate-version: + echo "$(version)" | rg -q "\d+\.\d+\.\d+" || { echo "version argument must be in the form x.y.z"; exit 1; } + echo "$(current)" | rg -q "\d+\.\d+\.\d+" || { echo "current argument must be in the form x.y.z"; exit 1; } diff --git a/README.md b/README.md index 16af5b211..5349720f0 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,9 @@ Shuttle is built for productivity, reliability and performance: - Zero-Configuration support for Rust using annotations - Automatic resource provisioning (databases, caches, subdomains, etc.) via [Infrastructure-From-Code](https://www.shuttle.rs/blog/2022/05/09/ifc) -- First-class support for popular Rust frameworks ([Rocket](https://docs.shuttle.rs/guide/rocket-examples.html), [Axum](https://docs.shuttle.rs/guide/axum-examples.html), - [Tide](https://docs.shuttle.rs/guide/tide-examples.html), [Poem](https://docs.shuttle.rs/guide/poem-examples.html) and [Tower](https://docs.shuttle.rs/guide/tower-examples.html)) -- Support for deploying Discord bots using [Serenity](https://docs.shuttle.rs/guide/serenity-examples.html) +- First-class support for popular Rust frameworks ([Rocket](https://docs.shuttle.rs/examples/rocket), [Axum](https://docs.shuttle.rs/examples/axum), + [Tide](https://docs.shuttle.rs/examples/tide), [Poem](https://docs.shuttle.rs/examples/poem) and [Tower](https://docs.shuttle.rs/examples/tower)) +- Support for deploying Discord bots using [Serenity](https://docs.shuttle.rs/examples/serenity) - Scalable hosting (with optional self-hosting) 📖 Check out our documentation to get started quickly: [docs.shuttle.rs](https://docs.shuttle.rs) @@ -82,7 +82,7 @@ For the full documentation, visit [our docs](https://docs.shuttle.rs). Contributing to shuttle is highly encouraged! -If you want to setup a local environment to test code changes to core `shuttle` packages, or want to contribute to the project check out [our docs](https://docs.shuttle.rs/guide/contribute.html). +If you want to setup a local environment to test code changes to core `shuttle` packages, or want to contribute to the project check out [our docs](https://docs.shuttle.rs/community/contribute). Even if you are not planning to submit any code; joining our [Discord server](https://discord.gg/shuttle) and providing feedback helps us a lot! diff --git a/admin/Cargo.toml b/admin/Cargo.toml new file mode 100644 index 000000000..00bcefa0e --- /dev/null +++ b/admin/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "shuttle-admin" +version = "0.8.0" +edition = "2021" + +[dependencies] +anyhow = { workspace = true } +clap = { version = "4.0.27", features = [ "derive", "env" ] } +dirs = "4.0.0" +reqwest = { version = "0.11.13", features = ["json"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } +toml = "0.5.9" +tracing = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter"] } + +[dependencies.shuttle-common] +workspace = true +features = ["models"] diff --git a/admin/README.md b/admin/README.md new file mode 100644 index 000000000..6d56d6266 --- /dev/null +++ b/admin/README.md @@ -0,0 +1,34 @@ +_Small utility used by the shuttle admin for common tasks_ + +## How to test custom domain certificates locally +For local testing it is easiest to use the [Pebble](https://github.com/letsencrypt/pebble) server. So install it using +whatever method works for your system. It is included in the nix environment if you use it though. + +To start the `Pebble` server you'll need some config, a root CA and a certificate signed with the CA. The easiest way +to get all these is to get them from the [pebble/test](https://github.com/letsencrypt/pebble/tree/main/test) folder. + +You should now be able to start `Pebble` locally. If you used the `pebble/test` folder, then your important +variables are as follow: + +- *Server url*: `https://localhost:14000/dir` +- *CA location*: `$PWD/test/certs/pebble.minica.pem` + +Next you'll need `gateway` to use this CA when checking the TLS connection with localhost. This can be done by +setting the `SSL_CERT_FILE` environment variable. + +``` shell +export SSL_CERT_FILE="$PWD/test/certs/pebble.minica.pem" +``` + +When `gateway` now runs, it will use this root certificate to check the certificate presented by `Pebble`. + +Now you'll want this admin client to use the local `Pebble` server when making new account. Therefore, use the +following command when you create new accounts + +``` shell +cargo run -p shuttle-admin -- --api-url http://localhost:8001 acme create-account --acme-server https://localhost:14000/dir --email +``` + +Safe the account JSON in a local file and use it to test creating new certificate. However, you'll the FQDN you're +using for testnig to resolve to your local machine. So create an `A` record for it on your DNS with the value +`127.0.0.1`. And Bob's your uncle 🎉 diff --git a/admin/src/args.rs b/admin/src/args.rs new file mode 100644 index 000000000..e7ae68122 --- /dev/null +++ b/admin/src/args.rs @@ -0,0 +1,71 @@ +use std::path::PathBuf; + +use clap::{Parser, Subcommand}; +use shuttle_common::project::ProjectName; + +#[derive(Parser, Debug)] +pub struct Args { + /// run this command against the api at the supplied url + #[arg(long, default_value = "https://api.shuttle.rs", env = "SHUTTLE_API")] + pub api_url: String, + + #[command(subcommand)] + pub command: Command, +} + +#[derive(Subcommand, Debug)] +pub enum Command { + /// Try to revive projects in the crashed state + Revive, + + /// Manage custom domains + #[command(subcommand)] + Acme(AcmeCommand), + + /// Manage project names + ProjectNames, + + /// Viewing and managing stats + #[command(subcommand)] + Stats(StatsCommand), +} + +#[derive(Subcommand, Debug)] +pub enum AcmeCommand { + /// Create a new ACME account. Should only be needed once + CreateAccount { + /// Email for managing all certificates + #[arg(long)] + email: String, + + /// Acme server to create account on. Gateway will default to LetsEncrypt + #[arg(long)] + acme_server: Option, + }, + + /// Request a certificate for a FQDN + RequestCertificate { + /// Fqdn to request certificate for + #[arg(long)] + fqdn: String, + + /// Project to request certificate for + #[arg(long)] + project: ProjectName, + + /// Path to acme credentials file + /// This should have been created with `acme create-account` + #[arg(long)] + credentials: PathBuf, + }, +} + +#[derive(Subcommand, Debug)] +pub enum StatsCommand { + /// View load stats + Load { + /// Clear the loads counter + #[arg(long)] + clear: bool, + }, +} diff --git a/admin/src/client.rs b/admin/src/client.rs new file mode 100644 index 000000000..43e756a78 --- /dev/null +++ b/admin/src/client.rs @@ -0,0 +1,114 @@ +use anyhow::{Context, Result}; +use serde::{de::DeserializeOwned, Serialize}; +use shuttle_common::{ + models::{project, stats, ToJson}, + project::ProjectName, +}; +use tracing::trace; + +pub struct Client { + api_url: String, + api_key: String, +} + +impl Client { + pub fn new(api_url: String, api_key: String) -> Self { + Self { api_url, api_key } + } + + pub async fn revive(&self) -> Result { + self.post("/admin/revive", Option::::None).await + } + + pub async fn acme_account_create( + &self, + email: &str, + acme_server: Option, + ) -> Result { + let path = format!("/admin/acme/{email}"); + self.post(&path, Some(acme_server)).await + } + + pub async fn acme_request_certificate( + &self, + fqdn: &str, + project_name: &ProjectName, + credentials: &serde_json::Value, + ) -> Result { + let path = format!("/admin/acme/request/{project_name}/{fqdn}"); + self.post(&path, Some(credentials)).await + } + + pub async fn get_projects(&self) -> Result> { + self.get("/admin/projects").await + } + + pub async fn get_load(&self) -> Result { + self.get("/admin/stats/load").await + } + + pub async fn clear_load(&self) -> Result { + self.delete("/admin/stats/load", Option::::None) + .await + } + + async fn post( + &self, + path: &str, + body: Option, + ) -> Result { + trace!(self.api_key, "using api key"); + + let mut builder = reqwest::Client::new() + .post(format!("{}{}", self.api_url, path)) + .bearer_auth(&self.api_key); + + if let Some(body) = body { + builder = builder.json(&body); + } + + builder + .send() + .await + .context("failed to make post request")? + .to_json() + .await + .context("failed to extract json body from post response") + } + + async fn delete( + &self, + path: &str, + body: Option, + ) -> Result { + trace!(self.api_key, "using api key"); + + let mut builder = reqwest::Client::new() + .delete(format!("{}{}", self.api_url, path)) + .bearer_auth(&self.api_key); + + if let Some(body) = body { + builder = builder.json(&body); + } + + builder + .send() + .await + .context("failed to make delete request")? + .to_json() + .await + .context("failed to extract json body from delete response") + } + + async fn get(&self, path: &str) -> Result { + reqwest::Client::new() + .get(format!("{}{}", self.api_url, path)) + .bearer_auth(&self.api_key) + .send() + .await + .context("failed to make post request")? + .to_json() + .await + .context("failed to post text body from response") + } +} diff --git a/admin/src/config.rs b/admin/src/config.rs new file mode 100644 index 000000000..5b63f955a --- /dev/null +++ b/admin/src/config.rs @@ -0,0 +1,18 @@ +use std::{fs, path::PathBuf}; + +pub fn get_api_key() -> String { + let data = fs::read_to_string(config_path()).expect("shuttle config file to exist"); + let toml: toml::Value = toml::from_str(&data).expect("to parse shuttle config file"); + + toml["api_key"] + .as_str() + .expect("api key to be a string") + .to_string() +} + +fn config_path() -> PathBuf { + dirs::config_dir() + .expect("system to have a config path") + .join("shuttle") + .join("config.toml") +} diff --git a/admin/src/lib.rs b/admin/src/lib.rs new file mode 100644 index 000000000..f1c9fb465 --- /dev/null +++ b/admin/src/lib.rs @@ -0,0 +1,3 @@ +pub mod args; +pub mod client; +pub mod config; diff --git a/admin/src/main.rs b/admin/src/main.rs new file mode 100644 index 000000000..55cb40ee5 --- /dev/null +++ b/admin/src/main.rs @@ -0,0 +1,161 @@ +use clap::Parser; +use shuttle_admin::{ + args::{AcmeCommand, Args, Command, StatsCommand}, + client::Client, + config::get_api_key, +}; +use std::{ + collections::{hash_map::RandomState, HashMap}, + fmt::Write, + fs, +}; +use tracing::trace; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + + let args = Args::parse(); + + trace!(?args, "starting with args"); + + let api_key = get_api_key(); + let client = Client::new(args.api_url.clone(), api_key); + + let res = match args.command { + Command::Revive => client.revive().await.expect("revive to succeed"), + Command::Acme(AcmeCommand::CreateAccount { email, acme_server }) => { + let account = client + .acme_account_create(&email, acme_server) + .await + .expect("to create ACME account"); + + let mut res = String::new(); + writeln!(res, "Details of ACME account are as follow. Keep this safe as it will be needed to create certificates in the future").unwrap(); + writeln!(res, "{}", serde_json::to_string_pretty(&account).unwrap()).unwrap(); + + res + } + Command::Acme(AcmeCommand::RequestCertificate { + fqdn, + project, + credentials, + }) => { + let credentials = fs::read_to_string(credentials).expect("to read credentials file"); + let credentials = + serde_json::from_str(&credentials).expect("to parse content of credentials file"); + + client + .acme_request_certificate(&fqdn, &project, &credentials) + .await + .expect("to get a certificate challenge response") + } + Command::ProjectNames => { + let projects = client + .get_projects() + .await + .expect("to get list of projects"); + + let projects: HashMap = HashMap::from_iter( + projects + .into_iter() + .map(|project| (project.project_name, project.account_name)), + ); + + let mut res = String::new(); + + for (project_name, account_name) in &projects { + let mut issues = Vec::new(); + let cleaned_name = project_name.to_lowercase(); + + // Were there any uppercase characters + if &cleaned_name != project_name { + // Since there were uppercase characters, will the new name clash with any existing projects + if let Some(other_account) = projects.get(&cleaned_name) { + if other_account == account_name { + issues.push( + "changing to lower case will clash with same owner".to_string(), + ); + } else { + issues.push(format!( + "changing to lower case will clash with another owner: {other_account}" + )); + } + } + } + + let cleaned_underscore = cleaned_name.replace('_', "-"); + // Were there any underscore cleanups + if cleaned_underscore != cleaned_name { + // Since there were underscore cleanups, will the new name clash with any existing projects + if let Some(other_account) = projects.get(&cleaned_underscore) { + if other_account == account_name { + issues + .push("cleaning underscore will clash with same owner".to_string()); + } else { + issues.push(format!( + "cleaning underscore will clash with another owner: {other_account}" + )); + } + } + } + + let cleaned_separator_name = cleaned_underscore.trim_matches('-'); + // Were there any dash cleanups + if cleaned_separator_name != cleaned_underscore { + // Since there were dash cleanups, will the new name clash with any existing projects + if let Some(other_account) = projects.get(cleaned_separator_name) { + if other_account == account_name { + issues.push("cleaning dashes will clash with same owner".to_string()); + } else { + issues.push(format!( + "cleaning dashes will clash with another owner: {other_account}" + )); + } + } + } + + // Are reserved words used + match cleaned_separator_name { + "shuttleapp" | "shuttle" => issues.push("is a reserved name".to_string()), + _ => {} + } + + // Is it longer than 63 chars + if cleaned_separator_name.len() > 63 { + issues.push("final name is too long".to_string()); + } + + // Only report of problem projects + if !issues.is_empty() { + writeln!(res, "{project_name}") + .expect("to write name of project name having issues"); + + for issue in issues { + writeln!(res, "\t- {issue}").expect("to write issue with project name"); + } + + writeln!(res).expect("to write a new line"); + } + } + + res + } + Command::Stats(StatsCommand::Load { clear }) => { + let resp = if clear { + client.clear_load().await.expect("to delete load stats") + } else { + client.get_load().await.expect("to get load stats") + }; + + let has_capacity = if resp.has_capacity { "a" } else { "no" }; + + format!( + "Currently {} builds are running and there is {} capacity for new builds", + resp.builds_count, has_capacity + ) + } + }; + + println!("{res}"); +} diff --git a/assets/v0.8.0-interactive-init.gif b/assets/v0.8.0-interactive-init.gif new file mode 100644 index 0000000000000000000000000000000000000000..74a9036aa35ada8ee774dd1261eca34c47df1d46 GIT binary patch literal 2284963 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

$_QrhQyCDV6ee<2QcgcXt7kc*TNG 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 z⁡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∓fv6pdX0YU*x&7P^kg*83!uGOi_A^wjroIT!6q9tNs4% z5ckYQke(jR@_E~sWDP-3?(hyZRFSttu;wzQ^T`VA*FI&gaFxLUQ{F4n;o8hxCA~@n zzrj(T@=~}iAo+bHrP#5MI&)pZ@AF#F@9!sVZsu2w*^UkZRzQvQ@6&gq!f;*ZY576F z&#-fZhNINu+jg@U`o%l9B)93@XMdj`>+x^j&fLbdwg2$fY_jbjy&I4uISo~ON(CCq z4DksF8ZKikI%Z;V;8s&+`=t&g%0wGmCF@e z*6bPL&ij2%vT((~<^$b!S0Z+E3x3+3b-5@1qLO+BO%rYA_oN5gAtLy=0f52+;@1Ub%4EJ__Spp!#rGyH9%?|!3Q1y zy;i6?nzcz75SupG*bxqK4*?ZE3?AS&g$e{65poa$UCRJYWjKCofc4bSKTp~+L!7-( zkh1?T_z)E6UNFK!dV}5FcaJgv!zcuf2 zG$F6>$YR1M*kNBR#J6e9$KEZfT`!1$_mtX2bOBZWZY`OQ@)*`3nv!#nqLFGRf-)zi`8(8=@~$3 zGLAmiii-t?N3lf^Lt?Ql;-2Y9O#1L*;&Bpx#x>o!Ww$Y%@r1n;jwXTFy|j!cLyZGz zLwp)S6Pf{G6GJ!hl^Cu%+9 z3v@n#Bi);_9msY}NHgp+c^Ab${^~9IM?NB;G&)eW97J}Uq`8>n2~LLpnbZVHQfmij zNc+gtCo3-Mibw;DwUbPVgg-`z8my}z(&JpU@_<_%`WI8o;ZrI1P>}1<&Cy9*%irGO ziS{NWV_kR$p`~Gnrm<@vVGE249n-Ji(+AyY zUX@$t69EhF%`DOJk?K4ZgVMwc(w^oK>F-F~r5zfziDT~xTRj9N(SZVk(jVFh{nCPd zhXeVJ(@%H+BlMv9bzreJ#rQh#>lz|sI!XL}R$2huq&D%2C2%t$ooO#493{sY_N3Jm z&7llHw#V@hbjlzTPW_q?!z3Q2t_@gB2Nr7ke58pI31e z5Iuo!;UMIRdG4aFkN3GCK3@1pn=^ErpS<~=O}?WGxx^3oMj|49w?sMzc@%tZK+gh( z4Qfk}%YJJCD+5laB_};mA=d`bnycWA3gV?lA%1#+kCVMQxafU`FUtd-bvrJBPLceo zhZxGeZVGDbN!q$B#BC6yO6qb#-phnNEJ zcw3f~fn%Xl&dOKDdy$#OkdK^Kj-OwOdXbs6QQm}BQIb(n(NO_6Q4tVX(ebUqtRjF7 zLJ-4H*`}k{-ci}LQQ7lQ`Eiw`kFUy8yz03uV@vuMe) zdM%@RqoaCDCuVV@x(2lpA)s_ur{=IDYV3hx#j^%gn?P)&28F)nr%X5|MJ+NL9{ZBP zl}`9nWccGlEgWXGBQ4PDrWoF<4lT0|qqFV>iES=1evC;S7Ndu0YE2@0{f(6ClvOR^ zW<5D$6zO9lNFEof;00b87+JoQGKaPpfOm0R3ootz(A(-{cj z>T3ckooqK^?c^-i4C%lzwR4*X=p<>N)BJ{mAG! z+w1`~_ndo$g8;qPy1jg&-M=z>A3A%fA3s!2_P*fmg6s0Y*7RPD0^ITUVRZEgIrVvn z0~#m$Kmz^RkZxS>enO_VEC(NOE`)w&_FtChq+kw6b4Oa6^iyXIFr4wBcMZhe_A)np;^oxxQP?lFj*ba9K)R*`2u5Z|t*1$+XUrxiBUzWu^jET`$s`Ad zx(HdPrqvFc_Oq-v1&A{BW_oGHPPS&?qQ=i(m?wMBT##DK>CGZaS|)qX-fhkD%FaG_ zxxo9_IqLNz+B$>#XHdK6ggYl+WLvy(VGv%u%2H^?JOK6a8=9}q?7RbwR8vzMX21YeFVj~(V1Wt+^rUipBf ztn0H<&1E!Myuy4tKLjrReX-n-wL-Rsr`R2UF=zQ33>UYziUPl;2o4B*1M8Eog}x(- zux<33#*N9wiPI;Ds_sNuS+R$-8I!`x8^EZ=-=eZkjF^v|0#;ff#TlA|Ng#DX10bAzm>l42T zpUyT@EjE#bKO-1_ChXs;AcLFr*_46Kf4)guWi{T46yKH!`0P;f8H*ckw;FIVO;{^W zFodOW_#2ngXC9SpC)poS!vB%m8`vcOo;6a@CUjJwR!N zaU8aLuIZm~+AMRe)kP3Z63|QWz`3Cpp zP)&TxCRWs_M}f=Rj+fa}GM{z!kxwY$eVb-L zy)SY4pBd|!4cSLe*Hq7{FC6)&zD<6oHqYUi1b!#hmp2GKE2ay133lZm1s3-J@EO0{ z$&=I?P_!FN%qWmdRh%_{5h|oP9-!J$I&{(X<{Zo+3>(6=^gWLV`%YqU8oGDTZLS1z z{9$hL6LyBh7v9?02I{5K6p-(zX&`*fsXpsrB8YQMeZVt%`6B|Q9lyIxumR39^+H19 zqByOMM)6=g>=MJc64Ox#1N!yi>;8{Z_AbzmH(0$O>H4cD_@75vlw%SL$G8NH_H>dg zHpDB(vaWa?Y z<5@gu$kj3GHEtmVNfx)|OQ6_~8gt5@Rb0P>Rz7;$18&%;$bR04o7{aExRFV{38lUr z3b;!H5g6o`Z(le>Dl!Q48>Rcv2;NU4?cMM8fKK0A1=vgRcu|9qD__k0Y7*~p*ty#d z{53xGFgZhb`Yk^Sp24>kH@cRyI2R`tO4wjHYi;qfe^%Q-go=!*Iu3Z((m&LOP0CTP zWf29yC;dHiF|J+z*a5wKyshUVJ^TGkjWZ}{hNYC)DgEf(4!FO0VBfpS*Ldbaz{L}S z22OZ71pUTe1w07W*xlaK;;Q`q!M5cG*s|wJ?hsRaAPlK`{!mg64+ll)uNpPvzVze& z?dM#m^_x|={h1D0vjPn*c(!0?(0_56YP!SDMe3r)(~#RCRDv`5LmF3FIb*Gyv9fT z(Kx2oJjnA0#mV=SruOG1Zd00hLc!00eY+zaPX#Dq$Xu0(K z`9>OuMv4}tv~X7dy!kST|F!BonY4|8e#Y)bU#<2JGDfer-#5rU9L#978g134z4i=6 z^K88+DvM*`oQAYtenW71W&XnB((H5%&*Vm$tjeXvR@VwjUdAD?vpdI2WB#4g>9Nv9ZeA7aaptSvEDHuVUuvq403+;X~kbeAYs?qzK43F4mLP$DJIU$W4x5OGv zxP3y?;Rlu(beeQmvm&z`&}$3jm)^`@l9I9cBtA+8qj)Z)L^6N*SQu|Lbo3#PT+O72 z>^u5?G^^vrLX6`!E<=e)pcZ|3*`-H?){6&etAg?oD1)_Dr34SXNb1Z3K;w1Fm}#)P zS%{fdhGk@YNu$?GGAW_jbuU8A5FzWHjtz{;Y=jg(ET8e{1w zmAXR(wX9M^k4%87@QRdr?01dB4?T0`lRtWC-`ywGuiJ&zN`>twIV9D^awd222uBz7 zN(Fl54g-~|Ao54Vr5DKvqL}vmAJ-WZhA7Fl)Kd{d#F+b7Psh%iIB>*R8^NfabrX;` zOe%wV@YzXo3C#Gw5freG^ORieh~pxaK4!C!0JiCmF_iqO_--2WYljI0%a|{dvCF(J z!J=l@7we-5&0L!S4|=dHc~ZhPhx^BJK*`%msLz6IqU+g_umQr&uQFztOpV9EiW5ciaXGR};;xC3UgS{`2_GU7!$l1a-egbE8c#B8L#?_Aj<1@LC4aD=xpD1^Y|)OK*e~-RcJi;RZ|p7LgJeNM?OE=Ou+Pcv%8Pj**Qc z-bI(DrB!i(bL0?{U4#n(lAp)1z<*6Nl|XCXdI^!0JP!3Gv?WDyx@)Nxh3N zs3lc}3uHp+0L=T}tV2|!0Lf0R8%!4hnDASnDyx8Ni>d&&fDdp6l);X}!7MmPz?Z#C z+;kJ6j;!-0qC#uLcUTfZ2<>^oBU0%!EiMISo>rLK_97Su?rhqN@N& z)Yo5GR!v`}AJN1`;7Fq?SpuvikTQ__&5WAHxr*Q#*rSU8mPzeXP8nBOvmzy8OA!ha z!HX{6Nzu6T)#W0z7Bk*?puNXZh34swEb471tX@B_$IF7Q^U!==@TcRAhj7V+eq0AJ za+u70TT+#5^!_YLbC8QRqe`8fmCQ|##27|%O@osxB|YY`kkZk_MWc@+YiLy?J8zb& z-F_tR{E!^CA6Y`Vm+!>PGd_w3DwBFkpqPl!oR(l!g6cuL)u-OEwM$JM5=f*s&YT38C%x@}$Din%l zKh%DyYGxj4rl+rR{1ORRho;20=(V5bh`6qXUH{@OlixN>B+#CxT*=KR`zjR3SmyE& zQjcuREKHm-DVAab9-cCYLQYphYtFX@}_`*Pxt?avA2whBkZCz zvEb5;yE_DT2*HDUg1bv_cXxMpcXzko?rs4>(BRtB$@krR=iZrFYyQ=$)phEvdi%%j z-RJCQg3pj`(%dVKCNQ1NRIo8q)jIA_yB(x0^bMSs4kjJKK|r{eR;1F*Z>Q8fPPv2I zqv#j~$p>A*UUE}`ZNqWOqZ_zAs;P)Z?w2%o`%KDTFS$AnpT%nYua|5PV&;E!FIXmi zSf(~*Sth(I7;Dp9W%g;8x*}t_ZJM)S#nDRV<#{DfoDGb|v2KuVT^W{dX-J(qOS{Wk zo8_9UEcB)#P~50XlSeD7onjWU9@*G**-RPKu@IdcgFj@tZ)9aVck0aCILOiN+&Bk# z^mei$jKX8W8-CC7d)bEY9mj;~!4m+y?#5hm4B+^j`>?<60X|z4UK`m49%_-|#I}v3 zW`7qX^E@Dpb?btzgYb{ic0>iCwU5_s*#`)?{bY%CHRLmr%${&r>_ z3kd6s$pjX?ojXwbNg<;=bo|IVM_+5%dXWE}_#^nj3l02Bk?C>3D(i}Ly>$-?0{hI95QX3++??m}7lr5f%=g=}f9+8o(c16i1!zK;5L?gd zxpseAW{Hglp}4QR&}v!My(3RA^tvtxA&6uR>kcnoYRG5#q6%^#-7 z4F9h^%G`&!F6a|2pv@J-rq!0=BOdKOR2sK@MQtwg@p{ah72_ZW9<3j_=h^JdbvnqeO(O=a1&YMCMDnr3v*LXiVKqr zGdu;seVls;@LCOKu@6Ep2#+drz<3BvUky)PAm&X2CYb}$+VIaF03Ijdw#Sqes}anc z@)KV@ydLcuCGE0Kzz7=-U+OdA>1;q1y!CGwUQ+o5Ha&U>e!9&%I$MA zh3TS53?v}tx-E8*E0!47-_s0cH4O-dYpGY}0LT0BIm|rJo--2|<$#O(UM4jU&#k2% z|A94LHaK1qC(P3z<`p+VIUWl=4(L%9j|drWlAoXe8CSI&1=Al&NC%{)OK{nX=K`fC zp49_H!bn)s(K+!%K3ni|b0;>kB|R7<<#9$;`or)&C1nC56vNFKE%e5DlGV#;$#Ho# z){@a#A-wvNba_)6u03caQp`2*)YbrQN>SSOAyD~A7IcB+ZYfHJNi%B6j!(XZc%%sJ ze}}}35K=zWNAlFC1f-|AQ>R9(rNyL&D?g#y)wzko4X35@x_SEJ+^?pG znWt&Tr@t1YBKT(%w7Z41XVid)#LCf&@G_e;GFvpHQ`|G7+LAlgGEw^>s>9Lqer3wg zx(>N#jizU*V5E=J1@^CH&90$;!pmO7`?~a>Au)|?rTmx;jm-9^>_yN@>ONh1V>|w& zMov^(&M88&JzMrUUhW^>+*^&@d-vSO^xWq)r^A0kVim^;YWpb=njtu0i62gbX43Q6 z!k~{eGE|Mwug3DK9`Y!^Ae@McN7YgAQNu?HwWJKD3D^e-P{~S?-_*fv@;YGm* ztPv^tc2nf7PGf9Z>{C{}i3jmzytrD;;lq^y+?;~GM~QhxiRHLSSGlqkUl`XqsqJZy z9$zVzWUsq!LC&-9Lp%F;57{<0cNPc0yN1z+Xj zgIYjDrMhd`w{L)k@k-<`IoYS!{q$ARZdIeFHf$bL;~iixx%vdAa$d7~Il_wYs%i!7 zC66-?<3lVy3vcn&9Cq-PXx5x$)SPzIoUPYf&|CCqDqcPZR`b=~d(^@N=RJ1RzCO!5 zuh)((S9Op(L1@*%Rx)&Y{PU7ua$DEyhOukzAnTo7Yp_{yu#tdhGWCQT^?LF31WL8U zNG@PI8HuKzIBOPb@Rh-WhaX)%v$=7(Nms^&hXqHApheXz z-=q>KVbuaGZL*%Iutl=BA!v2dYIS+>{1#e|0omj_VF$I*8vG^AkH0Ml2~S_EElj4> zH?wU%wIyo8+VHu}g1a?A%R^DC9c#HDEz-lIv%P{wOZ9iVT5C%|rD+BdwvJXux=UNd zMn}y{N8Rscuiw}p{LU87&NeHH)XdJVjn1A-)tHyg0sgKb8DVb4u2HMTs?086YZv=? z7o=;)Y^F;;fA`$7Zj#l1z2u?v?rl(|RVaVwo|b#QR*#%Z+froD;1SjZ0YuS64+Bo` z9~lwEK76pFoYB(roN1k$*!wnN2SM03LI4q<#RU^(H_cB11O_7rh|Uw>T4{BnY4<1M z^}{m)G(38+qZA`I`Zw?UNd*QN2zoJP2aYKRKH4`sh7Onp_cIX=igb{&Fb;k-8@z<= z;prN@))<7`9Te!YrY9Vt|IsVP=t%1}v{;fMZLNp2JcMaFq=;;Riw&V5Fl_DE1z+E1 zz}BZ8rD_!40Yry{79Lr2>3Sd_m9oaQ&<1>e#k4?%hQ1!b2L6yHgGk^S8Z;Z>?*HLc zKT?@t@NE)@svO|d1qk-S2nS^We5}1f1%A-k_nDB5B~$^Ez0_j~ag_!1qXk5@CxLh? zBYv`Yg;7!89>%WoG12?_5$i|qGsbZ2$D#v%P?P;=fE?mv0Jaf^P*~=dSp(|2a2mYO z2eZOak%3i=R=uw#{byE9U3gQk0FKs4z5Vea( z)o}H<=_LPY)%uB>ifKJ$s;kNGH)qPMS6CMU&iDY$J8KuMhe-~+0yDWh<0tJxrzktdK8DSuojF6D17LLg@w2l~J^?U^u%E0Y zDhOx1lxL&oAl0k^f}p)&-j_1EYFZjOJO&*Xnk;MnDGnAL1JUd-;%tFWIwHI}?w>#L z%S8_xGCF?wm>~1X;zt#u!g*6=W)IxgMJCQA0s}6tH{~xV%bKkOgj-#i#!W`v-@m?L znw|sfQ808rd9hVvzuT_>)#hVaS1@mvCtz0*{rh<;2c?{sgc(;KMXkclaV=1+orNJ{ z<;YsgR^^@WV2p#Im<#T0tsIF;#TCZ(=YPSapcHptdIgNx}qBndTA^KhXF8*#-ZdE#_mwxIr5E zp`TfSneZXJy^M(9M=ss8xV^)Z#h>Y>`#5CB-T_YC^^V`AGX%G3kGJG4e4OM(igW10 z>`*Oyr>VZS5R-<#6W;$=XUYFLhC$%TMDx3F!)e;&>+Ndlv_O{*w@r<1V>WZ5ji@{8 zX|%&hImc*2!>?4MBl3FE7sp5jRF>Qr^yY0w^R|=d>%EQ~%_;XM}^6qpMPxlMY*Jqm%_-v#f5?x9ahE*Mu75Kv5GuVJCGclLmokEby`YT`Jb7}7 zOSBj>Pf&vf_aSJ&rH3k-NIL|Zq++xz`Ggh2Ic(fF`_ zk=!7kYp5u%Ob~|FN-ssMOsp0P^n3P_?%^p$sW&Kh2&Zo zqlPBa`&+wZcZ$(c`G5)vMS`MeYOt8!adGo z1QF)a=5#9(uk+OKN3F<;MrUbOG%zSl4sly@+Ea$0;q&%t_=l< zmzNJu0=rq9Eiq(og+nIMATeiAWLOT{$B1RsGp2pri81DR^92p9s4(bx-4j@iN8@!h zJyE@B+kwK0vNs3&*ugTdnkjbe@kqVon67riqiW5VWZ3=?{S~TUMAp$_M;OM~z?kJ?bHy zT`_Ub7Pw9My{`vNeu|CZw7e-kQ7nNJgI-9Kd(7I*@s7z0Wg?o96NKUsf>=*cv2KD&q*8_;&r&9Dx&1_;UI=Vtlf zk(u^dA_G(d+UatPCRQ1CVa9{)eR0ar2v7+TqIIMf(O(V8Cf;EizP#e~Me-cLgTpqM z2YKvyvGJwwrjFCZ6At5)vXGI2)rTcD6D$L>A}Qb+#zLLuA!7ZF50D2j9yt$#;0neF z8w1f*#%ltSU#H4V)8qIh4g=1|^srT(rN|wW;s`2MX_%#Cmt`BA?Kq?uXBuT?u`%q} zp$f%|+~b$ZM}jjjBN;9S3FW_?M$aVa@vycLV&N(U^e{%!YOqZ@hp@0)@*eRVuf=oC zFMLWb0&-qHfu>m;iv0%}r?`GU2txNUh179Xf7<49#SaLnJq_p+PmC3!!l&%%C5nqf(;rRNe(4JaWER%l zme?7TqkgwYPN0>5!`VEM7IBpqF{L9HyQ8T8Lmyvi2%dEGj+;NbQJiH|skzRyR6lW! z_u5wBr3(%V;d7V7B!~HKo;>QqCJkuhyYpvOmHf~_511^OhKR$c6k*e1Af-2Fvi`cA z>o&MD0^)IDge^PgoVd-8-{h+6`x^O)*K-06J4M^)`J+hEOS;J~NyAfv8qj`YkD_#I zKyFa}{HrEu2z+q!rc<8V&oPdxnxU@F@M@98PJkA1D<84WsWW8d((bz2$FSfD&p@q} zfvHv&%If&a5pzFrqPpBIu~DOo(%oR5gw7nO(!MZ)?O^NH5-QQrwmj#Zc8K_Hj#FFJ z3O#1r{w201`meyc@Gqx zylm#Cp7lZFLX@-51%umkqxm{y!Koz5i zg!@ z)8(dt3mNc>*z*?2URK4v?N#|#R90M=*RBWkSG)oM~6cGNI1NOL{~6w8d7FE&dS5Lj1?5Pi4Sxcs?#_oG-UC{yxz!z5q?Bfo znz$Tt*=5Yijmqt^6Orl|K^x|G&T?%L{oEi|Ebvhn=Z%@)%aPoYy4H9e@i$F@+uDon zj^x^_Vu5yJwUZAw`pdo0(Yxsx&%^q;n83*W>&rYcHhDdXI$Gx;Q$K;w0#$oEsAEVk z1r+aV*8SjprCd{iY)%rCLujg}S{ zL&z4F2NO|}Z1N$11D={mF_7nkSVaP$;`l{X99z zz~Z*Zh!Nb@6W%IGfaoXy3tkR|^+QjYc|%*&G%orvX0((&v&&=DavDI^Et(fM%5X0% zKnYJbU)`!K`aU@tnl*a9t&A+@ShP@cHJ#X~6Ncy5! zti>o8V8{{=K+zA=EiV{~&PfHD_;r=|YBf%xEe2Cc0o%fYX_!aPEgoSZ{sSFuNFUJG z4hZop9%)puM>Pt?KFYGhixxcTXb}d-o5 zeR0xjc{7{Zu_`q(+tM?a8p**{UQam3hd6BIr_3RZEbc&vk@T!_1fhwwtm!eVR(D|J zQ`VwJHY#N5GC1#v4i_pYYvU=K4KKSGQ3NdqVUiWc6LZ%Y(&_-5*2OD_|zD`)}TpLs&BGZZ3R%3brO; zJ8eE8efqLW9uapoe-i9&Hk=YP4BS z=qu2bQZ+G|E2K6k=3WghUkm24EJpM%bXzSHw=AKwPjKSHarG$egN*ZdF7_D*qUj?_ z8^Zc(mI3^sq2u!n`f)2kPrOizrK0(Wuvaj!iqHaM02@R?mpXLjyi`j6An5pVNBeRi z%d%3*e5`RSO?<}act~Wja(Mp_X!a2JdleXDW#~#UB>h2Fby%Dhqy?vdqcWfmJdQvg zfIAL=7*|yi5&H*$!*CAXmJf(V3QUp)_}BsaGXN6LMTvHWFp%Zw{Z(iNNjPNCNJ>>i z{$)^PaL99!j&%U$T>!g2ga;|$nh%&mUo%w^R2K2om<0gI4+xF})J0%!cmRCuK7hN& zsji_(?ct#6;ZTKZknC%5_R8NhlaWb@{~VKlcmXo$7vDqxUdPdw#;c)$#e~ApM(PbV z(s9~h0ICTr6;KA?2_J~f05InR*wxif<2oK1!lZZrjr4(>d6fZ5h|?;t1j1!Pktq?H zJh^TSj7kYw_KmQ0h~Hj-F1T>U>e!qc4RHMpycu=7(ttaBp#BS>0Ixamp%#v{84IQY zrym}{zgd#Ct_Tq)^$PHi(MUbl3>P1aX$4e#0VMYUMR`;0lVI&KLv!1|Giahu1|}&W zLLk?N02CWytRR}6W3jIxJTe+c$qJ920h;_k&EF;I9UZQ#@$3+t0-k`A@iw^l4%obU zsQMNog7#3{2&F>cZhZg|Yg%7sm!DaF}3AHk6=TQRU%c04%s>`#PXM$jJncb)V1Hmnpinnl5p^#c04`>(qQ_Iinx zpw9@zUS)b=z53w2*e{-Bn`BxJ7W)vgLMt->$pk(rx9uUq2tcnQtSoj^VQdsl!nuvc z{B^(wWFW*OfI_1J28akH+)dz>>kygvqXWGXFvzn>?3@P#WVQ5W0#FrkO*dMZUVvyU zeZ1B=99;d!{mIw$0~UKQWcmG4+Qakdcv+CNaH9ig_NA)&5KQ_dbXkS?tRog109@+F?uN*0Tt5Jj{VA2JBB!qRntB{Q{zR0cPnR*zqOs zeI+~@5MJ8lA*@9l(uK#75ZwF|0RJKQy@}$i%y)}k6Ud$_U`Kz}~yI&|tE_b86RGsuUT$stdj5brcP9+;(!p(`_IMp%E>qkDsdPM2D=dMi8F4rJa%9A4%{ZMMcRRz7s(H zgn6b-h&M$bJ26bSH$XyGtxpKVc_ZbHq6c(!5JUq=&w=D9O3YK}90f>)Br!hEe#x4JlpVpSuXggLahe$6SI(uZ zUuc}TSBDx2 z@b+uaHf-M(di)6c{OEfV`uaz_rHuIO?xN2Ox!PeXp8zG^3ZQE2i|WW56#Rwk z4a9B0a%10h{I1Iwi<8F|0973NqA<2?45^z23l+UhRlV|)8|q#HlJ5Swy>^$JEPUUN zh|@%{{T{V0K4ed(r^7C*&%p%b&cyZ1JPJDJY$;33frt+yrt&Tv@K99n@H09tDN^`@ibPfcPe#-5+LKIBK=A^ftjJ+#p4Jm&R$iuigcKxa#dtP_Pq z=+D_ldh+{NgG)}^`Bu6_T&U=#`~%nihwkr*(6c~UWV=8RIOR~jhh82~3^CX1e;je~ zBb^tByT6er|1*B-m`rI})v=Ur^JltEHksgQNsPR`8PMD3R9E-JdhE2WCc2XNx0c`_ zsuF$Zg^Hro?=C?+c2nHO?ceS_dP8177pAjO`MI&4vohsV_@T2|;`8|))nU}M1)p<_ ze%7>%lV#Ph}XYwb1s8f zeFu)H(12&pIip@5jjWkYAae&>E*w}f0^n*dp?i-9t$eZlf1&7I6ANEsfBqFbY|;>H zIFNY_$DF&3{71#+5{m+oGWP^I?&^l=8gcIz9m$Ovs0*ur=|)Q6Y8*y^ya$MDd$VWt zr*G~?uy>jt`bv~!8ldNcdVT#R_agX%1nTx}Ix4dg^W9k1)wkR`IkN=K+FhR7D{7@X zotbmP&-Vz7KTUJ*BYpJ2e?pDM++hPRHZJZl-tHo#9-3@^V z`&@?B3OGB>$bGK4bXnxalm$I&**rJ-zO-GIrZdyV<-Y7$y$s(x_2^x9e|`%DKApq;nNv1hO2x3io#XyNx&X1rP)2&yZf+U);7wutbRB#KcVGuZ z)X|8rK>uq8)Z6}~ybO9H0Y|zN@8%LMfIqea%9MHzUj>Pv-oAal&HM~J0uj$_gY*#J z-)b*+dx1xK?|-YIHSPKWi*^7-J0Kkp=q-2fXa}U?(|HpA{ubNUw*%UI2cI13+W|KI zs~Lsxj=Dq)KK}Cxn%x9l3BJ53T+;4<>T}-TNczq8z>THnF3TY2&lKQQ?R*Ai)&dR< z-bumLe2e{Uh2B812N8&`ZzO}Q8=zK&=QrDHr)7|o{Il@C>Z0H(pj=h#$G6&u7T0a=nfzV+@#^*?y^KK(rzdr(06`W9OZUbla(7!esJctLQ4S?Xgep*HVA%OHfR zn!CV1Z@EX{7Xj#adO_cLV?F~Pqjf;wj?;j^2hz{y*Wd>$$OI`wEPx^e+Y#!Y#I`}t z;05>=7cm1r?toyy4V1ZM$Ka3c)LKbBM}waMlr41W^KA`;(DhUdKJS|=1YXQ%Jn-Go zI~vjJpAr{9yj@S=`wD@d+!uKI)#k1D?|rS#fDw?d(MzBv5cqXo77NWJfj6Njx8lwB zAh_q>m4g8ATLeE_G{Wth?^D0jGsy}_y#s=E7Q_aAW)hG(!mXvS2l(w~GGl}9r$q4h zHgf^qpYC^T@D0uhvcUTWzI@mEooodJ+tr9H{~W#!!b5unKY5Iq5crw*z$??+2iJK+ zI|uK-#}24e{@*M9d~&q?_gYx+2Yj!{ZT2=G*pK5y9H~FsR z9l3ZU2B*!T`7U`tBr&_8D()Yn(I9H13QD>LDw$MPgK6!xxg)tOUguL7mU^0@T-X5E zEe(!iq(Z4=CKF3PsOeI(y^hf@EyI)h=&H;|>uzIr3ZOaV&gx5AA8 zJF=ASazC5?PU|&P+EKMyIb7clXw=%PS9>u?0A|xoH%r|gfn;AwwAcQaOr~?%9z{J` z1W)r}g}SIW+pWx&N!6NetuZf*Rh!IkJwMk$thYNls`F`bAFTEUPv}Nwww&*cB{Q3C z3pl7AXMFv_ZJFV*|9g#pdv<%v?V;G;egpz7Macd3*HUdu4Lgs@p~}I`d(ZZ}_iKc_<`~RiXnzl!_uT zq?1=eo076KBB&quZ41iy^5ldtt(xjN0XQ7jBblnQ(_cWDezFyUXx!wn9|>W_7`_l^ zI{lG4N(*ur4+=XR9bYe7bdZ7FXq1*_8pL#zT@FG&}1)_ zkA}Ko-fr<)n5&c!cmDcqP!&u3#1M=`qR0AaJ*ZYVao3@feA>KpOI?^WF6a2nk=#KpGbv$f2ssn)o}X2l84nX&ENI$2#>{klT$DuX#% z(~c~w#%w9tnM#3ow&B|5xPzr$<%PiDrXS=w?otI(O#fZm8x)DpZCC=uwW}9FVC_~I zoyf<$UHmvMbGU|`f@tJ)6R2L8Y@3zVuZ$ALYqa(%l5Pqu8zOm}%{TJ2Ut;4Tc@m@9 zGk%hr7*eKQIPg9BgihFH^te9nTgL2*p#)z?I+6!CFpnKsOEIRZXT3~urZB^_F_~X= zlGlPTbD#z<^M$#Dcf7N{6C>sMtUrO#>Ac{5Tgq}k>zv?f?UXpfKI@)XmUWCbSi5%o z!?hw$Df#-o{BjGeJEz{xFYUABYt{_FME{7?-EIRt?VY5Dc!M;y9;KO z9(T@0J1pl*Sibs4sS4)L_ctUrZ(7Hnt#9TS^E}==C(lqDS)ou%eNy|0o^M@qA9bRA z(TaBEbN2fXxg>35`*$Vy;2Ce^sDe_ieraO9~%)-k_|<_ zx3fqyBWs$+r6!U5vD4ydnn6s)`cyAA8@8oE9;n_*2iqkXDkBY#i8MdtI;I$gNKSrG zmzFEyY^7LGp#-IbBi7_)7x{q>QeCo6LN!{E+rfGkCpW3&QXDSY?$AhO5toRc&n&_i z9F@l2_N9&#E#Ax8hy)H}v|x5F9&<7aM2Vt5CS|Iec=a28;ogN?k{rk&!T>QV(oEL; z-9g{?EE}6vPd5Yxmh z@Hh*96)AXI=0L5P36Jxp7|}0CoM1|_1HVlauP!KUMInnK?a%h}G(oyo5{fx1ORr$T z6sj&t(qE4ChchN}fM=_rJ|ptNs$;SuHX~ratSOh&CGoMn$p|{T&rfx+v-AB#7D;sD z&$?3O-%_P>UQ}28jt^08uvVs|3hJ0E*+0u2BP)Z$6IG7U=QI%MMo`1UgqaR)g2$aMk)KdTC(UDfTBaAhoM2lIaw2Gkbg8_%oEm(sq^l)`wQtPwglwf&2q| zblvsQ&UbZJ1Alh2{Yr-Ld}>|rR2V<-4|Ou?jz<`X9hi%|(Tk9lnByGK5Q>y2&+GM+sc04WFJyNh>u7?J-TBuk&?YGMOJHC5p2Jk%x`o=ZN@fc zQFGu$Ghod9+jvr9kN%r*)sKKY_d4Xayj0uC+~hI(iA=nvLes9qXeisMeg=+-h=Sv4 zp^T~DbJrEGXGK25IP4ir$gIqC*nH~`ItuXyg=)|ySJpQzmPK~k#IQqSrlxaT>l;}b z82_UU06ftH0|5y!0zLQ-`}Du3L+uS3Rt206)lfW< zLa95RCDm9mmC56Hx;fT(EJ7w2h)5*8Xp~SOnMkiQ-ee($Dqkp_E!|wPRH@!*xit>P zKGo_EqFR%>lt(m}N4iM<2m5p|o-NZ_v(@=G@c1|DxLB_jG}1JpbKTxx7zUhRWm~;b zmJo?djx4X;88QZmX_Qp0?|Q(L{!0H}}8TCx4l6c^#|0)73^t*s4#4Hy68uksxMXZ}aQxlVJ(e zbG~lJi%&D1xeC2KZ!eD~x~?07y&%vmC(eQ^1h)CEKRk8WZU8bDEzlqJZ{RT|D#xbL z%DLJen7j#}5JDV6yB|iGV!j_v`wb2&jIQNmKhn+w{vfKj|I0x%&r#Vy3{JgyqKyEo zd!m=f{h?93Bz5^=g3bpZWt=Rzm~oQoH;bRi>OM_5Vp`~n{)yDi=~PZCF;YwMrX^#> z?zPb+rV08zbjMk|B2vfMPVM2xl5gj~j&uEB*D*66$J+Eg?E|PxJ;L8DC?tXq>3@B< zl6#)FCc?M;B_2J!a$J)4tWoam5|W`@M5$w55on*%aavgip6K~q^?`^AkU_JDZ(d3s zE&aQ;?}+oXv>)3FOx~ofJZqR7Ikjw5NTnrkZtqYmQFU^$4NsnZ3A%7vrB%%2ew=W3;i9-^Uqk(?lm&elR-9aZOHYbgC5l z)lLa8Xo$`T!F_BR#DEc6o|VLTa+sGrX!8>i=l<9{0Fe9Mocmd?y4jP*_PjahtMAAA zRb%E?>oxNUe3y0W*7N%fyC2mnYYr>lAHeBQ)eqqsm!R{99X~jx$6Ylt;m5u4yXeRL zDDI2LgE$fnk;5c4o2Q>?W;IVoHgeNXVC)mq^GQ*v&GWA^I1eFV=Aa_C)4Cr_p0?F9 z;K1Xy&`_a^E-fn2%RW8lACgR6#IM(6cYa-iI$DRkcAQ8_e%BMw&rWx%aLL!I6*0#m zw@i`>TDNPdwmohev9jLa4r$-jJ2>F(`zz=7UMICFkc5xs-a_ow{g<0u2s!cY&&XGP z@I~s+0;-)bd{_RkTDwx;S_lrR(ZJwMaNuzo3nHez@c04gDU*7lBCeP{2fPrX_+Rkm zRWJ)-IM5JY6d%_%n7(K)`>=G7SfbdojVvDxME4LzhJOtvZ<4>^mkm+#f!hG03NTA0 zhv_x#bvhf<0kxyUOqM92y2ypNazetTMXZ%Sj zQ^j~y9vlDG@h7=1s+jTr0B=73N$um1BMbzCH;vfWsYdX;dLwpXDj z-hjcIC0wmzQ#Kwq|G=AphEw+7iJlX1I@HS8w2R23+C@~Uz_AnE(H^&jq$uT*U!>;~ zGH#3B&S<68Ea$xb2YFL^A%j{qk4xvD)4ew8f-PeI2;0aJ5IPwQ!tbU*{ z@47>Q&?T}i*pdEFnqOQO!aeyP>=Wv>D;&c=@FuN1IPiG#ANGj_Hro$Q5s37|O@OP% z-pK(B-qefwA&AQM!;kTBwybFsPMYMEI_i*`Tee?5#-aOyA3!aWE+|Gl?pga^@TRFE z5SC3;CHiR+TKFbyP+J;Ov=pS5^{bz)y?MvqSjpbGMiK;=?S(jNpYbJ@%#)ipTZY&r z4aJr&fUY}{Kr@~zp}VpmuLB@F=FuiC%LJ7-{;GucqlAbYFIB)erA*NrMwgVXFu>YV zni*a~^uKGUvQCv}pk5f8a*%03&iJYavjVE;yw_&|Xb=poE+YwVOiM*ZS)s5SPXfiPMvy|wI_OSu_RdS68(!uUX?^2m_Jl==OzseR+oel&Oj?b_ zcAL_dMI$EYA(nH0qXBMy5^fz`03OYs-vgvUcZg<2TDJ?v-U`wn*+sSe^m;VPvmPan z!Az#+u#lxAIRDOoDtWvPxDV%0{roz&KBcu?%Rv5iWL$2QB zQK?CrdK{0v%;i@$V}&sJ+E}n+#0J{D`T;8D}}AEwmhHXQVn#;eZ1Yih>#?l zcl#JorFkH!D7+*UJ_?>EXsvH2!AaMvkCyhQ>-`OF*^7YkXdLu6Imsb+_<76!26_g zV<4olyp@`$Idaut31QoF32;D?eleWm4&eUd&n@DEY9Am4;~0C4{;5oh>I9p;%;WJo zP)o(zpTj?KkDjZIrd>S9%|9^mP*yaJQLas~6(@*|%o9Lip-?6z?S`XnMy^aNhx>pl z!6R9s8jM~huLjTKmK<^t;18t~LQs#bS0-sd8v=VB;(8F;pC3Gu6k0Om1l=D(MjghJ zALcG>JkRTgb1S<2v2s?x`Wff0Ec-3|NrSm5v>2E8>Rj~ zbt9o}OcHq`^_L8;f4Z@BCRgaMZfv5RNRvpU?^ZVi<3bhqh5oA>8K}p`n++Cf^cj3m zWLm1$8qIT0C1so$H*#!t$i?XYhi;r`wUx^9fkq;hZL`~{mgdCQoqS{p9*Ls>>&A3L z@a#mfp%0#MBUm?zu5>g0)r}t*@_IJ(n}4ssB=^bFZ8v~I@a$2~r z59Ij^zeeA4IRsn1wD`zpcN~Frqt#AMg46x_CO01lO`%8NfL5nFQ|~hKN&ew1w=h=0 z_ww#p?T5@_Y%fUR;9a9g*AE7J^sCeQ)E8AGSVY*IFK8*)`J&^=+y;R@WRD4kBCL;d zez@b#B2D-;Cmn2luf z!vxuPRpUfOiJ^Vd6}j^LM5T%%gA^vn(c)z75V|8UD8qtURpdVCXSxvCn5mI+`{PlT z)3TI)vYC$gagMhA=wIDPf09?=Z-EijSe#yLX@wtFm@3^)SCSv}&GMH=oUSycAZ{pz*jWEH}P{D&GFn3ahe<)8Dl|Q}9*k>8Sje zH3IASN`)h*OID4u2{dQQ3ldhnY<#eRksFbC1ys=##f zJ?Kp2rl72<109P$KKJo{gR=1*s@S$q$bS5=n|hd^U;u{utWFN1RQ-HV$Rd8e@9r1x zY|xByRb18`c9C5~kq1~e`bk8wIp`Wrrt~v#4_$q^Sc=jaQ|cgelp?wmi1WO7X1txX z4wk*0lcae&ACl(IR+&Y|`v_EKC$MN-khqTg3(7ceZV?tbpId@Gy1HBID37{dw=SjP zRR0IcNMn`zs~bO6O?$Y4C|!2^4yyHcgV2H;_fp=^3lqZr>P9kpMMAJ{6r2U7s3i$G zXZEf=)dF^ZiXQz(Hm#zFrNnQ+i#G z(tQ3pgP>9MdXt*5HGl2Ri}rR084~k$-zQUxakm-DEO@h@YWx0lQd%o$P*bb7y89ts zFA>qJ)7Cd;7j5ZX{AK4KE_7GJQjH%H-_GWPKps@L1cX1Ooj)LISGBe7yL3ChTsQP39b}Lvn-lK&7)r~(SN7yp1qs(Os@uMXJ z2Nw0C?V<_^k0pQbfk7GM?n3I@qr`%+eX(vqgcx&%Awu|U0?f0dCQ*t29NZ$f&?rh> z2wng`{1BWQ%P0zEdnI;=S)zWtzlMIF)C$LJls&D94RKjE&Pi~>Z~J1Q^|EnIs9_YE z{^F0mjSwX3FsONAVN9;P=_;s0Y2An0gjw_L{D2|Y2uf4)gf)tDgD)va`NbRvYQx_> z5w}N0`ZUF%m_HS}o++}zm z|LVpj(su!{ZX8#PYii5~aKdv^NY4#ZHWlDDtCF$dOQ|yr7ZU!}jpGTP3AaVGa^=#k zTyx1C{~@+R!^|HnI+gHDmCL_1AjWOp8h_dX6WgCLKh=EC$7s&jmGkOhoSuw0d%Y3X0x7@_A4){RKTq009SX;W3E;oLJ*9?R6; zVBPo^l#y}YRQ9ugRb^s*d3&azCc4_%?EePJaGluLe!g$*L#eU54hh@?>&EXY6?*WI z+Vj=RG}+%T?voh6x>3!1kxE*(c4F(o@H(>6ipo|6l#1r}dfHJrRG9g!o2MB$LbiU7T12P|n z{-8$r)m3y{~wmLAF@YmnQKETf{hs~lSf>gydd%yZ^r{nnq$5% zY11y#?7r7k$AT|UGtvyKd2rGC!Wevx=sZom4prtquG{D0Bp6aDqPbaBI@~CFIJP{} z<<~8q7xKW9;ASsBmB6W@W%AAcGgUOEx$3L(PYtWzb8zL&)gYK%9cX6r@cZUE3f^A^ z6lg0WsIx^lvlE6io+h7t?#HvT<78#DTt|EU;zG}DdTSQ9Q5Egsj85!wWmk^m|KdU~ zTrif_AxB#}y|IqnH(s_Mr(1g-rY>FXHa;)DyPm3k<@6^Y%=shOHh`vi5zG&s1dny| zyGXPP*LwYj3+0}+_hioVKe*t@W&G&yO}z842gKJd>hT@ZsqpnD#Tf@URn*ZYu=B_y zLrB&p<|YR`2`+@zF$E5{iI$=s==Mb1~EEU%~MA7t6bph}Yhxqj9T(7K8}p zmfjzGbs6QzVF@?iJ;$*oEJ@%iVUjL#}C9J8*oi4!+=l23GNkcQrHAfIH$^%8Fv!rnqK zZ^R5f`|PcLCIgxAKjKJjngKrW02h~igY5laA$^Ja{T$i-O!pk%hD;D8zbv_;Q!U%s z`il|5e(xaBcBS9qbL6ru5o9! z1&e1);NqeMvSRq)euQNJvl))z=0mt)P}pZyil`QbPM%Al$7_}Di8c$NJ4x`kMxy?EyQ=t}6ghfz^OcrkzV1XvD3LMf(?2ugJB z;*?Sp|Ic8g|2G>oe=rpAKWtQ7_J7kPViC<|ALYJW22_B7=dk6N0ac3|JbNz zVu=52R1WI!|JtZvIV>LhR}RyUQ^E;rf^Af*`FPzydKmhDa+pLy>VMj(Nb%OQuuhQ` zqn>|g^@8+4h+sKfrw$u};o4n}YqC2McR(L5+s-CjExuwXYtVk9IO4?WN&MGFt{ws&y zIYvc07u#n*!wfxLPd6vLAqq1+-7n=MI}EoMnC-7Gk2k+}eC@G~Nk&!GoU*#FoQ_h{SfM zRS#m4RyC61E+{jS!nrsBhwSGR8OG5hr^TtlX2VmuL$ZXEMTv!o8A0$$fNfMv-tb}@ zHdL4lD=j9<|BJKt@aOvfzyFbyB4iXLBYS0MW@VF5WL3%@A(<(gtn9t_-g`#&3fW}u ztn8WJ{qcN?Ua$B2^Z9szd2_}xS)QNs#bhK|RyG^C{sUkfNmwPA%e@mwpj-+ zq2TRF298Q;hzpJAcicXqqFYZY1DzV>l3&W!6{J!HtHi%O8ly?5~oa7Y3l!^XvCpF)_yo) z(7+@lZXfllB^Xi0To$Vx`IkER(d?oT#*Eu950qFVHl>YC{Y`h4iH_h30cy_|-;{NT zEF!KKzu)ead0zf2iF<;tP~`XO7<;(X^Xx4_4#U-*L0Vam&Ei@3`1gE5!rUF%4DZ|> zrF@7PnrU7rUSwybMr1Nzx_4TAyVT@}aetB}Sa#%xUTquGgiCBBmo5JNo7OWy%D=6X zJQ#zl=b~mfZ6u#sG1>ZsKDxWRNEfUbvMkBsTOs%E5>MSv@HY8fEzW$h-6y_ew=<;sXk~N6YGQuJq_ZI*J}}pHXMZW?;sJjd_nbex5IkhHc!4E zzwo%5{|RoajKYhmE4JP07^0t09!LoD^GX*1=czxP0Qp z)RMiAyd97Ia8QtCyS-oxf#-@(ni!Ws`llMY_**C>S45-~R$Q?8_ZZTppppHGZBjg% zFVeceMjhFP$ziLu?=e_@2m+WH^6pZ73BFyiB$DZmAsbbyAyC~E_BSs0R$KE zaWulqCW0B*`L=fxYaTC4^?c`YZ`#hU^J@{!GpURFuL)+=H zxXA3g3_boVt-+>CIm?g8Rp)LD-auD(ahlJn7&-lD#%b>^WqxM1$@A$)L=I0W@_rcKvLhYiLhWTV*=H2{tva@r zo&2iP2iU0X*QMk`pCf?3ai#4)BG?mvjk?b3LwYWU0|Q6T$Aefmu!6EIjsHTGJ)rdxvNS4a*Ybm+;!E8oHo^bKslGCKMdPDC@2KAvJ^wvG#9mT9a74yb z04|4_Rll=I7H8_p{!|@394N~nNqyV-Q}c*OzTo!`t`(z^7D^@f8)qpwpS7Zs8$R3> zL*kVvYm9rna%4!%*s_qZ>ebs(yE|enX|F|Sn(cHThnaO88uOWG-@H9h9Q|#ZUqTY<>;;CA9#sN4yjueP#vT9S8C#Is zs~A05v;J0@DU`Dp=##(haII<*?UA)ac=d+IqbjYroc$(Vk_Pe*RkPLmGp%YQo-b?P z&l%;|q>u-H)jWFtXBf$JTSt;iMG@g@!w!<8J;Ljcu^C%bNV0YO%aO|RY^NuDEILvf z8qqc*G?N?^?%c!96wy;^%lnnz?2aO)j|-F@91eXxe0USpKEvqFw;$_+rw9ePy#30_ z`!kV3EBYzjO**>Lwflw|#A;U9hS>#&;g*PV|Wo3W1um8DJx#n!lpzgt>=;B-KW zcPM`R(X`G1rQq@Q-1{v;ht0!P9A%Il(HuXJ4Jnm~<589gh&NarvV54M zpfN+ll@x!A)_9%#2EienmJ=C*r4XSzAkf<>v55ua+7s- zyE^sQKn3S?&y~U5JuBXQ6j?`&(*0ANyG@;qJhg{EyPL9>^R3$#D5Mdmm~zKuQE-3gd+!zYptbEL&F7_| z>l{G_?KD0IG|yLC7}mmYcJ`m{58Xs*#l4(vfp+j2#ohOHk?-|$uNU?d84;oF(ia#b z@ZX*yM@jg<{N#D#fAD(e>QFDethn3y@|+QXdA%Wc|u9-xRp=bt)e+& z1Sn~*3l3(#`09BZ?)84p(2x$H8!eR#t%oxL_iLwrw3p^SFTDL5h+CE1ffP9oT+Ss+ zX!Vmq`uA}E#%wzV@vCt@E_BH2^@54p?`b_x^I_YyEHx$CJe+FJ}kh>PfoOZZgO8R`nM~-JyVMeOk*Tc;Q^cSM7 zb1v(O*dfU~MpEvC>)Ki{DKEx(P-V~vxg!;iCs-n3&??;m;?@Qe61P>+txKtKZgk7f zKZkhS_&BNI5fXPO$wMcJXnWd6hTv0U@H6{+u&TB!!?dSgrf~Y<&Ab|dpN8HTItE56 z6>e6`1*C{=bVY(srB;iFc!rDuz6nbkNwnwyMj*jwkru`Xh<@Mf%W)gcfiVJxZ>sah zGuOdW9YxgyKU(I3wVV!hFUE=wUuGl5Zr?g);)+DY84mX5cSh;PsYJIc&Bu zl&)+7M!;Jci*?XwtMmQ>19s;-%(N|t5!mh)C0xzV6QgF#_$I|=&)g&@&iGDPRmQm3 zkY7C;@_K);^l7?7j6m$J@vz=cY3lFZs>#Bw`pwztm@r1bk`2LO+;>os8;t=P+%L9Ic16SrDV_~!VR;imWTrZ&$9Y}^i*xK)00vNPnad~X9h zMLyY^bZ7p3E^dDxu9U9-KH6vo;&z)W^xet+LhkAB<2{(y8zpU9HkCMJ>awZ_+exUxCGB1l-UTzzFo%3cf#M1aOqDMO~rH0bXxSE{qWCIf8H4ZFanYm`Yu+%9Z6JNt*vslkhrD1OHBr61Z0xwl+PFeBl0ONAZ|xCL&`dm znXFpdH6cdeYRWx#zz7g+g|&c<(SX(t9UfXw-~2>2&~?|3z={|Ei~wU(wJ~4>h$0*W z-y=X??-?T?N99=uP7aC^)sSB4CVgM&X|mWl8T+|H#mk; zy%>Wj`NcU;66iJe==wfy?&MZ&)4y1ybgbhM&yk4#c?a`nUM1^pK3Nvs>*nJAR?DmY zAshtQJE~Ii^?o<;Mh) z!_ep?T}DKcD}hd6CQCExUU@eVw}Y=omJFow20CHlcFmS6sh!c|ZEa*yKmhQ1@r~bo zZ`Z8#x1=93&V9dNH&ECE7q@2DCr%FcfVhP{MGnI%g+E1(!k=a>dl+nQ`q__u>h9wq zCYkJWM!6!c-x5vpMb;8Bu%)4I4&1&_O zwc;jGkn~V$)BF*)E0Vap;)qWW*+Lg6=kdkk=yXfc{Ui(LTZ4vAO9;n3L)8N3@6K6v zY~Rk6AGsRBGjs4Q)BbG&xp(jlgbGR|z02{}jFTTu^!7Zs&Ynmut3NMEgbVX{8<2PtrQTUV%`3*tKbU+sU4S!;GQ-CC0n-ME=#tCGPQe zH}-tDPl^qhr6+H8yz{iKCO@~`V9EpmC=iTsfvWpYL@A_Tnvwi|u>UCpn!@8GtZ zh611$jq8&UCMz!J#rD#5NzV^216FxiVf5l&FrXJ9W%3Q5yxhF4I7CvcwWA!CLc6=P ztFY^SNl~zjikV*lv3pGwr8cb^@}?=)V+$wQ6fsHh(|k7&Su7Nm6&j zGIo2Rc!hIO(H_eUc}n;AwyUbk4V|OwXl?qsacE1= zuKRm%E-xnfg(&N(cJBwJ=tpOeLG+& zXw^H_;b`r50kGY;bwCQOwk!v1H|hsGQ*B(#`My zNYr7dZouiqmO3n;OnOD`z*A_TOl0CQlp%Ui{x!38{8j!yhnp4MDDvs?m{u)cNe(y8 zQ)uK02A!)yf;cc`^6L{)ydYv6L@&ZqXv4%>Mqs;bQXs%mXaX7>m@;V*Bc9HKr_e*p zM?JrMtvdj{7*-mHtv?a}Q6~EJ z>2i?mcDS7?2y8bSnx^<1>_oA@=|!0BmZ7?nq0(ufqMFg4vs;v;iJ1vkCOc3HtvcBD zl+3I+8($=pZi*+tr#IN{ZFQ!zXU1TSW`E8H%&Zq^(lC0_Lv}@GJY%RSA~4_gogcee z{a{N0W&gjJ&c1FumHU1xNcU8tP-=LZK z;jMcT%KhfcE$ztE^eiudrO*p%DKouRPZFyk+il`EP$u*{qjrcCYW6n?< z&TSUNDmb^@{z{>J3xZPNwj1kf=8)1`?6&3y?J{;OVehmjS^l!!nB`CFyFUp&nO&K; zTf%O+k}MTdOs6wS^M&0ahsmc>L1%QuM*3q;VdS-F0x|l-o~Y`&4BSq9Nf9E-OJ(du zT7Jz!Xs*46TSY12vdfE@s(s0F93qD@oJxePJ(n%sZK=o*e;+AJDIk%^F}$>Vvo73W zjL#zFN`c{ecLiB<%}6$Pi-9wHCHXfoi6ZCypV>;0MmXOK-Upl%-d%F#yIGQRHEU~T zlktdBlDjnL$qy1^=G38kj$D<`Db`}6qlo;Q&-l`(`5e{$9Fu#h2JQoOad&^(pwFjlbqem6SAIM$@kwJW5s-GJ0A zl{aZqGrIKW$vR5Gn__W=&5nTE8#mN>rwKpD)Qh`pT$$#*L;1+6@-5|@_kv6dYi+Ot z!rAuX|CONvWQ*I~^XO>gD_y%`_c9uEkfTbxnIIiZ>L6ZK31r3-M?rDFn zRo%G|QAQiTQ1xCHAX`H8=fmxAnv+AM@(&)HcRK0^M(M!}6@i5m6+6y8Y6Sc=+TK{3 zd2!u%$WV#dX0%O>yN)k2( zm-w6k1A6P^=^L{mF?1=@Z?c(gtYkNgv#+oD%W|gtebB6HkwrL6Wxp}KCnbJtVLJ|F#@Fv zhR4`@L|5^%F(`OULFwY^t=h-)*mu6-DhK67U(;PNv#QNtH;KFxs=m;~8DR(v74Z?s zPyw?P7m~bv32>yOH?W^1sF&m;QK#Pd< zik!PFSIf9=*{xOW0eJ2U8uKLFP-&sg&Itlp|Rk}4i4vMNVa^Y8Kb%k(n0}p zAs9RdGgNB42B5TXd+^QaKMfT~wm^mox=fspX51H4AX`3VAU;w+tHUsvMJ0er7jW64 z&wCqPyak(R(#7fSAK3y*7geeQS`s2v_l#b1z~H&BByLHFFp%cx zsQmi0s)hhBU0lF(P+Djai}xojJdV2j9V%Tsa?*X~O1vN;j$3EOXeIiMh(EBI2P$1` zPfj2`ORc~${p@m<7B*dd4^ImvOILFO!a9M#Lqz%w%fg37L9~%8oq0&WLx10G=z~6=ninbWng=`V8s7LfG zaz5hw-wc&A*#f17XQc~`;I3rw5RvR{#-|qAC+iQ3Gl*DepO)GxhGKute36~os!A0o={Yv`7Gr{R7Xz4V5ZNjII6V$CXrm?%wP-v4@{93tYf+ zzUD|fN4HS;8ru})2t!at@(~|S(mtP0|IEv#(_qA1N;r=ZEOLFG?11yM-4slf{1UNnz_-I@S-4a{sVpCANzFlsdcbh`2BrM{DU>AojrXo{jO>jO5DS8IlnN zymp*?bmp+t?Bkw%!V8r3lNTZ4Dbe&TjOBl>li4sr{K;~@$kZ zq>?-n7-zl+o;GT?C%o19C$WjmkZ9-BcQ1hihV&riV1@M-d4C!Z7_|g=CcprjW0a>tnJ{Pj7(4#wOAIn|M}w4S#p%TD;){TW+Y;xm78{TvYS>6uS=X z4xsZvtMj(w!ZWl>I$~kC=wdWvVk;UAfuQ*b7-T#T2x^#S-Ir5X|tou8&9^4>lr z&WXN>X2zSgPU5W92?Pd(6X$Q5*XF-5ZN|OCpjM|0CrE5iQOgxQBs&mDY|<9`*8Nqr{<;eVY6Z&YvqP(gzj2$pzDgE5$?PgAqBy zP^lm6R6dBFRqyc-s;SI zbNK=AMT8&9{A#>GkNic5Shu4O;Z?XqPV?Q+EIMQ=FBkJai471K?C``UYwOGxQRXo1 z7X23arbpsAuLb0b$P>tkYmBrhC>s|)RMzz|j*vE7<@ntC0TLL5uC9WdLB?t|;>5xA zEe6fE_2G$)<|FJcrXaCl)WiCKMzVl}w8XeSC70^3Ki%2u<3HmqUZXJ@pd6Dp9RjsF zpQ&{mEX-?R{b_aX&D$(zmBJDmP1@Ol!81BvM`C5I(yr)~3DEgaVsqce;drxy3obDD z&DtJ8iH+_bU*vyIY%T=Gg7~}BowtZUU#6Zj$& zo3?SyS(urh7kE1e5kX>eh9g-?G(3cS5$`1b-!!dKs+*9&fF(9=pG;%^YIXjn!0<#h zEdhy*c3(?{w^`^9q~ymmmpcM>3c^}sbSkc<0)fHy0DvlYV*mIepw*fF1ry*%lUGyW zbUvH@1`oW|3HL=ntMk!7a$(GV$AZdQ8obr{M_`z|aYMC_<+=_8#$Ue3S*!DJfdOxI zo+UO{e-$P#5fNN^=^6K`cl#Y%wf+a}jPEgWeJKK%22750eF-rEX=1VlbU1B_$pI_L zaz4Npi3m?oc%my`o#CGad=UeScuh=0>N>gsbC$v^J!7q>-`k!dO~+*qO=rl?Vkird z73cVQzEG6(7_2!20P-C!;xUV z$XQ~8M10|kC>p%O%8|2#a3nPtop1Lva|-KHM=?nVw!6rCY23&%?H&I7)R0Vgs}m+L zUZq*cm|kC#MNTM~A$moRi0n(HE}hT}QkMc7rB)-&nLZ>dx>IL~v1ksVMI@%o*6Q7^c13Z+qO&&R|yZRm*6@x8n zEqUqn4zJo9hv_ih6~rSMR-%lGl&QBAq;?v|z2>DJ^zAPtL+UdQMII@9Xripx6t~xU)fboC_IR%Gm6Lb_3Y2jkddp`ka}v(d4O1BYmnUS% zH-?q?*s<4l1)pY``q&-MFwDv~3CV5d`tW5OvOYy`mS##(0yxsWJE>LNn*>(OE|d89 zHXQ&*G9MWu<5=f5W&RD`{oZDy{%F!Bdp-^Ud0aR``iEd5eWR)fvD!#Y-0VO)yY<>(`yen$^^G&zoY%g{6Idp zyW#lT_xZ_DH^DZbn!i0yeHpjELml_f1QRw6q0(!O@jL0JEhZR;P`Jdh1IY*wuiUa6 ziZdp0Q&Dgv57E;SC5>4ma}M)qPVl_fMDt3DxeNFdXYtC=OCJH$)-hM%`UNfcI0Pgk z+yuwjCjymzi@p|8eySfHqHejQ{Xz0e>8()359RV9?D00C5jqgnY&woS^;DZjDOC{P zo4YsKtfUzxBhn&QFo{xQ+{lXuVhLCx76HDEwv-gKNuZq^rUQHm2mH45*R7qj1hL0t zhx#w?JVSQ?Pa&2K-o@0ME~liU_R{^#&Q0-%ODa>qH_WA8mdx;IK=jgfZGy%jGF{8F zvOC1+jo;F0@&NE-m(!>u?4)hARB{so8i#1_{Wza;1b$VO{LB#+QaM^v%<3`(R5KWd zaNb$_xn7GnGp!4}eC z!2%(HsH}7F<6K7UIQ)?j=RU=+xs50S2`-JZ zc88rKppsu{HOD1{FRQy_PHmv%XN*hg2X?tm8QCj7p!sHwI1vg=p}SGX+@17e z6r@+Qx#bBmC6j(=KD81b-z4@d~yL!db}=$OybU+biy8;}BZE zENS5JN|Ns!kP%D+SV&OGk0sbY-v?gu12Q5lEc@@0A4lF4hwF!z3Do5r60ucgL3o!aA@D`gC8>U z)j?@zJ_Q(uxR4PnrJ&^ZmyGyscIkfVu2XuK<++Ri@yZsE5f|eSe`Ev^h*w}fg}if3 zLHrt0R0C-S*%JjNi|f^TPQB^p@ygjaL}w78l(MIIZ~?mn;`{Utbvi||#-fz_l+?U$ z+rG1}6{U6rAjmu4EsvM;N)eM?K4i$~Q#LC~KU5fTipxmC9JhF*)R_TM%|qHnnJ@kw zufV{MjO%pj3laBIdUsw(RR4TOkSA2Ryd#}_{4*tqZpdz~7%n61;&NF_9zB3cez0+f z0{gp0LRenIH(3gycdzFqKNP$M1+|2J5U=Dl>b!pS-%5U~iq4hsUvLK{v6R|GKL3eV zOuBDDB|n%?0a49sw$M04uC;dC@UOFyA0#8DyK>ijm|Hk$Cl1MFPr4B3LN-Fp4(Cn-^>ooNcKkJeb>dqSR}Co}?#kth zyYYU*yyDsT_>-e2FS)}_Lk#eb=$E{yHyh#TezRaorXH$Q$-q0&6uYA(_sQ@|*~{8dIyBI0|M0GqS+Y`L;XpiSOqwQRMCmVCdo7NLQ@edV_% z^uecW#lpAIS89>{1`C9Cf3y)(JdjQvs(H1GAHC|IAaysTJIA9yztFgQQMD#Q<8men zu8C6Q(b(blozk98le}!Tf*Dl7@=>28yy{3$^0Nw_UoASZd`;D>lLo*6KEvzBlUdZgjr{ZoQgA<=CAfSM)Lfxii`#16F^#o$1hxC+DrkQ- z3i(nS#hnwM_7W}P& zzfTb`<}@89Tdf}3U%F}S{}GvUanjlF6L=2QA20s$F%70AnInb?I<6B3+2Yh6;xld9 z^WmqKX)kd26UCxj-C|tX<`)C7cy@0f_zFP8rzn9wAU+R=@cbk>Z{Bv6`)&2=Y!wO+ zpWZUdK@%Y_Fi_@%j$K<7Lvv>RT`qB7|;4vXeq?(ix?WYUGV!a>lUFvog;mSJr_)#@8x&ky3qzxU@R>U<97#W-QBP`*|zfcVT^ zNP!>zHCxLhSU>^!2bHS6M`r;=tefaY16rCL;3{&Db0e77-+NNf9{Jyi zPZ1pvD4=){#=dWH{2ReS;wsX4K!Nnk%>jj{o0O@$^^^o~6)~%qVFATrB)a)MjgLoh z=)YJwSGM24xe6K%3_OQ3;`8geHJtdoZeD-e%?IJX5}#)8p4*)fpDeQ1t6=SZ$L&0? z7guMBYpexWJi}^TYW!BXfB6R?dNvn_KP*{V6>t^Wmb-;K4Tv)2S4J3r6c=TZGa4-P z5A?%`Pe#wH^rPaZ;l=QP0<`-F6oj*PR{iwo;j2)xISq1|fUDptth0x&LOIQqoD-k$ z!w+lsmy%lW=YE>b(DXJw<0_;l4&_#>|Lq^}B@W?S_y-`MfZF{Ui6fWQhF;ZH<+<@U zjbpy@EF-z#DrlP2Eh4WwW)$6T?34QPKARSw$gAjU%3}n5O}=OInkWs~`78kzS7)wV zIbaZHDhTkgb$*2Nj9yl5Do~cofils+Aw8;~_r1{^Q{w$r-z}EVYMFVb$sxU0Za87Z zq4RyorKjxrjc)`-Ww3cN#o8_N3ss&TS1V$ax1sdBwHRN)79N%9TIVek!n=(lM$yoN zKl@hYZgx@blYIfV-$S}rs}>ME@O!+1>rC%!@X4nlQ>9=z#I@gwlD@9npQUM>p~!0J zRYvs2&ka56Ri~l*m@56%p&bnuMhdAt+mA_1kKOP$f4<_iV=g8cC?KoMlf$smqHtyRip+1R+ZI;y8omm9UIEc~<`3++ zj$JD`;~ZOOxH}yx{)h}!$)_w2y4MQkdtvU zfUAEdf%ZyyUq?1hhKF6o&4uE6S<7pFP?Q_1`+Cqs-CnaH-p31^kUSz-@#7 ztuKP}^8eHqLH>7N1lk5ldmPMxNyQCIANZMtfo%Y(2gx?%JPz2VFG%|f=p({tP4 zqA$Xm=?kb#pdS8}KDY;sv3qX+)Z~ro^R-X%bDXG5JUwRAj1Stp#+dm0qavGK0RDY7 z=8@^@lOwjTGs-5`Gw=O(R;lAeP2sjd8MYP1VN&=9U>n2>8EGUzwt>gv_aJ?EDFI6# zlJTMR0SQ~n^CoNAO=qS8kUp@R6K7ef?9ZcHf;MXJ#b25f02ig%JeMt4z6Hr5== zVf)XbA)R(Lk4OV(Qw$Tkq3&Jx6-8k!#4POA`bOM z&eI1G{kL%SP&aoEvJD`-fh*Yp;0?0z{VI@p$jP>41nPm;;wfDi@$RtnNS^E1xpGZOa(8o&#?~A}TCEq?JYosG-dP$>@ z5a=d>$Ef<)@FBa#wHjC%nnRNh^hH|4ZV4a=MHqr@pc{PX-GItG4ibAEdbTME`Xa4$ zJvaqEf%h+{%(F6d%I7yBfA>W$HYLy0LmLWO4!|2Ei$rQo%|aII?=n#+w?kCsPfrra zHrSLABo(0f3vZx0@ufYZGGUvN;V<){^x=68gf~Ea5nZd5WSDKx8A-}#L(pvVmwNbc zc-`*OzV2Zf?Zu|#|4sTJEFMNR7g~uMrhvIqkevOBR^~b$P!AVnXn;37rALq#Y3hP) zN@9A;2l5mqu;NQdgKZ!}sqS>ucm7YR4NC6D^^-8ZbJoxfRs1Rij#p7uSq81@WzOPa zCn?v*tC4C8QiByE_y#ZRJ!RJ0;OWEPR3=Ctjs$W5-Vn-5|C;(|9ZH&fK@ff*6WdXG ziTS|uS7+NmmU_7<(TY!@Z6KI>FsA31_Uk@v3lW>G0(is4Hc&PPTs>sB8wCEb4K6k% zJDG&~GBmClmsBE%(4KDt@sAAl!qbNhAJ7*8>H**l`>PZNf7u3)#YPc{?`wqdo4Rdg zOtyY00O}#^DtT4fiNe`75NuP@{3pLJQVQ$zwQHFTvp!#xl-~CsziMjq5z2pAYZ#23 z=+?+Z{yI>t?~-bnl}Ejm!qp7E&C90PZKVQk>knBAS58yjn(c=}VhZ7psu% z7%Rg^kM^c5*7=yL5n{tbQS87rP!^dl!`nY)&>hf}wY#Z(n=Q2ytL|;n)AVRCj+RT}Dy@HR!rifA zM=QMqpEdWZYNT&+z&23y1NHBb69|JNwLKB*{$s=lDA(?P7G^hfB}_U4p-W@lZ~2|${B=)eL=deLAS`p**+A0Yk4H33ohaBK;i%1SE&0x_zFt!CMiF} zB`h^W$iey=%i|i61Vt@Yeu8|3^lUZoI0MclTmiv--c*#zwa?xO@V%tYDAiLW9KJ62XTE2 z_^pvL{y5@97q&Ki{llHccaI%0U~AJ)^`;)LX{g{m9o65DbtdU$mzO1VgRKSvUjcxR zT9TACKp9-IAt3dk)ge@ML)`EHGbyOU0iQu%1NaJ3#YzyDaMy4R2b2T83rWm<B%npYA(_%x~B2rUQGBV6IvzK8rDTiSM zmj`Z68$?AU>${Y*BiKrOf1Y zjYa&dJbwh{s%J@9u(jzz@wz&E=Z8j3VVoVmn$g{k(wj*~QOsIzHy))G)09?`v|81z zuv#H~>%eKxkb40Fg-b(cP0}VrQ@v~F*r`61^1qzj?R{SoRrzQea+fr6hnlZ}v- zcreoUKwTzd%m^z;85kz9jmC%mHo!_rjaddHL)PKXz*K~z6|A>%N2?3dIh9cb&}!fp z0J3z{6Rw-C{|OY{yEHubqYREmz-r)_)itZRarZ|QxL`Ffes?}K_xE9NSLg4e=UO@4 z=o=SYLZk}!$;lO1U*imX{BL~?nSd+*El>b`4Vo0pf`2K4mm;`>6u1BMHMoQwk*;2F z39z;4X(@El^S%bO8VG@pAW$${s9`x<4J_uo>{(_C0tJdAJyNh5$YOym_>5#7TATKF zR@qOC8bJ}>zI-v00tE^(lO)VZ1rmTu*vlk>xP(_MZhp~!aS5+6C=}8KrSjlw(>j&DdS^GlBSEyG{ z12_0@T+yTbtIt+=Y9l3{Dg%!D^sq%v=NkSeu4?1p(az zl8d!zz$GB2r}bVtEc|ax(*Fb>|Ex_%Uz148$TN2QoI!#?^EBP6KU>TrSre09wwP|9 zAmUG7W1xiSbq0vDnWpHJsU3@RbQ0+`Vl^9O&M(D330t| zomGA4d7VOPKr&a{o@{4WUjrxuU-fO)KWo$f0v|891P1Q8-u)(# z?^M24GDWCc`--zCEEv?1*yPL|El5HIet%X2naJLMy6%{+#ND2$lGM>`5+`POsoWM7)JI&F>a(^rO=oSyc zI=aSw_5ecv@q)yoihG}G{Njlh7xi3hZE)o913ptON-1A$Dp(8pe={DS*y8^$uW;6@ z;HC#FY{8WO!7DKI;p%*+;?F3_hIoaMj=x5U>3`JRVMBse*Z{9^QX|uGgKVV9uOAhx zuocX;L(eQa%GtUzKk|ExXU@J}>cM-Is0oHD;Jm__@sQdde=aX>r3Dq;_B`uVbSJW5 zM#GGUKrX_9;7Y;up|5+Vd`tqp?bn zX2CwtqGFCWls5AQYmH{y<07`$Z1uSADZyE;_!&)T>9vfM9Q4dW=isTY9P6{7&`nAG zz%W&)SD`n6Iu+@yZ^cK0%_vl9W)_(wO;t1x=P z1l2*sFbHGkf(K}vMsDAK8n<#nn=Za*)<=q9`2oZh?T@u+ZrOwLpt7C!>RpdWo zx~251q1Ma`JhS*1AqX3)ID2OCPve1ou=YmnL9S^JyN|^PqThwbn1m3IIU2C^^ zZp~*ulnt=QoqmCvP8>#jZ<3vw)ZBlhVroILg&MFMfbkGbJ!;ad0qll4#=Rf>kzRY_ z`2nY${$NafZ4BLskSS^0jT-bSWE4C1XC}$9V0BQyD@@E=gP{sYUbxrLAe|3YXcL28 zg)Ka`AP!%b&=|})a{HTC$W{OOM_&BtRs54znEd?C0vf9L;K#9nynnFrz(V9~sABL< zZQY%T+*3jJ$)exC&+4F%yx2S>Kq8a~vBva1tAh$Tv41haKkHR=&7+V2Ug2R_4Gx_# zBGq5Lia*9fo&il2G)fGx$9uXbN1#{Xo>qa23*?1&FivV|!(B*Typ9@3SiGD1lG#J) zY?Sy+UNkS_wfckDBI`CX^vptlj-veS`6w~04*KVr1$?Li!XAxo{=oe!wvhY>_6Wrm zedt)i;F*OOjk|4K0&Q_|%M${uV90pLb*+NrMRzz@oN)NNSFyNM5cY!(;i6Ze^Dv9% z%y`go>PY*$4oYYSlNYdO77(vcHHI)fT>Yx|BDR2@S^NjD@New#b~>e4zcv%5v667! zG0h?$T`xjsVG@mYsx)V4Z-|&exQbc24E5#j;Ujo~9M$Pxu~T4mQ0rD&`NvJ)<3}U_ z_DILKn%YRz)m(**gnmy}Q)bf9Fw zHwiqmP=^^0V1@17u*%kj@o>c2Uq=*TrpBLDpO!u}&w$|i$=E1Fm3CNSwYXrbf=-94 zeYneZSIG2)AtsIvK1vLRDj02s9rY}Wsk9i*M~T;^=pp0b3tb*;l-Qk~pcfZBv-o!% zRKv*{|E_;_jwwy%4?F#$^IpYYyaIfbm_&pgZan;jJ${h2yd?9&+ou53LBp=%j!_@7 z-uNJkC*e}aF?IRDALHTW`ibRz3_U3i-jz(8D}k!pp9B?^)VmQyni}0$Se}<(3BG3K z*2qT3@af9cnGDEy2ub(;WucJZ}aUJ=$xwHfLj^ z!XFH)M8J&)o!?P6Pi?7PwS(TRL~-&qbdlN>ZmVC_ad9aBw)ve+rKX)-Km`5U<-%06 z_Ff)4T%ueKs?*}j*VjC@_M6>)A&N9heP9=fEn zr0?oIZO(m3YV46|+-X?pNAwiUWJko(C*T>gOi3MEiEfZ_*dRP}n3 zY#J%Hw`TRwkU!rJO?~nPWf}Ih532T;9462waEfn`m@Uy(P2Ujraelyh{q6I<$(z^8 zTeO$V94+|x@i0%-t9S!9{jW7lJ-Cei|6)Mkko}*E5y<~8M!=$po*+rz^X4UtXnYus zmc^)k^I7ELe=RQOO_lc6s! zQ2la)MeUqu#LBQK`q7*M-d(M-vKW5HN5&9ZJS;w&vKpnH1<}N{?CRp8jhVZ|q@a1p z=Q5-a(ie0JCHqo^ZWrnI#@h8#!QTygyFh9-7)|hh(ZbW`Nd2W++XDs!30F&-F;&@=w{wWdjNeSTgCME6$w5D@dQN$<*PAsP zH=B=4ho8egL+`Gd87-Hybk%I(Q&vTTSU;9wJFTF3S(y-hUW^DPb3EQWMEM3&2+6~} z%BOSa1Ls8JagW> zRm%&3Bkbd&Dxg$o^9yBy~}UoV~k(MH5oAvN?cg{IBn>U#uk{U-!rTe!C@e zo&iQ2mAP1-X*4byJ=^`KMx)G2Pnfpg^o0;W+w^88FXkkG_)~ZFFHu&ic$v~xZ!O#& zxcjraaovl@W9PX9iVe(M{V7}}VG`gpA%A5cL#ZU>lEktsd&{RBfUT|0ID{zr8L%(F zbyvndG%{b&A>9>BTL6C{95))3F7%ZYr)ytTm;Ru1aRz}V%h))Cig8TpsJXOskrf0G z&}qU(Ao$QYVTR$P*kF-IPd33KFLY9DIBqmzE{v}kd?}s;jm8I}<7XR<$J&BL$H4kN zc|NC_yr%lBKLUs|!w6Wh;cE*OR{Z+uX+nLXr?inGb;y`+JpMvZIcw|v0&lj^&zEj6 zRI;31UdFh);k%@5-)a3Q`s!7~5&>mWadZ6BSGvxmO8AdUIRyy=16@dG={%dkX`)aV z`FS4+k3ombrUhoqeXdY_dzo9WC?j4XEu`dpKk76~Wqrx4JHy%fy&Hv>wRcs8lF9Sk z$Mhmo-7j3auaLM9JaHtV=!<7JYFImTXoM4^uIqWo5bL<7#>IZC4v?U2`b1!~EyFKy zd-?5U?y%5d*Qu@OEpIuLh6dG5))>6-9^ziRmhKEkwk4Il-9dUp4nZ4c&L=|2L$#7N z{9actp-_;pd{n!b5n@cBctLWQTD0I%xWt;t*!i)_J`R454&y-ns*=TB@yY?tuIt|S z#BP?ZSH9ykzU1=5aNci8f8zyFI8!LsHyV{15v{d^>MAG1S*-^0!mnXyROU43<;GMd z5gv|Fr7gRqEu3VH8w%006i1`2LOz@Rj`{;M%z)GS@ydo@amobFl{-QYYAtr=s}}A& z!~rv>t>~lB8Cj9?k5|~X<|b8cpG8icJz@Me*+d+d8**)qoKM*eC_gOYkT6q#L8PnFS`4;{IL;W@sroQVSe$xI08SVXyJ7kjg2|U@&-1bfGp|wQ7F6F{PX#9oq6By~^14J< z7qp3>T+r~lKS-ngZXgEjq#8-{ecX?;B5f{+^H9M*_(^J$7KEJAHWhIaY6y}v`TqQ| z%#3VmI1GkK#@r?wj?+N@1y77Fx3W2e&X&A29cylc4 z8OXy<7;?mf@u3WI(NUTc-zVcEERxBEE+W0sOHWVDBuQl$6jt^ub~*Bn%g!8R$nZjB zHOP|5UiY4kk5xm9&O^E)3JEiR$h-{*?58d$#v{%t?0@9Rh|nbm*bUBqi3&fiEvk+ZX$k{8{jVp z)!rsS+6Sf;qHuOYOdz3@d>8R2Io%pVoQA83J43hdzzYIajnqq$32dI$e-H#Oh&2Esd8{atdg7_yG zrq9l!e_%HlQ_$A`f=w$=kyDb42*|YIL zr1v>#!C^v}_~@@0gJLKh-tQBJMVi?kq<1Qp$yA8la4O7{d>xcpd<6#*X5x5xI*lYU zmYf%fi?;~9>PF3C+b;G@JrA5P7A(M0A{-sSFi+SG()LY|F!OX1QBn9u#&80|BnfLd z`+^v?G&@(mc#xR!=d|*46LI>2I3vvD?09PTt1xL@gQ%59i9$8-w$1eiOE0!EAkzEU z6Gmq-k)-XYP|OyAAl^^?ZYPHR%jZkdh2PRX4C;`%!%~vb6o??B+h3VM=94bh#qdi! zQ&y~?IO~@vnF4vq`y^r$7;=i-ZJ=bGA?0kw(3PdOcaky0$ea^X=rAwIzi7y)@vi9A zB{G|WCz;e*SE&cvyTuAZf%pi#AhzmDij*A~PB#&Un%d~DBmD+mQGbe$j6?iWl`%KL zv=V#$j=*U(@;7qIM5m5n0!5^>l7A~+irf2i6XCM^$0p+B1tHcq*awGU!jV%p?*O|& zq_hK+8#Gw&+>GnUf+44%Y9u&eR2~xErLh$CV2sYhrv3JQ>`lEie{>Imd`r`t&3x57 z#!I+v9!;#oOrD268aefLEq4~stj}j^aID>7xYc$`2$^C|@G#t82u10g4-g-HHf|TQ zDGWArDx%Z$>iAd$ARL`no>c5dGD!-DOE=Cd*1SupTrKcTl3wsA9@)}PXfp$=*m@Qo5u-X+tBLNn2&uyFKc( zc3(Zm#VUX7*MVLB)!zID!WCZ!vym48Qw5rAYYiiud~ZTAiW6+tZs?3%mvt9@Ql=VU z@Udk)hJN>@d{&?`=IeM zyz)h_0}&7(na-CGk!{+OjWhksEpL&qG@n35{%er%KYtq4|i3wg7lAVE}H?X^I{?aS^**Sw~MPzJT8Jm3hYQENb+OcfsY1WarYBp5U)>fuXX zhNh8rL2tPL!U@jA=HG1t2q)3B=YfX0N?+YN+7S z*Z8oz1zt3KY~2tO8?SXifgctmq~8SyrvubQD+@v(eDQr0oc@%EBQrfdkb6KqCHz;J zZfZ0!yH1+sc{C_UFj&@Bie`v(2u>A9cgx8iT`vbsf_7#-Q(9lVA;DT6v$%pSyko<^dd*BMqz=RzG-jhZ6CLSof~ zpSLpJW^5fIPl9PAo|Rth&(Tz)It0|{o~js$EV^7IxHr2K&u(yS1xzF5tEbC(uNVQY zscCf*I5l*px4_7gbZMPL2&e_w7FJue;2F^Kh=)ytQS}DE!Mp;wTNa zkhq@@EhOHYT}XWXj|&M{kiaM5_PBL%qmJ(um`0u;oSd#8;kEI&mGjUZ8iF7py_6OT z5<25e$ntVpGi|TOYx=f%`1Dmi5QuZHBhKmf>a6SpXI&Ct*{D;R)hA;QL zZXJ8G!_&}!@I|3>hSw?`JOct$RDLD`@}%I`j6`3(Vyv8X-R9fJ!k6B%`n$k?XxFJ3 zv<*%Tu6d}=RLb9w^tqd}15Sl6>+_0!)iL2ISq)!vN!jz zT8iF_-m>DwJ_P1*eANg#S!lRv;YVTpySv$)ZK7~u%LsT=XdJO zF7)SR)ZsMbYO~laVgTiY`5A z_6%TQD({AbFJcpg$J0n?At9xeyKwcQ%BPiEU4?M}A?P?3RQ#>U@P?oY@vlLG znVAgZG)7cs7-6?r`(T#3_{FluGvrB3^O5QJs%SKs=4QHXIiv+;iHv@`WKxc|NW$kd zJ7NhL$tAnqzA2u)Y-rb}%Uc)#0!R|G%r+%+3ycJ#O2nIrvWPO&A#uC2jE?s0qJAo2 zRX^uhuT!;(UH|6uKKlWC7S2&k3h&B`ouviW{t9;G(ho7M?`Jk5EZXEszu8TJg~WzY z_XZz)ArW`?^$Q%a&6${*q`4Sm5Ya&jn*BUWE=bMV6bl_(rJ*vy$!qh+#` zO4H;-vTwXMsJ+WYnd@AVOD(km+6hCBh`Zvp#xhup$wN(&rO$MXnKb#33)?u}cc(5s4oqe1HqVe$ zvASHRRCeQ0h>_zs1vyEcS^Yh~u#lpkt~4)&+l`mDdXlRjeaop3K5agpq7?q$CgOkZ zCZb&4i!yZhsS8bNIwb;CuGclUs9R`BKDP(;t_!hE!hFfF_dtslUsKI^70*ImVq4rP0*a|WLN}+{*(N7X#E!_KHvfu|d`~ zlBlu=E`}5Z<8UHV)l%kishCpUdJBmu?g$FadQ@Hq%%QQe@#6b0MzD!UQp~qPBv*-e zkHyKfQiCHzI$sPO9?V%tgEyNS0zLqgf+IjFTpQup`pYK5{HV+5o8N=+-|vOPCtZ&q zQnfH@SfiN|)!J=?yANT=$1cA>i(f zS?%4mov;fMdBtP9c(i8QyZVc{JlpVsiQVh#q`7v1E;j&5!Cx8MW-i!r%x*p$A~HqW z#*WR!da}TXOqD5U(GW@@N!(^7KdhX0wKy-#0rDk7i^}f45%g=*Kj1_rXcG~D(^dN~ zstNGe;3exItoeAxp#gg@h)M7PheqBH@&_3%M<~Mey$R_sltNM<9%5v(3nq+I9Y*xz zrYiQAvGd2s$CKE=MC%``31)_;)dXD8A3m7WN6x^P%*{f;>GC|=nZn}`5IJ}T9I*e1gKWD`LGHW6XaCgKi!6EPPosCH%(0ZA4aN%Z6Zukv3w>0k!c61+x*y}5hD$IFMQ=!yFOb{bmuSCgmw}Ho-X+= zm;VqO{E1SKVQ;*jQ9W$U6Qa`=#v-dKrs+-L()Y(Ef`?rR(e_8bvv6&II0y$gs;C%$Ars+N434X-AMg$|x2G99B7NG3`w zi1=a-bL*rSPMePbHmAtPlT8GuCj3YrJ>$>_8Y!(u;|SBik4~szwPP)C%70Bl_`dbFi$FH|#D!jkF zi}CKIxK`Y#o#bSRD3&)C9^%dKQXVI_k<2u~fnFCFIcjm|9!C6&!Y5*K<2U%Vv=5ZF4s6qjU8=-!O|6 z+YC#1#lC#RU`)6C#9Aftd7mScEY?ll^}WOe zPxag3SHTWFUq5=IEHxleTlJD%jZ|mxLP`E!;5o7xL4mRau8o!%8rkqiG0+4xV$h5v@r2ksLiK%ij5Ho1)jXDvww=fIfIU>ZUGm@G#-O{ybH z$kFMATrkpf)w2vIZZM6YZt42?kZ$MK^+Q`l2O)hF*fe5FeE&spoB#?7-Sle$KWjDj z%SuCP9*@+UuX-LnK+_O1AE27?0?0-<6WZrypp^#bE~fkIB8`?OS|u8nC;0J{CiD68 z{(?!ij**Q4tye%%Zb(3w`W3etkZi%H5u=`UTN?v?6SOCB$tSiWokSWC(Yc_{jZSIZE4^aHEf7z{z6AVz2$$1$=fTO*3So!jc1t9XQvS! z>RBwqT6`+_nnYnRm4#|_L$mhuE_7Gmlr{Sdn9$cYjt+;fI-{~c(+C{v(WfaC#nZlJ zN}!n_#8NSbkK8jp7ao+UyAUk~fD9qFEC=KCz9w9m?@-OQ`7=!W50>(SJndGCZz#eZ z2>0f0Z>&4kmz_2fCU^W!SWBM{93bSvi%&(*@?Q7|8*S9MetLN#*}@XMjdVt`HFT|( z`(HAlPo@$61&IHkvVa~4RkN-a&mbEszq(_rDpx%}MmF9@JCEUid{>~fI1;4;$i@P% z+jnLr(c=GjARMbKP{Ya~l?7}X0rn8M=DvF3v%7(CgDlG3>#oCSu)9KKBNEy4>s)jX z(__h&@Zq(1SfJ2sCyWzd1dxqd-$Q9YcQH`jcWIXTRI-&q_wv2h)2(-SsqjGIMsLCI zW`c!CT-85HwodK}K@3q4asfSwWpw^s|F}F$QN%q%3&2{6mj41F7ZyNCAtCwhP&;fi z2}!nS%U$egI-|}u6Nv1uoJ=Dm9H;;j`bmLr&aukk>1Vp)#LH&_g&i_{zU6v{!2cxK z`g0oLTtO%G-92ZO`4Zp0lfh;*gDmpf;!Fi>eVJp)7L2vzEt3+slU;P1Q7O)9phQk0 z$0SBdc~*2NII=j`PIg}PTV|g5)_{oRp<&Y$!|;0tTvQKc`RAtZ8=FE6vizC}@E1pi z+hEOv)t|@!*$9(t{bnt}BwI>22PGx>6ITIiNty5nv=oYRn8Qmm#?F8$usx*5$8#N1bX}tWk^Ni@man-PYaTcw(d3@3*3L?td%#iXcv0 zM|nBX71R-A&*|c#+dEfuZbf1iep$h-ycQ-nnn2X1>t@A887C;5F0ub5JDAJRUbEl@ zD>fVH^!y#$iETY?o@g}3$Ab(m=(*>m^dFoP8faW9$@8o-3?cYIS+6smevNWf{a)3z z_EL;N$IsA8DLy*-xLD%7@wVMy|Mn6NkN&(&+^AHZM8uK|x73>xkv`wKt) zP8P_aj;_rs27^Ew=uj(Ya>&piToS(97opCPrVT|7y6>jD&{HA_3iKC+(10AvviFew zi=--!l57H4Lx2-Ss%)BVON58s%OUJLp|K0oBYHyH=D`#QrY4~4`2K-tW>92D*m6d8 zW^tyM)Y1`=UY2x3 zS*2>qctxWS1bS+DSRcG7fRn!X{4M56QFl0oVWXO0K0mr@Td>#!bRB<077Bb{-l(Tu zhvuOfL;_Y0ek^ps8hKV(sm}I8<9%2k^yb!zgR*Q1E?Y8}`f{kq><)tyg-st8LeK7~ncH`p zaVs{EHdqejaCXhEAFY+8>&g@Ce|}BN`Dog!Y}gi9Cf4^q7ICwHhT~(CV|rtf0PI8o zMGkInPU(%@!+_qXHUXzMx;ec4v3`NF;gsHJdfzCY{NK?VPax2`*!QtbejQ*;)SqZO zhaR)E?G8OYC%L?Mrt4_qql_XRuP}c8=6NpvYwC{RM1fX^GWYhZ9E-vU``}S}@p=E> z5NPnCIL0tUN5COYwrzajYk5G9MY((=2)!uGW%%#Iw4D<z<2rTGzo$3;t*OA=!OZ56YcA`RgdIpN zEU?!bu;m#`BSC*(HBku2u>w1rI>dCn+rvTR5K~Mqc||8b26|CU_(-~W7sld+2=IZf z$(*v3c%Rl)u2c#2 zey<_Avbx$be`6SYE@uLW)4N#)jf;ZK%`CczG&0$maoZj3tloK{FNov-#0h#)V0$y_ z%@PdsMjmTBF-1Euw2HFNKh^vTz0u&>$r>W`U#uaVE>Q*Mu$VDqP1qa%>ovp%nZV!I z5GK$XV#+H7tRZN?8sa`!L%<LY~yebSz zWAY~n67RTJxV4_oR6(VS^7v+Hst-Qv!Y8{c57nK?M71llh#40TJ8@jTwe*obATYdg zO{w-yt`^|?LFvDk^WX>uXq`Mt>WY$3);y5qtQeM#=cqPJ@T zMAN!Hp;X*X6}o!y379}64vJ;+Ht9;`nW|$}7G$VO7*?1?%A$q}$G$0C{!IBW@f(HmhS~`uF`3omuF*syqf)i-h}9vPD3kn}p2P&oH6>l0F*5xOevMIMZ}p(%0Fk)qRV-x)M8(|<&MX0-f2O+`8DqErGj!p$u2PUOU=wj}e1^bGwF8_VDcp=1fN1^9|^P&66wznL=^zf zc^BKN_XVj3orVaGAN)n2;Y{&+{UECVTR&)?tRLu4)(;s&*8|15!k!21jG#f@DcC;p z?o{Btko5U5&Ik7XFP|?o9gDopuA!!e8DUWANHQPEw`j#2bP0deQ8r*uSKZP9;@ zhP?=$>Cnj=`!aCQ2?hy@2CLgDWiHv6nE)_TUIQwuw7{UEge5$4WubqssXFwnqY*MYnJ|n2H%SAgrU#imX(9Vt-C< zlK~KUf2`19f<)fya$NCtQCStsxBxF#LjLw7{@dQK=;;EvSZGGbm$D9)P@4 zAY+iY2__KF%S=@69fi1dIijxXW4jWW>`!~TiL=l6-iQPl!v=i)aCZb+Ka{>UU9Wia z;w1~0KYaZ_6l<}Z?ely65c_-m@FVs2`XLEgKOmvN)(?3pgMIRO3uo64W&dIQaP-Tw zqW)BudAfdR<5`Q&alzOohcX8AzIgB=nA&(m8%?D5L>YNM9_DDbdv!5LfiXz z;e7X>i9CoW8N;!6>L8!?+D~X7362nFv=Cq)S&&5bhj&UZ9TR#HBoCqwv9`Pnxdk!? z2+Y*-OJT`ZK~(+8)No6U#CzKd*}r+tSXAA_G(Zc%>iFPJ@>pz2+fVFNxwpq)rhh0c zz}F8gQKY9LZ)p8+gm8;G04;=6Zb{B^2Mypk3l#S40K=(?VSJQ^jXY(tXq%>-)R35DxDy!ZL=KL=|v^7(py8PEWap^W0*z-=Mu9 zH%8V_lO(VCs1NR)dWk$T!LpoF3)f}N5SPU$6|I@uSDj`IkQM?@qGIrBuU--0IR_Gy zL+b|^))AgDz_bu$^tvzd-fS~G3o!m$Y2i=r6w-8V!(amoT$c&|w~HG|xD3*m;~kdGz^KaNG-LUigg{8RJ~C(TRozCJVMYHp*G zxTQxh6+!V*uIU{%PM~{}*0n{u4)un@kTPF9#PDsDfJ|1|`p!pmQ6@Sn+_G3I^g8Jg zcaOTv{49Cb9q(SOQ|z`=^9l^J(IwE2aC)Jm>h$osJlDC~JxIL8dZR`OWS);hqy^b{ z37BJe?=|&3V6!^hHNuq?YWjqR$bSB+#3d;P_m%fTh5pl3YV6&FM&Aj6>R1SQC%O zI5#qc!}-j+hS8L7E@O%Vy+pIhDq;NZ+Hmh16{{jWnFB4vo!fpu3t>_Gwz`P) z<_-G@rJSwMs-H1Czl4=%Cj8xOW#(>ttmvKgX@mg9uS3M}UA-xiM_5!PKPL4p12F47C@7M4v7cx9S;qsy8lAT??Z(m zg&#-7m$~5k*!un|S)9^BR6y zw9yke?a-lOl-j|yHbOT+KtLfd&WoetiVJk8FnS_sumq$KV2TmRof;LbxhC>CA;tl$ zAn=gt^)j+cJ4n-V3y(w$UKX_&7-mpmpe^M{H*_$1*?VWIo7LeZ>wy78mXY3b8s!y; z?x>O*A_`3?e=Qr9j^kB;0fYx5i)fl3h!wu18Y<%sWRCS`f&m1WP!6t;SMNfH3RR2` z8x~`*CWG4w7(mcs^?QOtMLs_mJ8U+J(BG7+C(z9{PenIc-4y0_`j@eS(J9?Ax`2=y z^-%EwXfjyIdy?jC`|Pv84i!1WWm57n#?a28U_j-Z0Uy+SEbYZYcmiUDZ}v8$Mz$bK zFf3!{?3(X3w#|BG8N4^)#COE`=<_R7MO%pBwBId5o?Bk*25T}vbjLJm$rC9=)f*lF zS%5Ve)P_+~)6^yxVRT2{1;B7JqU8N?(qve#GD<%^RGiQq|7Xd@^Hwo<%;t3$~?28jeH z7J>l;b)hS5hg2jU7e20Vnv1`r%&5v7P` z(hj9RQ_nUZ&m1Zi&oG?YPX-Wr>>~6%mLWds=TmxU@xAZ9X1&cb`8PJSLTOeKg~Y57 zUuM!_z_u0`K=_Gg_Ju03MYFukAXI1gq$LucdasaFG9;ug=HRvy<{^C+B}2b`dv1C} zC570uM}I2UPR0}L7(VcbfIGKgQixpGgfdH^HM2Yl94c%v8I-;cd@AAAMI@5RQm!a& zuTWb~x3QL2K87r8M=(79%>U`M`4}ZwO{kUU%l!1_b+{BFTwo9piWM|=6l2$L^`IsL zM^Sz%>`-w`cRY4WNrk4DmON3l{E*y5;~szP+y;*b9oGl{#`96d{hkK9B(d&~2c_`Pe4el5{=WjtQkPrtr>mtA=GV_*PL@8iVs#{M@Je8t%X z^o*wO`N069QJnjR=lOD>bC&MqKl98IOJ|wVF=-3Cb?CKw^;!4C8Foq2)^xqplPWrt-cQ)~PnO4C_Z(d#&FO zQU4@4BBo^{#;+lzD~&u-*kGe;QKQzH+tiP=S(@G|VKS<9pgvwJT`}~w)QX&N908ZJ z>Rm9SEf_%TuLoAYK>6&~i9GsCysYM%#8+1~ys0A&JC3~=LOaHv)9LEvW~U9t(}KeP z{fh^)he_*VP(gucejyl0IabHe8K)+X&j}B6nBY|BG?)`&Mj}oOup7Bd#s*KM)sJP} zjyy$wW(04384%nfqslgM+4%I~VWu5-bL8$f+Dmy4e|%4h*rAB`<`EUGz`A`%nF}eDd6XXFGMdHkXkf+Ziezh1qCpCBsV7$wMx!Ob)Df z)>?U;N|?18DXYP$p8mlkMYEWn27}qR^Qq61G;mJH@g`4gO%2tp_DZ`;t^h_4}o!<9Cl&P&_{RA*hMxe8w9 z>|3_jFRP_1KtZ7}nGA#narj{P_<<0~%)j%dsjVqMCsf}+<_eSH`^fWWc<|DrbNiFR z78XoeeYT)bCg-a{_&h8}r9&s}ZQd|ICzSFd)WO07&qVC;GmddwI0G$vT69<<;A&deU zl-cr$465pNKAhcnT`5Y5dOA!aKc19mR3IjPRX=Wbi!d_ z+VSvlHjSGO3?DCgd6bJ_-wJ7A1B(Z0#p|St!tmjvj7ToAaLav2T7BlbKaSZB!IeVu zQ2naM5U#&@*t{BWcJZLAk4*Ou(rTHpc@2>dN~i3`vv4I15FWHucg{iVMwB-`mP<)& z)9fGg2XP_?ffHgUqyjo8;06Np1^O}78Fo&%WD*|(6%>xY`_Hal=H3I}{T}hcKj2F2 zUyAXRN(ETAj|&RD-oPpOLzz=OQZSf$rL3!$w zJSiyDH86V#RTpXp?l;}|aKrl{^~9yB{pJ&C_2=%Y_BTATRz|a?)D-nI!J_`^nHrzy zUfsS=Xlz{2r!j;zA|kYY%RA1AkU{KwheAz5dSdn^<{$na%197GU+mPguqe_!pB#;7 z?bM-H9yzkoRkMs*bn>TsCeh8|!1m*-@4X+PC?)3w>Eh5?^@fs1SlkIQ{l+*y(E3zR zyovRTyUMzhc%Jx`&52X;;I&U}&-5_O%ukt7?YM}Wa*yx!`G|`MG)I4sc37Gth8navU9A@X0TcHP(JO zH%jHQYt*btY%ye-AiZi66=|euDgSts8whRcYovd5klehfo^3ro5#b<#G0E;-@}xh; z_%qu0HB?S7aV0uD=e?Hc1d%&#KB|GEQq@zEciCGwx$plH2Iz#xW357loBmn!5IW(z zyij+gPuklFVvr>_E^lh_-FMn1ob8hJdmkahztA{d@xK4P#VW>Cs?&<&f2ol0|GW_Y z2fPrRB`q-e^YGi_4Fu|cZ3D3^pk|`l-LC^#sTZSpQosAhoRc+66|w6>pNOhQTwaWS z?MJWocyVN2Gofg$J^kq=ZU%j;ehH8q?FDy8C;1JfWl^h_O`8;Ue&DFQb%*BuQ{ot_mIMG_vK*t_ zaCmhVzSMsofj5^Ccp=ca(QX3zvrLGfFVP=(#sf3Fzgwvhx&MSOX%XyNw4Z%J6s#78 z^EDzuct!$&-W%3NG*xQ!68#T~z-E%BwlfXj8G|0+<9c1FJ!6#`X)r4Uc*c_#1e<|* zHPA_-AB8(@9pf20$X;E9=_C*QGM=PT7oL4VTpsw0z$(gPYq6a~@t@8Qce*kpZ98Ci z#_KaQPcGWrz{O$b8@kW1>6Iz&Zd7*KjfNU*G2U|)J zoF9T6igV1U=apxdnbCVL32TQ;tFE{Y)*Q&XiX1ZL$1*5*Kh4WeM4C~$<_UX2M7SCS zY#$J$iv9z93E&wA-E1D@7-$j=4^(n^Vj^f5J`3_c|gg<6*wnEc@6+L$5-bR9{x<&Y7V0_~v(&H+^-* zXHU)#=C)HaU?lNya(5oru4C?lUur_?_ZtNk8!0%d>11muX8?^ zYvl1h7)ex;;vxD+NUQ5;M~3XqvsHaR>Pj$VLzu%_ zb+?rT;{`cnsY=D~Gb)b`uVd!xmT0`O8m0S)V^aQ9KVZA7?J0${QIgjQG?>A$SiDuy z#RSar*#ckLS2FAbO&mabgF8Kox4%{)Gq2eLuoilm9ho4X)J94U<(&=D#YsoD2DXz< z#%&B`AbGgi>I4Q6y-eTCdjg$+H3D=OK3+e>D&~2B1uHVbp^d;NB?Q|}!k~@Dmy72O z)^-}$Z|!~^f+3f#>bmTX=A(D*j+wPGm$hE`2=)**VlAc+YXQ6)Zul|FVsM=^*-vLD z1z2ZaHf~;o4tAFB$#=y~DiSf#w)f|w^I{$?#^*(q3nY1(I5@b*<#GkY<*kEv17o+v zYVqFK>AS&iViopo0LZ2L*(tCh2c^fboXsl!ufqq9|p zPu*#e(e#Xl8h&y3ZKFJWHykGqUtPN`5K;czP9h943sH-!^Vg>V4RyXN0bTtc?*_W7 z#9wckBJclWZQ;cj$w~5XD+*cQwim=&aNvfq7C`aq_$vxM9mAm8y<+!ojb8c_&vlw>yvuAf4(3QRh$-PjrcDo4+gRB zTia?q4wH|Wo4ONrCDR3&djvpj;T<8UEr8_Vh+~#mu2Lx*BoB<|&Etp65-!oQuCA0KV`ft%vgf~+06wV?3g1VH zK=N>^p*~YvxE{@@C!}1J7PwnX1+WX^K1$5IMJ44L%tkxzLnB9{P;J53n=ETgq@e_k zbq3Q2r6A=Jc9wT`kd1P$q6f}eSXN`IfZHfl^M9896V_R3F7K*Ko?}+y(D%rtlBXAQ zUciw{bqKK}Uy;P8kp9YA_;VV8b!Wt4zmcAe#!D!>@F37ms`EjCw|wWZHDZ&`NayY< z4lR;&LxFEz$g3k8X@-Y78E+(#5czC|XsZ6#MldmQcBU@6$W|+ zR;mBnPm3KiFGoI3H5Bm?JScvEiQA3hV#QDO7FX2NtVgb)xIg*J^!`mQZPxdg4z**7 zS8#Rfhb^~7pC>N6{2b|OTDonnhP^Ug>OfuQjK0ogHON~pP78xI6TY2`Qdg)rJEn?%M^dyrr)A~Mf+OXTnwK~wXQ2I2%TzM@onnA=cD|vah4Hey$&D?^ z>+#PNME#Io+M51tW-B;{orupYu0A(|ov6Xz|nNrw?bE zNo$(x*Mj8x3!dtidy@V~k063m-p9gljgjtCE!mo7@X90fcED*l9ziVjlzB)JQ&(E& zw?(ZCR$k@VTbX(xdW8OP^VauoJhVxV)n4fN?0f}Eh-cC_d-k@!t$aSR<~lm6*G7Hr zFbTORFGYBU+M~fZO+X3ZQYfK!O~gnQR31rf_WfT4qoXByLcnJc0DL}~Rkr9o_hud3 zCvoG5r3JXgV@?y*tJ^cllm5a7uV;D1Xhfs~Bn2Vh^QZuCun=X)ypzOezjg@BMOkZ% z9vXq20O|?yfyp!xLod)5qpb!N=k09#Msx&B7p?@lI-@wmzH}ut_+s>g3>rajI1t79 zafD9TYVM$ajtxNB?R7zrf(hvD`j6= z)2Gk9iqx@^SI?FH$g-?3m_I)oC2O^?K~{mWs7KInEVqw?!?1*g+6UkoLFN#&`+{-Z zAQx&YV4UA%suZ_B89|WFe+455QP>DVd8|O`fbpjP4;%n|=9U7$XGsGH_{_KnjUbrD zOTY-?RtCBeRv`92jUXQGAbf+Htog8gzIA^uZG~kHx6OAk(wcjOgJ>+_v&zF6O!nt? zaO2cr+%=`Tg>P~U&&PL$-CbdvrnemD5b|?&$DAv%_r^8xDE!B*7MZQeLFUkvHR6nl zGYymwI8>iuN(iOKj{Vum-%5xJi>FEm9EMXRM5QjIgm8j$nz9b8*UBBe_>WE2Q06dH za(cDk-1xJt0CQ1ZDDIzxxC>oF_4reBX%Bm`m&-Pe-wxMp#g7hAdtc!n?8B}WSdejw z$LntPD>NCODg>R2->9L?As!iX7@-=RDF0|HsEZK7uNHJr=I|TWxFh)f3hZi;fD@2f z2VE_+Fa;!zNQG&yA%V6+HQL3XHrT8ZWtNyA2AO+h#|&_qU?%G&<^tHPvi0&+m=aK388-RU$qrPwEt@(2>i?hwOlVzBQSz^0~yHt{!CyuYi~s*e5Z)}c+FnU`$0G=0FZc+e@a{j2Amrd9h;R1*a?B1@MZl~Q#$ABn8rcfB zesdRSJTg5bR_Dqy6<*606m%;hpkKjMyjfFN7_h~tGpjw=1)o*EUSLqVCjfxY$87~y zsiJdB*@lm|!PNrxb~tuXawwtx%z@1+z2}Qt{;GrknL`-Gv-9ZMd1BEYEW*@Cpjjp0 zH2qBp;j}m=)b|Ij5tcb97fk?Mqh`wed{=B5xAQ;RYjNPXM%b*9L%4Z?aD0X?o}Rqh zEc=m4r$sw0k_7K2FDBL%LK2UrS34{+T;o?RHKG+za^(ADY0Q%T*iX5cD{Yg2=SFVJ zk07Yl@2}`Jo4{nR!z&3~l+njZh(aD4BUUCuuMaifSm$G-uZZ^!N3sGJ$;{82#?uTd}QL1PyKJ--zw3c)DtzT7^ee_-gU#m;0 z1v~zQ+md+LU>^hGjv&V&hZITjr&vjAe({=+^YKbI^0))yWn+4-7DW!0hx(+;hCF}s zGlH%F$2ebr&1fY-`gPTMz#Dhv)$suvfp+K79A<+Cy%qO}E@z3-9UA2e0>li1-PSs_ zYXPC6RH@UcZKb+JCS6R*<2XwtJkK#VlEsw;H-L*WO55LQV=S=|cd zcuCvg2o9?_;31t4$GfDHp1|*+D)SlO8x`=}j<=C^pO5j4l*vzZm!1NABi+)gSsxC# z2ZA1=I4e$@Js{4|vOs0I`|K_JSpY2|F4AP+zfrKskPbrKTuhNv@`FrKsrp0~nid%} zykHoip=MbN;TspwBaQGj^`D>`h0dkLerp!_lHf(-P2*wFoBBn=g>3JO)KySobTol* zOl1|V;920oz@Vn&t8~RNz>l5IH6wC4Ae_wp=rT`C?w|pqP0FN!Zq_-6%$2-UF7M~5 z^@8l01vgMcnF^WZI#$86;GV3MNXVPOl9DY3@GL+Xip-k;9*A<8B|Qz7Ik1GNTrK^P zm2g~Q6htiF5fw0mmJoS*!@n5w#lAw%0<^3OqvLI4QYoaUu1*1E2GWZNsOH(5PtRHH zT&pAxGh$7{js8PXeS7G4i4mM4o*^+?)&0PMMG6wcuN$-zV39(Jr1*wTTff3*1+zgF z*b?Hpk2?>?>l~%t$0L_JXr5B-}y+7Wnvd= zit4|`|Hig|f7)N(6X2Ly72r6gUVPK_yTxI^0|8f5r&#*|922Cd&UgF{XbVFoP>GR+ z2(NNaZSpiys1~|T`gp}5ue7gN-q6z8!pAfo)*dgJIU#ksY_?r6&r5qcKv!zj*E z3p9ICM0B`{$iM@!SjgT2HV^etuo7c1XjZR)%>$1xtjs`%)r~3*o&~92U$MMaLe~8A z6af=aQVt$v()_W6kVN;81Z4(8Yu*iB^OI*mK|O=0?5Y&XOS~2q2V=bKA8}W}5`rT$ z)fZl36k0>hhVYH+4)LvNSF_&Dl5`Rw{-wkSP7!}DA<}lsBu?;+XFU+7B}VhYGRPD~ zLph_|;`PDU8jtSf>U_HueWwO-kfO^yP-0XhLq~i4t`jbzggpzeKBGV$2vBAKit0P9 z`nS{rz!Ku@HWDf`JYJh9_;VYnJ%M#jwAL68c8UPBg}-eh&(IcrpCUvnXhoYZiKFD+ ze$?cY@kNC}8UedF_0FNLxMjyDnf2l{o|?JGZle9-INPZLFTzDZq>#!LazpsV@`q4{ z0crtYilR>E1(AXfh!n;}X%t$C`7=R@@p~hpQiQc^RIzoAJu!pI#Y?=&erCCL(6b=3 z_}Qc8Xs5s9n4mI4NSp#xW@s-d3>TmPn}?B3x%Rx+OR~CrBrHWBQh=TXkCBH5D3`N- zQ=BRL%4 zk$TsIJcqxWA|OTei79G`J@dy6n_$M%NWofq{QNyT)ub0@Zp2LL?fr%CFFS|Zv;9n; z1d+lizVWg(GL9s2Y~c+4bwr`nim0oN&LBv@7TblGg2`(ggwD7$z@Og+emrr2d zCQSGSfyTj21U-U5B9!9Y1)@SKPX?4Yr^4=3qj{DKcWdkoZ-&)~>$nY<>u7TH2E>Fd zbi6G)V$(Qpd2fsqfy-0ygAms@xNEWHGN6OW0K|IV&d!Rzlf8rCoap5 z5mOd~Vw^KLBvea7>nl_1NSl@`QwJyzjCSk%uoq$SV;Cdl&R&ILGlnkT_w5JP#Y;C) zRs)c~dGxIJmAF-{japX;bjytvKja#*nmtcrn<81!WwVZdrHXFagRGX&e#2|~-Zj<= zl9CcO(+@wRMvxHKvM+Xj^*ARqb?d{&hO3gB$r7Z67r7JZ5lQs|PjISmg*}s1Ilr9}5llT|07kz;H4gm>()=;nD|4EScbe>7h~1aA+jUEjO&nVHn9<)6pAw4zZ>QD z0F;6`jfMj(Maa&d^thK?I0K;+m~y6AH{@%u`Gu!<)cg0}M1#8`YlQrw|9rKh&t`xE8eYHQsgVYV^jY74zD+1-$b7n)~ z^v3lHqu|r$f*a+lljp*{Qb2D^``uiS#K$|iK!EP!Cl1H0&VNi1j++ao7l_}@g*p@J zk9pkKyT7}SR*HzA`&gln12zw6BY2>>keG+)WO;glfKr6V(r(yX#)z=y!trzABt^j0 zp>RsTI@4Ux?{9!ogeV6D_;7N;wafHQ6Uf9$>GTbAwD zt_z3=C2+|EI5&{M#4blxF-KDf3-5}i{-Q6G{BAwD*5)uLiB?_$bx^K$g^UQb7 zxy`jcymMREA90;y8{;_ky}3!3>u1cdxB6s@P}yG148fVsij!}M5V+pabp0iL__yNZ zC%1F-MiSgeOzWr`a(rpD{F0RPR9eByY5&MRT4&VCbo6r-l%=y1l8Qgy>5rKf&S390 zF4>=sMGiBqn^22ctEwteX>IjNFE1cNCxbXcEXn#)1i#}4^%LwItb zRrD`!HP|BL6Va=Esj157-_{hVV|am&!1r!7LM-D?Zbk;ZlH+1|kq>l%$bDPLf-lMA zbb5hsrex&B^dG}!D?QCVLMVlcaw9Sm$wMVOkLkFe-# zOY+`vwN0N@C$xKjZ71rni#7vP7fUu=fH!@>GdO=^d4W%lVoJkMpW;@27?DV%%;m2CT@UXRMs$bJ|UFp~B=et79W z_+aJdFQ4Z($gR@3C05@t5-M#)w8i+QtTa~avliATa@@09rP!t~FCL!KSCw14TEXg8 zx6z64f{93LCcpMpf2o`s@dF((=`oVK^a45^U;VDfv5#zY<*(%`N2IBcPBE8PwdTJ! zHIJKIJ{+%(A~XwmMTD>}Ss5f=W@bO}ds@!=*zJ{oir3i-Wex z(}CZ-QU&K~{<$Og?_YSxk`+qNt0_13vwG38#QnQ`-5t;D*`K@(KiinsRJpGG@(DO^%R`6`&==LbQabY`>+LSo_tuJd7YfOW;IY zOSQ&8_s>&cedJG(+>=oiUxuRV2OfRBsyW+^4BU-^CT9oJ%4MYMam6d((SLVKx`8=s zrqTGe(a&j6cp#SVylvnMD>@S7CDbPT%GEDGd6r`VVh4XFKFWFtsW;#pb(*x?y!A@9 znpb+#(&ow=lZ=RK(O^eF>DvXx4nSNn6L1r{S+y0-0WG2HHu9st3lHKPrWWmzr?CU0 zME~t!KGm*mxZ=S`mv?8Z1u+nM^w)QWuEPrt>j}d)j*9%#O}t0M^61<@neG=lUWFAN zHl#c37&h#(IUg|FXI(}O|FIBFl*qRfe_74$OVa$Z?Q)uIwf#y~CMZ0hRCn#KU3iNL z;)<{xf#R~m$?4!|^GhRvIjrzd`x2O*UU@VB@bF2R^_vJNJT&;9FFXXp3lA&}@vy=J+46DWp&t|;)}g`!)*Z`KNu+1+ z9YJU+52D3!(eX;k2`zyM`96%FL=D-b&k7Ga??~{0D-tq2#qX0sk3I{Zju+&L-1HQz z(2>$IS39;z7e6XDO1i#z_UOZkj{Udixj~Yj7T8_XR{7bXc**u{kckg0s^>9RAPs7q8_eSB_ngmC%kLO1uB~bP#m0dI=C2|8qwW zMebI&>2sL#EIPm9B(8`wvHl+AKjMleX;acCHt9J`NBEB5b?F44CFpelSEOOf4BoSx z8sEL zc0gqO`Wa4Syr*d1kPQ(TAF!6LqmVAiKP)o$h}HrEfmkwc zE&5e?*+$BgKJQyN=)Ell-3K>~fsUm6B^rsD@(*cjt-M z!F^f&w9%Fz_9xN#cqlxMw@2`E%ABH&QPY*k2B#~kj#5l?oQTN1F>FOjx>ar7woL6B zFJJ4$$Y9VXm>!q44(L$lu>SqB{LkTKaY6>-SEZ}6`x?@f?tGh;Pfe&UL*0ixZ1lNm2k41klZH9v-`UzzR={pM{AD;W@yu8D_vJeLR41WH@beV{aJ*k4-&7?Uuo zolo%2LeMbrkAuS_ZP7R8|I&SUb`#nlyk393CHL_V;Y!jMamoe=y`;9^b%X_VABvc7 z+iBJiYI2~dz;g)R*FIo40Bs~|8xnup{{Y7L?i9xO@$TGh=I~`G!$@0)jRR2=KDz~E zo#35SQ(DNWMOVB9ic@g&@tb-h%;7l%I5i>O-o=g58;GZ|?Xc{?FtJP*m=y#L4rl14 zvRO)`e;gb}Qill;V1dC^1Yse`3@1zbO$+k8uY`?a|LXsde(SI|Vx1ffGG) zNKx?^#&{!#!Qcz)8I19_NEbeUF?NS=oNf@FjHp5FNgQ@#IC@E~EW85le>mA7zowq|y+LK}$$%y~beR#&@S8;Z5u+=F5+Q@FIF+_8NN)+b+`fFXYUhPRA zf@*GijAcGyQps(+cG7*g@BD==2q}Z*^HqY}rrE#-Ik_u+NZKvUfxO?JRT@WNMR_&z z@a6duUC}O_wQJ?+$qu;ash-zZbXTMdKg)$+D`Rw_Y2$vCjsUXUUYPsB6o3sPh-6P-{5iH?|De@^NI$7Y0oE zw|V)PRuyCghBTECa(}ZJ-@qOpl3y8`Clw@P{zy2|u;HJrTdwJgus_0(ZT(R%ms>Zg zWz5TcU36Nc@i~RaNTa9CMsy&#F$Koht^B0QUyZV+oh_4AVeJ0&P7#)uh*-ZSVv3ab z;k+DZnNIq!^NvCW_#f;c|AUE{>0OgG)mhY;@ek4y<_Led=Y&-H8p$NThna1Z;T#G} z3}PSzaSYDp+t@Z6KKyab;T0*-l{afmy(K@E+5a!~KlnRHu2-_GjTGhMTomVE|2m#z zx^|3LC{@9fti9hq-V)|*mQ-8)qV9&dl^r~h@VKX^=fwX|S>;eWFei~7{jAW2%Q2t! zV$17Z77i!xfX&B4y|)a10sjL>%&Gq&N%EHy?#QwKA<+}~A2hybc;#FyBKE%Y2sOq1 z!g>Eg3NKPUt+p^t4>&Pk+T&9MF$mI(dlCJh1&IVvMc9c!M@ftc8W6_ub;9MW2%bk= zLh^;-6&Aq~qkTU7!8+|y%tLj1ELVdc0(vl7^K0{1{bzA{J%+)toI_bK{{yX~t=EbF zfs~4i*6kJCD^35&JCbW*H}o_+sKaCOi*&5xBQt8`5#)2&|~lsj5xJl z1tgZQcvN?cW5?Z$xsH%sk8jNASjIfIP)xjCqnX zR^9hMazbpzSELA+5Z8acn5=&Q%8|L3dHczS8d&)rJ~%5m{fkMD)E@a9TlpFx9d0wv-tRV#X&8p)i zRl|QR#@lZE`f_Q#OU)q8-HgkaGrqtf{W5CV&()%KM(txx$IS*1 zR9tbsYW}DG{VA<^4e#p7fI#Hv2$drr4!?VSyFNfT!2Hl-0)|&uqqF<{O;Nd;kD}?U z3IPlS@^%aLa%hIoxV7Eq3a1_Y=adG5qu_lThAl-5iL4=VCt61ar1AtQ1f zZyRpPBq2OGhgE{M4OKWuQpdDr__hJ^KLDZRcwONMRw+%wjhxv83<#r~{F5FiF(nkl zFj_N&S6CP=A{FK=UUOf8%8}2)RSnW*k@|1aY&Hrv4%T6&v6Qa&Q`Dh%eWl1`{vA|7#Wpd@>!l-rlwgFvA@87UW zP*Cw9nbwO=)p^5;%7$`i2{AG2+#cV;q+l7Ad%NdY5T)udzM_{?1TQ&&Z39Q#vgL-Y zzueUK^Fc*LtGLFXZR?Ns!mjEtC| zZ!E-rh80j+=DzJp)!{^AIg+M4dTC)s9IwL=SKX>1QueImff9eySZ~h`U$iKbiN3&+Xj$j-7%c{3l6pOfThm6nU9gbo~cQsqo+ zLRY(U2aU<*Pxp=I{%Etet?Z<>63nKAYsm<1`-lq);dt$~%%`+hl~9iM~bUArv2EAfd4Y3l;E zQ{YpM&AtSrA4Pi)R=ldO4=4Oz-GV66?u54>s{Y?oK|BpCc>jKV?eG_?vMnOM0V)4N z@{?)T<5LDCmm+CW@Vu@ES`Y{_D4O0x&?$q&71};zWTi-E=R>w?7CngFRG}F-8IBz z?CBRZ;S(jHe=Kjy6&1lHGJe}j$iVcX6e($~Y!uk4i>u6xWy+>ytW5!V!9Sxq!4TvZ za^yQV-hE@nZL0cCzi3#eRpSrXO(iIdZ#Wsj3Iez9cX~ZC%@wtrF6!;VMy!tp7Cy6r zCf}Q{JPd$_3$T571>y{Cq!&g^!EkZY1nIaz2~HXR5qE_03z~T5o?kx+zf;OpSfhe5 z8!<}pWfUK|&)$3nw}jW)*q@{*P0 zKKzuCcZ><%xX~?Y)83J++H_XUxVeS*~MdBTYZW3A<^pEAx>hOrQ zpf>w|E$&DwkqrYs<9o(12S(Lg#~(l;F3qS;rIXwa`;@R>mc(p7_0-#_!$Qjw*eBDW z?Sm2kKi`VG4r@@ZE@mrq$HM@8f#Y$C*v#! zdPSS!Po$l>xye4+{CU&zF#9CO!0-oru}m*mgA&eel2Fk&$8N$711$)AYs&+Z)y^o%C@u>3*=uTR~2T-Pyq0f3+Nf2p{(*;EmcGr?@tCk@J6 zrmHe=`{akliS=`~>XYF@46DYCvi$2sOyl{uJJJ7aL7ae}ZFJ1Q_5p?aguE~ZwIFg` zZ+mg%v8aQ%BT*Ql&sy0m_POCgzo+KCG>@##*UyT5N^z)SPmyCww1bSUvpi<+3S{7Z zmepW)@1cgYzH#jwsUlUoco2)UHzUn19~FuWh&_~;&@$-vck-mNM74@9HT&K`&}S}< zz4&<{Hr@V+&opB?PWIALm)dIEGNTpW)~i^q`AfYEYb$q~Yjqa)#>l+AZX|W@&flk? z>~I3>pOj&|D9^&tYvIl=`Ysp!yFvq&{)z}8l|S>fpNfAT?yH$IT}|R zhQ>)DTQ!B%T0SG`hy!AU4|SdKEsnI2X2}XQy>Tt)*n_OZ z)s4lTR@3xXj0V@q;QRf~LHM>~Jh)ypuOK`q#aUT$?}GUoR6KIQ2#zPC#6-@193-t!ylnh-t#2`mHL{AR{lqnq{q^zQ_ACiXGO%n6(bz9+{ddn~H^ z`yPZI+_1}Uxgc|;#W-E0&Vr;-IvVbe5i^iIa248upA)p}gTAD*2Sj&` z`x5Q&NkN%cO?fdINjGM|*S^?S)!zVOG(GB|4oN_N-VXksaV0C}o~Fg`_iEm#4%a||Dkl`u7=h+u@X7XEWmcp-pv#JE+x2QNk( znBt3aV5oF}&;y&i7wAj+@jipEA*>6PP<1|zS0u6JtpnBq%|l*<_GVL# zSkB4(-Kfi`N36TkE}QXuvmOKE?1J6|1y$C1w>PT%+#dtFbNDR`%f;w>MD|OtHAIrP z#yFhO1VRrE;l41|0>o%~K?dl~bLByhr+Ne2DPFVkoq4K%Bx1lAO=pt=tS@;Mdib|H z#e3YrozzV}KzV%j2;=Z_5(3po)l99XOC31^62bMTJSG%G=04&JrjZqBDn*Zfze}nH zRJVASD7|7zplvoD;alUwksh;#9W9A&#KRv zG)km<-82a>n&6&lP>i_dPVjGZ=Wvpn^MBEupAHlky`6qXeLnQ?U*0KTjHaA$`_M8~ zJH}ZNJmjtj2g!8i#oou-q61D9pcwIRQ34brMB&AV$NGeFUNJxsA(12Vi*GQ!=4+PZ zfizG=$h)8e4W;^me5pge7MK(`J?KF(;_=PkawXYv5tUy0%(o@hQs|UMmuBF7Nzn-^ zxhCH;X%x6q5bnT}j-5(d_T|OFPVuS~V#axFE;>mt3Ds!aMIh=q5dE1vCMQ!l}bpF1rkSbRcFpHO*O55B752~J#z zzG8MY>9P%JRd8mtZ^Q@lJtA&iV1P)(M0opgGEVq{{$Lu3X_jn>Q9$&*v7Z-ej;zF* zcWo^Fm1s7#mk-H>M)qmrZB%o)DW7{z?vJ$9cNQtioA~_M8l{F1X%`Ro?%w4;K36+c$lgzdzdrd#lZr$iggMz$tc z_9SiMn;E~k5&d!7LEHO45X9<95HWdW&Lr=~MyjanpU>Ahs4Kbq@lCjW($IRV+Ju6{ z-|(l+Q)1Dqzt82{3}BSKgbB(4t%5z5wH9z_hi&f;wW$4+aNcexFov5^!??^Dd z$1wHI?&s=MXJz3`fz6R~7j0G1+((~l3@CrBinTqAZ?%3UjnNJ6h`wh$-Bn%sr8kNH zLLH$}*~&oH6MB*E(>la&y%jJdWY*`svlS+;cfWjFteV<$4pxV-Kd*qO41p97Cf_%t z|JM`{v;fFtwx#a+P+gD&3<;y43GrlU77PiHS+YQp*XyPqTmkXPi(JJ{Q+EbZKrmKZ z5A|b)h6ET2`u^}G?Vty%)X(26rlUgbNkiDJV*cp{-AbCu6#(YZk%iimBUI0)EuXUc z>hj5qJHy(OG5v08_A9}0Nb(Jf!WKDW>M=G;*p?X~x11cO z>kXg^jTPFd!4L}i#V?U;?dD=mg@o;k4u(SembhdHUd~3V*&WJ$^pS}>Bda+@l1HK` zE`BZa5jhn$_h~Y3AVsb5ctB>!CYy}(qC$XzE~)O`rv>dv2BO0LM_$I|qf1Ia0b#So zB$DjRP+(XJK@~1SPzA||6R5&=wHQ=~m`JZ5Q3pc;!lj!`K}?q*O+KrlH{<$C z|D8v$TSZ;8`h-fpb@6x0bhl^Ad@3T(FEe( zKqe&Se^o%F{D%S}*_u!K8se(27Yi5?@P4?Q4hgELJWI{yV4VOqi!9ZE)G z@R2g-mLac4}v2^tchI>h-~ z1t%wi%+K>ff(H@8{p`$6%X7)dnsXq>bGM3f>x9E=5h%opRk)F#&;m=6iaR z0u=OlS2f#G4WFnCXHZ!h=jU6Z(l-4OKZMhn0}VMk=>}r`LNeHiBayBAQoFu~D={5p zOLgylN{-D*5e$s_B#JYbRa?F-MjCA^$%>9V=aIrNO~j&B z!3+T&DG5_nJb;3(0dsD{J#5TrD7|7~PyP)TrT1Q4 zgsX)X)|KHI$tNF@EsFw2jWoAKl^6&&ihLe6s@llhe@Yc3dPQ&&8?orR4Ba%Tw>OS< zRKi~K{T|B+vsc>0zm-UDF)P2}#9bK2sJ3KV5>L9rD1MotsXb4mXgw2%eDigKA2Mw^VAGYJmx(vFDLbiWSB)FXc3-?Rvg050WUFUz)<1Ql_sL9Mkdr*rM&& zl!+y6Si->abxdyJUa8GyiM))Fs|okuEavW?k_1!BI920CJ(EhrZ|g698YryTRMvi3 zPqR4+s3(pQDaH^rbGUSM{1CIsV&@^2)8*Q@9rn(et34J2l(ihE@aEIS!2g|Xh?9H* za7Rkk(0y;_4WfbRAK;4trf23i zn%AtQhertLiyAJo?Y7cR7jD>vyhesVO2)pI<~)Xyg`P{(V%U(mqMM=OxUrEf&%q&# z&WqmQ&F7*4`UmLE2j&Mt2mJo5R0*!H%kw;(hfqG@_|4ZrkhoaA5Y~4Wb@BCmNtinl z(m$*&r%BS=(CJCZkTlIiKXCG0iUryyYVFnh8%xp;{lfWQ=q_!2j)UnRrn*Ir^$(VQ zK>vWSq3ZClAiL`MhiNG=XdNdK^!6J_`z$Kb2!k>79%R>yvh zkiHeJ7D6PXf7q->&&wc5($G81jlU%BIyRRY|w^)RUkL(kvTh{H=ps&%O5rh`Dt~Su*JaFJ7PErUp7DD zDw=%vSwgY?);vMg^}XsAa7U&Qy)pR#P6&Bc&k$}7{^%GOx(rSTVwZV={vi)Q7@;>G zUV-Fau{?n{!%he%`2@));%fMCccf~%^{7tNLrdU}%m-}oMs}F?GHo%mad$4jHi2(G_)Y9?_qD~kki`)F!-UCL+n|N{L`eJO z5GB69^2_a%n4quka6(MjU|6bwEe1e7!BF^$`74)NSU%xur~S`Qh4=Z+1sFFade8I^ z{}Ny{f2_kk3F#mFMckjZuf0Ve#&Jgk0Y+3Yg9%)71x)jG1$p6qjnM{pB+9wt8 z=BvqGEQRt3mZXm%2xC?Lof3L)L>3AdF#((qY}*pEcu(5fT3T8L|@MPH!)%K z8o9u_?LXf9Gh)KY387}|T!4`sr7pWZ#rkQ225RghPxYtngrvSW@O%QV;b1yEpCFf6 z6BRE5=^s{~#pcK-E0^agdspr7U4G`ycn$466LueFFZ*|%+TJ-I$adfTe3jO zt(?tq9WS&TXAw{GhV=zImR$7F4hC+CHWkc!{&810$=sE@446^hMA+!v2#GmzG}Tad z6dO=D+_~3-{GrsS)`Z}p|6=o;YI;bi8rEYW{T@u-vYxLu-?I@l^k$8J^n9J$Y0U zswx5W4}R5!m;!VDL!p3lCm2tN<}W4KF}wp^U={5VW8Gp&|zg5QN0mp$g*zagkb{ zhVa9J5t&~?D6!S0IptUNBeYq!w!egUB3wV}Sj{U#p)tyTUf}n(plWAz#qYQDDuWa~ z&&#zU^3@pn5?VeOaq057OfP^fft>;V=M30k0hwtn$*a{3rj5)s%P%MZZOU&g+^SfU zNYn-KB^@w*)Y_)gFIb!MnZ5ak){6lax|cb=S`=P-3@bpG+*M|V4hszto!?tY9b5_ePf5O$OBoiV6QIdBC5Yj@&hE2r(0oh^tQ*nT-$=jdHOWZKI!R+QVD z^|{T#_c`F`x*b3$Fx&SvN}5$yzB%0)WXofo>Y3&L5wE|g+DRqFODM!j5tR}pZRQjpZ-m(t~lLf14k`&Oi|!K>%F{Mtzaa ztLvX`tL0Huv1W_4OqE16T*;_Tg7S^mU|onHppQC1D8$t3oZlH-(^Z1Bk=aoep~u9f zm3Rjz-x%=a`%SvuxaR*LE=f!yAQ?R}{(FAF3d|Cq5ryfa&hHG)=7$_IYSG0ZX5<1^ z{`arwRsnGd86qy7$sc$yRzIPW$^})I!VU|+!C|5C^swMb2o4KW;IKf?gk}*TBr!Fs zIB*f<8zY?WJ~YlZ%Nc$xlAr%pW=`%G3LM196sz=>Z=iPn48(YPSQu@w>dg%bG+F4U zAM4PvK%`I0)BV`g+3m2JpE#wc3~3_)LIG!$!Dz8;Xy{~T;3)d(2uG)^EFpyRbbcrR zAVxJQ`+Rr-f;)2fINx|)A4Q~IVMV~7a8U4Gj{fwp;BPazU9($vB7Zn0E`84$KiEIX zH)@8CRWzVJiqg9lpIpac$5QgD$b*>L9qo3`d;F6E1ZYzxsyPOxx@3pnZ~DkpY)^3q z4`2J`hiF$zZMj#Y-&Ay)(k;ISk@{<)b&fJ{Z4?K;7M*`&KSF=^I*TxJl8z+tSm@Jw zkk1ldr2lQ&fzSZl)8fIm3dK7s(nzA22y{QOqPH%TS@I3m#{slDUQ#lckW_%hI(Vr7QYj*7l^i)XZJ zaS97ofG}dK!;yKhFkp6EfOrZoKpcPq#EtPGIYfm8axb#mPyu4vKid-Txi2bIfG9VN z2qe_A-Atss$sY1jT}^-2tdcUcVj$S5AHygv8=+{&q$!YNG9#;B;g?Mjue(|Bbu04c zPtdB3?`?jPa-6zKSHUwIu<88!w{uPX?)yuLY_4x3W+?hN5U?aINIctSG2ZNn%p9m( zd7VbRgu>IpKxiSItNPg~o1^WZ^1G|%gF-Ac4zZ5>+;2(9$p1UBga0Oq2mcgtjHz!g-8u6Y@{m54WybvHi-9Oc3SlO=R-k z(d>@%?v>$$+7Ge;x$lpp=MF=VXLZ(y)0JINq1eIW#a-;z_{41|7X{I64KKmx&BWel ze5m9Sf3+V#Kymyf6i^%u*1s^`MsA&Adfnv>7Yg7pav+Mp+YbuI?T4Mj5NU;&1P=x3 zWr_%8n-y5>U@7{xRkm!9PR7c$$V+%x)KB$b0mU5x8vC7WU%iA&#W4c`ub|k0M@1Bk zQrDAk176~rqDslv_R&_-!a+Tf=a$CmLdsk9vdj#!=8LpKscuF_MsE|rcA>Sq71n;B zU(;5(V@Knc%V~t4iMPtdAY>Lw=;Hex-}tLrd5?XrPWH|cgL?r9P(vXPMLsVbJZ#eD zpHLYweIlXf7-BW*mz$ck1bB=-9|*ThgF6X-f34XXo=7O~8;7O?D><`t%$-h|S|rto zP4yMLyl){#%&%h7;PuEiLLWZhnadlsM6q{$Z$N9)h#*kCl8pgO2k86=+k>3jJm=+-Kq`IQet@+g(P)pZ*QFExO_=@)3b;C__wWX9zdjWtXvJ*WLPU{BYU5wstm>0rT5D1vVw zOrO~l0~SzBGERFjksL*0jG2*Hu!@AVlDEGWmIsk_Jgw*y#4S@)b{r`f8W2`4{x;=|L5(8uB0%v zqXEf?hgiUNfyDo=Cnyn|$|b2}uP1k0lu3bK6ngHyoL zQub`d*>nH`im{$C!w-m7As!=Udw?xx8V3PNmnHqx_$9z&yu4Hc0hX=+^=ufw_a z1EE>c+iUzZXR!lXF^i0ofMPTw)PC5CB{=3W`gy02oJ|K{yMUORC4+VNAN9ynH562j z{FnAa-BsaK`XV#WH#wv@vD%2$D;hniDdN zTi-2%@fa05|8Y@xEWl`H+gaNMSPMKr0`cndBx^)zRSP+@6`tU6>|n!Rl0jVxucBtO zy8tGYF1Yu+d%GYw>+je>4`VF=EP?jJvwXG6vwGyobTEq~>rq0?Tjcuw+StY3l`84J ze0Q4T_Crwo7E9Ovto?9>bFqJ~g@1xN$X2`z<>z&|g#$};IuR^#hORaw-jd*`t_5oD zU+q%tWUu_Mxn|38cC3mvcrMc6F<%;L&5%YgED%>kRi$bx{>~EK6tH+J_tz1lxmjua zh=aRqu`+{oVyO^H(ii1smuTCbxR~GK%X}BiKe@A)rC=Z}l~L6QTC&fkCS=a`lPWY4 zCAu(U!K3*7#e6`}WwV<;J|@E#8Zc44D=1M<;nPjm@ms<`W3zrTw4b9X50)GVg}W_D-pBm>^JN6hPH4H`yrTZ*vhdUWhyK%8DKrLO^gU{9 z*VOSs-#l3sRlL$tvJvira6Df8FD)PbPXY_{>K#yEfs=tJK{SHuAAtqNK^(mS>W4WM z`A}eCyotx@55v9$2{dDfjh5f08;W zG(*3Pr@0zufrWP!>vb~b{KLtoD5pO*-pBk#fN~P&rwK%=s~MT^^fVb_4t}@2`7qt( zC~D8H*8Xi+@3qWFWuE)HzyhI2cRlMjjNeG_^#1kK=)vxQ&NLd}H(rhKRyeajfWX3a zY*l=y|8Nr@msA(gc@!Kk(uK4<$>A1=Jz02QA%Iv2G4TFji)PTQXB%XmgyEjiZUx+r zF<1!YUbhPl6L0YVw4XOkjJXW%mqb!J)a9g^Z6Sbru3^^&76@RFvRE-pH1sF*QFqlo$kuop>>zhb z=rR(Ier8%^YvuHx7N0s0T5;CRtS83jLHoGl-I zcEyp2{p{W<@rEBS8dUx;mKhuyq$JGiMRz@g;0CE5H~7kpxy;j%S`=+DvM@BD@j?+~ z6~=TjooL35Djx#yLNVYsa)*iSP8GU!hfD*0WA`K~ut20uxe)-Aljw-w-sc${7{3t; zER1BpanB&I&_jy^J6@zkneFQm#TV?`C&5yU*X%cim0Qgmy@V%EmJbb=-l(mfpq%~( z^o2L_FJbQLH*DXUcK4PazvMqPPd@%Y+-rWs!#ex&@Br?vhAa@Mg=W~_Ty*Re8({PW zV1b|%zOaCQ+<(wC(SXK_PwtDqN&ElZ0+D)VfiRDRSs*ellfh6&OF)P(~gmpFh)duzW)HZtDVmU7S8b-xsKh{;~`2i zxatdypPrC4bp%>Trji`=a`TJIysTNUqLRp_2=v7R7Kji=r)+V$8v`*cU7GCB^1&f0 z_Q#;k{ezW&SM-A^C9;Wv5=O)!IdTRfN!d~f&q0_=e$TorC!3H?q4No^dzV>mfG8E3 z)3|&QtXygQl?MbCAPYobuG$w-#Ym^}Gx|dL?WbV8z_uOwKz=3GOT7n4SZTCLgDxV- zX;7Vls4)8&<%Hcd+&%7_orsYSPc+SNonW59WNl1(|B*QCXXt5D#wa z$eCQnp2vG9HD;kNbu+cW?S2De0eYZ$mv&UmsN{gB=oN>r*oauw(!7{Dq3S#H6kxot zHD*D83{ux9TPaelJd5(UnI4<9$E<_}B%sZEg#TjI9PW*d;gC^aA3JL45-H_h_*%@y z{j^z45H;%O*GJs$y6;3kmbx#$x?_)C$(S8RleFTnG<4I!wn738jpAXjpz0X=tKq=( z+jYvKnN0(P?W|)0roj>~_6KpuwiWO-S8K~01e^t}f8)3Gd1a{#S5;ijQfHf$d%Q4A zYj54CHo^Vev1QavHD9D<<%9Z9pQidJHeY?5$n|ewj9yJoD*ve^ZuqWc!c4Zpi{xR1 z=@+hh3ueB;N=6&LE=25`Jy*(li9<9lQ>fqzNS(Qp|uNDn*C{(o5cH@d*}8 z$mW1?9w|hQIgdBw;GD>Fk4wq> z6d|=%tPF0+D8_l&Z^+wLilzG67z08+q=04|6ed!UHAHw7u8gaW?Q;DBTU za6y<5H51y3FCtf4e*NA?Nrc?MOA}Q)h@fu2SI}{%)r20I#a)j7AISy+(=9>PTX4N3 zs~F~ECbsv;Phon={5ZQ--Q?|&Jl`ujqh(f8ab!A~7&?PS;4%SR5bC$_k;X`OP30d) zGZ-W__elQv;CUd4AQdwEHAJUYP+jhCzG3fW58%#k zV&0g6a%3wL;NR%0o|Ypqr&dqWjPFtsj+phu77^)UxZg4(t(!xXc2W7u9t+; zjN0B#|J7xp@O5|c=H}5q^pdERX?O3qG6NR`&3#@%DNv5wQa^I}>2^iSAA#h`^Jk;O z*vJ9R9!!>rsE{IRpVE!Fi{K(U*2iP=!bv&uAtHP@ApehKg9q{UNwNVx9N;8(Q{xK^ z61)RxMg?R~i1P@!AZkL$DjaYKi_`et0xh*woWSNy`0l|4J{XVa?2q}xP&t| zWS2<%CK*(D_#dH}vcP3Rh@)D*=D*TQCjY2{(v0-6DXO6IU{Q`k`^H4CC!7u{N2)}; z1H*yHEntWUnLL9#FaMcA=?9$0lQd&?sndyG@~`1Q>VUW;3F17SR34rrVo~_Lx0d-k z&G^^u0alLuE7_1?!$~XIhu4jH=w0{ z;&UN7&8A%5jnPDGdwlFD(Z8so8&-M16RD{5bYM6g4)QbXEaKFN4=VnuJTP5}1mUv8?2^DBXclvSD% z7_XsEV4>wyi2V3E6ghG4i^4P35Y!FE>gbx4M;c}F3+sh}zthw6chxmRl~$YLEPhgB zmwWeb{J0npcHy;f<1_N$rkI793fC%K{2tRWoVbbWy>?gL^IHZw{xK%Ln&13*BV8`+ z&jKy|?Jw`R`y;I%Q_d1D+I0-sZpKXfxz8LW+-W|o>Z`ao`#@j3?TzY-zSGkM3IZbn z_&P2$AtIn2Az*+qL@@Gk86sHI*Yzq9c|fRC2ag}lJ);L%x)hB;B>a9iMM~1z!!RgP zZjL_J6~ScIHZsXBZsZ{&vW&gb$dVy>K~xe&cTe{7(^#HMm=g3@*`4XsuYc$mTzf9< zikH@sCbgX;>nU3-nl>9^(o)1iWFp5P<;_!iiLNNZ&;^mV)aFuS!o;21I3Xx2=o(ov z7eC^<>!L`i$t->jp}!_5Sye^Vm2o4)NYai|TR-&K4R7{4F~utbm)@laj>&I}jF8U- zJ*1o9G4-l6Ep&FoVGhyB`y#>V&3R?74k<1$(&vTaY|!nXnS`&_mw z<8|~$>ZlRLp`Vz9dh^V99y%@wwW>}jX=oqpZ2nxMv1fa66!-fg?W`#0l?4UWE>3SL zoC|bz!R|N@*@Hb?bUmU4W}Z~_Y2gxndhX4lyG+LG6;dJnl2nhK)Hx#%g-j14Xe))U znv6Bor5T$;CeWd{HP!I3UO0sr1tP(MA2NnAC2wONEx!3v>R}!67u^vzLj&&m=n9hN zQ)`LSJ5?`6Gn)#MsBf$<%?46VwPgee^jy*v77E&uRTQ3z(%}=EsvLaHVr{K2=+Kgu zX~abq8zvy?<)M)9&=1!`xgL#`O0==sdNw^of$-Xec;;|-lZypDeSQR(gH*hk_^e8P z`%jK&GI*#2^sw?MSUebFkm?Mztygqem1Et00ZgiBaec=&`YWnAkISg21)GWw{ylDgv9QSru%B3z*k=Dj{d2NiyC!-$p zeCGQT858^)Y4J7I!2vlcg8GlQh>dHu>}VJ&W?yisMg{E3e+mzcrlw!Nn{{s{C&@5} z1M6ELqXJg4IO>hif}ho*6wh&d(I`+;FD-s`Zt_c>rfft!>=qYfdq;NJvkV)BK9}qf zYY*m8J8ly(S++fn;WTnc#KRrdyKeeKTC3BgjeXmzo|~2fS9V8&dvK-6cRHmTOny{; zN0rdGBf|Y=lu7wfH!Z+|Q%R|;G1znLlWjopTfR_RoJTBaB4ToF;dxIuAGc7x5Kc?R zeII!TbJZJpo@g$g&j9PLFDe}-Iev4&Xro(A?MD1l9vPBYEi~nRpq>0<0=9#tIkBHaX*<^%YC)TbbH5>)B$R1LN-S`!T z`+KY#K?nDGLm8cb?_N8CEd!|&GA=&H@LkG*SCjFi_i^}HsO>6Pc~~%{QdHp+QR^9aZCXS|Ybci4_2XVdQojx>D%Z5;B{9tk)SN~BIGO;k*j zA*f@tF<{{d|{1f@vwd>`(Qw4z(W0{(}V zcQ9Ns5i4pqyj%v0l*reLD`=~K6E*c)*vzvA=f!#IVEXqAxaN8#C>o4-lRJp<6Rj2%ko24#hr6AZ6N-@(( z!>5qR;(9+ce{DSaC6W7>ZjM2@-4h>b-7UtFs>tlcZ67N|Wo6I!yA6E@TMy!>hhEiPm2%5MK>~!AF#)xmF|81GhGJ3;CbdhR*KM5aGJ}=!2?!{5Hd4{ z_+_&ATvGC*g9OQXT;$|R?IgK7i$OR8qtuM{k`mAmT?NlD!v01nvnci{Cl$VQyPsH; z^s-OccjFB#4Ic@LKXxW9z#CL0o8$^f3r9NB`Yq5+a#f;s|H$qN9iyYg{qcZg++_`+ z-N`uQTUSJcnRj1&B3GPzm$|tyG9x`mPUftxgGx6v^3;{CYJR@NM@^IAIb>f)%7oGR64`u=}r(b>A zokJk+Cxq#ZM3m6&QVw(+!gFl5)j6OqnX8lDW9l*WanA=FKpg1e23V_r8AR@>WoFvplL; zLdT=?`IRFR#W%O}HsS7w>dpT6$?QewcTKm<*wWI;EVk$7i&Sw{-R!qpOF%rCSyUWn zl8%Mz56hl1K9<4{SrT0BMbyXK1}8i=YQShJZq3D9JM)BW-ge4|c$?LU*o8NuY~F^G zd7g=#6wVJ(N>T9jiW0XVZb9nCy7(x=E(3@R!_&JTCWjukZ;S};@50iA_ior#4usXM zT}AQZ5JlZeEYJ`FvToj>MG2M8zd`J?FEjUv)3R4YwH-%rz#5cKvV@#K?B1z}P7k`! zVTV{*;@(<(M5Yhv#`Z%i60vOkxON%xA;}u)tyD}S&R5G2L6p#{q!9in52r}q7j1+$ zJz<2KzqN@I)tNw6Xc$}Hn@{4w+mQjf762UzFl(U!x{8)3t)bx_E$nS@>6y#^CZsMB z(nJ6;8ws>qh$uD*8v7tneLRqRelL9p$(^;4*Ke*R8AT3&IFqS0WUi#LMI~_ z9ov+K(B}s{B&z(qw*W(k;XH}32C1aS2gxDdYbk^qQ{D$vU(u~F%04M=T5J+`S|=Vb z@{E&qvY0`W@y5JCV5JwasoRQ1czavS7j2iw$e4U=J^lgn_3fyF-H4IQSf~Uu`MnZK!8oFOjUjpG(Y4OlM$Jx5s^$!HmS;}Q7I&)w~FKI`n6F$b?@YS3BzHiu^69~BI%l<#LcehaCaK7Z z!8e}4sS9a%cajJ099(+|_*t@MGD)lqo&vn-wx!rVDy>~Id2W8C+|H-ldxvFk>Ufz+ z+o_}`m@`VzVS_gV)oBQGx$G56AxtvyOSj?OnK4W5$pjZ%3G0!1dl4or=^xa>M1E&! zpQm@u#Peyv$Y`Bsld(N0N&7#0_D9IEwu|FLID2}i3fk+Jfb8 z-kGPz_w(cq$t1v}bI*BlUyFrssEEo?v#s>p3Ljo*y=*WbqMLX~VMZW)gDTjtG<^nh|0X!G(_y$R_Ic_dKA2nsODPobE0)tu%%`E44kj{I``G zB40{rX(4;F47zTG$5-N;aM#LFLg`U5o9PN-Zb&OHp(S-r53ZpvPYx<}@iQDr{*Oh` z{<+L_n*4NC;K7K5TpxutfgQ&*5o@)$*Hsmdn>b5!E(T>aRyB)PBXJ|8KPFA-&^l~f zlQGVPhd>ANb3iy2Iony=^vqi^s5;A5lAu!YddyrCSI|b7~8=ZS=+nf<4W??0|+Zx9($RC zb%<3ODz%l0e$|+D`P+<9UXSYO1bCnJOmpmjB~K%Q*?pVj`zVsMnQDtWbtlp2p)neN z?`%he%0g3Ppi0?vNyaNmLA8FsD5W4vyO`DF%14S{_#)s85af~shSD91QwX3Dz$t-ZC4`ljR z)mbEs)7!kTFZCQ|NoenqWWI71Q3komWOE~XpplSdFyQz=aYP%c$-J6?jJ1vr^;@$p z<&=$-B*_a>jp0@0t!?G$H#um1Ww-lnB}j$S(XpNph0MY2{oM5(+m?d1khRf@Jekbt zYchG?n4~1Z+xJ;?1nqATDk?r(HYB^TqETi{f1&ruEs(3rSP%Tc6NG}u7>%egkQGY3 zUhUgKpIA~O%vmQKlCc)uMtE2Hy;7q(END)w4gKabHHnS5FW3Ed7MaPbxM|(%#K>Mj)XFo%a`bA1ENRHJO@VOnbo{X((tZIhC9m>>AfIt@e2fWu& z&Ti{vMAFillm1@!t=m`S?3lEeO6g$pDp5TPbJPz$m(-$b6mCEJBo83pI;e!j5Lm7o zOunn%UFFvwL_j^-0`>f_biQ?{MBe?bt4;3B*XeEV2)y<*1){i8?gYwGHQ3Jaf0z79 zXVRj#L2S`SAXaWC`JGddkFK?xU`nIz_8=eMs^Bj{y#f332HYg}ruiN4F` ztC0xze+#J^DdUO4Kft!cae?5;l+s7MM~`Cu++Ez-WZF`tLF9^yD6GsP%BN>~M`Bd% zm#5ID7}{B=I6g7a!o*lI{(0zY&4({E2-EEP+ytbiR`BVLk0FzVo^c()Ka=rWFYUtS zDoE*yx>PnxNoX7WQl-^&<2ChusCfzLBmQLZA6Alnmll(=Cm!MEmzzP!Nhuj?+oaFW zg%Bz_cW*L>8ax*&I&A!Rtnh%$fn;*z+{rB~Tm4PzUiRQSN|Q(1-oILJRP6&EoJHSu zO~-ymSY67^>L8A`pE&X2#4{Uq`BeI%y*zyH>0R3ICgr=2QiIU{lU8(ADw$xqpD{;# z7UZhK`P*x)WJd00sxBsZi*qc2d4c>5Meq@&#b-K;9|*L|WaHaenf#_?Z;j19%^?Oa zodgG2<&i#DEYT(rfKBmn3zrHImP3N)h!kYMzoX5Bvrp zc)Ojyk0=CQ|0p(J2PyR5$>Gv_`Jg3iGu>7X*s;prv3X88GT_FEhg69{*d_>FyLUVS zcD?dtqt zfV&Vlt8Opp6-R@`h8@lZ5lr0fUOBu^I-DRo5>N|!of5WY@P#(`uhGrs%*qji z%GTH8qm9@6(w7x1O`3I|_G70To#VltB49mZz?snTrQyl7;flhmU&408>j5XvWJXG- zC$EG@i4msg|E}ysPgNouaiQ@Un2s~3>?8Jc1U6ug3xOXE&R(4#om94nL*!EA8h4Nww*Knc8O`h5Z+3$67HabQIKBKXiu&6;iAe^5=w7SgoPscVuUd?6bHv(b2)4+Om9jh zQcA?r=*(=%q%vyMnf;#Gmdku=K2fUkb4MYU*MyDdx5(}Y1Cj<3m$I1oP$oCZ+}gg(n!PAEkE&=^;^gONGKi^4hUB>tMeHog{=pRG`aj&(jEj;p5bEP-F6 zdsH|!bk87`iPi~YCDxsFmLl_=J(EBTnze#%8~cuS;FvFBg2;2+&Se;`)X*A&2hL+8 z5nsKx5{YCg1=FyX;JV7c`~JQ`FdL;=rilhC#I&$=Jk?c^?{ApA9Lqe-sAR$|E(n1i z5zkFo%+W_hIUG+XVL4{)|t)@-XoDV-7CX`mhl{t@i=#v@zJ@={3!H zqx+3f5aMgLl@Oo~wpiOXtCiuvsG|IB4B5-`u9eaw{fcyQ>v zc%4kkIt{7O2I0L*aY)tgT|D4NZJB z$ESex-g9jS*T8-q`YED9Rc!1$E9pqwM_T1zA8ZJs<|e1F#wc|?32a$+rc*gpi6Vld zmkB8Z-u+V{9-B<&&-wGz`&|<##URW`igc(CgBXBd$=N@H0ufIzQw$|@4nc@sOQlzL zq!HMYcBc3M<_99VQ)821eNZJ$Z04Yn=QVx8m4Pgu%1$p|S@a?lps zz$Nm}W7O;hM$ zEReF-6a@Gch0k?96fa`zP0=T&kZKx{sO?JY%L5}pDvnI7tfTNvM3jE}=ZQEq@mk^g` z&`uX|INtZ!LZHR3vS#>v$FOUNk-Vv^MEOCDv-vicw7NM=(w$7;H;N9W%5vf|%hd$z z(KMQnSq-K88|>54b0#8yI*BLROeip!I-FyfrQQl)`g#jgmRKUWQ#r7r-3+HArv*Wg zseXrqrBY=3*;=YVmEIG761&9(4jpDe%!D*E;zBo=Vn_RfgXpC0-;3a&M*$knn<>a} z$NGrcv?t20MmtzmnBb*w(=B{9ST+kFCdd=m`w!J=u!{;PPWBV@W&Q z+W`Jlhz0q7c>|2G)lcj{Zg5tR-_a6$hu9oV<2u--uZcx9kw(}~Ap#eIxpMM>DX0qv zok^oGGELifkfs2#ElwFlkoiQ0>R8D|U{_(tG!Y7}S<1$YnQ0>^ba(_RQi#YACdQc~IMPS*v}ivtL0PIq*pT&v|L zei}kKr6XJ4kGzxrn95Z6&@LieXt#ypbD~>mdW$wy+xy#Mg)^Cub7zZk_(M+1BYbCU z7t_kh1w(TcCP~!wXInJ64~P~;@`l{M=$Wph$KKIhzs0EEztpmgmdLL6E6#y(S2nkWdWLfOc?U0e`@7>b?W;iB&|yxk4~)U5H2i`HR^_E zFbjru^c}X}NK+#DCfpNKpt<=tq&9!f3hiHtry!W+bUso)%c)C@Qxh?5{ZQa;M0k~yO%YIM`Zl7rCLSH+OAC^T_kSJLC zH)O$BR1@xG#&A7NWI zMXc||v#cmpE`gsO$OKDT@cSjd*>Zc}!1#ai@#PK@zZVynjoRXEL9B(QP7w?HigWu( zF6&5DR}vnBsSAVA3}=B%r4k3)g2})h`11FhW7mw7G1x1jzNFKxP;KO7M9LT_6KQrX zOu23AT_Y(`rP*J`@$a;?q6Mgj^wt=ldmqWzW`SIeg8b&8VC_m$+^F!yk+_A?+{|}X zKEul5ZK}$6WBHKx zvNhkv2Hr{;XBQ*0MA3@9iN}$H6L5$bWJ^?F41a28e^ok+>lgjNFV6UmP7bMdv=byk zIhgD9DtuN*l$qqyTRQ*J78@jx;>9SRxMF;X~4d*fKa(W=iWa%jOBB|D#=q)oy}^gQECYyKWci_ zGLh7h_Qn#d!g$RSsAOPljM=?7q=>iV?017Q3-W=Tl)L>{jM>1~F44`^%-zYyL zaYc>zDpF5< zf@TPZSR3IacP{$JPw2KPKdOViR{*{TQ~XHb5f;P)ougwKumbI9X@;9r+)|YqMp1_SJjO}C#M006wQU6;uvnW1Sg99oYIQ6TO43eLGl)E z>P?a2N~!=XST#%CLWdLASkr4J$?-Jw@cuk_MO*#Qt&W=TIYfKp(VJDxsmelA)c9SX z{DR85kXcKr}rxZ9jIP0Skl9`r)l(SJR?x_L({AKR?zw_Gh-@ppJ`-@qD z>W`o)LSTGH9sC4Ws>YSuazA+T>Q7sjUTdDgj(_azr)A36sD(6`FBc4EZ+M7_kMXl1 z>6DZz7d8kJ;G~s`Z$l&#DbFTcJ~UX>*XwVQk4fm&O)0FWs0Jp{P;nW6%FT_Q&9V1r z36ivhN4TQK1YwWFGr3$*!aNJdrf8kx`5t(hgOpsRag)zoYrC05#ZRCas@B%Rp2Xe} z)H*U#CM4N~Rp7UuiIs*;1I7e9SkS&$ggWf1M58T?@HyY0(-dvq(x0JIbG03MqfNg* zKP?alnZmV&JHG)cSnPu{4ubEQNX&uFJQIZM*(h}r?)|4Q_1s1nkC^qD}}5K-IVRxD*}pU z)wf1~h|Qa2AU#>st9*39M(K}fS`rgmbXg{c(NS#a>S|QRse4L%b9!EgI;U}S53ZWz zb7op}ai*Yt9=6OuhHb6xZOgayNB*FxnHrgEAPAtp&I-d1ohRlp)mOB*SOcL*8{CY% zlw&QqfnrF*!uC3y<#zqSy%$$#6|ZQ`a7Gx%hB+Z(ofdD+2im7oUk3Vo z3F)nPg(3jawhRSWX1zYZ_f7(+h_Mh^#RG9N>0rM2HWh|Rf8(NmVG^ZQ?o@Oi;9Kw4 z?Cm5~c9jj;Gzfv)&qSuF3Aq>nC=}?E>t7rm4jKafVp>y#RAPL>2ZF=&!@QS+oow5V zZTU>LDx_)I*KK>)4xg08dS9=#i8OI>+YP73v#fjz%!$cQ|32J(*hUA$60k|-Nmmlu z_ZhOAzD^`7*W&>K&Ykq!M0592508*X}vxau7BTIg_8nxzM4nM>r=ooRAB<{P>j4-aps| zG^YtXzg**w+yi7~0;nTh7+R0xjja;aT%?|&(1u;!V!?0&dA>@Q!4b$^xrAYqlj!wy zXIu%cSt2%}h3AP47ukspypGPSs3N$?RP zDUfOS;_jQUcHp^?<6g)D9_ z_xMD2Z{C6QH5~fL*{C2_TXrW7ri+|j_aqU|`_;IE7ekt z&)z$(l!*<(E_MV_wOV&51-l`MKEXi`O$EL;nBE~Hp6yz&x{8N}xfg&AtSiGUX7@o1 z>;CKcRkoLVztLk#kP5DaUyq`1T+n?;rRwR(LuACG7;4PilvRKxF5!=xx{8;J`)6}N z@HZ@PH?7B+dAFsZ$GOOJLQT-d#S82O&`$_Jws5- zezo0QO9tG=ljHz>*4aVJo&h~V%d}E=k)^QxVYk0GXCjtXbMWVz=ZCM6H#I=N^GI8c zbHYGdfX!#TVC`F1qritq&{a=hMujGSX!A?82uBVTskDh8k6k-(>6XW732 zPmx!%CqUu-=g_@?CjxtE&cG-7fYDW#Lu!Y}4lhvm^_eR9({6&f&MifltCN(vzpP#xc6zU)DIxmh;bgSxn0s zY7&4)5OpvQC#k3yMFx!rqRZC=JS8}x=^h+=zJ6W#H+@52@o_djQo^Hcofhp~aU8m)V5ueRoQ1VgK^-TK6I{_T@>CB-fbb*0-a8 zC!>o*hxg)#0m;3OFB{KF+8s|m^34YlSw2_3WaoqP*gR+fdh;@5MamDA$ojedwv9j( zk-_IF;VR%e!5^(-_|)9LJZ%b9jIDt#cG0V}Jm1@TK4IBhX}CNY1=1qj@fWY|7fVH7D0udm58Si}@VfzqO}r#-*V;7p_$2D(O_$*`BVoTkC%^=v zz=X?I&#kK;SJPvTv0xsPflpX}pQfW<@^vbS z8@B^HGJgndxk}0Wx5{GO)6(nHMDoBV@+0f)>ty4HzMhA)mk8^R;O1t1g^$@U1@p8- zas;&~!OrFb+ge7`dogI`p8~jHFL?>fFAqulyEOs3C-b`}dkp=zOUG!reybiJcxzq2 zOQ|_NJ`ZGU8GUmfugG}Gmj4MLjP3ZPEQ>GoY`ymFX+LlDf2wdBl}Z(Zf`ksATRkzK zD(tTmK(ym&zL5_vQSGzUTf=)V=wZi`?oR|q0m5IC8K|Ls0lhcCEu5F6yet&Et%cFq zL0zMiUd=TZ_gGzb6d2^y=0Jwt__wCtrXfbbn*P$&6g^2=f4Y4_5%8OGAp z#>X!OFEk8@=7mpi1Gju%8auG4`);<(FR5YOH74!lWsKx$2nRf&2yN>p9G$)Xa6al6 z;11>Fr66}nD?T|QLQnI7FeLk@4-TUrfUcIlPs1)(M^Wc|z_E;xfVse*^B_qR+;*w% zf5&izJxus(rg1K+of7gtFQXfsd_Mp(5R(4X!WgLw#vLZhP8U$c5>1+{+Ml zXQGyw#LV@VQuVi*1lfB&4cke74>;<9ZBm1_n%sk}JQ2N|o`!8+B1)0AV>OYZ9(LdQ z8R&a++12oGRM7Fw$jdyQ$M7)`C%caUgs^{ALR$mA#B(E5GxgG_!a%f_z4>rB7StTC zEH=gjYDs`;XE9&>3iPBSzxRxNY1D)6`vl`>`|{|Q8NW%UE(S*X)d%U4KgYdf)6s$A zt><0*%i#)-ws=nE;HL`9Xy{R{{kq09EfFKQSRE)(Y7vtR1UiGv+$(efw)Qo9ZNaR z8bHe4^KYx0kRT4KIk=f3-Cir&b^$t-i5y-)><_(ZZpl2@DfMg?5brv{{pDp{P-rC} z{w01?N4WGK;0~&H>PwoLfoR47lrDmb7`qt^b$Wtx$NH3<#|Zy<1P|??2kn`N6b6T& zU{T3eI#G%vf{4Xp8KwcRU|C12HjQmvgZM_r-p%|5tT)GHUkuZa%5KI#F zU~LfQC>>N!ljTo~!>Xi4&AU?ZP`CAWxIxNw21%ZH&*nr6fYp%jzr@^L+K!@xC`8m@ zhh9`$UC|`uP=4m!>1F#2{w8k^B(!cMHave|6^aJW$<-48oF# zlu07kME8;-(92LvBKP97m0`2AZpA7#Z!AnKq?4}JWr@GGEop$)8&u=5w~be{&RErr z{F#w=jYGMJvuNzl@L*HMpQq_Ntg>`H7m%g~y1%tZCMuUqsjS|c_eNq? zOatWzB459Vgy5v<7(kI%JlAqXX}ydyfJfe29`{c=3{WORLb5btN;E35JoxAWIIN8p zS_Sjbu_-QcGWW?5t7n|u6HT{ZvPo5mgDEFqKc(A<_5Aw1q=nJfI;9@$kX>5PeqIf( zV}7PrtwqTi1M3Wy^K6EqQ2eQZCh?JcYW`V`RDs}7XLi)=r=z{qK=ma1DT#Ga(=Z?= z`nzotRUMQqdcQx%@be*`Y^LlKx0!Y3JHlpaG4v(E6TKUM<^~l&GHoyt$SATP*h3Nb z_!|ztpJ51rxH<pcZi{!0+?q=!B9Z6THM9+X5bkB7EJv0xWhRbq0Z=qH%7H+)^{;94+m{bFd z6ZC*0r2MW=YJw1FbSWj!Hac?kuzKp<994*F@;@+L2CbiUEfxQjMa~^rA)YYLih0QM zNY8VB!e8g4#%m8<(CxsRki1@U+AQcfa31gvJ#LX@IX^sy;j4nU^wTp8`3^Cz_8gC3 zHPzrnT^kbqeSxD|PqBXLW>J?R`Y^vUNrbqLO%KmH$flozZiQ~sW}15?i$ss{U#j+a zty^u=Rr~|HtS;4i5FU7T2V9k9A&NK91O8)-`PQ2Hw?BJVKU7!pa9$UT)h*iJ}t!ii-cfB`ikFth9||hdk!@SiDval@kThK=PZn zsZNYP>Gw5dBWjgssxXwE+Hl#VEy9x}lX~&`GKF>6Ae1lnJ;9wuA%|XP8KA03^-S%8 zyfjeyrpk`joE4OejwZ3AD(O9!SE7xWrEmOuEbcz|Ogo-MEbSUD)@vbNX;^Ai4)}Lo z=uXLqjd`*!-vy~Z#>RJIVjTTqyFWyjWkDu7r;bdFt3v2D9Hq|t{#5P1p}4xaABdXW z?nukUZY|UEX!r8*{>*SwA57b3Tc*7c*Ppu9=E>I{Gaz`SM^0IcFSlIC5oto)!^fG% z0c%dY=Nzf_xbFQrGd)J$E~bJg7rlo--A7=y{0)RYjzsQ9XpMLGS>jaA^LvO`OnLY8^1aek4uf;e)nxP)>>FFk_>Xc9 zcBeuGv}nqn)ShD_XTzI4zKq(!s4Q)T+Zwo&S+X2N#Yh&zax*gI{A7G6T@3nm8oMHy zX&kEtb!^;mrBb+NTW361tF{<=%&V&qT%h=Y%LJ8ZycJ8wa_V1#-%|?uoI)9LX>{IY z@Sc>`H9J*xz8k%v*r7EG@I_Y<56@&(6U_m--?tOyb7|$tIfsrj@g~ENsPrD80(V?0gf->``qU8pwtl*qE8 ztg1Sk6G7!$r@tcCN@GmTM$=n4_S4;iFZXWnZ*Gs? zN7#cAN0uMf0BWjrVfY&``z%IR^wB!;> z$g8(r1fY^5TVScupZwAN<(qS>X?i5B@d6T2&|CZaki*9l-}JdlrzzL9_n`3&5ZA6o zf<4fvP6=|9F}ZW<_Ill= z%+|FT-Wl<&43Q^CX^>Iz>`YIXX**$T{==1GHC9h?w-AuFr~vPKO&G!<#;1#IT`1WG zdBIW2@wTGqRuBk$hi zBQ&d?+2_gy8AFjN;DZHv`b%<`tA4zNkArIku{j@!!ch!Y%lC}$B_uZUhzIW0#7ZgV zMRk-JlF$9~&RGZMdDjcT*-u9}@XnmcvjL4TO}u^yK>6^oSrLMjiMag2k2g?4lpI1y zW1{4u7@6$yGQA^MZtHKjVfng|IcD185&^=y;T_x}t$`R2w~jam<)i$}V;^3T!tAEZ z`hK5`lT(oj&mwEPY?MC?hYLh)Ac58R`}1fDp2O(0Iq~r$Q9z!FH_HYzx7Z0lWr#}- z{F;Kmu-f^hSnRTBfe8B0x3P}7A-cA~dT-i%x$34ugfT--gtkik+T>khb)<5}MaN6Pm^4!c4?|L2YEmZXLvvAXn#@C( zOl{j{C^k)aAFN{_5%jgmb_Dt!Bf@+hA){rAh|s$qdl zvPDuX`*<*93wl`!70?ofn0}=w5YyfgB{c`POJT;(KT;M`LOynO5~Op?BVD4L8kjoD z2k}SX7ybA(!XYAfEs1!$urOO9munu1w6xEPy6mpG+>RXk88v5WyHXS>M}Ju|eGw#< zVL*pk|_5PjeK(X4u{M0ZM<-ux|OhbTM9HT^FWYOl+h`>ikF|x0Ut< zX!cPSiMxE5g2~9lW_P47Jp7X^VlzRUw+V6g8|~O4;vI5Cs$J+Fp=^JKwjFf<%3vLA zAk=#O7{DM`iG%Q}@~i!dC9AQV6a8yU3o*A|t;*5bAmd__O79J1-)`t1-q~E{i)GU5O0mMK z%zk)Py!7|`*->6>ij01V@DN3EpM7yi(MONMM=+}Mc#dfZgE&U%N4kNCWu@m%Yf%8b z)6QP@aTz_?>Z62>^UyxDbH9WwGTO(6CxW*0zTBVKTC{o6IewpX&NAV3C3N=Vgh?S% zH*KyMqv7F}+~taJ^}Z*obivr9+}eJ5wRzke*`islpBNNx#{JiMzKVTaIL9iG3M8gy@sH}}$JVhL$yt*5`=AX!v0YVNb_tz76fBMLu?El1NtZb*o@V!`20CsRSQqBU zYun#)IN6ooYgQo2vGB!uL+ps!M>edhpLq{yJclf+soF|QQlf)tbAm5wFdErWv0`4V z)@8;jda+`zZYfH_QnzeUmq{~5hkTA3xP)Tc%wsQsa#YZ%WT-=ih?MpFe7DwleI)=l zqz-9)v2to)DY%@GZ>~0gtp>I&zuYY`!N&C1hKkx?w;fQaluiHhem&BHO;0_4^txI_ z{Y|=Jt?1i~_&a+BB8I7V!wHHTc=!xh(Zs!qr2A|Gu6+d~&-qK)Y~sx|TPyG*m)}u# zd@SO7BFb(Se_O&XELIl2R=r$hRkyMS@SUt+PdjQayh^7#_OC7Wsg)BTIFpP~ey8CEJ#0#MnN5{YvGj%O|nzTLHuM+#@OiaFMLS(eJG$mC6MF*yd6TuEn192zVtr91d^)8*v+;gVILx04` z4*cGWAQ$c%x6~o8o~$`LcbYkRcB8)9WuK2`?SvkAD|5UiW_BDu;Io0#)wRgu^MS?EdPlrA6(OpNkJzs_xph3+-@+I4F_{wmau4st6U2w~_;Z z1T4268mt(a21Gp1mLSZoDn~pdu#00CZ$Ho?v{|F{>~%33>{bLDi2w6G*4C5OyRg|e1IGcQ;5uNv(p6yf3ZX=jv9X!$&II$W843AJUN<)tT{2B z#kMk02&x9=UAapBL^&g)`yc2covumC3s>n2S_C?8>&a^GKVwv9oAZz16fFH8s*&ey zy7_Vi$2q+2`CpJNdK}ztG)|Vj!QsotpB>jJehtja!Ni$l2bD+-tM0`Z)y^fd83%;{R~7jh(~M1pTin;h={9(DVsX;U|6_bG6K4`) zEEAU&`?Z-$F9F+D(XAd3$)j>8lmLxi4J`YMhcA{$^wiIX;Rp75Yxvi81~qT^j=vtZ{5>}6CEne4+vrBu zY9`Mk(QC|1d&uYs&{+IaGhk|a(gzgha_nDzg`p92pFZp)d8?~#HmJlVa5h9byv-p- zE{`Pmeb&a%9m8j7fa-i z`yY2AROL^1d!-rqnkxjb=lPZL*5k!r%v26(hlEwf_eYvNmcC*gn=dM9;B~vT8>Xw3zi9K=Zl{IWr^Iw-jKSzbOxoub?=8huX0@-4F4ZX z5LSB`X5W=e;cEEQGAdBUdO(0m8AR7*pLF2nhO78jMBskA^RVd^pvzR z&p%_7*t|&H|HX8UT|;ttF+Ld5APZqo?ZeyX2L6Yu4oW>VO8>O;>Gyz&k{NEe~b?=#wgqZe-@=>)Pj-Rd`?cvxGWX1;uw{O zgrjg)mFWnL;_G#v^A_&_~XAud*$Y?2Y>YxCN>p-8mut zEJKYH1d$LyLwdD_Y}#c);ROuBXeP=v-YNaSUMutNBN3iqvc+qJLJRdvUU(vpzzoWv z01km*vRGoKDFqg=Qf%Kv#u{w^3?$lBCLNnhk^YH%JrKu|uIKLR=3Pp^>eKJ{~M*%EOW~fAuriEQsQrL^LCVsABfq!D}Q0D@B~h z=?v3zgg0E#a^{VS<}Ow!?AkAuNHlJ>7nQUzW{vi+EFa23Qmxf5CNAgf{{>x~HyLWG z^U{!4zZmEn?L(@;}LA%ReYl`R-dju zG8;@D=zJq<`VZ52SmFob7EMaCU7S^(`tK06!00DpxI9-o?H%GR536FT#OoPzJ^Ka=Rb9WBV&}_-C#wJfnS@gj1ClH9w-V z6^@jnR8^qWx1?!T(o$kzfs}E28MT9@yQ;sc#JO+TV0WiA<;Mnw3Y+yAf`)PaEbel7 z^c(c&cPE~Q%9Uj*u3G9%g$zBeuCD1@wRP2F?fkK+%FViF??5{IuH;<(P~VzULxaDw zJFpU|_`zjrcXqqK=J8e^xcD%Kq!nI%cmAEnhtij5%C#-0`#<^$eS3u$R@=s)bW0zc zk{+n-;P3yG{-EJCC2n0;E6>M>hd{5=p7K{Q`I7b6hHq~<#y%*GQhZL#Bw?tm{u*eQ zWRv`iW8sqBndeMgwP`HHi&Dz2FKSB4`pJ=f1)HuQb%&OpQLR{z%H-R~bfa2sEqP~L7K z`|;6VxpDsVdCh$8Spm)ajc+;yH@o#Nb%s7^e0Pe(yU*3&S;F2oJ-*3=il7t@Oo65) zt%04h0}}4?NxsYu#OS-P^qpauG1bmECbr)4q9=UfLNO__5iL`cx--{!0xZ zvIwprjk$B_YfmD-oN&DVHJ6^c{Qj})E;~^!Qw+!)LiJieXwJfn4=K;SaA z03H8F0?a#vWHNXZwRqMvo^YVkPqcIoy|3 zK*4@n+BxsSb!{Ir8E=%Qepcl^b{hVfwCdN zi3aqR^9PUPuYK{cjkio0_p3$@+_@3x@yh@D(*Q2&pfJ-wA)dh3^MO2X?)#wy737IV z3XnI}+9?wU`?Uo&MAFy$pXm_5@4G|BS`(ba$27>urTKznWE+2g7gSPNCW1f#C*Xj5}~GEg1uhB7E)o(x$Ymk@Lh+($b7@d+d{|0 z!(C{@ZnbbYIEP|m02M*uOq`DWV_az6v_!HLr|)tlayg=4M4bH^(JpSai7vPj8xeXv zk}`n^DS+ct0uj#wTMNw@;+h+5XU?Ky@IMr_kJ5Y;&U7K_^-s2hX* zRsViR4X82?A~|E<1^rc1BI?Fqf7K?>2-u;&YI-C(K8L00?uuLqs!RKS)lu*&bJ+Ge z^jCd!dwrt9{Lo*u%|qk;Ds$kk+5;5}tTMkINQ=W_&|CZHb!Rw@e9ECJb7*@#=&WKr zxV^4cNS|+HxI7Z?*^;8zu-V#H?XWz1^#UgFS6zjM0WGC;k*SHW)72To_h-s?>O0qO zKy9UGooTi{G^Bg)oqJ+`;p^wcp$}^}xoKQCfGYD;+DyTPZpNY=;$WD~0W-fo-Klz+biVKUJCYj2+ogV>y8Z z?Wlc$?XXhe_I`m?nX7Br+}7kV^lcu|cNR_@LVELZV_daC)Jadk|62>NqsB)0*tT<~ zgu;Fqt)@_Cte9WM@x$J|_~+~I6vI!V*S)OKPd;06M{#~8WO}p?R>4S=2#&<^KJdP z+N{jOAyj|2FXO0~cQ>b9)IysgmAT>ftHw292_$AvcWZ)yh01Sq%) zv3q)(Lm%#ou5ib0&+|3ENU~#-*-k|{&6thE1yq^C{;Hb<%Dh+`D51Y zU9M-y14aeluNpnE_tD2Af7QTJ3b4a^b_ZNaF^b;fVTAux8$I^VYlD_jcx3Crwo*ZQ zCrzNOlrxh#pwR+V4?A;zd!07n*xIb}^XK0F+l@DEy2HQ%39W}n}KI$B6Iwq65`3k^Niu zJ_7!#{bUsw?v}&0*8{|^aaAbyyXEktlJr@yV;@wRN70UeJ8D3cxmZXPxRf#mRGA;I zNdCA&vpp{hETuTG9tAxArIen^Sa65c zCX3--qB`1YW&V|r0(EeEop~TjQv+8MY%3+TFEoJus)41Hm`tdzE zZtL_V`j$Xd=F5u5!#9Dy>Qw=|w8>G-psGd3Vr#v2psf_#UT34%hN{dpgVVmR8ts@x z&R}lU3NfSD$4v+_^V@3qgjUBXS2amo`?c7_UahG#LW zZMTn$cvTR*3Rd4XIyrmQSF!qf*llgrHySsuU+OJ7agDk5t37F8MeBK~h+4{=14^F?R?!STA-o)g0B{pk@U^T{vP10r_7ZaP`UD$p*DHKuSEST^g5VgcI4>psVv zjFrCIUz0gAJzQb6B`{<8Y4v4m&|cV?dyRMdMp<$$51g&VESQ^W=x2Q5{(OD&GirxY z#1mjQy+`_*$1!4HdL)<5^QBkD_l}p|cv6cxZUmYV>C&e)!RZkYub-)mQUG|3u5C)6 zlLzdkS1)GB|7c=-txnr({yIcJOv2Om%usOu_vbC?KhH$5Od(j~nM+&yK=_Wht} zK_{sscsDx)#}-&NJMM(>4xApLi7?HPC2+T_e*X@{>xCrpO&M6bc#2yrt!XNV*J%%k zE%PLa$X#Bi2J$U28as7pW=dgRvb3Y&RWf7vJAauM82uCdyaly$EX;-x$^R*10`q=tto= zjDn$8j%AeFH%Ny1G@VZm%fAQ>iG$==+ti(f?{CMjiuWQHu#nnBt3^GQPa2`2<4JTR zTa$&}z;#|1zJh~R_v((H)R()`VlLRx9dFZw)CEK_2;H3*^KwIh(aM^&o#nF56oTdQ z-{Q61x94i-2CCY7_&(m7|2zix;5 z#L|7N^s@SvyzJK>Xz9of1SgtNCh2UsmQ&LS@6a8~F+oLxt6;!xI!P}~1w-JqObdZv zzqL0vfY;;sdym3zV5iMsA$Cs><8=l!J%Uid5WA-jGLSL>ye7_Z0rC3G>&JoE=t!r= zf!%b*)B1>Ivp?Xq^j)H~FnGH-q=Km@qn_&Sk`g?$duq>q_bWc}`Gehby4o(4`aq415?0`-wskL^O zKWjj4*t zYHzC(&w{^%6302{L+z+?+PhkNjArJ$w$li|LCQ?E+1r_C&ZR=rZa%lPdYa-UTu4(K zJD8hR`s^fE3K`#Y#KnBLJ!`u`7P-M!Rc%On^M=kt-rj!W<_S!W(FZ<;jdVTd#Z=3D zKkr)2oc{dmDOAeFSEN(h9Rjg3{tm1SBsIqX z6>Ki_9D&~ZD(yRGaH5r5i67jR-8Nv!k%_+BTSa}ot>?l+`;TS8_{^?fV?TW>kFV)^ zTf{o7f1TYhfhF4bYh?n(BgM0yl?GWC1n1uONeh)HcW1m6=2ttxDeSoOhoxFw8ck)uG!wtA%+VgCQWQNIM($W#7vR3X?(sR@>hsS2;1X;G2G#tvws@v`ibHGikSNh zx9JOtD-~tH27s9RTcFYbRU#J_+j+Ctvx>8sj+szyJr$S+w?Mb{R=4In8uHA6 zJq}v|eY%f!p`_09^onKZE(UplV{jopR zwZ9Y&^NsF5w$hv0Lj!%Io9xFa=a5f#HKPgcGhEEyBWB{q2PhF|0pF;Fxc;M0jNCcw zR*ixnYeU~uW+WUP&DOASD}dqt9x)I5Mj6C4U65~dO`UR|;llSg3TWwt9f75AIKyqb zI=imTg1r6-Kup@iV~f(Fq=P<25W|(BNG^>C56+@xxX>V``cHct&{BA$mba@(iV@Q@ z-O2UXT7@yA`FI#&V!vA_V1f{{OCg6V4uP2T1a|0126Ax3#Hb1>3wZdlaZ0b~On;Ad zc~UbqgW#BKm0dZw6b?sBHOeqI49*W<_tM-*+fu(_=N)W;=J~E;T=7vgPsRDCrEsIV ziY$8zGC3{XGT}{$WY&;;1v9y!#7Re;;l_h4P#;Zk?*qgPpYV%zDtA9qjOKt@ z+n3Q^Md4Z8rM@gQxx3a|&DYANPaZT`z36nc=sS@?6Ya#1r4wcO+pbC9<&^xTrJAOu zvv#**##v>XX{;L9X}$FX7rji8I?0)(lI6n-rN(lLdoY|k-_00jJ6kH!*`d89tK9T0 zt6ykJySqR=n^mkO)t_xwy}2u~I?hjhA{O6sCf@J{TiVmFZ(}@Yf*EyHw_CJSseExy zyb4XKXnj;s)11iII0&4N-43@&x0NZmqOOww8*bW4%7ROLFnU zYPP(|x7Q|Y-K-ZoPKQS1zP4rR(reRM7tBs7Aw*^CVw1Ixcxd+a9mNGpwplK{de(Q? z*Xw%U50+E^H+bmuTg4a7AiGsD`yL7aiZ7E2#z5*pj^aO5d^Plp;EM0^Fg>97oepN-VIi4sJ8Jh0~usP`5ed~VcXbUCo-+CT*O>&BukaQ&tfbn zyD(buFt`NT#!j%`!%cmJa<`Yczwmzd^`>25yb>#k?cD12&NhID=OR%+#g~!NsO}`d zAkq0Y^}KM|x?U=d2s6F{#w&qz-;?Xka0W>!=X?!@heQz`AcK?%zYpLcWiU+-iIykd zyF5Vg?IF1i8?XG7E&V0}=leEIB-i_92oKMMszUozhZNtt;dc)d-((dg+5~HmLBjA5 zRD5+W$QTf~p%p|%d4YI1iX6C@A^Wv^F*96>8QR7M@X+)yg9P@e0L3>iXP-eBG*sM5QM-|`TK~_9e5s*Pj zvw3_ORN%iF@2e!uwlPd8s)*ReRt~X;;i2$-#mxzD8++0k+NY{NY$0@H&BW&AE^MFb01p8M`Tff__Njc!*m>8}4;ZBNBsN2& zH*H1$k`joA{?u!?!UDD1<_Ic4JiH~M_YGi>z&@4I$-w=6Dp-yJfrtN;qmc3qa|;FW z@aR63SBWr^c^U(J8ykJ9YxYXFTom%7nAkdMR&Js;ok=d^w8m_9=WZAte!D@UG1z9v zWgg#g1P?7RIq)pyxG%Ri9*kEW+NXjkzD`bzacjmwtgmI2&8XDqtBMX3UmveS+t}u1 z>-oSoHlY>vy*vp9xfg+GYOch6jPcP<${|iUnP(+&q{QV0BNKs9Z^it>4AQKp>h9o| z9Dxwc5B4sk;RwZ7ZrB&SGVkLNBT3^QBhMY*d;hE9GMHoH}!7 zKNnoBwH)yb=VdjDkjV&&)zu`-pPN8rdbf29i@f4tF4&+sGJa)m0wygyv1lUOs zEg|7{QvY&WPn&izJ*r@*3}VglcEeM4K{?a2;Wafz&E`7t)AOWbS(U=t0FRYCN;c?&3;hP*@bH^Y-Lb*OTg3 zH-?>?QbW!I`&5~`x^hqa6WH(PX3Qd!jo-rER3Q9m9JC}vi;7XxDE!t+ddfST10Jsr;0{-8He@@`f7 zme-zH@*8FcuZ~WLn(c0}2(_dtH#H1TeF?ZRF!1Eb-X7t-6EF3fAt<7Un~$Ci5EKmL{1i7^P5Anqnc zm7-_T^OSohU<^<*45JWLO(qpjg_P**7|d0f=_qv1ZeT~5i-bztEH?jLqV>L*34@|Y z+G}w0ahA~(M$P<*HI3lZZ1XPF{dq}{n*9cfd}9567Bc}TGT<>UX*{52g6N`=GQ=P? z`!^_JFYHc%%*WkpiEGeQ;{O1O4726eyBQBb5fte=Vm=HBdYX3F=Me)zHbvC|HJV|~o-vWJe@Js{FICwqSng{659>1d?yk5Cjf zMT9O5h?xL2b6-jk;qz!QUCsZa`FMz$y&2w&?1Gt(Fly#|vMf-$cb*7>B3PvFX?(=# z(1S>y9J{qGYs`;%keaE;?L2%LvUD9cuaqWdR2k4`iVKGWC7TAo;zK@UtNR+`y=e)tj&MLUt<9O>B? z$R70HMocBjDyth*r0`Q43w^5FqrAQTITh*TVQO|@J}zoEGQB`msm!pOAeG{mJ1=1W zC6f}GN>ug6ulNOuKxzg+QF6DiLyy`;s_s-_q7Z3sxzuFPd{it@JrFY?^HF!iUaAR* z^z~>AoU8&PeT{*XnlG@^ip-nFB!`$qkMk%!w5C%(=0W0JJ6Yvr+qC>_eKM9zzpYdg zxyW_9N2FzvuJD#*ktQ}4e#cVP`M`TGWxMIME7dn?;zG2I`D-R(ZpRv@+Q?sJVn9yz zang&58PWO_Q#Dd=hEgiHdSe1pOT56OxUzyR*4n`}{2nP`b;UQjn|JkMh;EJQc1V(1 z`(cT`BiO1VJ6@pY)=)8=VP4zsV`~^*sdqv4bnwjT2ue%g%sK!?GJO;-V^Xu>`V~zP zr>Iu-$?8^60_&Ii&P$B!;{6z1X-H2$UuiiNUbVEw5F@j+wb5>3x>-11zjo=1%HoMV4+S0wc>ZE=Xn16FYWM@>yORW4bMNYy)ErC@z3 zOM`i!grUNV0_Fwc+ABV*&JV10`YUI7*FoUe|O)$)n)t z*RfGt_7ei}6Bgd-hp1d@&^hIljn(zz-f5t+>FPK*2hZ++Om5)GUUj!Q-K#m67l@94 zPrwU=F*#7#M0kOez6fQL5%K~BV?=_YoARbKI7UJEgqYkWsBEG!y#e6U0+!v`iv*<2 ztbhv_e;3|ig3Lffc;_elJQCi4<0ly23Fce+dny<63TYYi0wE^Ha+!ApP&Q4wnbA?3 z!R$^qtH(ZkPN|sfp#v)4|tRj1oQzMvz~ z`9chPz01d6VVx5FqZFzJQ|d}Nf6wD-^WFt(%FlfQ3q_y%FK(@T9yo-b=Lt*z{8T*s z2nl`p%PY!VRND2D3Zs#jfoFH-H`8(?#*kF- zl&$9tT^QS$bw2^{xvy**9?I^lC}Izh;1ZR83Q;1U-d8pq2T4EwoZW#X;xEY1bFD|b zR*5C2Iuj|Ys>%}Dm_^SId4YRTY1r9}a4MIlU{XDu*P{tc4gV;oWi^wPr#+J%OR9pz z?wpVdvM#3nrmW@iYh4;IVdmiXkTRW=~d|ae0DWy?AXQI19Ynu;uA##!+CdN zn>F%M-x}wLesbvZpjQ`v>6%Bk9?-6UIiE^Ely!cW=mo{~VU4zO#&OH27m<-K($_^S zviSqF!bvg%NEd z-;nhkO;#e4S3yug$Yl{`^%`($I7V7~6-_zrL36Or2$w>(ysnMvD0%gUxD@ZG-jm6y zS_13hOx1!n?{=sPnOjO7Pg=KhBsTt*68#ZV0%+qBy~rQ_f+?kCk3dW*k%ME3*uP?m zH{Gj!Oj%v~0LPStge^Fxpkk7PnBt9o{H^=}ra*a6IHuUET!PQf!t$VR`G~v?>!;DJ za{zUaimeyOgDMA6-A7zmMKRk*zRHWv{?;LyEVp44S)g43=0U9*l?;S=PgCr;_NIE0r*1PKIN5pb1kf(S=48AsYua}fE)Ncnx|71}GI+q`9+5W?2zB%x z%sYMpU!AIIc?{%aS8wt{^YykYE;V+N)yT*86qg}R1`C)hJm28-{~1%Ps#qR3f_YFl zCHrW0hCYY|$b-T#1)yYrI`|TXDg2&3@H{AhDe3x{O6EUdiV+Q7aGq8`siGN_FM&}q z&@KBHOo0L>i23?M^5Fjhrfjis^txpo$b%is%SB!Z%rZEYpj-CzW%I9Y8J~Q3U_X>E zal*8z8b72C7Mh*g#}wDR5-euJKTxu=dLHb9JZSJ$I{~Vf9LxmDK;#jh*iY+L2l;Zl zcxQc`$1rN}Fw%PWbN#9L4n}$LWOjmP0xcW^ZN{eKN zz9j=nXprZ5zq+cc1Zr10+&WLPKT@#bImOc5rpvP$A*ZM5KsNM1f-kH)%*uW>w9X|* zu!_MaUk4+K82R*|!DL#*2p#G|29rf0np~#9 z$XNH;{(S8Um&m}7MamN0)_VJ^%iV1uhz_YTxA?Iw|VXE+uZOz#UbkLodF|`edm}nAZ~ss?Q@vC4 z;86E)M3IZYDz?}7Zc4kfqHoq-REjkwy|`?TYU2J)0Z2x-q<2h%wRXpoTLBA={H967F;o-c)o*uXaA;r4TS-V;>)_8w{k z3*-xzdMx-)%CMlV%H%S<#9(x~)SHrQnUni50rze}6#2IYgU1BlD6(Gf3%Y@<>w~hR zY|c!0d79N+{CwNv0M(XMBl5SDXqGP|i5(1yHt?k_Vpv1Ui}@%N^GWHLaRJjdGv;ZQ ztVVrULLcDEe4kOY=ov}@B8q5UOji=B)O30)^RP}Wb=mi@N7tJLiH8)Ni3x~Rql%`} z5?;mEIFqiP4@+DGRWF?+Vej^$p;^9>R8L$TSe0&mZ+WzQhqFd359yXLy4qXIlR%5{ z-4_@cI;p48e}gFKdq{r_o&PyP2diG_R>eR>2GIW}k%7Yf$Ux;W_>ow=Rdfk0Cj3Z@ ztx5!TB=+FD(Lv}Oh|pOSt11wOceECr#f!*8Yslbt#l54!x{0tBoaGr66h0b$z z+yI}Zo+&FDN0{$RQ(~!ACz-KO5AAI0lf7Pch!i}rRTwZ3`nvhiOf?KT5+f9P>8vM8 zx%SukM(MFwC(Q}v>e)al1ygpS$K zFhsz9oC4|lTZGUQyD9?-O~wy6+27NOOObx1RpeK)fFgAJM`ExC-PHAS^1e^=Zd312 zWB@u6Q&k~JRrDaPSH*#j#8!(t7c=E}G5#(x(6I-+=((aI%f8iU-Oa`OFM1*l4tOL6 zMd<#`r&+68{QZmm;qgC*&W}Xs_9Fw9w}E>hMVZ#mlWfMF!w6dMDp{ z?m`mmNNhIlecownFf#Ci54S|`y_XYio2{$1wNP+#YQufmW*wPncJN3HAO(mQ9SWVp zA_IvsH1}YkbIs##etiFTo$1L$CONP<-_knd2yBXl;}7c)u6 z{t!Cff6-4Isa}v0EcexS`z12q!sSAS=Z|+8{-C#wOMQvz(fpxsIn(j2@gSqTa(j7f zt??Na2Y6%vc+i=cI^rbk0{!do$Uwb= ze1luAUNrrHi+xalP+hk0{*l;Qbw>D+7`kGfSWWhTkKmVdGb=_YGN4QNuo4KJ_f@jk z*z)jfe`9pxV*YJpKu)baq7o3A-d7*X9h!bn2|E%4B6P8|DN-@1C|~GbWEC)>oDKF= z%O!o1t;%~t^Xjvc?ByB-jzq#b8rQVn+N0gYBi-9V{6i)JI4h^!^=oYm;YEvDO0X#+_6AI?Mf-6 zj+GY~@M@sDsvMuFDCJ5AI*8aN6KwZJJVWH2A5PZa`3#+3T{F9|2RbgV23o>!XyEGD z%#Wg<)G=8PKpo?u!pu?IlRRlyV(H>}4NNRlTT+4N(tScD6SK_}uZVdr-eIHY0M4&$ zIr(6Th1t7IaK}Y>bQ}ni1C9#-gpvJlY6E2FK*z|s^^UCVUrP(+WPNyi4*4B|KET^VvFu~GWRLfWc9G0Xr_{5b zF+ICyMATv<`Cge+I*AFj$g4*$BsnWNA0(MeeHImuh|JB*;eIcp)iW4d|3&!RJ*HxH zOst5(;cJ{B$Jk%_4BA|+yeRoV9na8QIl;*?H$=oTGjNG5o1HpWDrD&;65~iOM^yng zll>AO4pF*L}S0j6lRDfZLzPOe3v5HIT5A&npZ~3vek3@+dHvzhonOE?>E~N(1m?6dzC~n55&ql9-J#4ef zbHy*g70{)~uP@F6x3khGT@T`B8yP;i@^$@VzTWr!UVcBVbrXeno5&7r|MfPbLI;!2+N3VTM(WpKx3iSKi&QRCP}~fD zI}3Uni_d+zKyL$`*W-041)3Ie*gc99aK9WK-`_Yyj2*ZHIx~p=HoEy_7Htggdl~&G zj9USKE=A1vO6&&EAP4Wd*tg4Xbx7wL?aV-37YVU(?(o~$#dLqjF3<3J<^G!Y56Ned zMCl{RXNblWqsSqW&!8~1Cwhez=9m97jUmRz+P|IE(@0nX8sxyPi@$ok|0i7+pj{q_ zg?;FD7Kob_>Q;(ekN_WVejo7zyWF8V6roEQ20h!Hy4lI*JZd`t#Lez3>|X-O;ZozB z^!WGJoA%Uf-eTIp>m9~wvRuY(EwN%2rL?<>@d?RvCgBq0!&SXH!{iTG??ZP#X??O~ zML`|$aML`N<QrorV2wf^K z_x-IaI!-%jh`8Ai8gpQm1CKWwQ4U0n;NC_J9~3vsqWqc09J-zTHEwpHOCa)BT`J(oNp#wv zN_gC?+?ob?J)0wHlUN_;Gnf0toPyx|Uek5f`2Jvk#=vf8OB*xg6$1M9%quA8R$yHh zAdTrY<{Hw;6!MKq#+;}B^>+3kZWeny5se5>>=b5P0q2+WHBuTFjro#6ay*`m8@!!G z#LW)T7}dn0ifoRUQ;*)9Q5%%0%vrz7q~r_}rl78igG(T)+@WmncD8+5F%#&zC@4hN zBPfRGnE<w)9{|I+Q=nLK8|$Eu>G7gN`P*ml z+;IP$9vAfAVTDYP))o|i+~(d_XD?1w>9Cx`th>AdYHfSdaIFou3CKi`imLM6Jp1*@w!*Y2fRpx^vpr>Ioe;fMU3+Ai)fH(Xs zxsH=aG@W z44mgc{<~6GFqG-y?bp5kn@sd!t?g(g`T(TPoAxA!@v}qcIdw`*1|@ZklGd}1CsX`v z@fI^qKM)D!x#;ZjzQ{_$arwj(gHg1yUkV;BHss?1T3g3k58zyNXp0+3m>;4T1B9s8 z^$t^vf79BYNVx9h_54zEiZD-rn$zEFZ9R%k^a|I}V{)N$RgPc)q-vY%pZgy$3=VU~ zBy_C3`!e(>c%S@b6pR8gP7Bisa^4el1GP3uRLMuMP}dzEntyap{&1edRJVe^Uvs+e zo}8)OMiTLe?uCWAHmzvt*RvQ!OE67)@%Fcs>(*m6)C{x z1H6zaN~`c&uE+_ODi4A$X`t5T8PMw^NT?v`upoY!=0$*MZaQ%vyx`#|NL3{Ys(}>4 z(T?aIV8H9L(mW^R#;na(%D+93966w2&7G(Gj28I>j$xh*#kFIRlVxO;bh*TyOX{JP zDe-(^1x^vnY9}%@$_zEAugw$~)F)m#Ny&z0fx#mE-12-mL4Pp;3v>HR%hOdYHYjH@ zt;#8iS=gDcNu^_z;v$ER(X z81yQ9h!y+Z6x-J^sr&Ib8+i&(Ih^6r_dR1@H{Ms`)NtYIoWgQ_^zzz+P@!|{wsG_? z`_ylG$IgDXwQKU^{*XDT7eCJz{y09c#C1!r{>oX--*pT9QC;%^vS+^kPqJr+^UMf! z?QotM3JzS&@j^cZ4-Wj3x<;2zQpuGqX$W=^b}v$bHq)ixjEY=@&BVxrDVj~vq-B&p zl#3tbR)J9k>mpBSrmU>~mmTFDJ73AP5X;=9$ozfTX} z2I-0G05uy>)v#Y~gt!OVSbkn_1PczB=X*iw+J5#-Eu?AQ1+tlb&Yt;4I34gaJX0S- z@G|vq_Ux<}lF?P_M6@Y?gw6C%*|S(jqX-%L{5MdZ84(=#`84(ad2oPP0t@@pT;8G6 zR6t!b$i|FpEdrVvtT+U~JoC>@4JeMru;9SMOY%S$;eom~KOv3iHhMOjzvMot^#^{Y zpMn)kDRTO0;PacIEhzjeh%Un2O0qpgG%Yu|4pKW4iB3wtU{+k}IbV(|xImaX6xwg{%nZe#&$Q}zwQ6(+o@YMZ==PU+W`Lkg1$5R#U%)DVI!CS~ z^Pl9I4IYicyNzJMfrj}668Bw1p81?rY0DhLZO~?FG*&(LO*SvW7=5VFng z;6n?zV+%BV!=O+4UBmAizKzK=^17tBPVilE%#wV`*j>O;9vKgZK9}_)dFJAJTCj{z zGb1Rn1fD&c9K^S1d^=8v#Lm5>Du^GikL@n2Q1+=j-b2t-$o3|Nscvh+6_s~mS+ckq zlY@yPkp(Yo^P!mLi_O?vcL0HPtFVs>>zR)>Y(jj{oEvBMTNSrDhR~DDxO1CY-Zo<>03UDe&JxQl0Mb)Fic1is# zR!Fq)si+qrPLAiw(iiP72@1uee1WoOPaPg5?DS-3T%l4Lcv};=I;2nEt|Vh4H_SB3 zLm+KJD1Ux^h!8^^zm65wMHni>yTIbl93Hzx2TnvdjXQnH>HsDppqxS-QJuk&oPr5K4j}M__@gY31ztrJz=H6@VHwT;7BmsD zaFwO8Hggs!oGdrH_5G{2&oeXcvHyGzgRA7)*i88j)c4%UH#YaXY(e~(!!94E{dOFY zUH-E>)1qeJ2i?OwZIlMiNn!e4?KKp30<=tFsOS*Ym;4a@cqF$KNp z;+^^)lP5^O?Z#8Ma&lLtD15J-;GoQQ&QG_Cc2`FNxF=O$?`V;gE57JPd{;3-euJ0wF7u^Ez zI5!={oq%$@F6#%>QDY~bC-J$dtCX6V0o#&CDQZ>^b*US^wsqx>a2p1 z^2CiIbDIe5n(MxbyH+%WXL}hLb5we_rr0Ma)vfT1mFh?tB{HLQ;JJ{h+ca^Te)`u=qe*nFsYmc=7<3BJIH5}(V z@!Hb(L8kefF(v#gCRfrKD$M~@x%(!spwb-3_=nD7I@F2d*pI=iBY#po9I38g2ZE#2 zLU-2nB&lG9b13w= z(irH<6ZgGG!>~;AU$*9;1E-dDK25)A&FPaA=(K_N zr03--A%#6)bQ>|a7~kR_UFt(>M1^g}Sa53aZA^bYwN!X5Z=EOQL|YhgGdgnJovKw}5yTq!?7P4cE=uvOv4KkXZa8vwKjc3-Ow#$ecwz`dgy zXY4IwGBgNbrFWq=tRrFkoN!f$o`;F9&w2VK!C0FV-wRd6(%VC4D~_28G<;H&iFQcb zA;}&8)>ULv(3+g;VU{`^z~Q3XlM>Owa4{)B$#F4Cc7^Z-d$(heXNC#NxgE31Rtde^ zt5 zmT=eI2rsfW?Pr?TUyxl1s8UmDEX&)G)2AbqJMTSfmGkM=`y2%q@mw5U4KbOk5}N!m zLw20J_-%~^+MHt}kGwhxOpiy}J;xtqiP12+Hqv|hBiC5v{CqKm*ivzxrB*?oO6i_1 zOJUaJ*sZjxGXEKEz2C>1{|GKW9nAbcPL&~aucx)&k>I>VYyV*8pL8#^g6L>Gk!LZ) zo=<^gJNnExh_`$^htR!%WxEVg>=3Un2Dv%F28ZzyP&ezuny&vbFv4N5=)?)Gs}5G`z0X??MmYZWcuV3L zoB~*>H+V1u-tm8V1YGaeg1Llt*8NWJLza(xL=^0fKT*!+NT>I+#WTRcOiBESlBp$^ z?%|hf`v)_>rpn|cP-)g@tI95(WH_#HWt4wy(rbO#<>|7g-5W zm^;6PlyT;;R`Buw`Le#B@A%=m7ro+dqIy|GVCU8XSPP>?U{LsYBfHe=Mn2a=U+w9ONx}nzu*#q@Ps7mhEnVKle1^j{o-3u}0vIUum`E0fFaPOsY2Ej{mu;zw1FT zfhToSJHneB$MmS~l_8GFflklN$u108K7YF7m!k7EHTJ_C>gu3Gjv!{UM(AFltD-c2 zShlkfsFD;M6l`&MO~XmuEsK*K5&L`HD=%x96ik)<=rS!iCQAo`3&>lnv(Gx{@DaxV z=l|28#~ArN3`x1I@dfBJU;(p)QO0)~re}C9CQ%c6jv?`NURRWLfI_H=A3^Hcq&5ww8caR3S3-*G z-HxuzY4T!Xy;3mbF++HReM3`v;I%{&>FvN~V+qxBZ1PxMtVfOSGu`Ii%dTknkuqb^z@{mq-{`&Y83L6F^|>j78SPr_U7`xi(IyuDkc@ihYQAE`sJujEs$6o{ zQ5za3#diXlSZY5F76B#G;4A~^T$GZKm~1Sl<}AmsZk0P_@U3p{{ZQhP9eHy&TISqO z!MytQNhv&9Hv4^H^bQI*%Ya@#ECQQRN_~X}M$1TkiIz?LFY9fcZoLlHYX%kX8Wnt&}l>k4=^uk^|TbS`GJiw(e%X==}d zQcX6zep|@3w>#;4I9ld$qT~xD$_vWBwJwZl0yAvkXY(?$7`rRzWTHZozH=q6Vi!H` zZe`=v#_npe%bflu*7Tv|oBESeLCqq(tae1mW>i$5^z<9oeqh)QXkwX59ae1s#z}2U zl=mJVAHNSDC;f+$N6@tow=r$lSDuK2!z8)Tp(e9GN6Ww&rAdDm(78CckePq{CAW>9 zFCyTObs;AajQ$8#G7VO-;O6oMiQEdd4?G85$dEF*TLLB1Om{jifc)SK9v-}k#XX1y zAwBs6{NNAL6BGm_2Q9mDxsff*(Eg^ch-@9k0Zu-A@eUd>FvjMC>ruKhu@ z446?eN~agY%6jfo?PG}(vRL24_##jjh?W7a{rBu=A-{{30j|9|{i<8O!do6zm;Nu@ zgiZNwMg`E#<4@7DxE}THPp}y!-ngNB-Hn1pW)w|fZV#Yj`s&H=%qT?R0_K6YmGRTA zWB2!r9*?XlrgL4^wY`a7ui9R+5>be>!5o*HGE%DjibdiW)>so#wFkv2sX<@)cqk9w zb-yNkV{ty6Pz@(GE1#rehE5ZfbWR!?K5@fh&r&dw3Mzbv3U&5qtNL=Pwes$*iq3Z{ z4~3Gp<&^j3xzl15&!F^GRtp>6bdc8%n2%+v44E)fBbA?(QGKhwPtCsRnSqzn7S)HVXKqha>mpTIKVAi+WkS!-#n2VK zY_VHdBBN&8=xqMBQDS$h*O24uX$_Re&s@k@V?V3j2}LiV_gE$QkKCDn|C`$xpslQK zzpZRW=%88V6G7SGwz7=hx0Q7Ug*+Ia?j9nQwdHjMnq_$23}ncFwE&LBL%CNnH7${N z1J&J=OD>J%Z)A;>0Q=oQEx^jtBGVyujr3}pVg<;Zk$1-L2X1HF1uajN%p#@+#en!V z%VwAJ{?s5BP2@GUL(@fy^;`jiz|^3W#PzD>_G09;dw_%nHp`&CDQIwf4irz*n6fkq z(9Sl7j19i{T(f@Q?nmas-F?LE%;!ZKp`TdJ0BNqG7kE2!&@A(3cLrQ8+LzG8F_IRw z1FI}@|BmIrhZz1b*_N|^MS8S&dVgy0KWi(yKku>M_6e~Z-P8gv4nxqL(d|Wf{L>Bt zctlEChYl?b7UvHd{OfYjKSE@5F5603qU6P3gOm4FSU>HxBWVXeqC}sT5?80NW98y& zCNAK-#~`k?{{J!e9*$i0Z``+#>=i;OdlRyw>`nHnWRn@$Bs-gA6Oz5R%#gB`T|`pI z%&wF?=lNYmx~_Vj`*+>XKXHD}<2c^$*Gu4Z=;HnsDV$bT-XidWb>o%w941nc1Z2u# zcqUS%2!f~oj4T6mXU1Na(0L9arkp<@%edFt&!%aebpXgR(Cdub_?K>}fq4Y%Ge7m+ z&vVCW!6_$&DvW!j)%l@2c-hZ?^hcp}wfDPT_|(;^k+ zi8%`Wu=|me0<_eb)UXvAtVF7+a|2E*>)(w?_yLk-w?{x zOb$h58KY5_*v9m9-pUaL8t*QL+~})hk`eec#D1g`53f$<@oF6PRLiI9TC?YYTeH>&Ki&7#vE zEIuRuE%Wlsk<3e4DD(2q`DFVuVto|9GB2UKvgW-T|G(_YG7OcwVo0I8GFH%DkW6ZV z$cW{rs1W(d2_zPy0AOMgBYs=)W8GFbgUit-iJUxG@yY zj27l~25@eR18c2I{Lllo7LVxV~>!rcD9q z@a)To8QjD7FxLvq<)lR1_#Jv2k4l%kN$j_P>4wiW4Pv!c2qy#%Wp28uLua2sY~@Z_=3(|ka+uHBajya$9+6QB1d3pz59PzrzFJo)0>ZV(4$k|81PKH@Tv5yc zN1zBG88NziY9c@1d&ztbmU;|Uc zR6Q_=$8^*;y2NjWHyH!N0`tPT{*R+)>@pP`9Li6=6H?<{;!zTb0YI02(&vj^!yWp~ zlh9Q&ADGj<%u&!6SvF>1w$q`|l@&=n)yW`o!cKx=VgNtn%qQ|nwe#Mpfsc}FXGQCH zRs40MgE0!FMb90-@?4=J{nXOEpfkbAp+(^tRDiv}*{(XKR-N;t`^{oyOiY4)qU&sx z+QKi7_s?6YXNi~?D$sBaN+wk3{7`RY^@aNH&WZI1#Lho{jK-SlMUBy`U4eNrU#!v< ze;`&umkRgx`=o?@*0+hZS{;KH=ks8# z7Jah@NUH^NL|^(dOgi)4A5V3L;&7`42P&OukMshhGgP5-9q?#YkaZgrRqO?{T4*IM zZG){A<+w?p)pGOQgI}aGdlwE_s+hwPHZJ1#uCgEJ7~~ayGC{PZ@ap9etrn4?c8F%2 zS=kDZu)(A=GYKO3n2o!^Mh+z~RPjQQQEcb0(cVJ@ndNEA11FAOwWa^~^WTEK7wz3I zVcSQL393lhlg_Y~m+_-k&UVB9{h`UMa2~8yuWOgEfn*lxc}OyA{B?jTxF2Iw2}2}% z!<0J>AxN+bicT=;%rC7LwwWH!wtDN|5o82pc&-)Iyv&+>^KAyo1Ov=7b2+AkUa9R@f)ix$2A`b^i*J#^>%qDfOyx{ucaLD` z`*$BCX9eUsq!-TbY^eg`FRz@NJEh*Z{q@qSz>gRTHj%y?s%s}Ur9!XVZM4z%V`4PG zT;BQ2S7u3oOi779M%;S$1UC-KFiA6}*z}zvl34)h|LFag%jq+?9h-F&Kj$4F`!TE! zx&QR@4@9$Ma*%HwV1h9(?0vRj(O&jUcF77b+AD3O2xv=xOr1mNpyW}a^;Wr$M1>>a z1-YMZ5dK^_)gedU7YR9WB+w{qheP&bTG16MMcMbWAewPGvd(M-RT7fS+LO+}S}kBQ zYfn03pH2y{UhZqPIC#+EH^cU0sH0L2@x4yV*b&P_ICLLsa)tWWQv}`V_B7)F>Hqwc zYz(D++8JiXJ<>lQo!O>3kJ*||r147hchyVC&;Q$g28CI!mkFbTS1}t961E>vOv?B6 zs+apo|A{2ufuDaHdtIf{;KV|E4Ixe7tKBAtkgzoeHdn&5r5AMv%2vF*Z};TueX-yw zUfV2Q(S0b2nuL!+(prMb$!dU6_Bw>oi86v1-4IXgbvveh8D=S~ICC9-FJ@~wG7_6P zRljzKIWJxI&Y~D=$eWhsj7ofOYcnc${5QMI#uXJjOCoYt3C7OyGS*MCiQQs(GhQ_O z#J9)VoS|iOl=@3qIa`rM=J&BNRn3~9JM2cKSlTl0d8h~7#LQ9Qngq0i5>7L3AJ;^Rzu%!tmVS-YlL zj);Q@^J;60n(K!AlWPrVO}=5O^STgBp0t|ZNvZY8s`d#WxZKyJ3! zL|$HcT|d;Y;?rv#-&Ue~`6f@pqO$MZ-?od0tH-D9nrjv}<;qrOGKpA;&oH2niOg3R z+NBTgtQ)oO4v#fC*%H`g&TbJsUN#frn&2R=$#y&O1kFW($GJUj73;}gx@RwauhF#q zd0}K@kx<|yxxF_#Mal=K8EymhSCK!NyeYVDhLP#m#F)yYGtl?QxC5GTPm8R|mR@7W zT8GELVSl!KUfFkhu!#PBrs#-;O!Fv5Ncg6vX`!VWnnhY>kuidSfVS@;2C@!lM>-4s zn~qO29W3iGS;_d0iws84xpFf|213yJw$lZ37Qpz@FEi4vb(8@?x@GkgRn9>A?#L#a z`L{v1kNEtBd@(89`WgBjgIhq%E=F(*sGE+jku~UX8pt{ba>M+CFL z{{+V4xj?=&iv?vJ?+m5S)+p#KxQW*2Tiy!o_^{O}^}Z#rLwT7ro6dGPqYZR?JPiA1 z*s>L&SqBxAu!9|+C5aglb|lE5jGpwZ8z%49ZhPE6a27y=bYIC(xeTQq+cph>_PO6U z3-;zWlRE->|3%i}AVFt1u?rdMFGtL8=cWMWbSs#3=$UL<{543IuO17{Xk#9g(O!7$ zwY6OP`U3aIg?|Xr@zpe;?;_vRVZHK{$Qc0#eR|xWgK^=eL?>&t0y`eNRyLKS2ZM*FrsETjDwa8Mck6*zMWqdeuOTaQ~nVL2+~0b zIx>#P=K(lq(Tcqo*`?Myyo<^>x7(koH<#@3rTe^RLi~?M#K-SvFaSY1Y1#CXrHt|a z3r(Xu<^art;&=9zRs{zb%Z5|UJ!5;GJ8uTa$Y{KT$td~HS7u5D>bER zvdB5vJj*q~$A~_l#UbVJpz4x%ru3w3yfzUguEp^aYk9Q&@r3w@lZ+_=5yhz;38@|K zK0n6|)pIfGGUJ>t1Ivsu zUKcGZTA4A=lx^NvzxhUfCv)hFx<;XkiIMK9QY|I#O`6*~_Z125_tukdl>}-?=%2hu zJ0AbIL~DDY6^(^#e(-r&=(NAFz=q~^CZ2NB4@PFkW?tiP>X+|4VKMJ2eLYk=Y#NDk zmv3ObI_o}X>2kTn{*R3AC zXxxzOMlt_wghi(!MfeP)b;|bgrINJutzx7_W{_@LSjms=P`5eKk%7JS`)D@|3j}Ty zPXXyWzf))NdjXt=OEB5_-)$73a8pEU2>K#<2KJQg2QJhtl=^)^_)vFQmpV_#h=3c# zhMSsKg?BbxEKJWFx@mI_c&760t^d;uaXow zf}zEjH(9zuJ?u{9?+4ILo#uUc_n2-cP*a)XQCk~`C<(+^;n8l$UFxR2gs8e*up<>U z+z-Crq625T_3`q17zr6Nwh2-*1y!UyqWA){=%_27K{*6Bg;9ZOWb#zjqDIL`&T_uF zuV_!W%M=T_OC5o$uJ{C6=(uE+>!xLd09>^_lQA-P3ymKWhCaPde4|2EfL>bnICfdW zElYyh4fLMRGHJI_aCIajT^HBaF;! z$@fOR_e=-HX20jq;mN$g1f&tk|bi*pwR|j$lvGY#JvsgSacS~WB+RQi2$fD<$ zRIv|oB+x#duRAh2SXM?XZ8nakc5kC8;&~;=D4VR35M)QDM} zs(I^~3Vh{GkNKZw?<(0l)_jFtj3!LlwpJe9j6+)ee~t$tsS&UFMZ-Y zW+#8F4P@fTNRWOcwSFCLNjsAmM{y8dJr#m$f)0M)1C>#DXP&&bCI0j}&Km&gK&Wq# zUQ)g2#(*SE;8CcO)ZCbejGWHN@D?`L$XHFMIg`8iTtqW*#<3vvO}9hjFi^*3rh_)l zZR=n(FVV!n^F7^fBx#qTPW;l`$z9vU*t4W96nz)v_?TFKMDE}f#AtIwG|wtb_J0Jg zW(8~nhk!c0LitZb5TEyrJ{g9>irmY9RkUAOn$1y-UjY)Xh725taP`F#R#4xyTxt)5 z`UXdKz7qnZqW|i<{$=7I5|!PaLptrfor+HR`pbODsaD@O8?9|5t77MAWXJ0B-0q7_ z(i(Log;?t1E1Cq6B!umJV08!KyH1%22h!E~mF_@wXZP*ORGe+&9Ywx7KerdNWj()d zk*r+$vw=hS0Wm6rOmm-A8X&Zx)Mw8T)oW;@CS3dj>KjEy{Xyzm>GgGh`W6zuPe&km z&h(=%^0zC*)$nMZ(P$q13x(X`P;=n>ekY^xLeXj%rWMqZrk8Wi3CirOt|>)ScaGK( z>^Iu1!J~OJouxqR03x*6D}~B0*x`p%!l-Wn1vI+Aecv~h>>6%4*IgmgT#))Ue1Q6v z*-E3J6r_lDvm7BAO;n5O5Ml^j`Ksth9hkHnn*Ceq8#%E#VZ~)MVe_jgS+4@3LPBxF zpuTHe2fZ@@yqfPw>YI2}Z%i$blBLhAyf{i5@CP7Q*(0QMw8&ZW?S{2+|G!bmthNt=7glmu( z#aYW=#bG!WYr?A=A{nFpW~ibs&kQ+pd(mJ#c=$3;VR`;^jD=B1q*KDg$x5{QOxA3{ z=h}LlG#kdrEbJ~;PEPqhsZ+F(aQsd(R>fLDPt9&0b2Xl4XZVh7J-cId*Z8tqoO;%G zn~{pHe&0yvTT~7*mKbKE&5C?idWjS4ir?t1PO;YGHGl4im#^C7H7?k~S;6}Tz^k7X zOPd`lsY1UdubZ=tVjn=dEJ5?McH4!?S!w{w}3=sEhQ!l=sl* zQ-c1t0SE6cKZH}X)R4wtzr5#d#$kDnA-Y#qcR1;3jGB&ev&yImtL-y#73R`uQeaB2 zB9}1(n1&v9=7-lH^e8|{<~8Y+|Rj^08Z{BT@SxNQsGJVS(uai5G3`8OI@D8td_;5@v0Mn3rH}Z>pT_gzM+H$FqTqS4;Jk+t}kHU(sfALygltZE6!LQ;FKF~#a zd(x8JS;36p?1j^I?X*~2_8mTyC1cN&azod;-cn+fr*mbOHy^sxy^=U}eWgQ+p^%$e zfE6HI+hAZJl>kZh%4(S#6oe@6|Eh~L0!%|p_Es3z|Eh~LI1F@=viWenFIGUOp|h^^ zb8|4K=t}GNdAC(GLJ&X4XG=b$e)0UBu{Owl?v&=8t+&oVzM_K}@9&(Vd844-)smR}#w(!*2$%^g~uBBA>cab8lflBTuT|Xgc zkR9k|goo0)MiNWQ24qCVW?<4H2-o|aqQG-0TgY1m%6m*2IheY112Bx4T1}`!Ik5Fc zRcSE4W^z9Y6O3lkjdRJ3V^(a36S^D#K$(x@T9ns=w5=#doZY!pzG%4}fmU{$r6BiF&N;#v`{O4-m&c%`=AlRGSH z(RFU|mM%2No~f+ho5z~+Vk$#wb3~afOU*uWP*|BZPyJa=x0L#jDu$GatmbWpAxT!p zJiy7V-G-S_cg{PC4kC5LIQz<@tdxNh+ zqn^CV*!=p@426Fhg#L4j57<$H=C9*XLHzX|Srn0+J3z;o8xUB)R1X_1dpQi4Jp;^L z!2C6nbO+cng(3{DQTj)>dCN0}SEH`a+W3l`OE8Anq9>eaoWnbwO7A+cHwtyFfOwpU zx@VGK7NPQjk7$rVD3xR3Cm6sstiu62N)Uztmo_C*7tcXm^qMpTkCQI)HO!p)ZvQdm z<{(z+=_N-i7=pj%5B_2hF2pQB6DIsZeP47Av_oVC7r8>wQLN+j46s%FLYFK z?T2s9K6E)`i*A{|4#QuAU-q{Yn1?z_x!L$0i8pdsxhUZoj4HX0cZ>GOq6hFe0K?$F zA&c7G%+f1Z1(I{H%S$#E>hw%IWA?rb#=0LJmINe&QLfCt2->2*Y?=UHc57~F@pF(p z7w}~lG{c7GuRB$592kUfzlg%MY+qdM$EcrS!Uv%}{590ecIqqvP5?uZJ&ie65sYCV zvt)i6Ir_1m>&y&U^EV)X-6Q@=>%>d#2z99fZDB5_}C^i>A4K zg+b*_JV%+Ta=u3B-b>xG#e-F%#G7VCvzsucP#f#fLtK zPVlK(mt)zq>2m07NgyMlqZCoO+i_?6Kt~BAi=OIy6>xSi1~<(7fr6xBkX}Fv$#YzZ z-()b{D#FS@yxPri4(5SGi~JMit+`^s`oO2X!gcA#+&0lIUPsI!If5L0?C{RPN4$>u z5+;DUhf5<*eMnG+?S|&;RR3cq9+sPZ?=H!Vr8ju?Vu(VoI&*6ge4LnO3C zKiI~w;{}?F3M;k5tZm~K6epxwYp{~o1_`?&(?}F*yMc~Ubyp8@%=6mjmgUJD_cW@Q zw)(dX)@B1;6Q^C{l&8i+>_ti6iI7z{e7#QLlKFQN&41TBf+fa9zrd+*X-84v)Q_aX zN$dYkM>+?k!i@yMbfia8;kux`qofUHI*qk;T5g**G{3SZYR`m*u{0mUqY(fT*NqemAjtf9Rl1$XLLb68@0o34r4 zfPM7Ec*tKFtr=+l+r+^n2lm~)=pjU27t;Z77Mj3k?>Va%pd&pLJv7bl3mtV@SgM|^ z?X-qdMGxsn>qrZ?(i2U7Bd>dFgM%x*M^}irr~Bf}n2to-vMBaiyKm67Yq(?sB}B-y z)jz_@*e_tN3!HAXTJJfSJ$!XJNdd9|+~^M>!15|lkY?j?V!Sd=kMaSUI6y1_|3ODu z9q}DZjDNDSlDz>~A6&R8&I0J3(BCD-H;Iryqc!}#qt<(nu3+hT<=&lH#6+_IOf)Fa zi6)hNP&Lszxz|!+S@N z#CRrS{`3nKn2wZKr&9w=jBmt&bOnw(-Tu`Iegqak;(*#ZqLKD$=|s%*D+Ov- zW)-xB&igAU^jtW%#L6JB+>wD{%$THVPfq+ywH$p_Ep?ie@lFwjvY)1m2X3XrrQ-Mw z(XSWMeNassDf1qO)COx4?`Ry~raB#(=n#tIFD=KE+1J6(mBFxdqEkOHC8jq#ixaZ{ zQ$wq)$bQkn#H!Cc=(9sa_&g&{u}4F7Q-VNElyOSLJ2)>xuq7`}C~>}~q%-ib>Slh7 z5v6w9C{L07Ge0T9{O8@|30YadL=%>)`=OSnPzt*!U6=WKsliACSFr%E#KOw|FDpn3 zbbtiTPr?9Lk)bC^ej{OlvEbSfEI9l_EVz$*EV#002n!AsWWhONH9%N!eFzrZRR{|% zMoko8!L1=!aMmyuoc$P_1=kB_!8LSYL0E7nq&5>Sz*%todhbCN+@=3xEVzb)EI4=t z>0!U(pU3so&eyRr`GgEFpo zjNhHDic=k`LoM9;O_&{cP+}6Xze2O@)0?6Ek@#SQZS^lAY@LT9Y_)CB2pc5J?or#v zZfh{y3m%l7n&1d;zW#jO9bA#!F}n!E^}Ji&1Uy2(MG4}!1~8+4a8VkyamW27Fo4Tz zjp9R^aza`LQe;gSZPin57rW6Q?#GsazHNw3O$xB!3U#S)_bN!J&%R)yWA<@Ka7z$I zw71d=uEL6}l7;woK^j7#1m*C95`d}x1v5I{M|I{yX#v1`kndUW$N3DOqm1u~fGaYX zq2W!YFc%OQAc~`*flA;slBwwVTvN_k-`{;e-$BDTp56g}P(V!eKG*|wL39;xQL0m~ zy8c2Ux)FQkp<9W#A#*x{D?HLg?r?U1l4>uWHKjnnO3|;2hz!7$i@WoRLy9fWGaQ^q{UOI zpNLhDl~mUkQhE4N@nPo>H?JeXjm>D~9)A@Hq4IolMZhCuH&jX9!8gOt68oaFw9Iry z(50D0+Z0U!C_ZOd}hK1g7DRnB)^0(+*X(-*+TQp%z;d|L((eJGhuV@DVYeSR_X>K$f~ zQk1~v0)46x=pt~=8hvWETR=Hc7QFW9hP@0VsElm%O!~BE;|}nZzn75)!4;4@UG+i* zg35*s6knBnFnK>sf*u|!j|LsS{W1c|fUoB;AY%jS>bNKWw~aU)8BIIlzh><*HO(Vg=)uLQm=%a6J_agg}=-)zfP5x~#Yw)6(fwS69* z+^MF6v4Jz$UC5ki;749~5K8p9s}l&i2zu`KL!8$Dt-$dWHFR4>aeEj-^f87_4Nfo2 z3YNCUrl~Q%bk&e+JbSxO76;pw*&HDHm|1itKahqJKLu22m$#Z`81LW;x=V%vW5cy~ zVYOE54w5K#=mqTGwItf|wimUA03**61e6W#ycTLH4srUv28|7ff4YDqqy^v#TrR&9 zHpTYZ`2*+m9<3lYz!~kD#w=m`uTukp=mW_qLqGC}#uA55?LH2ltct%r;aC?=&LkXRT$4@1-{BsTC@&g(ZKtH9V0 z8G6up{jF{jN#8peb_Y3YMdNrOlUaJ^nTBRoa8dFg9xye8yOsegX;@>aKk|lp2jSf} zY5If*8cStNO(Gc>ia)T+6ZbWiCb6^m+xCb)Bd(9H0?nHek8Gg_CJG7N_IpGh=FW#d zv2#RD$i4Cbh(7Rb8Q{Fem;AIzE!W3JP?$nIjxBY;B00$Zpoa%2nnF~c6&9-i(Z?*0 z^>d#C_i3Q9RIMSXyTwf<^*UFXZ`0?|8hV;k*p2*Qro=P(z z0a&?`_t9i{@RN;VY#=LddkbzfK%K^>9ZM(*Z7SQA?U zG`r@FyO&+tkIZ3^_}l|M*<=S_JB*bJCh_0$2C#CGQb!m|xA^sb5gO#}j+#NqpwN@e z+6nJSi7n%2v8 zo;;(FEjZHA>r}h`@NqP~kO``cL+^mdbUj=Kcf`p?xy-oy5t19D#5=;uAYF&+R(sjC zoozZ9X}NvIQYbSAB!dc`bnV~BvZGeLWVf9Vx>g~~y8{>vj;PJfPx&wpqW2$PMNJl55RBQR`CmFos{55qS zD8^{M+pHMMGDFT1Tryh19J!n(Tv$=Q6k~Ne1m7Kvs0!^3lkH_U>R#UbC&IpLx5%En zeJ|+zxWzHV)*yD2fUUabB?b0K4+UQ9iQIkxndRHj>eI-4*wc#Av%94;>l?89jT`#I;CuU1hz|9bFw zf0#AFnDtc|nfcO-bZd=D@X>@DRFAHho|tL+HR$kPXn=nDis$d!&&}kqcoqZlpCUjb zXT^zy4IF%+n(v|v9eBmG&N6fuqLJ$jwyvIpXn-L5xj%X|Iox?Z#jP~&u_o-&r2x>} zZ4&R&GA!FgPAZDKLg>g(`Y4GzsI$8jO9KL|Qo9CAfi4g8$i7z-9Nln`P{r1`#Pz7Tb(8 z4|kudf#j8YUd}_j6KY-(NOpU!2D>||?o$@QjOfgADjZ_a$&KCZ0BZsae1nslOXm&hj1S+P}Ov4nMI#G)D{ktr` zEA*H&&VYrUwOFKeT6Sk9`mml?aX}nn9DW`0;f!hV?QaPwAIw#q%3QeLtsa5O1!{m! z+7LW3&9K3bFw$*F8p<)%akvT90CA%VK8I?6cC{Jaa^C_;bbtnE_Tfh|4o@YE#F#aP zODk`RFwEuBWVp-&+R5m0O-fn)L-57k%l3&%L|>XRHkag7Zwxc^Nz=p5q$HYGkz!xh zqi7(I)!1aYpQy-77nXaPhZ!$XYCa=2C|%xU9*<#(TbTFx_!U>+(bPrpmr~3#yOpPI zj8jR>e#hczJb7taI9AqzLaCuzb)J+tZ%h6IH^!Q#TJ$`7Km!Eq=lmsxttmHUaFVsJ zQu%7s3=YxTQ5fp+(Q4=~ITo5M}BvWrY%ClP;F98e# zxeCD7AoCzfOj13#{|;S>+(TVXjG=t(a*Od!jqBM(N%20Jq>cqTT86*_(=}{*Pu_NS ztn*=r2E%wAtT9>|4`!sh@fi_GI{jxz$$|%VgQI0B;vu->`W17HqNp1DJy6>BcX_C% zw9N^fzuL15U zeR#(M-WXks3AV}hDqL7T(o;IykF<9Hy5(5+-mj@8PY9b+TS{T^;chF5S@J17@^>>n zDxjUTjaFW~FqkwBz|SpEK03G?1U;o!e~7^jKwo$k3M3&UQ*pJXjz1-tQrIFn2T%1V zX1;a0%}+(=I14sL|A1ubybJ{C^05yx=$2jR-P@+O;Th?ag`(OI_Z$EQ-T8V`ncYi2 zRt+M;!Ho3NQ(ce)(BLUc59m~O{zDHmNcXP{x-XwE({_GOMLHqVgbZY)p^Z^sH&~+Y zGB$<+dte;r{T6|Yv{Hkl4~1X*rWhk7e$C6cu083rW4q$ngEELD~}Iv<@Yhr<8^Y%Ai}e02p)$nP-z<#RM}V zvzW=srv;V9URCp|ZVc>Nl+d^1{FKR2lhtK_mKXmSxbH*<;h3r(Ptfqq5|()*Z{Z}K z7}=D?xns~%(9x&at1iudnN#V4<88g!A8LY|6-q9sx04pl&B7XQQflzt)ZEJGL`A2) z;?f@#_ckF0^+(MkPr^ZbDTk>`IFH(Wt2o)#xXk@2Yjf|g4{8!Mv`JEQ_ObF-oW;09 zBusW2@RX`k_T2|OrJaIsPwB!yNy1OSQ%Xvu)HTE>hvabW8*Q9y*dSI^xoe->FfRQjjxWg%v9F8Ftj;)D4-L;3K z(>RNJ(B_6A9TCt##t5RQ#ghxcD0CbH$~jQi0Kw5UmK|GT>|S-su)GLFq0c_LN_E*yIp(Kz3O88bE(1~Mhuo`ZG{&qwxaAojFNacocf?15T}Dlwc0otI?aAB;7iQqE-@S)FbrxgOW?F zqiJ?p0P}o~XoD;w3f*ajT!guco*#Dc#XeobZ*g>New9i<%jLCcQgSXd6ZV%Q!ciyu z{l^{3dqCx%HqL4d5QXlGLf#vpx5N z#2cW9IyVU17fAN}W`|y3f9vb~i67EbODCNwkR}bc_O1uBDhK7~_JmHu5a3V5c@J^^IEE0C;f)9y8oA_ZuMWIdmadf8mMqkBD1lJQ@ zg=TTz7`{)Ww4QiDo`zTWLz}gQT-XFQLpK)_Lf0_Tq2xmuMYm%)>o;*o*RVAkgnTUL z@-d>9-iMAm@J=X1*O1qqt5V}o{+P0dL|7cYSDUNj&)eIp$qgiqZe;PpI-%qyo|kau z6BBt=A4O&5NLAu0KY&t1l>rS|HelQV_G;Qad79OjwGsB4`T9%4i!Jly8Bv=B>uwp+ z>J0dmB&~(y2Kh*nZUi;88b$bz@?{nU@f*n{iV2Rfs;z93HE&fGouDd^_@NtLNAE-# zK#XpLG4;BtD5DG~VNn7pM90T`xGYLCKaY}<_;jen{S%@hNX}fstqQi47{|PjkY52f zy8c+o;+_s`8tSX}H+ZYkHBQR=)-~%i<0Q9QKR~r1^}UBpS+l{#;xKU1d(L7J%~qvJ zvcfWE)yX&Ky$wiS&pnILJ9rPyRe|C|=W|E^j zAFpfCoFZj1RHS<euH>%U6{#azC8@{DV)wWRsh&#ef}?`OYN`Iwk(jH#&@>uh2Yz>(0Yk6Rw!R$st=`*~u=l*y;=x0H<8 zZB#wRxMhhSx|`UXaeKp=o073U7z>&`@Aahr_~3PrsqkN4qyF;((Lx0(yg+0bT||os zyGF59ia^I6za7H^1)`gUs!I8Kz}RD1lPf<=%>UidJhkfff|7f@a5PTGlQPj|c7A*7tAHVQBGE`HluF;k6zu-k|(PC8!| zrCi?e;W+_ZqX>sZpx3DEA;>k#CDDseZbJ`#jrv3-@m%N2`-3C}Ln-JrirGOwjNkq> z1=0>ef*QLd^YOk6eXg+|C;J?&xD@#}T17skBdejN?&}W`k%*bCtI3C|p{gpRsfu1C zwW_#~NW@ZM+o#8JJQ#-xL`PRcp^=DeQIUm!DzuKKLP(MtSgb83;^HC}YriC^A>B|Q zN&UZlHOH1a_m4gO>|O^Qs5`m6$W-K7cv5^z4sHBG;H!C=*9^Qy@yKb}B7)R3AMK$e z1=T|&1xSHNe3!-i-KA4?L^wc_`amS&;591Q+0%;VuFvu}Xp;KQqawFvsRDrAX19)1 z7sGD;rD^fWy=kZAlP7^H(Vheqcs0Sf2Ux68G$8E&1tQy>O?v7uZfG}DlepyKzZQr9 zfrIb^BE;C!o%)!$zY-O=Mk(u1f+Pj_UX2f44F%9`hawRx{@^tVkFSwz^uVjhst}60 z>kUm(vlbj9j5B|dqmvP!pgypb4(WzUk0nhJSLa-2vVeB@(eb*?RMjUkGzzi5k!Oe71U@(u&S*4Pfe461eAs4?V31R(lC6M9j`(zY zuK|$=i_sxIQRYO?DDF#Vg<+8hus{S{qu{UR%~@5bi$6idrUQ^fOK3 zhLf5eg_T9vwJdr9Sz48EC#mmd%IWtFjBF6|vI~u~AQ2|TJiF9d8a$0z;gc&w7K-_=t8%I^ZW5-k6`JOc z`Q2JiF6C*LanFCnEgD{(&t=nNc>3)Zp13Ekj(@uKer@bQ?v_N)9UF%eok(7LLQXB~JErJ`JsguVH3xWM%Kdz4@%G6w!5elHMVo zeqy>V%u(hh5qr#R;b{_9NkE>%IZPH82K<>pch{`9SjEMur=`yL3dg)}csugUM3y61 zOF`&_FDK>ST&4b_8q&Z%%-r%{VdjuQ%$%ak5tun0C}vIxj+s;2!_4u(FmuIRkARVr z4aCe10hl@Gq)|AB=!Tg9h?#rxmzX&>C}yteUomqNu1uQ?5QDhz@atuG4JoP@3RZw$ zr93&F>pgf49XaFXfXB0Iat}iU%@cwn=RR@80kA@ByqDE*=I_K6Fbomo@%*@Zbp3X3 z=7eyF_GdX}55JxV6oH@8|20sUm&(r}{VcbjYTiParyh=(GsuESUIpKgH!fEp-8xUp z(MDN{27phy`&Grud?{ZoRt!QhL>EJGz>(994I1TGIAjnnE->r1{M=wp9$1_|M~AZ1 z_=g7Z)i%4J;Q_uZn!wHs_t>jB+sfo^mK*DPyq3CD|TVK0}Cjh}uw zYn8SRa)`h{;oi)-6Z}dOmgOKVM*1|r`P%qYsN)-APA~RRD;lHQ`)5vQ{r0y@!=HKW zv2W>q!4U1$kPzTg_|ni*un(d?f{&a+t6#c@KCeO^&!VR|I~&K=m3F*PuYvlbG5V_4 z}~=aqMzUH-;V%OB{vb7eD9iEj-6+?uuV+S*E@NB^NiFz#Qe_C1 z3XzQ}t9R5HNHt}PW7cHd6ZsK6?Xy=ylFzxM`B6V8{3bOJ<=B(FGR6S7g^+85T_+Lx zBgE2h-{ZMXMt$~O^E2UX6wYE&;?c zDsCCkSqhkppyYKgHSWGy3J(M zWH&CP{(PN1$^8nvRi&nIm?xv^as~)mBuChrU&6&9P{G7YXV1$D zJ4ScKe?EeNJw`~1VnQteI&$J0h%sx%@n~qXR^}57SkN{Jl;qT6oOmV}2b+K?wP zmCKQw_G&0Fy|1ag{MYcg-;Yf40knGHqH#u=4!&rl`ujyAuf@HpBNmNIF!&s+5duC} z4u#LzvHQSdn{zVfZ~L-4tj=@&=9=j=fE+>JTNqA_O@ z@WQ&pdPCrIj}xS+{u(}~We0=L1tH*bt_R_B&;Z}G7d|@zKDY0q|82(Io;u(Ll(}GG z2T74L?|Cm6bxCGUO{5@6A(eDwv#ADk!uz5v7N0J!T5;vL^Vme@WBKtMd;;H5jO?Ksxda;gk zwmX_#C*8S`c&ZibDtNswm<1-av${)nKJ70@&hUI1B*tfF4f*J z~37$N2r9Abo_?5Yb7mb}m zMQ)q_L=6ZQYQiyeY$+&cCpqnzfCL?PV|9NP7=1%B^mRRRXPJPyvEtn z+7@GLBQIrRXc8Kd5iCnS-yW^2K~1!D3BSHPmGK9 zO&$oKXY$qz3xhN`Xq4_-`pf;^rX+>K-X?Z5j*C^ZT{!-)Cwh{YZx&X%W1UkH+W0)x z{s8crdpH1I^BZ_lZ;;%gKe_W6-YXij`LaY;>s>c6djqO%0x*fqghE4KE5kd+^S z9pE)T_i+_q20b}-9O^Z9BDn^7&GpT85#A8sv-8M%$|2-)5Yaa%F)P^SJ5G&p)!m7=+s1BbE> zb-yLLN3*G{!Wet+*B=ZmkVBb;CPsmvLB4?I?(94~fZl16w5QwqkC;J+4rTT+W#Rh{ zW%kAV^{ngrZF>ylkO{^7P=k(m5mL3 zzt~}2*FXj+Ji)~%>m%7W*!#6mVK|dKa8+XV$_M~YKnqfG6GdN?5qHQ(q{F`+%0O=u)hBa+8I&IB3a}I4G&s_Nkg!{ONr&Ck7cD_ew*t+mks!LgDs#7i z+v!B_wOW|~U4yoRGBK>{s;owRMAvoS)N=I7Z+PMC5nl6{Bs?VSKrre6yk92Gye%v$ ziT%ccLYb!NIdXDKB{3z~3G_e<3XIZ$EvWS;k}+rO;!e)fA>JEtxDeN9-i zS{dJjED|T3A(qi+xv2bTEv)Rxs8yFwtj^l=!15d(Gvo0x-5^&@@orXYi!UugZ*0?Z zE4eC`tem^XCbl(Ii+2k99mb;i3AJuDSDvxybJFFJRD1G@VpfHMYdn~Y*LuiA#-1Xp z{gd05x=9{0CvUaFWnG(kVhfu)gQq8w;+@snC`R4KPB(tV4R5%g_}L(qMRdnvzIFp= zWkIf^)eG(pL^`M}Li)d`EZPC`)z${s*D zdnq&>;60>@K;nLkOqimXqzzhzxdYh*4?M~-pvqYbw!xbV^ci|Iyg2f)#IMWD2l5`i zd9ONFd21IWh{Mt%)zU)>6CLFQY83nIQ(oZeML)AEpe zL2hdz(MEYMlogNqT>uBfJKMo34tQtJRI`HKS*k+-p^9!Myq6cYcHS@HY^~&HJYru6F8bF-%zm z-P}Dkv*%x~hc|&s8*o!^488!*UdfVSLhG-djk|$ouLhvG2X5}1UoNi01QF{BE`KhF zsER*(1QM0?;=5%y67{Vb!vtXqVQ?PXY3}!8P1!BSGE4k9l8G?(iOW&q8?+g3-E*3w z!oRn-xr=joa2E4^kmWb31Dm^pVUhGHf79+x?14|=S4&sJ#F_WveiHrP*5JH{49fjy zFC7^YfcMbr9Y#duN+6)x&wLmlBrOXQM9`IT1~M2Dqy@y&iZ5uBxv^D<5ib#mP`UAjD{VYBh|Uo@L!RqFAMp6>@tc?RZ}&|H z4mz=EK+j%fvxdCKH5DYATOOt?*b=X2*Qf?lM9pmE=(gUZjqc2e)8vvmu7P^~K6G=( z$*$TXkcCN`{gWl{E)}j$Yp_O)X+?o~SeWMVR;1$XXE~2ON^(kcq_JA?Y!pot^& zv!;>U;Y`~2rjRvUxa2Q+KSj|$%=@)y9Fg~{1@eA`VBYW5^MB3zWzQfj!H+Ks(f?`Q zul&#Req&h%@E$FNVa-*pHBy#?vC^! z5nVUK$@|eKjD8OFP`}jv}lwLqT3qY+&yMN95 z9jTwCdKA#SeHyo`@}l?KTlZ?oDS#fWOlylr-d-gLj_lbxz5t(a!aO8B?0v`{qfYzm z7rc9GI1qiR7}PZ>$oqdTSYF9Sq%&pYp$TVWx7zbbu>@sOcUOD2&H(mzmLh^n`Iv|)zKjx~| z6#!$*5{al0Jh_nDpbbqfh~VTM?$Mh1dn$!lBqj2y<)&oiY4+f%mqXWZ5UBN@es)B# zKCW!D@K)HuObPQyEn1^>BK7Iv{F7xVJ@;J(8g=!{u+}|pAm(`Hg6iQbM;!lV<=X%n;z3pmp zJ%J*umNvT2u}xlWrt^6{X;+bd8m8XbPf6XS>nGj5k>2<+`lV5eiox@XCDrB{pT(x5 ztUF3Q|E`Zsqt(gtNwnMV(6Sv$aJ)-i_>A#loNsNy?JWu5>wa&fdnzC;t(f)xWMPZ`m@;H@%#uthc{d1Myvw*cu6Up4dw>7fWsjYCjeCsqJdXF>J-vPX1A{}uBco&E zA0{TJre|j7<`)(}E-kODuB~rue%jjJ+1>m6W&hyo;kWPGNk^w==NFe(<4_15ROl}F zN}+9$_h$#HZk*z_14VeJpz<#X`bJ5~8;>jNb}3)3zWh)kmDkEb-)k+QSEw#P2Wnzt zBn#?s?Vp&sDcK&0=oF7QJtP-6>wfFEoDHiOX1)-OKNzm;qs zy}7p!9JWX-K)_;fm(p>Cl}Am|EfAopvIjr;3z_17IBY>ZuHi+~f3fCWtS5=2Pw)T2 zBe_-#v5b&S-gKY}6`&Bjdf8hDo<8SK2;P&=|9c3Y+{=H1;8E;ZMSc6JRf?2P!~ck^ zieKE~8|eoTyodJidndtMq%y;A9jFqWQ+=2YG8W@NF`3^wQ2LVofgYJQ3W?1Qk$EL@tvFvXsI&@KF?t`PPOY=IJ4D*edcjqbiOi|`NPr-AV(M&G{+r%N)rAYRs*+B)5Y>-KUG_b!e@WNtl`%n-WR$gk5QKAY(vmFk|s5&P)6C;S&_|1S^GyQUw=(Dw!C*ygqj@c3HPPT(7sZA=-E{A z89rRLnUi~{?zIbc*3J9!DGOb00rE<)CuC_n6RPdQH4z51eZRji0sY>zXfDvh(}&_| z#=lX!;a;YQ{QP1wx0Pn-YL z_7(m=^AM%1wD0@{;$Z%!*qb#2x^x2+M4kVF-@_G@ys@$}7yZr38h&GCjZV^SF0ZTq zk5<+aR#6UCp;y}IAHE%Q{`S5|MFB}U;&ND*p{qc+Ep}3t4re92UAoABC}xNda*=W0@zn6|IN*ZLsaTlbQ~Tmgwv*ix9ZQV2fY2 ziobudl>$q*lfTC0@_j{C8Ju4tYlQwiYYy$${;QRhYt+11eX*e+5S<{nj(f?o*3xO>#!whf#ihhQN~SjVwb8{Z+J-bQ-3yF2c_2t)I$^tc!*{T zh`NMf6544v)05(~?0Z8Scgl?PNz3=14y4kDwUF=4aVhlr`(W@em<;)64tSDm@>pDS*Q&>b5~)iOuT? z77k+|i0eZt5<|(P#bSxrHk4f+@>v4E)4`b-M?p@bi-aYWL>?^))Hg zx%Npx_{0}NiR#lYLTk%CsR`8c@%{}9^k1R`HogBsO{mHpNPu>3`xKF(XOx`a_1&mZ)qV(cH#{4=XGrvESf5VN!Z29cp&Kp)V#WeIe=-NF45%RLIq zx`ifGPwH2d3CvfCUf8N}LxHLgdkkpjcDy74h!Xttu$JTF8y$U8%-fA)I;pbH;{1Gk z{X>pja&mng!14eq=TOD5Z=Y(!02;211YJV96(IwEsE75pC>;Ht`Dc@0?Z30^ig5fd z`~a36(+23@+CxRQn_+*C!ZGaTxefoegDZ9cWB0X}|B4bYWfYcNFLu{#<`*w*M^(2Vk?A8%h6iMmepx18om61>*e{fSwG*CjdOGzoG<>3(&beW=i>uW!Gz) zBkhX(6tS=RPoV0#QvAxLNf@!yQ!kpp^xxV;;J-%U9x>qB+SCY;UYTkX(2Pfyp+?aB z0;)~`VWr>NL%&7gisX$jM>7eZ$-NWWQh4Gsp4*>aAosV$7|`FJuSmUEe|18sREd8;f1WEK^~Kyke||n+ zg9Z8k^auKU^h6*RZVh>%e_Eib_@JBxqX^BfJj0AvJeZ4vZ)L_LQ1GfxBk`hfUn==aD2sXkai z7vTA_?S7L7oRC_Te`>_tR5<`-g!qHaM&9~YK29D$60W5|ZlW9Uk;LPvhd}u?6JY+3 zSOx6d)OT84Rz9N0qFf{FlUN)avZrN3pRbF}{k3v&mbYzgX*>JC!fR>mF#h`yEt$$R zI#;wK0?jGD5elcHA~eaZ_xw!uFZ~@aHZjsbZ*qy`Ah&H@O+Tu1>?wozTBK*5?B~jB zVIKqo4U~DlAdP#-oCT^xym(Ky9yPnM3<;6=)1Eh%L+bO)xNylyowL^v$^*|+w+u7O z(-e`Cq||4?oS>1XO5N53UwRgw!A{utDKjt}o+{j*hKD#K zTr4?0o$4XOc5b3^(RN;HRbzT?+Ul`BfMP8gOPC15pD7R&R3`~u*}fK~Q*kWwD=GvQ zUd0X>7`D4wW#cN0Iu-WHOdt*l$Gs#s^SRx!Ta7r+sd4R0H2%xF1)<|TzY@Y4X6K>c z-SH~hxR95MA*2&50c!S)_w)CMrRVGS3wdMP;D%6^pRa{)yvjM9d%@~|M7lSohj_)1 zX@L)4a?l0+Ad!L7(PZv=0MAs}jY7ku(?XW;vZ`Z;+m$`<-H$vfX*698t8hk_X`3P9 zAx-KYuG{A;Ed%%-K_4G5g;@Nm?^F~2iHxvIM1E=U>aJqY9#G%;83L&DmMRBMNGMTg zxAwdViKWt$_hNg{B-|_v0F;|llsa9(3L(LN2VHorMgIICX$)o1`E^2yybmPdgg(ih zZ=>{t0?*f@SRr8H1$>bFndBBJ9R7ujaIx@_55_CMjOn}o7mfIg$<6cSQMCe10sOuE z%8$hwd3iAX>iX*R6OiP-JlTIc(sslA5vc7eWkX_>fW=X}dA=BsGX!K3qBfBO5WvtA zk|Pb;6bN*WN*akfk@-C8z}Kq-#-BB?6Ze=JE?r?ow22d!55Ehc=k>}Iu39pLeI1^A zLW=kr%q~KbY=MTaJ3t!R+eOz10$B+lVW!WB6tHEHdEf`p7fH0%ZTkfnz!Kp-jBRY@ zfF(E74MVTB31TDd3$cdD7AIRKW5DeSw*(emeUF6heNk{Wy38g^^6AO0u)0C9UXAzo z_gYg1XafBmCoa_F_Ytv!RKm*zeRA4|_Y=S8(822mDkNhvM)4W#I>r<76dlI$N%SGz zJL^}UQ;d;mxZ#1P`BwdWzJyc&9{8OgEcPI?K`1gJhvCl6^98N%4CWm!2*|LNQDa+5 z=W^nFAF$4{#N5PQXTZ!3wp}ei`qHAo&B*@rc;Z3&smK8ThR`)K|G1*!YR$-#Z<3=Y z1@g8`nHe99pO5-OdEkJ8ftCS_^o!DccNq`@oD`6Rn-EBSIfnYUNg_NNsIqDjqJsr| z5V1S4^GtmoJw;)rdbxp->eMd4+U`Soxf04zN{FfzloUd<4uW+OKsUDnr5(3pyP-1J zfz30SDZ0_c=wPX>7$(u^Yd8e1q{$h_edJ3z!C{`}s>S%hiYSJd2bzqpm1*Dky5bo6 zvx?j`Z-=Yxj|=i=eNQDL7?kuQ&Qk1|G|~&!QSVXDaIo&49~(h?)ShSQz?jFL7k|S850GBa z7*`=rLRYj-7+6T3t!do<#$=l>y||-((lj&lB}v9HZpj=-!a-52F1%l&@mx0f@3XcR z1J9Q#>$cmg@2iYU=W}?f^{wTLTg5u7U+dq3Fe*F|Wo}TcNOBe4c&_o6?2ZxRZWX?? zGAk$=r=7=k%)kjr?~6>vyOpbu`0^!>?%V|WY!4h@rCa- zTaSbnuaVv$BdQ_;WY#H&&U!!0fua)z*J*gq`sBl_V)JD-7&K zkP$MQ>?vo1rgGKE(}SCw&1cs`R^ipDpJYDq%%2ShGJ(=h20uN1Mc3nwVe7{HjRJz& zB-h7Z6OS9ID9U?27Wo4`qQ@pJQtW&@)&eDiZD{))0#j!iMs0z(>`ur-XKH7b+9K7V z9hGLnmKe@~JROTnUg-m%}e%++r`Dw5i@5yqTGQu(d9DI(}s@eQY*}(<`r;6Ll>>w*I&Zd#-H^o* z!+fpbT+H}@H*UO^Z>Z35I6*M*{4^XM%~R3gt4%~*`y|0Gmg8k7o!6p%FYuJ^NWq`R zd?bG4TEDP{Wdm39kd!g*N$&(K{A;tat3QX%#7MsMcT{$_VC8!( z9raqPNj^RskB}Flu+pwi`c!RN*ZJ9&KlL3+M!S2}T(`4xB`!ZX{GnC4L|JxE`%LM< ztCfW}=JO}q7oV`<90{^*JmDa?*F6NNNbF(`Pd+)&9XZ@X=Yq6-^Nhvv{4nl;{m@2MPb1iFa3& z4@Uu5%ErfBL6vt4!rFivX73dl<;$hW_=Jl~OoBOv#z%h2M_9s;A(7F4ieA3K?`4O# z1EufYnBVB?bEQC%XA)q&UP0p-O?5|H3r9?#Z*GpycK+3$vH?@7GoS%8U{u5(am|vT z>wbn(zzAHRKE49PbA~!J@Ii1dZ^TSsJQrJB12~Be_jMp=5H6po8t0ptmnnf(Vt9qI?TRXWcw_CZZ#n=`Ku z-HU7vo-Rx8fdE|sAOXesxp-Sg;*=DHH`N@}|Kb6i`qj_plxvBJ>2|w!!dJz?RUtSouRW&%=hZ2(z#9jlr?5<={ok|b!fyDt*#*h+KnHe zA<-Gdc;lXw9_R^6DyVT?}U@%9Zl`H4**A4lZ}_?dVeHSZTkj~=R<-~PZq4qWKaIOQ~7&6 zI}L1B!sA7Ry!^7CJC)yuQjAqtxUXf

)4$6fcbI=ayXad^mn=5UL_u6C}cg%~665 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

>q2f8d4_5SXJfKYo|QBcg?E_f>= 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

  • TZ>RUzR+6redPPk^}2)l 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%0AW+|Fb`m{U@vs>!Sdr{FV3}>GFbqGY&BC!b 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 @o`Gb3H^N=sK)%cZfp9dK!kx`sP9fARn%K z4Yna4f+rp)vuO8ZpsDEeMTx&8_xc^5AM6EHbk_uuN!Cq5SI*b$q<(eamgr= zL?8Ecq)0+%jA`SIiWEt#zfmI&-$02Z5DY|wNRh;55%t}9--a-OvCqCd-JAO_)Ejjd zUX7U8%b9_li>M(k8S*7>Eu!8jNAiECFIkA3L_1s>i`l{ZO3R*Q69-sR5tGk_A1rh@ zrz?+O%lVp*dJ)3}s;YAi`TcNYWt@2N_C$}Y|AT8vyDhA$BtGB=xcR6sQ|>!(TJXaO z?|bog>A7m=W}gR5#ISLQ)X2Y4O4;z+Zv`uM^4k*~KLGB(^yp?HsudFj!)xjd#AY5b zP;v+*$v2p2%|y0u1uGh@BDa7QNyi7|-`RJ}09SGIc*UGFJP;Y+z-|%h;=5Ae0$GnIV)JLYX1O z^8e6KlJxGWgfkI?LQeAgIJsc%E44W(%}J_p3QrVrQ$MC@zA*V(o1515?CKk@+)r22 zKfO3fV$X}^z}Jy)*;|XDZqq@StP+7!VO_*oQeY~K@#4mz)CXSN)?Z1Zk&C;Wq2|pO zw|*UJDy$WHna1f=KKkPBfJwUAb8A6#Ml-W|~QD2W-l~~8~hk`H(#t8s9TblBxmpTBU%#Zq$lEj}7mEERm ziH#mk{2Z8~7GB%(Im?De#fx0<`Sq&hcu^~lcZ>8u&T)}#@WW)qZD=hEQfS_U*qk)5smd=8tO z99)2b6qMQj<--+1nIV)JLYaqwaQB2$BQo1fGI*rpN0!8vm0lHiL?c_R=?NTg|5dBC zG$}vu7?ppKh#O$+CCnfU&7r$5@BUOjJu`AZm!_-!Ek*NfmoZ!K|A3%&L+ti^hc%OR@(%mGIuX1N)M? zeaIL+dL=m;`$GMW@#E$(n=GC&eXlXzY?SH=67V0prv zD>3MTA6HngL3!x4$Qsv2fl;PCv$~J>Wy=Ds*1{L`qfdV_3=g}fe%`>++RfDffjlA4 z9V#1?br9!HF>sg38HnGNah)^q=#^S76HBMQpf9=v$Hm^?3~m7 z%f+Xa&IFaysa093y;o>CP=>U9s!n+aR;sb^CRXjeA#Dk~Mbq1=&vqIKMv+J1W=Fse z4^7nKeK0+&@HK4VOTEa#=*;?C^vU!0a{Cvo-qP!|*nAK@K@3RfPpz1L{P^}U{X0!t zlBibg8*k@q^}C8@lT@1b&UctPH_U5L7OmSpvz}ZzPhz*Q%D3?G0Y1N-)xAC2TdnUV z$o=SxFwFeX@4c`7$AA+pslBR7uK}%$|RX}U0-+%{i;J2Hn4J(D$Tdme zkfwfnsG=iLRxSyCmPy$to{dvp-Zuc|OZbTu_spRnB~w+$P~rr*>`P%fV&6bz+ysd% zxmxwYASQupagSOCi%E*6!wQxg4=5Sd!S}l0vQ{SuXt34kW|9zAenBt?*VI1^Aq;N# z63y*i{`P5vU}REM;uT>BMN@lg)>q4kqE&>IH^f}dNj?(r98h@g)nOh>)5n}* z8KA~aiil$(NkLK?k$^o;DFw8Bh5?j@6c>l0Yiz@#4jT^Xf)r(2B7sNKvq=&psjAN? z)Si@CC%fY?%Xk&Wal^`z?4;OXqYmef&mmGZslB*hO^xaHxgH-+A2?sSR3=04eb2Sr zuNRtYTk|3nQ{`h4E)6JXXgvz@-IEN=j7>CXYeS!rybP^{0W)L9-51=Xub!Z+Yp)cW ze@^|J{Tk<)PqkX}*%1xt2HzId63oNAbXU@iWRLAj3=)2rcw&t5O-e^=;ce}QALUJ7 zpLKq|s$G#MdFZ-^F^d>&L{q+?ZpLoQSEVfmYzP&haxHS~wl+q>!0+Vddv4e#9V_6Z zG8pr|Wt~kVLd-^0*Wk%8J$yN;{x+9?ksMqw`)d;a^#Z0(W->(KS3(OU!;Z2O+&r4C z(?^ZSnB$vp);vZwT^X7`w9A1-np3A!il(rh@Zc#9=73+n;>js8JzOXsQ!3!PQW)Jg zb$)B@E}Q+nTxiPqZobt88F)cCK694*>4F}|9F4M0!kc$QA5##qUZaLJ9rE*bR(>BN zDmwN!diMbdXV#}|Z%!E~v%1hUcDJ+(2=26RAKe5&OQe$V^Bo+TUn*2WdcQKAK zA4VEZod`;H+tXE-u6X#62X(XVXK4=Uua4a(I3UO4UhAhe<;#`bDkZU0LwGbNrKv!$Eawqq4cN2#-|^&onRN;gWJh<2sc#;``eu} zxSyG(vQHN%P4q_SQ4CZP=E#;4T;RROj3^;^aUtl6s{7vRMg9Uyh5G@oqANlez6hPV zSDSyO^JN*!>gtTulgBqhMuWQP+UgG&6|vb?6`i23l53n(9QKI+!hG)re7SoGc}_F#l9Is{WV(yHB~uyfoCcch7Mq;Gd*Ty(r7 z<;b)syeQ(tVdn&oaJrABFq`DWzvzTl;3!bdwkYH*Z09T*;VecVOHkk}zUVBm*G0;M zi$&B$MpKR5&PAcXg(KI2UCl*tuj^S+*YldL>UOT05w2PVu9w?gwFengjVR<7U9Wi@ zJE7@j6yYW+>}DcL$=K#*x!2uF)ZGTos;ue0*yF$(3L}5*E*%5I#==qPad#qjv-9A& z$;#gF<|wuU-GSBXX6^*C_Q~gbji?>q6rsr!;RQ4Si&_rto?SL>D>=lmp*jw7J=54pnL-vS+++Db?H(c^= zwJ2FbHTk<_irr+ssU8Q5HGTI@dB2w9d1*%*ALP-#X#ZK0sjYyzSCgiXfGU;%Hni7o zoPee_f^15YP2b2%6x+}Jh35bP`Pd*;HUar6!G5fxT#E!$ySRAftHp3$vf*=4UDWWI z4i1pU57d*h{VGRwWYJINkbn3`|9a*?n->A6o_q841r{Yg+;@?IBZZnaC6EdyXjga; zE_QG>OK?$h0RL*rfstxjp?&lx2+4&#srhQCPwiu5dn6>fkA`QT=$VVxZXe~78u0?peHv$v?}@=-kbHca?UABhlogwU@b}1<%~6fvE{TEUZu_F_;Nh)= zPEAAnhYv*se|xfg>d_~bqtQy);#2~WujHdo;YRa3f5Le-Z1?xa_)}4NGyX$_3|Ls3 zD@hz+vV->90FZcp_uD|igScFiy*9&M`)yD-pRzf_UPDcW)d&I9Bsk1tZH65bk61%Z zfZqmQS!RQ}*tc}?hR(raA8McM55mQ034C@L`P*+6w& zl|UA&G=6EoGNXKjNCW=AKY;5|-*yl~T5wkMMc!a=|d$K>WyJ`*Y{+f8x=Xo0b zfz0Apwh=X@&8sAPw7fK_dz#ZuGTIj3?aAu`rPJavGspyD*NtVAbeis_ER*~ThSQ8v zyJbSZIyx2a(mjty;nL{>CJ--cnZmnnF_O-9U%q@~Z;vNDF`3135lkQ|I1=>w2(=pZ z`jX`(2l$D0aQ2$8&coRru96ssdddX7)dvEIM^&Aa8}qM)oL3(Ta#5EOxgJJD{Zi|a z{+*gWz{YWrBgmj9=X#_m9!H||)yRu6n$~&7hW90%=4irfI~NoEaaQD7p5CXizx-q` zxd|9Rdwe)GL-1oUo(_+UeYs`EI^wbo{Su<)En2DScZzNQjMey zzf>5>P_|Dce_9|De)<{ykXLY48AYza^Qsun(QG=#C^h~12S<4HYSk;6Q%+wvqjvZG z?UAwk?#TGPa(RiOX8sj!`>At=^G3!sX-jwxS|((Mj2A81Yg&{n)0{WA{yEPxS%yn% zI{BJ_vz`~9NMzK~qF1|O@(uF00e8x4s*>JzbgIhPNwL3TZiRcg2A)JriNg(!uy;ul z&(sTDia&HgxCK=ba9HW+DzYTt#ETa)TSwSnNx-wcHmwI4UeC4h@5i3kJmI6%&tNbR zatb9kGR`DH%8f)Uc)K!0TBpW0N&+mqh|5Y{)@lORn^Eq%*r0wJkWx{EJO2(+QO5V! zPQFZ=%_y(zMt|`iza>X(aoq6;y@lA=$Ca4n83g+tpczGDHDwld)jwpub*;_&*W&l^ zjo*fYH}3wNtlIwDpfa={+2$R4+8j?2fla%(_tB8c-2zD%&U%~owWpMtr<{q$l}s7e zY#f=_sB;M4zNs~kirE|ED&P}COxRPjuanOL`P*Owr=1KqBf1_&5s(!Dh6dz$c=BD#xJyq$LU$dm0Q$KvnvxT+XO_i&)%2=Lob zeu|ZT07OmR>uMCmF)pA`lV&a$fSSnFcpie2^2W2!)>O+(yWjEiiD#>lsSKpI3Q9eE zS(e`uY0X0{lg=>hQ|KZ`prq65*1Qe4JG7UL-?oN~W_o&EZlu>E7hL&xKNsiOnjv{h zCZjWnLPX66}IkEo{yNwS-R>~W*YBx6oW zb`)5ib*H$!SB}dR8yM7lB;cD%(LGNP%t9QWXy7>{X|F(bE-RjZ?>;judf$Z>a_X>< z0Pb5^bSibpS-ujv@|QnqJ(3}C!B^CEQNQrQ%P7qH+3V*Vuy!Jk&iqE*=h}>U)|%!{ix>Do-R0-<4u0abx_c}*>VaEYeesjsZu_qc zjRuQ^W{gJ^DO`5C*2aE4Zd^iuhwPQXwQT)RIk-#5S09i3;*Ki~92~vJtCdfuy9sbB ze98K_I9>T7ntei%G3&FNWjNb3mB48-)$V{I3Ff#ti$~FuofCQ$&nVv?JZ(Se=H#GS zzQ;594EyxAVBRq1!_qL4u%Bc@V{?zvBrL4k1#9! zw;P2nJ{Z2DZF=6B3oIGeL9?BCN~{w_%my?cz$79!}!N)7;GYpAT@?!^!DeUor{eNBf}XJ z4}Sjag6%0N!&jbk+P~aQU;!_s44u^Gdi9OWzo3FsdCKe3a?jp(1(hO=Q?8Al*;en^ zRmmz(2SqJ^hp(!&yJsgGPn@!i9HEi~G$)|6CrB*i(p~%RamQ z+YqijQ#AE>NY%d({B20Rv@)#uuJ8aSVlMOU3h>+Ts=dn3EHD`SZFtqu)(HMKj9L1> z`ZA!rQ22Re+@$4)oQK~+$?k^H2VLGNI4X84SS6Ee2XH zis|>|$NNN9snl#`fXB*-0a<_6cc)Iz9zAql_Ph>7Yp}S@g8hmH-X31U>RLykJu4?^@E4#znNQaR*OJG#d>QfYDo zCUVmo?W0)~WEoT$wY8S~?kF7S^n}?N*5ouY>p(8)T;SyVfK%pp0hM_BNj3sX>4F22 znodzcF6=fgJh~65+#O}Uxtxo0R?vhq*|}nq-_3YWg8C7ODqkbbGoBtN#N}ce~`@9WQnYXKF zy=D5?N96m_gYqd`%o?i9pK?1}nmX(uolpe$ekAAeNGD#>3jrKMX*8F0b8qo)~h>%mMxA$d2!ZDa5y`htskuSGm)qLtFcY(+m1d(lP^|)Q&tW!#k#yQBHGX z^m%0}@P4cp#z=C=2z!m?eL=n--FU_ezJ~!NQ~ViTcg$7uxM(=MW8ZaP0i6i82z9(sx~Ws4YSjORIEyD0#p|dN@5lbC!VBGDp5X z#%I=j1lgUCz$+$?1jo)XM3m>tsS788_v1IILC!bbYFMzCw3tRa z1lriSAlZo=K+4idmx4e$COCH1t2oR4mRsw+uv|e;sYk;0@>6|PJSMWdl&MQZc5&eQ zG2{k~VTNFI@=m-)afBcRNT z&?jR35RVT-xJZmWz@Wkr4_pxp_CcGuPOaC0;gI zDaeK3{$Q_ZxkGt7a^{KF2>V7jFo%Gee0nwc-un9y7(3HZnU5b|dq2*`kohJ9;lTHA z?>vj$3%nmi6lCbEY}76leim zv-iL`deybyp3JNjNR*c z0obNARCF;5#zwj(s1I+%imJnD&V8;3~;!b^B~a7|<_{{0$C zWPLccYA6Ze#yy-IA66UlFflQ8I5j;F*;9^O5x1I*WEAwLj${_Kww-!brlo0^RRP}B z)f{P~+2)dE=_dB!%1%FV8+nuD{Rjk|gU>>uH>;e%~iicQMogf88GVs3n4{- zyV_(0@9zsCfxCJgS43M813l$(oGU%p3TU|Emb;p7zWrLb+59J?qzqt142rBj-62BW z)%i|1Urx+r+22^L6S};g>HR|Y_PhG!`*3C8u3lvD`GHDZ?mX+^|2dk2ToG?=!F?Fm zUCH@udAeQ%)q;ECZK<+KXho~xfuI*1wyS)xo$koH+Ty{u{Nt|S=;3_iUA-~uX->cM zE8tfHSb}>sYo4{rtTiMoGmr|_)Vwy!Mg{q6xc0%i zgX6)1v2C*+(z{r|tfwweGCO?nPy&}DD#)*`cVIop-{b?#dj4&Y-#U690MRTAt)7sX zTATHNceRaO>9)JtOKTQ&SJwhT{@LHGhz%9s$U?}D^}D*6hYOK(Fa)ORUV9wN)XU+t zlF8}ospnZ&sNxl=sj;YNKPGB@R5@8Jsg*NKlc^mldSL|!@~6gS6;`BiNTyjW8wU~w z%w^1}aa^8ouYK7ur+Z7u^CFgK%PSeP)Cbhs;>Nq$%ZA@)xKR`6Q8sHtW*>QuYd z{xib)2u*gxk=Cn+y-Ovo&tyOU!lQn=?$ZYo_nenOX~rjGJNEG1&dqw_VW|I#x9Q-A zJn>x!Pcw^Gb@B$4`5JNQr8Z@sd*~Jl1U{QlymI~0FShWq$=7_rAu3RSnx6@MUw{Mb z3xEg{3NwNS{I7S2JcBqGO`W~&>5oT3^ZRHj(Ftx4Gcp30_cTGGt#?R1AcGP8ij5Q& zrc-Z=rf$k$P|?&%rVU|X7BZT8`+T;2s9&WSW;7MJLmG>Yey?cM74*oA#Mu-UJ}WF; zFR2XRvY~QXE2*5QzKblWTr(D;qNyw*SHS;0rt>7c$dXFjD}b?ZFw~v~Wi0e~dW*5q zUDt!!Ne;O$So_~Y-65?;aaSli0b`*+OrnnSaXc>6|K6QB5HnH~zSHBOjCqG(bJU>Q zyLqHMH|~&qS1GKx3FD)*Tek@dCFvC{fqg-zUAOF6p{->I#=xQzd54$`rz8u`8*Sbp zJU8z&BJU6}YTUwkh2GQ>JRaZyj=DoW>yp-@{qNn?iElMHqnq4;`M-y8hfEaBw(f9; zAom3tHD;(gWV2NGIg7*EzTi*)d%zv?F4>^*IPwm`QNPi2nihG70LZ%xZ5ev0u&jvF zT5eBabc36pLY!VoL)Kn?hfI<)tOnf zd50)BHx-^Ml$a>PKe#+u0sik*19!-Ukb}S-Vsiw!FR<8x8DZ=T4(CXs?F&p+{7xnj zjRHmLcYuAtllW3Bp;e?SGHu)M_RyoQ!Bn$xW2yY8IkGL^2D7 z85NXpp8c& zeY2ywiIYUDQ2PRmmYpp!nBmQR0eFXi`vSQB?ZhUxa<^bo)c+pp4uQXOBNW9l0`HKa zFL+EJf&k1&azsa7o{rKl)&|af-}s^)cXMRNtPO85_`la2t?ZpBe!~CELP9cvZZ27l z#P`V0!!4_PM^dazhEK;6UD!p`#Ho=nte6b^@0lbeYm=mDUI_a*W_c^!ke5fRt+w@U z3bk#Q=?$5^ksL3xNn&qH_w~gmH{36#X21KkUuTAny3mSG7UvM}X{!DF2IRLh_t1^X z5ixzL>KDuk`$}eT82I0_pMQZM$;jTjyU+oRGKD&dk-l1}qZkaUVdLuCI&5 ziXHp`$}~AC6QE4N4oXE0EQ!}yB9}}sO4c@xf7VW;jbDhBS$LlO=J9`DDdC|%XL%2} zE>3q-30@jp`-OP;nZMp*b!Bnj88Gf!0FHkcF#=c@OFY$lwlVG#v%Fq+_jltyjPeF4 zI)*IQgZ9Aj4^XBZ0@7Ds#gM+2DPdTeL@LEs0m^hEL2Ac-wE7#K;u>YDg?ap+ZrEK8 zP^OVL?*a}2x_8w`$`mJv865YaAOD3G3J=hKAyDh$wd0?2Tge(Co&M)e$A24KU;ck9 zSu$@L_8kMiHC&&dav&SPfCnAfpMS8iJBMD!pHW%@B9%~V%;^C7wV-1(!@4Dzxct zN!7Z=CRUu95(FIoL57Lo@n5B&p1KUT+Di8PYsZ%_Rq8)vwsNHE-!;Ae(A@H|wXOYA z$LB9!JG;8S^#JMEsKz3({*lo)>|^MTujQ3rt4p0&pyLa<8LD8jjCtcucD>I-?s=@} zDVoD3UkZ4Ls{GqS9O#dxV%G$tHba9#t?Aga!%XXc z3a>7Je+sKxEH+)GOi8F;g*P4<_KKJmn~1~vg+F;Y_P;~Cy-AAlM&8g>Y$!Y;O%bF1 z3T3f5Oxp{3BQ4%Y%B(Uf7um`8RwI8EULJqf2)NCaiwl8Yg}CRn$h+dAt}{v-IS9DT z!8-d}*+{Zz{ZFAwCuqIS9(0?RQ|h4H=77ZJn~VKR=?%Ae`y~=aH#jhD(oVPpl0{qo z6j{71i`PwS>DVjQS<13}M`BJY z1LLM&#~sjr73f$b=RNj5T^~2C-4!dzF}GQhB|x{it&iO*A8=KGn<3t2hs7Qrkq4?+ zezN>OzOQYD(5{N5K|v`c^s6EZ?N1@|Cm2Zh3H&Mex4s89LpBvdqeW}0 zA&u&C8susy26a~;e-+RZ3FueF`eq0fNZ4{!#OrmJ%gKByI}am-PirzJgWEUS4E`6VU??j&Wf^{Ts~Ys zPw(;f7BEb879lEdtb`bvA%E^4`59_he7xp8~PhfFB(3E*z*~Ln~v$pfCSz zXzRaE%wonEzBZ9p{7wCXp$=LX8rLJQ&H4xLn-YdTGHxm5Pqx%Qyip6_ z1nA2p9a3iLZ-ZN_B}0DTgA@5JN93wPdvrGPjI?Swm0843U<_=}H>N2vl@jRN^T;{v z-1clvldaqHKTK1+KV|>I+c+bSQEP6Uru@6-G^N~)_0SeDP3gk+K^F*AMM?qmCGed7 z{WRsw9@xT%(ngXoY)dl-m#_C0cHEx(nUVMfr`UYIUMjH`+FE~3Z_t+y2Fp`7E8U^a zVo3DGr9dg_7+a7NcI0}!{Hu!}AkkNd`ahXzB=HD8dEsn%dw)`;UpLbj3SUJ|>Hl%l z>jh9*j~akYFVakNDdX&FC#FHNtMuXS^|v?BD^yg=2Bd*g#Qc!GLco|ltVMUD`Yng! z^_DSx9y-L(w5VJnnJvfX0CtoA9DZT2^B5>0SQvJZDw^wFq`=<9Vdxd~i zuMSr=X31s>=M92U%#zK&^d&%|FG%#oxHhNR`u2u8i{Dg0qOY`d%Jm=#a+HA-@~Z5+ zhOBAB_lqq;J5ER1yDA&k$KJ?MMj?G8YLu}6_;`~F@2`(CN>^|7|Jt?T<0aBNg&Jkt zsoANf&EvBZOBi^Zs((1;b^YsW7H*8=lvRUx6djyVi~yFN7{@6j`hrAXJEf#hWAC+5 zM)z`iLK)u9qYV2=XGrt~iN4yN9ZOQCBwQaFBbAC}#qAy7F#W#!MOYlE>027hVGZM|JvdDIL-*!87U?L(cXKKbwsJ(?RX-+Zx{F4g? zGK!Gs3le?(S@eYsVBFOkE=Fgk|11$NDJ^?l{-)w>WmR=eZC!ms<4$|MLXzJ8fikzj zt=8L~;h(?OyL&JaUyQ*lV0X{7*wru9&*Q56nNE4puUl_7i~&>}*ZLD52xC}pg~BV> z5?@>uOv*czQ=mj+YqJI9Ue7)ro{#E-`wDdyL!HG)>n$AL*nHD^3q-z_^}U2oS{pVV zH^i2FC()cNwT=MZx1dnq@z7pBqSrBUt);p-``!m20(f$8g8@;>+HGFN057mYV?aQO z_+}m4Pd;5>ueVbj-1v`ytrU4&r`brB$o|`-Ef>#h8Uw(+-Ub4KPLTt~fSGA2Ks2V( zH`-y#jsxqmJ@^aU>#epn1Cg&^OQTyb@+}O=Z}xhQO&I_Jh!OdcO{N_WL`A;-m%Sd; zS-kDg+q5eJ(V71P*mGn&S%aj)mg0nG*XFnxp8U*1Z{$I-3}AEyXMhRGGJrkpDRI`)L9I57DJuIP-ijJS!`aZhY@vrN#~@k zT_G7k%qQFb$S5%-(L_IU2-trW5*R#2juGtoQw$^2w(Y-+ZVmHoL><)uEkT4qWHLqM z?O`N)mg;fB$0XI|=wtM#tkv1H6PJh zPI+G??wz>?g9&;~A>p&R=5kPLg&tFh?+gKKxL|`CM%3~5oO0gG&FO8O#rybGvZq6{ zd^WUJ1@#GF)KPnBQ)`9US-dUksKnfp6;<&FCR#NlhedS`3x;4mde^z}R^iMOTNBRX z`ZB_Z6l%Bc&h~%}*Nj$9+W4%}QK5tZ78)?>NT2&Waret1S2?fd=p~!83@byo ziLQ#r^i#r5+%PV*xe90ra#;oM4<|cue@t~UOaQb5>iM-75|)i_{?Bmoe=U@N3W#4d zr*Cfb_PHXn@aCaM7AAlP{l7qW=&fIZuGL7wb!*ZK#cKr%H~Ed;t~nn zZBSdIeEpIK8*-zE4kxq9(KmvCgcE_JpTWM@`tbS{_+}J7epPA@-w^1nLBYuhA{5#w zePNexZ@|ethxNbKX#P~}z@Qy}SqNoN>ej<2=uApl}TeA&Lo)Hr8u_eNT`rxZ$dJ@kH>i$C+YcmzTWT8@jZ_3=ll5O{0GkC zxZQ7$>+O2IT$c`7yC17~v`B#jDvBfyksw@6_-g@)#=j7#hKmdVddTmt$4jX3@juq? zo%lGoc5~IC{}V3K@XcuuL8TGpvap2@*=fw2FtFbZyu4Ap=7p(^B@>gj;sg?#z4g`&~MK;{S(Il6%ZeQJV*hOnnqoPvDGkT3cC5;6gjAaa&1ALb8;-L74UJMlw0|!OOmkfW0)Qk6;-nO}Sv3M$V5;w*&5j{Bw@X-#;0`et8 zzGTRkyiK?6(!DQ){{`d?ZH;Ix-jqGOq1}@n6E!ni5LHZasp-$VJL{V4w7vkyAzOA-)v;N5IK<0#dnwj z2NfXn|9u=YY>_y+87jTJdjBLYec00kJHN) ziDL$l{(u7Dcyz`uK*m@$VUMPA$Xj(J;i|f9jxTf~=IQIjD=7{|%-4Dh37-kwFaLg!Kj9q}xNqNa{ z=H(tMUwF9w;$w(;)dcyHAzw1&ONM;OkT3b4>(X}THG-cE`H~N0V(zt_k&w{g-A&l4 zOQZKFW~rjqoO+B}!Ga%0w8c+`oB3A}_#OUh$y^}KxrqoJqjTQsyRaO-ae~3raXVOj6n#uI5Z6RI38O zZ6N{qd+cn|bx zN-`0T=Z}8^`&HKGc@f|?3fiHC>HZ2QH!@_OW)S2{-U_Z9KmaciDe(T}E14c<2}1KJ=Wjs1 zbc0+YqgW zZdgQg*<*8l4As^Zu99mkG4%>k5{B+k z_=#*mXbo2wM*Ndre8zv8+i*P&JtWKfhk_70&}(&7F0=GOv+f%))o~y%{v~+baSTUJ zyC%FknCWCt5&e@>uQ-dYyYNNJl;}!fJ}=<#3)j4exE)@IVEN{X+hP{6@M2U>Co`ib zTMVVx4+Dk)tHF4S2E*R8hdDYqGCRAudw6Zq~15|k1cpA2MT!O63kd+y- zGT+OspLzS&>Qse3A(sEF+5QWi2tq7FR%QsXyqjf)tjyh7AhHv(GJEfG=!Uu@M;F?Id`~R97)(dYh12_ZDAZm?m`u}Er{%lr>ce5oQAB-kd+y-GDB8o z$jUrf;P?9QbnTyUJ06eYyC|Q5TJPk4*NF#NnIXjTzv+pB5X+F28L~1jZL{7W#Bwa5 zRbAEJI;aouR6vMj%sn-FvM=CZ(u0am{~v1fc9I@nfJP}~(qrok$8onIKeZ!yU(zG} zQ?`1Q=j$GIAn9>|z?KWmp1Zfe{G1XvAD4+#B@x(TG8M zzptst{3~G;81yL4AL~fDwy#m@^R19O6pkeYsEtx5^vfqg`A3J^;x9)l>@-T1l^_80 zoA*|pl>Sof-;mLbHl5!h^!1->hPBZ9c`{12?m^G$*fV)^-( z+yH-XtxzI%neY!8PrNb`SOnSGXHCt7iOrkj*e=|xxg1C$xgwmX%$DkTJ?*q*hIbvC z@r~oB-j9ZW)mQh1WGijV!Yc5Sc->^0l-}pvbAWuwz?u#OvL~BEwL8*~f$W0Kw#q$w zIvB`KPpH5PAEj>tVd)LB=mx%f4NSVk5_ zL5O9@my92aBaI6FtfVNOJplaq7Zn3b%TmF6&}f`-e-p~05{#;Ll=5r9oOcv)g;0}w zjX|=U;JdtR;(K%eFaEFUH`=>q?=g zDNRo<+;z}TxyUN};a!Yb6lEq`_;FccU;XRP79n3UgO;a$d?THk|D(M6K>dO4DzDKl9qB>hi7-8*B?s^KcF)uB`FQrnXRTQw_?A3gzIGe z+JnM0S{+MCel}W}RxrIfkyFd_doo{o!+ff6BGCuPVrw1mtGrKWGgrrI7jn1( zsqxy)WVNdpm)$42lfAz5#cF1KdBE-DvwRtEQ+gh$LCOx=}zI9w}KZ}_=xQtEJo!JDz+NRt}&krx(SdLu8bhsS({Y?sDHqV2Ib zwp9$smkjxmAzw0T#Wfbt`BV*dJ|W2TFj^M6UHh<$UfeYXh?krj zU+YIF>G@}CDjAE`a1!K8)=v56N^6NaqECywNMTSL%tS^E0LG6CKgwO(D=5 z3V^fhTZWbOe*9$_##Qmv-(7~w9j^h)aOz0ZlYPrDOWJ6hx4^$W>Gl3V&-yp@O%s!^ z+N3zA@;!njr(Sn!r)R2S7?kLH^|j-0o}-~7o-P_qN}n#Cd^0g!GF!trQ@YsoFgp;v z4;ayqFB$SBfB#YKUMIyP6>zMS&b4>6?yY|#tG?k@o^vP-LjpHr?B#j`voJRcW?m7@Mh&AxSUy|QDRZ3? zFa8B($d?THl6Pkw#7l;F$&fGEJTy2G)>7YMS!}L{VGY!H$h7*DwL-pRykoM#%pP0e zxdVZ3(r-bM1OR-~-6lz(0^fdcJjez?68EO)3Uj_yxs&b(zJ>EWM1mw@j^W|%1HL_8 z@@Wp`o%-yq{)_nQTo+8;}*2U}9g71!;2 zGh#{o?jtmu^4<45b;@nO9mN*0q;3hekS`hXB}2Ys$d`dB z|Fi-1-{{N`FB#$`L%d{&m#p(g2elY}+`s9dhIq*kFF74ppDh-aP}b*({{E+Dfg1>N zebyatz(K6fYAVXW`pl+riA+xSo6E!vcR=H9C%d?X2hvnl^Z0VZp240q3q|AIUY}RH zG=cTGhsbzAj}58uqWT^7NW41tQ2Y+;&pme~UN2KI9d9Yu)XJCpB;Kkk{;Yt+yLyk1 z{?fP6gka@8sg2-Y*yAY)q59*gsHqLem%Q9>zrP?F@+Bw3_k-Bf@gZL_tL14EN8D457M%9&F0( zlAaH~zGL7xTgtYpax<#nPmX@yRkONNKqE0nVDa*e)kHwb-E~&Hc0Uy2?|?mkjxmAzyO#xnu=W+`ae2%{>iLpC&uX z?J*964N^M?#S$#vn=&49MR`9O!}fK2}>=YC_9e94=s z&xPg_ee!{Ps0~sQjD8R|;-1L1J89_!sSQz0Z@@hf;w3}A?{#f(ub9 z*&Y3c(9dnmT&b~*kT03>cn|{^9hnza|A&r0$d|l-8QwzLL%w9lm%KJxO=-LaurwfF zGUQ9f6XDq2OVdx|eg31^wEwNpS9HW$nnC_YvFWbQ4O~kj5{R0`W%m`EW@|ydWXP8c z@sc54@&JCaP_0ahSws-zOGc6;WL_n0lO$N{utc38U-C}x668zXt0UYeK&LdAeTT!E zF}p9{{GLiDW3GnQY7+7#L%w9lmkjxm5xEtW#291)s>xoRd5#?nt^hi-YFbU@{@{vw zKsuFbUsDgwa0^0bwxxIv=*$o=8R8{R@yDDK1ulB4=f!@0RMpA+iCpL@7|@p7$oveK zdUTUB|3BbM-fUN5{OwLZE4t=b1QR0|PSU!t-d5LYr?K+;gvJ_c#l!P6Hk7#PXc&?e zhc@0nCB&4&V1$$A%t|!$eQ%exJzmpcl?sjr^> zbT)y3vc67AcpfN}PGDk{k@07W3FPyJIbhn?D^zNi!@dqAuu9jTlLs46GY+w>KPq^g zar%t7+>dFoo(A*ItD(h3%m7gTvXOku7EoU=)c$v7hDQqOrE>ldjlmcx!O`|Xp@jo6Uc^wv4vSR^=4 za+CU5`$9C!9IMzbhFpgh=9lSgDdHaNO1J1Ni15w?i~hQA#g-Az#Nxr;QfnBj7DO81Y{JlRXmRWzFEiw2?v%_b<-yTIWnoIyhyg6jZC*uZ z#80)?-Fd9~Z@ySgOce~ca!wZxg+4rpSFwW>^6JUkz~Y*%z(lOv=g3w6cPlq3{2_`* zq95HG)gw_GA%Qwk)!n$4kkRekiF)}6Y`Ohy3&9k+iJ`so*C)%Hpyv$oGDD1If&o3n zN5pg{`QC5|j0Ppv9`hJ&2VKcW`E4Gz7UR@!lSv6SKwf6Z%M5v$AuluHVNsNm?9rth zH|#Yim|FU5Qp>&k#p078B>8h~d1fE^b6~AI5w-66fG!kic;$aOW$tvLxWTI#sOQ|_a&aVKb=53bT9yjl zgGS?w`y+>oN-(P0QOd6YbKX(J6+%t!H3Fdu=tka*Z>!mA>)LYp@tG)SCU%t%Y?-20{&;Qk+!3YB%0_}-cgE+v&ZJ-BCI410N*<&j3=2MK2UH32m_Eln zoyZ4P38vMCu%}g=x&(QdAusb1GBuJQa+WP0<^>cT@6ha7y48cP?@4$62b%pbxBV`_ zla2Qnq5f#B`+o=U90yycI3_ak5v5bZX@4sR0R<8LC23&NK12XKcPA|D0-!*?7pyTy$gnnd9W$;{-N@QY=>me47~PPsqra%Ev%n<~_^s zz_-C-g73p46|STEm*K(j-y7Q){5{Jsm;b>{Z;26FEiw2-c2*3GCQT%e*_zpNuzS*aV&9mN|uV$Nc7QD z8J{b^*)3T@aOH7Xut`_gM`L)fa01Dk_phZ8V;N#BLyYDB3%tzeFf>>lMitUn0UMyp z`45UMSOj85?-B^K;@zpw+iJzb6~o*1GAFl2i-BI|{FD#zaIh6`@xDuvQoQWTtyVnr zr)jSzs_AaJSU>Gn2N}zkVM<QJW@wXa#|-b?4(@_+$8^MIo6fP^0eab!yg$%s-g%~>os#pOgs9TX-tFr zz>ZOc(!#m#*Df)-eWk9b|3Mxp8U5>V@y{K`^5C1d(wk3sqBO?BKQ2)7w3dt97@OV< z<<4R@Tmv%Ew_luC{%KT~M=bUH8L*^MKf#J3S9d(b?sm@_U&=j@kVHAW+lB%`pNRXR z?sjr4iAF+Q{JN$p{3#BD{KnY=&D*Z2CT;eDsVjp%LRnIMW`~EZ868ChwBqk5q8&|8 z;};Dc3IIy+v{c4KfO)NY^ymkV>p&@<0hJL@iuZ{dH_22L>qe5Pq%Tm4hx@2L>9%rt zs!DM0&%y^0RNvS~6d9*~4cR`!;?TW)&i8$P(9a&`;g|&RPa~?P+BezaK}eht{++b; zxCl$nj_1mkgrky)(eM~kW#m0MBFr8{jHTsBY=%_pusYfXr;rR%r^h5sk56P*XxHlH z2&Sd^=T@6tWR)&s`5YM466k4=--(4~c-aqK=b^axD96V)AAQ;H7Y-e_G%RZKIjj;v z6vz3Yh(Z2gyJQa*M|N;?F;E0T^fmoM`kLdYb_L0=bkb7Hk^+MVzX*j*Dv7S0Gms*6 z>ftfPI&x?lPNTDUr}m-^&4*axFoXGewyLfiDbDQYb5SRgCzaoy{)DgDbgg|Y@#Rf= zg9ROiFz1CRVdG!3t>WY!i|vxBUeRXKd?0+niOK@Bsy(WJ8J8(Fs=2LyZM*E`6VRi1 z;?U{0TFC?f9Y!auep=o=A#L`Bl-%b|r}gsYvFN^MCGV|loPr)(NgHB#y>als24Fs9 zXoNP`$nZtp4FToVMK`#Orhko8o#DAo5EEupEd3}tYjylsV9R!S^(Uj>+vU|?w{(Q+ z-`1vcb;g8NGFhyx!Ne`nCq*u+$^n^ZUU9#&+ioYrMwfu{>Wvk-Bn7al$yfz*JWQct zZmKpqZ)pCL@unonmu#TC`tTv~P1RFCc{SDfDB@Xr9Jv^D%B}M1gt|%w_&XHAwv{{E ziSA(d1XshLCR{R&E5=o*DVETxuIe~p+o3~faYr`Y3TfDg=G;F>z(~T_h|#G=apk<@ zT!PsUimm*3pGgW1j7M|MOC6ul5|iyuuiAGFZMK8FYK%$m#i`qc7SDlRHF%kS0P_h0 zgja2}ZH`&ZSz&?WIWMc(d{7Mj1K;E94Obn)W1-OXT#sn^)(p ztUyP$NWW2q3mQIV+5SvdCrDSV_3VT<5GHBKr{5~N=KQ+&XJ(ot z=baJRPsP0Ioc z%RFrZXR!_Yo)$BUgeU^T^Au@c49JZs$NAx%iA?{?VHe{H=$sJ7>$$PN4s+F)7iBOeCg=B&u>%Q7SGy^7OlE zo5EKIvDh{Pb;8o18-=lSu>&U+Co6h61}Rm4+-TrEN#g0vE0iOXdJ^6nN&JaDoY{z1 z=Qe@nJ)it=`$MBs9-E(;X7Ca!rRz;(^>Z{}vw1d5mNOO@-p6nSwMb67$TE5x5VI^> zvj*efF$-~ir7IaBtokzKr89_4r1K!xd)74Y7#=B`Z4upxBvZ!}?`YO+%*}e7n}=ZC z8QL?d`8Ky%TBJ5>-($DYwX$iLy`1U55k6AP9@Fgcf*|gD1OF-)#X1fp+E?Q9te4&# zvaz_#)?9P(1a+Zu=w*rZF9Aw+tDQt5FqlA^o=g5MhF-F{aI5+8oAI_>lr2q8#!u_I z=Y?Hciz2 zYnk~>%-PS&Ez9M<*Jtb%RUI%CS1KuO`>8hT9u#Estb| zPPYDPd8}qtwDAO8^5kkx7i>CFv26T|X2-`8HBUk7_00D?k7MvRw6wDv2=rSYzYsod zkutM>yFH5TY#selh+7)IuZ-5WbNyPFb4T49%1@SE*ksnv@ubaC%;_?Z<_UHS-#lLK zmp0JYGCZXCcJ)*1vu|`KZgjGS|NN|ImtpgE!?EG~#2^_LJ9l%%rHs)@Q`J@5+EurXzH`V?Z}g0G zx2s8=k}{Q>gX3KbYd7m~H`_utt4q#LR^05V+#QA7i%4Cat=;1;xw;p+d+XjY-eeD^mx(j5w+q$N#?;3>mD=8n`nLFnYCwHp=X}7X9gSD)n(5- zA+LN@uQ%ZWe%4;M!V__2F-Y^&jKfQN%toOMTFAejv_n2X&r*0e` z@t&ym@@DqAuHj7|>%;ZV$K;C7Q+iLdOWuPxS5vL84X{a=yYoy+icaYITw8diYwC-o z=_e%ad!5`*_?_Q;H_a*={R$OtVYRDcJS7^g)JENna$V}T(xMp8NoJ(|n8gFQb72&} z{HV{0P89lgYWn*!5w#TtkdFqCm_240BWFKLf!jmDEfdIl^C+C*~)oHmR5x zd)QB=l6@%*#QzX%ziDXpEhH-i<^4 z;fKVbrAUeok%vqpv-n?}A~ukok9hVfGW&hR&32KRvkFB=McaQV%AXRvD*3YA>4ior z*^B&FFR|WT$JC5^7aQgO>DYjc%TN!^Lp}kzA1|MgM6)|YJKU6<9HSh>6<$rfu*ps| zbC!m~C5q=%3?{!Ixl&BXyBDp~2{Xp(K4!Y~euD>>i2z55LKFjUfSN%NU24M@&Yb7@ya9uqd4 znm>aCIw2ck=oJX2!+Gc2Qv47=r-hL=5a{$Z$<#YH9s5L9S&3D6{o9UBf+M#)RmlfC z(k~phDtkQmrXOsG5tUj%NbLO&*N_b{)TYvOGOvzZJT7rqD&(t!W7#2%>sTbtea;{| z@6Ig)w*E)Q2^RVE*0-ZxnSwFmPbL>OSPBwbRE zxEZTz{zgydskq}$icqV*l_Womb$Dm=QwrNVFR6(2!4^Y~pg3P!N><4rsZ}MnrP`)tK2*5Qyt0y#{@g5aCU-iS+Rz*@;XA+ce_nLaDHe+1O*AK{*v9 zueEb)V?8GGsENg-0Y%!QUha8TwVb(vataeiK#7 za?X<`iCMwZr7O0o#^q}i*Nx17FL7?$!daWRu<-;ZO^m;*RnJzD0qnf@m~)<6NlYh4 zx#8-c>m0z>OENww21miKy;qSt5;I{(Rqe| zEj*jbqU+?bcRxSz(4a4=ig?QpAJZNQmPESu^s)#L?ma0@V$AHdhkui+O~z}HKR8_()!LYUF&SV}VR^^#FA4Su~G|A6l3L$~ww zGF@UlxxsV(5ggz6yu%q#=JKG0aES7durpQx{?Ce!)v!R$EQ8s713UA3pv) zTYGYIZ4vl-L9v@Cj?o~BX5%gzVS!&SD^$X3vEIr!CZ7cwOz38%0&iY>#0)jT1Q?+TZ4T~;(piI%r@$jGw5fw2S&kuKXAZcSaQhf$U+Ehw1 zB9k^BG*n7=k~SUeFgk1*c)iCdHbO3B(q`Vx#urH1)JoL^(3%CN@!gT;@u*j@1-@R^ z2p8y%%Jvh-0Ctl^4wd=_<>L8}9PdOf9ht^kz4M_V-t{a(>~(u>eM4;Ok|5W%fC` zgU&gi(QCaE_IR9YYE2x zE|Fx-DN=9Sn|!DZBco3e zJkYGsWba<)k9Y?KC%n#zH#dtZ1O0>1|?uWqHoO{1|yBC!8-fd=K z`F_4m;bMj>FNf@xoR2H>HLs$WXXK9Oe0DVnW11)9y-1`q;9n|6AOF+%dDLv*jAnH< z>4%dSZD(B_?UgEzc%)orp8poa6-v){2}Th5n`mt6=ks(iW3wZ9nndYXhq2jBZ{*CX z`6*SF3rrsoV5I%_u-KW{g;&<^O64G3`Y>5=+ngN#B_qZ~|hiqmOEwCavCVlXvbiv=lr;jiau zR@>Ya^5ZC*N2SgQ3!Z(NpFrRv2~synl!(==W$h^VG^WiFqY71 zTQ9xW;x-JfkL|r>A@HW4dCG{78e5?AO+oF{8|e zL@kzW*Hy5NaN*W%ED?WLlQ)o8`1)Oqt6b&EtjbS|jM*~IH&)Ll4om*-Pu5xCcPL*- zHa5<}7+C52WVFzMF-2?7IPBXDBa_Wc_>Z9Jd~t^hW4R|tBm6cu zR^Af-{+((yY;eM2aangg%#QAq{rx$+ySa9l-PAa$a%0Qv1SuR}3+#hbo-mwpxM%(> z_`W?~y!~l1``6?SZn3~u4NE{02d(Z=ij~t0ql%MO=Hf#R0s)RM>78J0juVUa#Ntkc zj!w^5rOp?UiFRLL!Xdp>ctTv&F*4AZ*}|Dq!;Z|&LF$|HwRk64RW>?n7j)vsw{)3X z$VudIM6QS5JXLV|Za4)e-0U6|#lu39d*LqhS6uxu+;HBxq@Hr6GUFk9$2~~uDuC{y ztm)=5=yvUsD^{`tYYL5pwd*L3gP}3|89Ros^1T42zc%{yg(s&Z10a`8vocZs9ps$ z3@ShL&*OOnB((*`KD^m!806|7+}Lb6)6HKoo0kmZ1mTLIutm_ zTt5_~B!vsZ9+%l^!S=<}2vbK-)&Ta$=ZQfW^=!<3+B+@SlgCs;URr=H*ytNIBhmI) z9HTML6i5>tn?&+gm*F`74QE!zASs|C<%5sMSkjB#0;#N#`%w|SLprJWkLo}Z-6lu+ zrI4=S@r=S@{q(GWmkogWjdkuyW+lbL$=sSWV1Go36@o50DFM&DE;=Aq$dl>0U4vbT zD_*)NT69-(x!v_<+1e7)ugsge&>mb-0sqm~gFenMIa@^}EvJl0qGDhgi+%4!P#*Pv zB6*mrvVTGDj|6lwoclvo&5D9y8eOb zkDdMTA5iuiZKM&v{@8!RPEC+3j#A!oEM>&`60kpJE#femAq%gyF})u)`CdqNv~6@^*yYF__!?V^a*4 zVBI@H+gXJAErL}>95L(6CKroGdVMRX{Y_$&wQArB8Z0(Fw#7PT$F2;h-zkp7fL}R- za5WI{D+|wgD0ypEUu6c=?+*g-!oj!hiGL=w?<--^5xq&ByNzd!NNQ&m5wjjjLF|uC zCRu(SvEqjxVU#W5CSaW*f)g5R!o}J>+oj76VGp^JlWnKW!oI7$&9AYZ|#qZp!$80RrbSso9s9$V1E>p zm7+GYxN>JL1uiYy9*8v=$0DzXXByKUTD+LZ>ys*{ zKK9I0C;6F@I>vf6tf4bW_>sx{leFu}fch;Z7opsoh994XRKG=VF5jf?%JWo8)s}xa zotDt`22j6EeA1EX_s=Zr=5)2?hEL_IKeO!#GSsmzcUMv`3v$uU1&oRj*P`o<=P`{U6=lEnA=y;W$+iVv& zmr}N0{YHPEi%`GA8o#7<^D_q;0_ykWuj99ti@Te%EDIXHPTK%#NgRIrB-T{hVp5b`x~7(H(DVgM+bOzFL3NzDrr18EWJj4ERPy?sei6>~gY#<7 z9hEFIIrH=fQx-+1;J$LbN|lant#)D10LmO zK1|$lv)Pbf_J-<2foM=di<&rpOk|!8{>F1X&tb|~w2!0hqO0r$y(GF{S#+=7pcaW% z%SS)w6CuYqYWI}+(QAn*;_F_kTJt|%rrxG}=;1QMWQ--2b#JOmW+4Kerr@4!N5H32 zQr}jsARwVCPo(YkzNf)gpxB>#s!bv?{*`6VYd%tW_(}h(;f{0_MUA~}z!Uv5Z-&NN17H zrQALrInY_O$MF8ZAmeF$jF)Dp9!rQ;6mY3F*m|p39nLoCjl8s`VAhNR>daW-dU>he zqMa# zzm7FmjnI1jN7SvInuPU1bXk;|gne)Ip9p{+8$5*8Q{ag4MdW9W?ZeGR{yQ{uAC?cO zohkYdreO5z$I3D9f7E(-eoyA3T&kykBOUM6ly(6FHK=Gb2VB zj_U(2)k9&%&!%Nw^p8i47a-p19j&J$!)C*OqZy1Aspl-QR-jXZmukPmSdti+OtTJ> zx9Bigb%V|cncRKy`vozfnK<6O2g&j4!I+ZW$v3_@IJ@-H;jLp{6WOHe*^j~of)WnYdI%q*0a{OEfOuZm z%Be(l2bm^K;8LxodE#^!5G@j3c;4m>Xgxr*2)I;tHzf%a)HfU1E=2B75*J>K$|ZwZ zk7e<~%UN$kd%JC~dDPL;WYOiZO%bWNEv*N9t1YbG{_$3O0tf)aTix)%*A_ulLA=!w ziwSJpQaWRFQc84Oc$YdDW);AwwRUjO2QwCjxPWC?QQ z3oek*^RB1NQMnSX~nouSAJKhveo z=k-?X!9rf{7f$7ijXmx9Zuv!l>3SF9dXI2hzRr2+u5-VHtLKL0mA?=GVhRXCmdQf|Nre9 zB6AEuZd`oe;fF;)aknA=z(#rXs{e!T)Z+Xax+L&ku=|EsUeB`)@vSl3+bEAHfH*r; z-J)^YJu3oZ*X@*D{MKs|*(mSNZb9a_)hItx_ZZPA59U)5-+N#_l|k?>_`OGWoq!9` z0D*ZI=-L?#u|>L_EZw6Y9dB{da3^aoD9;<4bkFHL7W#vIn?ZMly>AFQOZ^X&&=jYH$IcsaRGq|(12-X3tqb8!9Yguv6Q`9k z0qzBT)&tU4`8me+rv3H89iMJDm!+Iu(%pSSI8AL@^d~Y4hlR;8igPQ_qOi^D)ol@F*3Of_WzFD*qWjZ-V1>5Jq+cC zC{;UBlodNwJHQ(vE$Fxf<~j%?gG~EBgo~-MP+Yevs@T03{PDdvEkF?X+eYVyV~PFW z-VmNgeOa};Z-_!iTk*AGvF$fx3om{n_~gvmg2frcy#Q>0(8*q3`f|{{fG=Mh7+5q>0mkDpt5O0XOGhs{xR`F$9LjI@|465wZy55ddO>`2+W8Tfrs`HjI z;4lhr$5ZLUcyM48X|pcg=JfbFx*SK_XF<1`r2yaf_Rfs`7C#G6Z zJO}vR1LFRL<*ZldfO|n4MM2#k-+N@8U)$@XTE4~n1DOlkhD3yD-hb#OBPy9|J*h|r zd_xw$(e#HS?*;i+u_a_0u10|I)PwE?g-waz8=|%f+zS%!p*aC>NR(ngja<^6H^hTW z>*_)Ti_U4sab-+Rb6gss&T zR|riPd_%^*V9~V)0&j@;#61}qYEs`g3pS3YdN(yWz&FH#s|@_!>xfeDN)i?EyS$v3 z5<~qn1y0~|<~LvGCij_CGyU<433xXS;kB`~v=Jx(RJ>Nj{OMHRtPlt&O}dFjWGgp}r|W#r6{-w)qgpe8Rifr*`;sPUu%6Z9d?8&vxlm3_)fd)!|}$*zWkp0>*#!&iE%&)%=&|;yq?p z6uA!q_kP=IL`GDtCH>zI?){vK*Y`Jy*k#vC`#vE|{LkQX4WVQGp91%SpAg4-ShnRp z)bS6>eIcnvhEp)p9?mu#HJZ!$cP>@|J|Xs;i-pVV z{q~%Tj9s0*?3WIVnFGlkdV4U#3WpnmKq3*|3IB2aQxTGDyOZnneBJ>)L>Mi!LT>&VUA8PT4y(R z4^J;|A74NJfWV;OkkGL3=Mj-FUPeX7#Ky%ZBqk-Nr23GhWoBjPi0FZbpXjGU!v&`k_`~v1xPlLEv3T46O&cUQ?qmP3yVLOmREkQ{$5+( z*j(*Hquq8ERWq4@B%236+yRn}kR%14{+B{dyjs8RV0+rLY3TJqe|svD6(5T~+sZ{O z}B|Z)*`xOWGP3Ld#0^i)7EJSuofY@ z;%EeVJROExW8Rw*$`^xj(?bop=HfG#NMe;skX>>gU+I7N@%{)Jims5 z|9C1^M^8)0?{yaKeklN#p;Bac*RSgXa2etps$sog{I+4@{gZ{Z0xwCxS@g%3!X~P< zXzQ)G5QTgzf<)FAe<4UV{P;J~;ahUkZZP7{(-69!-L|!8>olZNcW{tx=QM=+RBT^{ z4ty#SGzTi-QbPvGe=vLl?9cM>qT`U*A6s^hKy#M#dxD=ZJ7478D$h!Ob0_(c$ zXZ=eTzB7C}B?F&M3Je9FitIBE^0xDS2)W6ntKP&XSICDpktUk5`dVdONLuNg56-6= zDZAR~a+);R@Arh=<@gXr!~P)HT1JliYhL((2J`8#n};9xRy}X>9#)D;jYq3g5?T~u z)X!&cHhSh9**E0%zEURa{u|8~L!C@Q4>elEW3FB4#_Z%J4{5XjPD4+gB)g?}Aifmv zJx6@mVp_uvq3^EK7=R>?;=Y8SyvP}8v9L7z9duuA&B*?zXLl6&9l(K_in0?hBQ-9O z$pMP|#0_^qk#8rvxV27eDyw;Xxna*>&zc2X&$rbS@Olo;$ki@QAnV&hWW1oqhMbY$ zhy<_aC?oPm=pD$#Vyn2xuUYii}o-4Thno>yJ*X9e7stM>@$ zFMS)`tEP-42miv}>VZcck(;vJQF#akjTr>x-Cn1C4GDaMQZ0raycOHGPVcxcpN&?g zA>EhYjFjFm-?L7)j`vmGC$s^|+U!COHz3z(yP2$Z72~q|M0ZfslxO)e-o|M!f$RCk z>g28>FDPQO?lR~DT+btKSZzud1KF{y5t)B{fn+N?_UDM)x}G}~WNu&2|Ko_wlAA-bB=QpvEbB6tMnod5ZcL6CEvYX>aZ$7hhVFItHc|9YLC zA)#ZFK0r-jR(`>Ta9{q9*J-e~NLoB_pCZpXz%(mxsIDVm5m4kGvR2tY1+V92-4K)) zb@xsdE(dq-9On1n?tKtN((@lEk}X$|6iMa(M3EH7!tL?I*tdK4DA8_bl63^s5i0#o zCi!nFJ?P4M-V9uN)4=|W+nHB4`x;(eF4#Wxg1fif;qBdWMxF?%sahwne+PtWNx_hy5*Ow*sdJs=VwzuGu=x zA>I|WPrr8Gm4v}TRFxhC=P3Vj8bH~-$xur`>F*OgVPm-8+Xq;YgDj6o>@tL!8O&-Fw@X1={*|PQ5@V8F}hOv1Nq< zyLUd3{m!X(|LzUCvUXK^#P0oA#iKSi0EtyX*1N zFpx>!c4cj=^m})2@X`xXB)RI)|H+nR_~!H{gN0^|C>MmSf5(<(xcFhhzn7YV*2Yig`m83LD;@=r6}WcqPxGQ z1tDbs;}juf6w|hV-5E&ZOmgwlZ7BnS^6r%~ASf?tNGjU((L~OxVynsgg4<$K79n20 zr>7&DcZ@R!bSk4r8Am1#gT|T7mAj2F`(HzdJ)LpM7Uk->G6FIlASf>c<=wt7UX(W4 zjuRjkSK;~OPU?;%rPeF^MB{VG3Z%H(qA{?z{vjHFn(Qb?6u*Ia)UD#T5-i`FG9Fut zs~1>I{=BceaqVX$maRo%;A7k``xDoaeKs4T7T@d)yNHF;M4Vn5fC>jGTMHfDs|7lU|6Y37!5sf1>oBtL^-4%@?DDNSY+L)nSKYM(w zv5gfT2+I5CUGE@m0fO=(M)V71mthbY&~igy*8(_m&fFeYhM#Z}0xt4qW1yX!oA%3nYVwv>uqZb z2b4Es>ly7C(QEfT1umHDw4B#L7jG5oNRimK06sM)k>zw(+aA%|Hu77mjX!O_KLc&# z7e;qHAo4kfjcSjv6`JiU{Mjv%`^~L^N(|T;(FYO(;`3uIJE}30MI4M82d`D5nFEk+1(K zTK~gckJtpSkl_M!q|jRxF&$# z7$gSZgq=^rx&YkuRNGh~DDRe;;s2oRIU<3mSzLCH?fK1Aw$@LMV=sTd`ExA=^;C=z zIz-GBTuav{ra?V*%l3>ERBdN=1yy7%&s)16_-m|y?OE!h7-)M|zvuz(rT4DDw)WD6 zD{dN(NsMq}U6E#nE#KR=nW6WiIv}W0UDIDYrn|eBB5cop9O@t_FV}n>69V$McP))b zlU-;Q8bQWfUo{?DLts(>Jr(dWSTy=@P3`x+A^V7TZO?PW{*>;AVtouVjrNzE?Z#YB z%1eGTFZWpa!o#(LN!d5_UNu>wDgfzP<`bSgu)Wcl^3HGN*e9RdsW|e_3cyU+0?iX- zbOwYxW`|CWUrrMP1b}GDFY}D`&$clsN9^V{4g)dQfATU=J~@UObKT>6JJ`zr^ps?} zi7nC)ZaVI*169#PAp5qDIc71QF zbHHBuSKr&s*T1g-wr3RI8yKAd4t4rTUP=Ga_WU1xZ%;hJ^Y%q&g8nan@Z)eJo!|k zd4JULJ^?zS?fB0F*nur-f5-^H{cC$(Bko@oNs;)-dA)o80%ZhXN0mtOeDoTl`bM@G zqru&bF3qrg{qZP1WvlzI{~@Nb&wQq4(;u}5Yt?cCCN?|X6pFWZUT^!9jRa)@pYnFp z(alg4@F{PZ&ss@Fd;5#TmO&_Q>X(k|8!N!P28|VduMbZjfVJZBIKDft2Wq{O|6Pk3 z2?-tE-GnVH0lh~tOBJ=|)MM1BBYqswmazhE=3hnNd$9RT^*N;pIIq7iXu)8oJ&^_S zKRYTxtQBg3d_rIF{GJ*$WYqERKIJzHrU2GzYhG{1RF3i}=Iy~+{rAQSdHTVe$m-`X zq1rJx8rd~8SPcEy$4)JefT*LDKI{4WQUWol=0Hqkq<1LQ3mH>6MvI2Nns%1CDFhS5 zTCKh^K1~Lilf@!gTihZN;x45oU%Kts<|8E&U+s}n!+VRu$rgw@8dAb9>0OmS%bz&H zKmkS_XhOv)zmP_NiR9l#R2W<33LJjIdYW16E* zB7h|Tpu9H{*K|$)*XHE3^o&0)dV9^u2a6cp5+%ZeBctz_$M)B3E=?c|5}-L*TyBF9 zsM#b^_H`vCD?%_&oK1bSl-prXHH% zmKacHwxxIv=**H##N+wnpK|UuMy=2DBDjYXv_lKifX?hjwxu(dbY$#a^p3h9vhYSB zXF#19dC>!P<_jaXd!q0^nd?zvjCmbu+t?alpSMiiZ59f@O+XDs;pr3}+;(T$x6jwG zF~VtEK!b!Mj<~P((RcURn%3EN_xXfPi6h)7&bvfG617yM^KQ!^G03O+To*J*Y-i#B zFeg9ZhV61|Qcmme{6~WXs`C!TAd!Ca*%SzE-*1or%ij@jx6i&jzya z{4wW50iAjEycjCChJpcY$&Ji!-vd#W5@SZ1BKFmKB-6^vVg}TiK@o$kLu>^w-ia!q zdG2Bl_wMsNrwMk9ce~ibU7ZJFTxR{6t*z4r3`Jxi$Z^&;vQfnc3tWZq2_~=>HpY@+G#VOfPk&mPd#j3-W#V z1m;+XkKiH75pE#oa&EVCs_!8#XBq*?9rsX;rv`+^~B+)7=EWhYa&{jSfq1On@iyt zktRonIm&SrE}I2W4ANqrCAcIny56qznhVInd(=MC$B9@3bBrD_mVNH%OLuP4p~UyzbOxr5RO9FGVpEaXc*Am;a{FZs|E0ou)h@6>??C zMyT!4qqL|NkFAHRHj{ITN@d3w$4o;J9lBJEAw3?FY|b_-iCx=6myTWgJ?8k%kkmdN z`^&!niO=Knc)y;n=ZmCfW~TgH;MStFXHfv#T+z3|eb|+e*XKFcIc2sxBg&~@@uodA zPUBm41Ij&%v zdn*;$w78-phnYgse^)Z-E~!@0blm1rTWFC+$(~R5KHKVBv?P&&w!ABCxW%*?`5s9f zh6b81N?yF>w56uB8j@$QJ>4IV1=e||&8*^RoS=CXb-0(>?dK@^S*?3*+EyN@7!oq? zRN(r$dw&G&LabiYNLKZX>c)Aj&k{4f4XbLtw3&U{WP}@hrLFDya=TK~cXuu|JL=Tx zpX0=)<$Aa8)M|`ct(>t(D=hd%ykIlZ@-9sc+iu^{ocpq}#JzN@zq;P72%_;r0jYco z(8@R7BTO=zN{?`&uR5^IGPn263(-Spj}X7T1Ir97GqB9SGEY>?p6EFRmU)W{YH$ia zB{KGYNyci~*mLSRD;(LY1D2U+>_w{~*yY2WQ}YqC_xR-lSY~392`sZhM5^hvTFZJt zbGiL=Grcc{q%Pwpw2BZ3VE7Uhroi@1SyuN(Gc&S7LU>;!gBNdN;c)DbbJU36A?D$` z=FXIpt_;-RWZvIXzs!o8l%2<6TYcA%sn$GV11z)X#tbYou*`0>>MN{U!@oAQi5 z2}cweRo>UYGT*;hgmNeG!heAi~3fH(8!%{3Z@o9qHc75 z!E(PRrP#I(CQHIxdFV2zp3TeQVJ=>VsjxT8qwwjimS0Lv^=Vv9b* zymK9o6w3I77;vcU^2^C$Kwz1r*Ux}u29_BSv;CI}XJDBTFPo}`vd$=FfN86w!q82& z;7Yq8;@BZM=nR028^V*Hg1aGnG%t@?Q4j9N70z7z(Mw$Ljv!{+7JI;Uh?jVDDPaa+ z++@!r;hy@&NYESdEp{^x;Z29_CEX8I&m55kT2!!FFK_7J4%;Y5zJ zmXEjTI4@o(j(IkSE))kdw~k?}hZ~vR8q^Ka8hVmWSWnZ%=x&WX%qWDd9?Iflf!RTN zi6VRqKk?4qdUYtrexMK4Rd|T2+qhBa;25yX;8>RUDu87M$MVYMq{g*#+oPGA6Sg?- zs%%a{Ru4ng>$*5JUZ+R-E^-_#S^1#Yt28Bw?Ko1h*iXM{tZI;{uS!{^nu5RU#{J5UaG)yho8|`bpzRGNhY{&)s5JwBQ>}aWNlqV zaDr6jk0i$@T@%$j63sug<^fzXaLMsXR-#6BsK4`6l=Z+RZ-3Pt<50U>X#SM_rVl%2 z`!AI-b_|an)u$fbz!J5>40bDY0$-pHeqf_8m1}+)6WZ;s~{idslKC;`XAGO~k)Dr=h zJnl0Lj%C8l8XU{-ce0^Dotq&xS_fRRjFSx<%fKZ!;bW*0XD2>}3XbIlk2s056CBHQ Xj(`2Cwu;;rye*Fo_), + }, /// view the status of a shuttle service Status, /// view the logs of a deployment in this shuttle service @@ -67,6 +79,8 @@ pub enum Command { /// Follow log output follow: bool, }, + /// remove artifacts that were generated by cargo + Clean, /// delete this shuttle service Delete, /// manage secrets for this shuttle service @@ -100,10 +114,14 @@ pub enum ProjectCommand { /// remove this project environment from shuttle Rm, /// show the status of this project's environment on shuttle - Status, + Status { + #[clap(short, long)] + /// Follow status of project command + follow: bool, + }, } -#[derive(Parser)] +#[derive(Parser, Clone, Debug)] pub struct LoginArgs { /// api key for the shuttle platform #[clap(long)] @@ -136,33 +154,44 @@ pub struct RunArgs { #[derive(Parser, Debug)] pub struct InitArgs { + /// Initialize with actix-web framework + #[clap(long="actix-web", conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] + pub actix_web: bool, /// Initialize with axum framework - #[clap(long, conflicts_with_all = &["rocket", "tide", "tower", "poem", "serenity", "warp", "salvo", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","rocket", "tide", "tower", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] pub axum: bool, /// Initialize with rocket framework - #[clap(long, conflicts_with_all = &["axum", "tide", "tower", "poem", "serenity", "warp", "salvo", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "tide", "tower", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] pub rocket: bool, /// Initialize with tide framework - #[clap(long, conflicts_with_all = &["axum", "rocket", "tower", "poem", "serenity", "warp", "salvo", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tower", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] pub tide: bool, /// Initialize with tower framework - #[clap(long, conflicts_with_all = &["axum", "rocket", "tide", "poem", "serenity", "warp", "salvo", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] pub tower: bool, /// Initialize with poem framework - #[clap(long, conflicts_with_all = &["axum", "rocket", "tide", "tower", "serenity", "warp", "salvo", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "serenity", "warp", "salvo", "thruster", "no-framework"])] pub poem: bool, /// Initialize with salvo framework - #[clap(long, conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "thruster", "no-framework"])] pub salvo: bool, /// Initialize with serenity framework - #[clap(long, conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "thruster", "no-framework"])] pub serenity: bool, /// Initialize with warp framework - #[clap(long, conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "serenity", "salvo", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "serenity", "salvo", "thruster", "no-framework"])] pub warp: bool, /// Initialize with thruster framework - #[clap(long, conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "no-framework"])] pub thruster: bool, + /// Initialize without a framework + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "thruster"])] + pub no_framework: bool, + /// Whether to create the environment for this project on Shuttle + #[clap(long)] + pub new: bool, + #[clap(flatten)] + pub login_args: LoginArgs, /// Path to initialize a new shuttle project #[clap( parse(try_from_os_str = parse_init_path), @@ -171,6 +200,36 @@ pub struct InitArgs { pub path: PathBuf, } +impl InitArgs { + pub fn framework(&self) -> Option { + if self.actix_web { + Some(Framework::ActixWeb) + } else if self.axum { + Some(Framework::Axum) + } else if self.rocket { + Some(Framework::Rocket) + } else if self.tide { + Some(Framework::Tide) + } else if self.tower { + Some(Framework::Tower) + } else if self.poem { + Some(Framework::Poem) + } else if self.salvo { + Some(Framework::Salvo) + } else if self.serenity { + Some(Framework::Serenity) + } else if self.warp { + Some(Framework::Warp) + } else if self.thruster { + Some(Framework::Thruster) + } else if self.no_framework { + Some(Framework::None) + } else { + None + } + } +} + // Helper function to parse and return the absolute path fn parse_path(path: &OsStr) -> Result { canonicalize(path).map_err(|e| { @@ -182,9 +241,60 @@ fn parse_path(path: &OsStr) -> Result { } // Helper function to parse, create if not exists, and return the absolute path -fn parse_init_path(path: &OsStr) -> Result { +pub(crate) fn parse_init_path(path: &OsStr) -> Result { // Create the directory if does not exist create_dir_all(path)?; parse_path(path) } + +#[cfg(test)] +mod tests { + use strum::IntoEnumIterator; + + use super::*; + + fn init_args_factory(framework: &str) -> InitArgs { + let mut init_args = InitArgs { + actix_web: false, + axum: false, + rocket: false, + tide: false, + tower: false, + poem: false, + salvo: false, + serenity: false, + warp: false, + thruster: false, + no_framework: false, + new: false, + login_args: LoginArgs { api_key: None }, + path: PathBuf::new(), + }; + + match framework { + "actix-web" => init_args.actix_web = true, + "axum" => init_args.axum = true, + "rocket" => init_args.rocket = true, + "tide" => init_args.tide = true, + "tower" => init_args.tower = true, + "poem" => init_args.poem = true, + "salvo" => init_args.salvo = true, + "serenity" => init_args.serenity = true, + "warp" => init_args.warp = true, + "thruster" => init_args.thruster = true, + "none" => init_args.no_framework = true, + _ => unreachable!(), + } + + init_args + } + + #[test] + fn test_init_args_framework() { + for framework in Framework::iter() { + let args = init_args_factory(&framework.to_string()); + assert_eq!(args.framework(), Some(framework)); + } + } +} diff --git a/cargo-shuttle/src/client.rs b/cargo-shuttle/src/client.rs index aea1f2d38..4f3c4c778 100644 --- a/cargo-shuttle/src/client.rs +++ b/cargo-shuttle/src/client.rs @@ -1,23 +1,19 @@ use std::fmt::Write; -use std::fs::File; -use std::io::Read; use anyhow::{Context, Result}; -use async_trait::async_trait; use headers::{Authorization, HeaderMapExt}; use reqwest::{Body, Response}; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware, RequestBuilder}; use reqwest_retry::policies::ExponentialBackoff; use reqwest_retry::RetryTransientMiddleware; -use serde::de::DeserializeOwned; use serde::Deserialize; -use shuttle_common::models::{deployment, error, project, secret, service, user}; +use shuttle_common::models::{deployment, project, secret, service, user, ToJson}; use shuttle_common::project::ProjectName; use shuttle_common::{ApiKey, ApiUrl, LogItem}; use tokio::net::TcpStream; use tokio_tungstenite::tungstenite::client::IntoClientRequest; use tokio_tungstenite::{connect_async, MaybeTlsStream, WebSocketStream}; -use tracing::{error, trace}; +use tracing::error; use uuid::Uuid; pub struct Client { @@ -25,35 +21,6 @@ pub struct Client { api_key: Option, } -#[async_trait] -trait ToJson { - async fn to_json(self) -> Result; -} - -#[async_trait] -impl ToJson for Response { - async fn to_json(self) -> Result { - let full = self.bytes().await?; - - trace!( - response = std::str::from_utf8(&full).unwrap_or_default(), - "parsing response to json" - ); - // try to deserialize into calling function response model - match serde_json::from_slice(&full) { - Ok(res) => Ok(res), - Err(_) => { - trace!("parsing response to common error"); - // if that doesn't work, try to deserialize into common error type - let res: error::ApiError = - serde_json::from_slice(&full).context("failed to parse response to JSON")?; - - Err(res.into()) - } - } - } -} - impl Client { pub fn new(api_url: ApiUrl) -> Self { Self { @@ -78,7 +45,7 @@ impl Client { pub async fn deploy( &self, - package_file: File, + data: Vec, project: &ProjectName, no_test: bool, ) -> Result { @@ -92,13 +59,7 @@ impl Client { let _ = write!(path, "?no-test"); } - let mut package_file = package_file; - let mut package_content = Vec::new(); - package_file - .read_to_end(&mut package_content) - .context("failed to convert package content to buf")?; - - self.post(path, Some(package_content)) + self.post(path, Some(data)) .await .context("failed to send deployment to the Shuttle server")? .to_json() @@ -145,6 +106,16 @@ impl Client { .await } + pub async fn clean_project(&self, project: &ProjectName) -> Result> { + let path = format!("/projects/{}/clean", project.as_str(),); + + self.post(path, Option::::None) + .await + .context("failed to get clean output")? + .to_json() + .await + } + pub async fn get_project(&self, project: &ProjectName) -> Result { let path = format!("/projects/{}", project.as_str()); @@ -258,6 +229,7 @@ impl Client { if let Some(body) = body { builder = builder.body(body); + builder = builder.header("Transfer-Encoding", "chunked"); } builder.send().await diff --git a/cargo-shuttle/src/config.rs b/cargo-shuttle/src/config.rs index a6bc12104..a364455b3 100644 --- a/cargo-shuttle/src/config.rs +++ b/cargo-shuttle/src/config.rs @@ -41,11 +41,13 @@ pub trait ConfigManager: Sized { C: for<'de> Deserialize<'de>, { let path = self.path(); - let config_bytes = File::open(&path).and_then(|mut f| { - let mut buf = Vec::new(); - f.read_to_end(&mut buf)?; - Ok(buf) - })?; + let config_bytes = File::open(&path) + .and_then(|mut f| { + let mut buf = Vec::new(); + f.read_to_end(&mut buf)?; + Ok(buf) + }) + .with_context(|| anyhow!("Unable to read configuration file: {}", path.display()))?; toml::from_slice(config_bytes.as_slice()) .with_context(|| anyhow!("Invalid global configuration file: {}", path.display())) } @@ -256,7 +258,9 @@ impl RequestContext { if !global.exists() { global.create()?; } - global.open()?; + global + .open() + .context("Unable to load global configuration")?; Ok(Self { global, project: None, diff --git a/cargo-shuttle/src/factory.rs b/cargo-shuttle/src/factory.rs index a4cf1c74f..fa9b5ff52 100644 --- a/cargo-shuttle/src/factory.rs +++ b/cargo-shuttle/src/factory.rs @@ -23,6 +23,7 @@ use shuttle_service::{database::Type, error::CustomError, Factory, ServiceName}; use std::{ collections::{BTreeMap, HashMap}, io::stdout, + path::PathBuf, time::Duration, }; use tokio::time::sleep; @@ -32,14 +33,20 @@ pub struct LocalFactory { docker: Docker, service_name: ServiceName, secrets: BTreeMap, + working_directory: PathBuf, } impl LocalFactory { - pub fn new(service_name: ServiceName, secrets: BTreeMap) -> Result { + pub fn new( + service_name: ServiceName, + secrets: BTreeMap, + working_directory: PathBuf, + ) -> Result { Ok(Self { docker: Docker::connect_with_local_defaults()?, service_name, secrets, + working_directory, }) } } @@ -176,6 +183,14 @@ impl Factory for LocalFactory { fn get_service_name(&self) -> ServiceName { self.service_name.clone() } + + fn get_build_path(&self) -> Result { + Ok(self.working_directory.clone()) + } + + fn get_storage_path(&self) -> Result { + Ok(self.working_directory.clone()) + } } impl LocalFactory { diff --git a/cargo-shuttle/src/init.rs b/cargo-shuttle/src/init.rs index d4309aa7e..ea09f305a 100644 --- a/cargo-shuttle/src/init.rs +++ b/cargo-shuttle/src/init.rs @@ -2,7 +2,6 @@ use std::fs::{read_to_string, File}; use std::io::Write; use std::path::{Path, PathBuf}; -use crate::args::InitArgs; use anyhow::Result; use cargo::ops::NewOptions; use cargo_edit::{find, get_latest_dependency, registry_url}; @@ -10,6 +9,43 @@ use indoc::indoc; use toml_edit::{value, Array, Document, Item, Table}; use url::Url; +#[derive(Clone, Copy, Debug, PartialEq, Eq, strum::Display, strum::EnumIter)] +#[strum(serialize_all = "kebab-case")] +pub enum Framework { + ActixWeb, + Axum, + Rocket, + Tide, + Tower, + Poem, + Salvo, + Serenity, + Warp, + Thruster, + None, +} + +impl Framework { + /// Returns a framework-specific struct that implements the trait `ShuttleInit` + /// for writing framework-specific dependencies to `Cargo.toml` and generating + /// boilerplate code in `src/lib.rs`. + pub fn init_config(&self) -> Box { + match self { + Framework::ActixWeb => Box::new(ShuttleInitActixWeb), + Framework::Axum => Box::new(ShuttleInitAxum), + Framework::Rocket => Box::new(ShuttleInitRocket), + Framework::Tide => Box::new(ShuttleInitTide), + Framework::Tower => Box::new(ShuttleInitTower), + Framework::Poem => Box::new(ShuttleInitPoem), + Framework::Salvo => Box::new(ShuttleInitSalvo), + Framework::Serenity => Box::new(ShuttleInitSerenity), + Framework::Warp => Box::new(ShuttleInitWarp), + Framework::Thruster => Box::new(ShuttleInitThruster), + Framework::None => Box::new(ShuttleInitNoOp), + } + } +} + pub trait ShuttleInit { fn set_cargo_dependencies( &self, @@ -21,6 +57,52 @@ pub trait ShuttleInit { fn get_boilerplate_code_for_framework(&self) -> &'static str; } +pub struct ShuttleInitActixWeb; + +impl ShuttleInit for ShuttleInitActixWeb { + fn set_cargo_dependencies( + &self, + dependencies: &mut Table, + manifest_path: &Path, + url: &Url, + get_dependency_version_fn: GetDependencyVersionFn, + ) { + set_key_value_dependency_version( + "actix-web", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); + + set_inline_table_dependency_features( + "shuttle-service", + dependencies, + vec!["web-actix-web".to_string()], + ); + } + + fn get_boilerplate_code_for_framework(&self) -> &'static str { + indoc! {r#" + use actix_web::{get, web::ServiceConfig}; + use shuttle_service::ShuttleActixWeb; + + #[get("/hello")] + async fn hello_world() -> &'static str { + "Hello World!" + } + + #[shuttle_service::main] + async fn actix_web( + ) -> ShuttleActixWeb { + Ok(move |cfg: &mut ServiceConfig| { + cfg.service(hello_world); + }) + }"#} + } +} + pub struct ShuttleInitAxum; impl ShuttleInit for ShuttleInitAxum { @@ -552,49 +634,6 @@ impl ShuttleInit for ShuttleInitNoOp { } } -/// Returns a framework-specific struct that implements the trait `ShuttleInit` -/// for writing framework-specific dependencies to `Cargo.toml` and generating -/// boilerplate code in `src/lib.rs`. -pub fn get_framework(init_args: &InitArgs) -> Box { - if init_args.axum { - return Box::new(ShuttleInitAxum); - } - - if init_args.rocket { - return Box::new(ShuttleInitRocket); - } - - if init_args.tide { - return Box::new(ShuttleInitTide); - } - - if init_args.tower { - return Box::new(ShuttleInitTower); - } - - if init_args.poem { - return Box::new(ShuttleInitPoem); - } - - if init_args.salvo { - return Box::new(ShuttleInitSalvo); - } - - if init_args.serenity { - return Box::new(ShuttleInitSerenity); - } - - if init_args.warp { - return Box::new(ShuttleInitWarp); - } - - if init_args.thruster { - return Box::new(ShuttleInitThruster); - } - - Box::new(ShuttleInitNoOp) -} - /// Interoprates with `cargo` crate and calls `cargo init --libs [path]`. pub fn cargo_init(path: PathBuf) -> Result<()> { let opts = NewOptions::new(None, false, true, path, None, None, None)?; @@ -610,7 +649,7 @@ pub fn cargo_init(path: PathBuf) -> Result<()> { } /// Performs shuttle init on the existing files generated by `cargo init --libs [path]`. -pub fn cargo_shuttle_init(path: PathBuf, framework: Box) -> Result<()> { +pub fn cargo_shuttle_init(path: PathBuf, framework: Framework) -> Result<()> { let cargo_toml_path = path.join("Cargo.toml"); let mut cargo_doc = read_to_string(cargo_toml_path.clone()) .unwrap() @@ -642,8 +681,10 @@ pub fn cargo_shuttle_init(path: PathBuf, framework: Box) -> Res get_latest_dependency_version, ); + let init_config = framework.init_config(); + // Set framework-specific dependencies to the `dependencies` table - framework.set_cargo_dependencies( + init_config.set_cargo_dependencies( &mut dependencies, &manifest_path, &url, @@ -658,7 +699,7 @@ pub fn cargo_shuttle_init(path: PathBuf, framework: Box) -> Res // Write boilerplate to `src/lib.rs` file let lib_path = path.join("src").join("lib.rs"); - let boilerplate = framework.get_boilerplate_code_for_framework(); + let boilerplate = init_config.get_boilerplate_code_for_framework(); if !boilerplate.is_empty() { write_lib_file(boilerplate, &lib_path)?; } @@ -740,36 +781,6 @@ pub fn write_lib_file(boilerplate: &'static str, lib_path: &Path) -> Result<()> mod shuttle_init_tests { use super::*; - fn init_args_factory(framework: &str) -> InitArgs { - let mut init_args = InitArgs { - axum: false, - rocket: false, - tide: false, - tower: false, - poem: false, - salvo: false, - serenity: false, - warp: false, - thruster: false, - path: PathBuf::new(), - }; - - match framework { - "axum" => init_args.axum = true, - "rocket" => init_args.rocket = true, - "tide" => init_args.tide = true, - "tower" => init_args.tower = true, - "poem" => init_args.poem = true, - "salvo" => init_args.salvo = true, - "serenity" => init_args.serenity = true, - "warp" => init_args.warp = true, - "thruster" => init_args.thruster = true, - _ => unreachable!(), - } - - init_args - } - fn cargo_toml_factory() -> Document { indoc! {r#" [dependencies] @@ -787,32 +798,6 @@ mod shuttle_init_tests { "1.0".to_string() } - #[test] - fn test_get_framework_via_get_boilerplate_code() { - let frameworks = vec![ - "axum", "rocket", "tide", "tower", "poem", "salvo", "serenity", "warp", "thruster", - ]; - let framework_inits: Vec> = vec![ - Box::new(ShuttleInitAxum), - Box::new(ShuttleInitRocket), - Box::new(ShuttleInitTide), - Box::new(ShuttleInitTower), - Box::new(ShuttleInitPoem), - Box::new(ShuttleInitSalvo), - Box::new(ShuttleInitSerenity), - Box::new(ShuttleInitWarp), - Box::new(ShuttleInitThruster), - ]; - - for (framework, expected_framework_init) in frameworks.into_iter().zip(framework_inits) { - let framework_init = get_framework(&init_args_factory(framework)); - assert_eq!( - framework_init.get_boilerplate_code_for_framework(), - expected_framework_init.get_boilerplate_code_for_framework(), - ); - } - } - #[test] fn test_set_inline_table_dependency_features() { let mut cargo_toml = cargo_toml_factory(); @@ -879,6 +864,37 @@ mod shuttle_init_tests { assert_eq!(cargo_toml.to_string(), expected); } + #[test] + fn test_set_cargo_dependencies_actix_web() { + let mut cargo_toml = cargo_toml_factory(); + let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); + let manifest_path = PathBuf::new(); + let url = Url::parse("https://shuttle.rs").unwrap(); + + set_inline_table_dependency_version( + "shuttle-service", + dependencies, + &manifest_path, + &url, + false, + mock_get_latest_dependency_version, + ); + + ShuttleInitActixWeb.set_cargo_dependencies( + dependencies, + &manifest_path, + &url, + mock_get_latest_dependency_version, + ); + + let expected = indoc! {r#" + [dependencies] + shuttle-service = { version = "1.0", features = ["web-actix-web"] } + actix-web = "1.0" + "#}; + + assert_eq!(cargo_toml.to_string(), expected); + } #[test] fn test_set_cargo_dependencies_axum() { diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 415cf0407..13236628a 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -4,28 +4,36 @@ pub mod config; mod factory; mod init; +use shuttle_common::project::ProjectName; use std::collections::BTreeMap; +use std::ffi::OsString; use std::fs::{read_to_string, File}; -use std::io::Write; -use std::io::{self, stdout}; +use std::io::stdout; use std::net::{Ipv4Addr, SocketAddr}; use std::path::{Path, PathBuf}; -use std::rc::Rc; - -use anyhow::{anyhow, Context, Result}; -pub use args::{Args, Command, DeployArgs, InitArgs, ProjectArgs, RunArgs}; -use args::{AuthArgs, LoginArgs}; -use cargo::core::resolver::CliFeatures; -use cargo::core::Workspace; -use cargo::ops::{PackageOpts, Packages}; + +use anyhow::{anyhow, bail, Context, Result}; +use args::AuthArgs; +pub use args::{Args, Command, DeployArgs, InitArgs, LoginArgs, ProjectArgs, RunArgs}; use cargo_metadata::Message; +use clap::CommandFactory; +use clap_complete::{generate, Shell}; use config::RequestContext; use crossterm::style::Stylize; +use dialoguer::{theme::ColorfulTheme, Confirm, FuzzySelect, Input, Password}; use factory::LocalFactory; +use flate2::write::GzEncoder; +use flate2::Compression; use futures::StreamExt; -use shuttle_common::models::secret; +use git2::{Repository, StatusOptions}; +use ignore::overrides::OverrideBuilder; +use ignore::WalkBuilder; +use shuttle_common::models::{project, secret}; use shuttle_service::loader::{build_crate, Loader, Runtime}; use shuttle_service::Logger; +use std::fmt::Write; +use strum::IntoEnumIterator; +use tar::Builder; use tokio::sync::mpsc; use tracing::trace; use uuid::Uuid; @@ -37,16 +45,10 @@ pub struct Shuttle { ctx: RequestContext, } -impl Default for Shuttle { - fn default() -> Self { - Self::new() - } -} - impl Shuttle { - pub fn new() -> Self { - let ctx = RequestContext::load_global().unwrap(); - Self { ctx } + pub fn new() -> Result { + let ctx = RequestContext::load_global()?; + Ok(Self { ctx }) } pub async fn run(mut self, mut args: Args) -> Result { @@ -57,6 +59,7 @@ impl Shuttle { | Command::Deployment(..) | Command::Project(..) | Command::Delete + | Command::Clean | Command::Secrets | Command::Status | Command::Logs { .. } @@ -65,13 +68,14 @@ impl Shuttle { self.load_project(&mut args.project_args)?; } + self.ctx.set_api_url(args.api_url); + match args.cmd { - Command::Init(init_args) => self.init(init_args).await, + Command::Init(init_args) => self.init(init_args, args.project_args).await, + Command::Generate { shell, output } => self.complete(shell, output).await, Command::Login(login_args) => self.login(login_args).await, Command::Run(run_args) => self.local_run(run_args).await, need_client => { - self.ctx.set_api_url(args.api_url); - let mut client = Client::new(self.ctx.api_url()); client.set_api_key(self.ctx.api_key()?); @@ -88,10 +92,13 @@ impl Shuttle { self.deployment_get(&client, id).await } Command::Delete => self.delete(&client).await, + Command::Clean => self.clean(&client).await, Command::Secrets => self.secrets(&client).await, Command::Auth(auth_args) => self.auth(auth_args, &client).await, Command::Project(ProjectCommand::New) => self.project_create(&client).await, - Command::Project(ProjectCommand::Status) => self.project_status(&client).await, + Command::Project(ProjectCommand::Status { follow }) => { + self.project_status(&client, follow).await + } Command::Project(ProjectCommand::Rm) => self.project_delete(&client).await, _ => { unreachable!("commands that don't need a client have already been matched") @@ -102,13 +109,100 @@ impl Shuttle { .map(|_| CommandOutcome::Ok) } - async fn init(&self, args: InitArgs) -> Result<()> { - // Interface with cargo to initialize new lib package for shuttle - let path = args.path.clone(); + /// Log in, initialize a project and potentially create the Shuttle environment for it. + /// + /// If both a project name and framework are passed as arguments, it will run without any extra + /// interaction. + async fn init(&mut self, args: InitArgs, mut project_args: ProjectArgs) -> Result<()> { + let interactive = project_args.name.is_none() || args.framework().is_none(); + + let theme = ColorfulTheme::default(); + + // 1. Log in (if not logged in yet) + if self.ctx.api_key().is_err() { + if interactive { + println!("First, let's log in to your Shuttle account."); + self.login(args.login_args.clone()).await?; + println!(); + } else if args.new && args.login_args.api_key.is_some() { + self.login(args.login_args.clone()).await?; + } else { + bail!("Tried to login to create a Shuttle environment, but no API key was set.") + } + } + + // 2. Ask for project name + if project_args.name.is_none() { + println!("How do you want to name your project? It will be hosted at ${{project_name}}.shuttleapp.rs."); + // TODO: Check whether the project name is still available + project_args.name = Some( + Input::with_theme(&theme) + .with_prompt("Project name") + .interact()?, + ); + println!(); + } + + // 3. Confirm the project directory + let path = if interactive { + println!("Where should we create this project?"); + let directory_str: String = Input::with_theme(&theme) + .with_prompt("Directory") + .default(".".to_owned()) + .interact()?; + println!(); + args::parse_init_path(&OsString::from(directory_str))? + } else { + args.path.clone() + }; + + // 4. Ask for the framework + let framework = match args.framework() { + Some(framework) => framework, + None => { + println!( + "Shuttle works with a range of web frameworks. Which one do you want to use?" + ); + let frameworks = init::Framework::iter().collect::>(); + let index = FuzzySelect::with_theme(&theme) + .items(&frameworks) + .default(0) + .interact()?; + println!(); + frameworks[index] + } + }; + + // 5. Initialize locally init::cargo_init(path.clone())?; + init::cargo_shuttle_init(path.clone(), framework)?; + println!(); + + // 6. Confirm that the user wants to create the project environment on Shuttle + let should_create_environment = if !interactive { + args.new + } else if args.new { + true + } else { + let should_create = Confirm::with_theme(&theme) + .with_prompt("Do you want to create the project environment on Shuttle?") + .default(true) + .interact()?; + + println!(); + should_create + }; + + if should_create_environment { + // Set the project working directory path to the init path, + // so `load_project` is ran with the correct project path + project_args.working_directory = path; - let framework = init::get_framework(&args); - init::cargo_shuttle_init(path, framework)?; + self.load_project(&mut project_args)?; + let mut client = Client::new(self.ctx.api_url()); + client.set_api_key(self.ctx.api_key()?); + self.project_create(&client).await?; + } Ok(()) } @@ -132,23 +226,21 @@ impl Shuttle { self.ctx.load_local(project_args) } + /// Log in with the given API key or after prompting the user for one. async fn login(&mut self, login_args: LoginArgs) -> Result<()> { - let api_key_str = login_args.api_key.unwrap_or_else(|| { - let url = "https://shuttle.rs/login"; - - let _ = webbrowser::open(url); - - println!("If your browser did not automatically open, go to {url}"); - print!("Enter Api Key: "); - - stdout().flush().unwrap(); - - let mut input = String::new(); + let api_key_str = match login_args.api_key { + Some(api_key) => api_key, + None => { + let url = "https://shuttle.rs/login"; + let _ = webbrowser::open(url); - io::stdin().read_line(&mut input).unwrap(); + println!("If your browser did not automatically open, go to {url}"); - input - }); + Password::with_theme(&ColorfulTheme::default()) + .with_prompt("API key") + .interact()? + } + }; let api_key = api_key_str.trim().parse()?; @@ -181,6 +273,17 @@ impl Shuttle { Ok(()) } + async fn complete(&self, shell: Shell, output: Option) -> Result<()> { + let name = env!("CARGO_PKG_NAME"); + let mut app = Command::command(); + match output { + Some(v) => generate(shell, &mut app, name, &mut File::create(v)?), + None => generate(shell, &mut app, name, &mut stdout()), + }; + + Ok(()) + } + async fn status(&self, client: &Client) -> Result<()> { let summary = client.get_service_summary(self.ctx.project_name()).await?; @@ -198,6 +301,18 @@ impl Shuttle { Ok(()) } + async fn clean(&self, client: &Client) -> Result<()> { + let lines = client.clean_project(self.ctx.project_name()).await?; + + for line in lines { + println!("{line}"); + } + + println!("Cleaning done!"); + + Ok(()) + } + async fn logs(&self, client: &Client, id: Option, follow: bool) -> Result<()> { let id = if let Some(id) = id { id @@ -254,7 +369,7 @@ impl Shuttle { trace!("starting a local run for a service: {run_args:?}"); let (tx, rx): (crossbeam_channel::Sender, _) = crossbeam_channel::bounded(0); - tokio::spawn(async move { + tokio::task::spawn_blocking(move || { while let Ok(message) = rx.recv() { match message { Message::TextLine(line) => println!("{line}"), @@ -300,7 +415,11 @@ impl Shuttle { let loader = Loader::from_so_file(so_path)?; - let mut factory = LocalFactory::new(self.ctx.project_name().clone(), secrets)?; + let mut factory = LocalFactory::new( + self.ctx.project_name().clone(), + secrets, + working_directory.to_path_buf(), + )?; let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), run_args.port); trace!("loading project"); @@ -323,7 +442,7 @@ impl Shuttle { handle.await??; - tokio::spawn(async move { + tokio::task::spawn_blocking(move || { trace!("closing so file"); so.close().unwrap(); }); @@ -332,12 +451,14 @@ impl Shuttle { } async fn deploy(&self, args: DeployArgs, client: &Client) -> Result { - let package_file = self - .run_cargo_package(args.allow_dirty) - .context("failed to package cargo project")?; + if !args.allow_dirty { + self.is_dirty()?; + } + + let data = self.make_archive()?; let deployment = client - .deploy(package_file, self.ctx.project_name(), args.no_test) + .deploy(data, self.ctx.project_name(), args.no_test) .await?; let mut stream = client @@ -392,57 +513,203 @@ impl Shuttle { } async fn project_create(&self, client: &Client) -> Result<()> { - let project = client.create_project(self.ctx.project_name()).await?; + self.wait_with_spinner( + &[project::State::Ready, project::State::Errored], + Client::create_project, + self.ctx.project_name(), + client, + ) + .await?; - println!("{project}"); + Ok(()) + } + + async fn project_status(&self, client: &Client, follow: bool) -> Result<()> { + match follow { + true => { + self.wait_with_spinner( + &[ + project::State::Ready, + project::State::Destroyed, + project::State::Errored, + ], + Client::get_project, + self.ctx.project_name(), + client, + ) + .await?; + } + false => { + let project = client.get_project(self.ctx.project_name()).await?; + println!("{project}"); + } + } Ok(()) } - async fn project_status(&self, client: &Client) -> Result<()> { - let project = client.get_project(self.ctx.project_name()).await?; + async fn wait_with_spinner<'a, F, Fut>( + &self, + states_to_check: &[project::State], + f: F, + project_name: &'a ProjectName, + client: &'a Client, + ) -> Result<(), anyhow::Error> + where + F: Fn(&'a Client, &'a ProjectName) -> Fut, + Fut: std::future::Future> + 'a, + { + let mut project = f(client, project_name).await?; + let pb = indicatif::ProgressBar::new_spinner(); + pb.enable_steady_tick(std::time::Duration::from_millis(350)); + pb.set_style( + indicatif::ProgressStyle::with_template("{spinner:.orange} {msg}") + .unwrap() + .tick_strings(&[ + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "( ●)", + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "(● )", + "(●●●●●●)", + ]), + ); + loop { + if states_to_check.contains(&project.state) { + break; + } + pb.set_message(format!("{project}")); + project = client.get_project(project_name).await?; + } + pb.finish_and_clear(); println!("{project}"); - Ok(()) } async fn project_delete(&self, client: &Client) -> Result<()> { - let project = client.delete_project(self.ctx.project_name()).await?; - - println!("{project}"); + self.wait_with_spinner( + &[project::State::Destroyed, project::State::Errored], + Client::delete_project, + self.ctx.project_name(), + client, + ) + .await?; Ok(()) } - // Packages the cargo project and returns a File to that file - fn run_cargo_package(&self, allow_dirty: bool) -> Result { - let config = cargo::util::config::Config::default()?; + fn make_archive(&self) -> Result> { + let encoder = GzEncoder::new(Vec::new(), Compression::fast()); + let mut tar = Builder::new(encoder); let working_directory = self.ctx.working_directory(); - let path = working_directory.join("Cargo.toml"); - - let ws = Workspace::new(&path, &config)?; - let opts = PackageOpts { - config: &config, - list: false, - check_metadata: true, - allow_dirty, - keep_going: false, - verify: false, - jobs: None, - to_package: Packages::Default, - targets: vec![], - cli_features: CliFeatures { - features: Rc::new(Default::default()), - all_features: false, - uses_default_features: true, - }, - }; + let base_directory = working_directory + .parent() + .context("get parent directory of crate")?; + + // Make sure the target folder is excluded at all times + let overrides = OverrideBuilder::new(working_directory) + .add("!target/") + .context("add `!target/` override")? + .build() + .context("build an override")?; + + for dir_entry in WalkBuilder::new(working_directory) + .hidden(false) + .overrides(overrides) + .build() + { + let dir_entry = dir_entry.context("get directory entry")?; + + // It's not possible to add a directory to an archive + if dir_entry.file_type().context("get file type")?.is_dir() { + continue; + } + + let path = dir_entry + .path() + .strip_prefix(base_directory) + .context("strip the base of the archive entry")?; + + tar.append_path_with_name(dir_entry.path(), path) + .context("archive entry")?; + } + + // Make sure to add any `Secrets.toml` files + let secrets_path = self.ctx.working_directory().join("Secrets.toml"); + if secrets_path.exists() { + tar.append_path_with_name(secrets_path, Path::new("shuttle").join("Secrets.toml"))?; + } - let locks = cargo::ops::package(&ws, &opts)?.expect("unwrap ok here"); - let owned = locks.get(0).unwrap().file().try_clone()?; - Ok(owned) + let encoder = tar.into_inner().context("get encoder from tar archive")?; + let bytes = encoder.finish().context("finish up encoder")?; + + Ok(bytes) + } + + fn is_dirty(&self) -> Result<()> { + let working_directory = self.ctx.working_directory(); + if let Ok(repo) = Repository::discover(working_directory) { + let repo_path = repo + .workdir() + .context("getting working directory of repository")? + .canonicalize()?; + + trace!(?repo_path, "found git repository"); + + let repo_rel_path = working_directory + .strip_prefix(repo_path.as_path()) + .context("stripping repository path from working directory")?; + + trace!( + ?repo_rel_path, + "got working directory path relative to git repository" + ); + + let mut status_options = StatusOptions::new(); + status_options + .pathspec(repo_rel_path) + .include_untracked(true); + + let statuses = repo + .statuses(Some(&mut status_options)) + .context("getting status of repository files")?; + + if !statuses.is_empty() { + let mut error: String = format!("{} files in the working directory contain changes that were not yet committed into git:", statuses.len()); + writeln!(error).expect("to append error"); + + for status in statuses.iter() { + trace!( + path = status.path(), + status = ?status.status(), + "found file with updates" + ); + + let path = + repo_path.join(status.path().context("getting path of changed file")?); + let rel_path = path + .strip_prefix(working_directory) + .expect("getting relative path of changed file") + .display(); + + writeln!(error, "{rel_path}").expect("to append error"); + } + + writeln!(error).expect("to append error"); + writeln!(error, "to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag").expect("to append error"); + + return Err(anyhow::Error::msg(error)); + } + } + + Ok(()) } } @@ -453,9 +720,16 @@ pub enum CommandOutcome { #[cfg(test)] mod tests { + use flate2::read::GzDecoder; + use shuttle_common::project::ProjectName; + use tar::Archive; + use tempfile::TempDir; + use crate::args::ProjectArgs; use crate::Shuttle; + use std::fs::{self, canonicalize}; use std::path::PathBuf; + use std::str::FromStr; fn path_from_workspace_root(path: &str) -> PathBuf { PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()) @@ -463,6 +737,33 @@ mod tests { .join(path) } + fn get_archive_entries(mut project_args: ProjectArgs) -> Vec { + let mut shuttle = Shuttle::new().unwrap(); + shuttle.load_project(&mut project_args).unwrap(); + + let archive = shuttle.make_archive().unwrap(); + + // Make sure the Secrets.toml file is not initially present + let tar = GzDecoder::new(&archive[..]); + let mut archive = Archive::new(tar); + + archive + .entries() + .unwrap() + .map(|entry| { + entry + .unwrap() + .path() + .unwrap() + .components() + .skip(1) + .collect::() + .display() + .to_string() + }) + .collect() + } + #[test] fn find_root_directory_returns_proper_directory() { let working_directory = path_from_workspace_root("examples/axum/hello-world/src"); @@ -482,7 +783,7 @@ mod tests { name: None, }; - let mut shuttle = Shuttle::new(); + let mut shuttle = Shuttle::new().unwrap(); Shuttle::load_project(&mut shuttle, &mut project_args).unwrap(); assert_eq!( @@ -490,4 +791,77 @@ mod tests { path_from_workspace_root("examples/axum/hello-world/") ); } + + #[test] + fn make_archive_include_secrets() { + let working_directory = + canonicalize(path_from_workspace_root("examples/rocket/secrets")).unwrap(); + + fs::write( + working_directory.join("Secrets.toml"), + "MY_API_KEY = 'the contents of my API key'", + ) + .unwrap(); + + let project_args = ProjectArgs { + working_directory, + name: None, + }; + + let mut entries = get_archive_entries(project_args); + entries.sort(); + + assert_eq!( + entries, + vec![ + ".gitignore", + "Cargo.toml", + "README.md", + "Secrets.toml", + "Secrets.toml.example", + "Shuttle.toml", + "src/lib.rs", + ] + ); + } + + #[test] + fn make_archive_respect_ignore() { + let tmp_dir = TempDir::new().unwrap(); + let working_directory = tmp_dir.path(); + + fs::write(working_directory.join(".env"), "API_KEY = 'blabla'").unwrap(); + fs::write(working_directory.join(".ignore"), ".env").unwrap(); + fs::write(working_directory.join("Cargo.toml"), "[package]").unwrap(); + + let project_args = ProjectArgs { + working_directory: working_directory.to_path_buf(), + name: Some(ProjectName::from_str("secret").unwrap()), + }; + + let mut entries = get_archive_entries(project_args); + entries.sort(); + + assert_eq!(entries, vec![".ignore", "Cargo.toml"]); + } + + #[test] + fn make_archive_ignore_target_folder() { + let tmp_dir = TempDir::new().unwrap(); + let working_directory = tmp_dir.path(); + + fs::create_dir_all(working_directory.join("target")).unwrap(); + fs::write(working_directory.join("target").join("binary"), "12345").unwrap(); + fs::write(working_directory.join("Cargo.toml"), "[package]").unwrap(); + + let project_args = ProjectArgs { + working_directory: working_directory.to_path_buf(), + name: Some(ProjectName::from_str("exclude_target").unwrap()), + }; + + let mut entries = get_archive_entries(project_args); + entries.sort(); + + assert_eq!(entries, vec!["Cargo.toml"]); + } } diff --git a/cargo-shuttle/src/main.rs b/cargo-shuttle/src/main.rs index fc4f83b5c..a80e1ca15 100644 --- a/cargo-shuttle/src/main.rs +++ b/cargo-shuttle/src/main.rs @@ -6,7 +6,7 @@ use clap::Parser; async fn main() -> Result<()> { tracing_subscriber::fmt::init(); - let result = Shuttle::new().run(Args::parse()).await; + let result = Shuttle::new()?.run(Args::parse()).await; if matches!(result, Ok(CommandOutcome::DeploymentFailure)) { // Deployment failure results in a shell error exit code being returned (this allows diff --git a/cargo-shuttle/tests/integration/init.rs b/cargo-shuttle/tests/integration/init.rs index 370001605..45551314a 100644 --- a/cargo-shuttle/tests/integration/init.rs +++ b/cargo-shuttle/tests/integration/init.rs @@ -1,97 +1,177 @@ -use std::{ - fs::read_to_string, - path::{Path, PathBuf}, -}; +use std::fs::read_to_string; +use std::path::Path; +use std::process::Command; -use cargo_shuttle::{Args, Command, CommandOutcome, InitArgs, ProjectArgs, Shuttle}; +use cargo_shuttle::{Args, Shuttle}; +use clap::Parser; use indoc::indoc; use tempfile::Builder; -/// creates a `cargo-shuttle` init instance with some reasonable defaults set. -async fn cargo_shuttle_init(path: PathBuf) -> anyhow::Result { - let working_directory = Path::new(".").to_path_buf(); - - Shuttle::new() - .run(Args { - api_url: Some("http://shuttle.invalid:80".to_string()), - project_args: ProjectArgs { - working_directory, - name: None, - }, - cmd: Command::Init(InitArgs { - axum: false, - rocket: false, - tide: false, - tower: false, - poem: false, - salvo: false, - serenity: false, - warp: false, - thruster: false, - path, - }), - }) - .await -} - -/// creates a `cargo-shuttle` init instance for initializing the `rocket` framework -async fn cargo_shuttle_init_framework(path: PathBuf) -> anyhow::Result { - let working_directory = Path::new(".").to_path_buf(); - - Shuttle::new() - .run(Args { - api_url: Some("http://shuttle.invalid:80".to_string()), - project_args: ProjectArgs { - working_directory, - name: None, - }, - cmd: Command::Init(InitArgs { - axum: false, - rocket: true, - tide: false, - tower: false, - poem: false, - salvo: false, - serenity: false, - warp: false, - thruster: false, - path, - }), - }) - .await -} - #[tokio::test] -async fn basic_init() { +async fn non_interactive_basic_init() { let temp_dir = Builder::new().prefix("basic-init").tempdir().unwrap(); let temp_dir_path = temp_dir.path().to_owned(); - cargo_shuttle_init(temp_dir_path.clone()).await.unwrap(); - let cargo_toml = read_to_string(temp_dir_path.join("Cargo.toml")).unwrap(); + let args = Args::parse_from([ + "cargo-shuttle", + "--api-url", + "http://shuttle.invalid:80", + "init", + "--api-key", + "fake-api-key", + "--name", + "my-project", + "--no-framework", + temp_dir_path.to_str().unwrap(), + ]); + Shuttle::new().unwrap().run(args).await.unwrap(); + let cargo_toml = read_to_string(temp_dir_path.join("Cargo.toml")).unwrap(); // Expected: name = "basic-initRANDOM_CHARS" assert!(cargo_toml.contains("name = \"basic-init")); assert!(cargo_toml.contains("shuttle-service = { version = ")); } #[tokio::test] -async fn framework_init() { +async fn non_interactive_rocket_init() { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); let temp_dir_path = temp_dir.path().to_owned(); - cargo_shuttle_init_framework(temp_dir_path.clone()) - .await - .unwrap(); + let args = Args::parse_from([ + "cargo-shuttle", + "--api-url", + "http://shuttle.invalid:80", + "init", + "--api-key", + "fake-api-key", + "--name", + "my-project", + "--rocket", + temp_dir_path.to_str().unwrap(), + ]); + Shuttle::new().unwrap().run(args).await.unwrap(); + + assert_valid_rocket_project(temp_dir_path.as_path(), "rocket-init"); +} - let cargo_toml = read_to_string(temp_dir_path.join("Cargo.toml")).unwrap(); +#[test] +fn interactive_rocket_init() -> Result<(), Box> { + let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); + let temp_dir_path = temp_dir.path().to_owned(); + + let bin_path = assert_cmd::cargo::cargo_bin("cargo-shuttle"); + let mut command = Command::new(bin_path); + command.args([ + "--api-url", + "http://shuttle.invalid:80", + "init", + "--api-key", + "fake-api-key", + ]); + let mut session = rexpect::session::spawn_command(command, Some(2000))?; + + session.exp_string( + "How do you want to name your project? It will be hosted at ${project_name}.shuttleapp.rs.", + )?; + session.exp_string("Project name")?; + session.send_line("my-project")?; + session.exp_string("Where should we create this project?")?; + session.exp_string("Directory")?; + session.send_line(temp_dir_path.to_str().unwrap())?; + session.exp_string( + "Shuttle works with a range of web frameworks. Which one do you want to use?", + )?; + // Partial input should be enough to match "rocket" + session.send_line("roc")?; + session.exp_string("Do you want to create the project environment on Shuttle?")?; + session.send("y")?; + session.flush()?; + session.exp_string("yes")?; + + assert_valid_rocket_project(temp_dir_path.as_path(), "rocket-init"); + + Ok(()) +} + +#[test] +fn interactive_rocket_init_dont_prompt_framework() -> Result<(), Box> { + let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); + let temp_dir_path = temp_dir.path().to_owned(); + + let bin_path = assert_cmd::cargo::cargo_bin("cargo-shuttle"); + let mut command = Command::new(bin_path); + command.args([ + "--api-url", + "http://shuttle.invalid:80", + "init", + "--api-key", + "fake-api-key", + "--rocket", + ]); + let mut session = rexpect::session::spawn_command(command, Some(2000))?; + + session.exp_string( + "How do you want to name your project? It will be hosted at ${project_name}.shuttleapp.rs.", + )?; + session.exp_string("Project name")?; + session.send_line("my-project")?; + session.exp_string("Where should we create this project?")?; + session.exp_string("Directory")?; + session.send_line(temp_dir_path.to_str().unwrap())?; + session.exp_string("Do you want to create the project environment on Shuttle?")?; + session.send("y")?; + session.flush()?; + session.exp_string("yes")?; + + assert_valid_rocket_project(temp_dir_path.as_path(), "rocket-init"); + + Ok(()) +} + +#[test] +fn interactive_rocket_init_dont_prompt_name() -> Result<(), Box> { + let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); + let temp_dir_path = temp_dir.path().to_owned(); + + let bin_path = assert_cmd::cargo::cargo_bin("cargo-shuttle"); + let mut command = Command::new(bin_path); + command.args([ + "--api-url", + "http://shuttle.invalid:80", + "init", + "--api-key", + "fake-api-key", + "--name", + "my-project", + ]); + let mut session = rexpect::session::spawn_command(command, Some(2000))?; + + session.exp_string("Where should we create this project?")?; + session.exp_string("Directory")?; + session.send_line(temp_dir_path.to_str().unwrap())?; + session.exp_string( + "Shuttle works with a range of web frameworks. Which one do you want to use?", + )?; + // Partial input should be enough to match "rocket" + session.send_line("roc")?; + session.exp_string("Do you want to create the project environment on Shuttle?")?; + session.send("y")?; + session.flush()?; + session.exp_string("yes")?; + + assert_valid_rocket_project(temp_dir_path.as_path(), "rocket-init"); + + Ok(()) +} - // Expected: name = "rocket-initRANDOM_CHARS" - assert!(cargo_toml.contains("name = \"rocket-init")); +fn assert_valid_rocket_project(path: &Path, name_prefix: &str) { + let cargo_toml = read_to_string(path.join("Cargo.toml")).unwrap(); + assert!(cargo_toml.contains(&format!("name = \"{name_prefix}"))); assert!(cargo_toml.contains("shuttle-service = { version = ")); assert!(cargo_toml.contains("features = [\"web-rocket\"]")); assert!(cargo_toml.contains("rocket = ")); - let lib_file = read_to_string(temp_dir_path.join("src").join("lib.rs")).unwrap(); + let lib_file = read_to_string(path.join("src").join("lib.rs")).unwrap(); let expected = indoc! {r#" #[macro_use] extern crate rocket; diff --git a/cargo-shuttle/tests/integration/main.rs b/cargo-shuttle/tests/integration/main.rs index c21561713..accb9c4ae 100644 --- a/cargo-shuttle/tests/integration/main.rs +++ b/cargo-shuttle/tests/integration/main.rs @@ -12,6 +12,7 @@ async fn cargo_shuttle_command( let working_directory = Path::new(working_directory).to_path_buf(); Shuttle::new() + .unwrap() .run(Args { api_url: Some("http://shuttle.invalid:80".to_string()), project_args: ProjectArgs { diff --git a/cargo-shuttle/tests/integration/run.rs b/cargo-shuttle/tests/integration/run.rs index d928c4f55..318145ffb 100644 --- a/cargo-shuttle/tests/integration/run.rs +++ b/cargo-shuttle/tests/integration/run.rs @@ -10,7 +10,7 @@ async fn cargo_shuttle_run(working_directory: &str) -> u16 { let port = pick_unused_port().unwrap(); let run_args = RunArgs { port }; - let runner = Shuttle::new().run(Args { + let runner = Shuttle::new().unwrap().run(Args { api_url: Some("http://shuttle.invalid:80".to_string()), project_args: ProjectArgs { working_directory: working_directory.clone(), @@ -168,6 +168,22 @@ async fn rocket_authentication() { ); } +#[tokio::test(flavor = "multi_thread")] +async fn actix_web_hello_world() { + let port = cargo_shuttle_run("../examples/actix-web/hello-world").await; + + let request_text = reqwest::Client::new() + .get(format!("http://localhost:{port}/hello")) + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + + assert_eq!(request_text, "Hello World!"); +} + #[tokio::test(flavor = "multi_thread")] async fn axum_hello_world() { let port = cargo_shuttle_run("../examples/axum/hello-world").await; diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index df1bb4d26..00b26b436 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "shuttle-codegen" -version = "0.7.0" -edition = "2021" -license = "Apache-2.0" +version = "0.8.0" +edition.workspace = true +license.workspace = true description = "Proc-macro code generator for the shuttle.rs service" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -11,10 +11,10 @@ proc-macro = true [dependencies] proc-macro-error = "1.0.4" -proc-macro2 = "1.0.43" +proc-macro2 = "1.0.47" quote = "1.0.21" -syn = { version = "1.0.99", features = ["full", "extra-traits"] } +syn = { version = "1.0.104", features = ["full", "extra-traits"] } [dev-dependencies] -pretty_assertions = "1.2.1" -trybuild = "1.0.64" +pretty_assertions = "1.3.0" +trybuild = "1.0.72" diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index 384e19373..2adc85247 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -1,5 +1,5 @@ -mod main; mod next; +mod shuttle_main; use next::App; use proc_macro::TokenStream; @@ -9,7 +9,7 @@ use syn::{parse_macro_input, File}; #[proc_macro_error] #[proc_macro_attribute] pub fn main(attr: TokenStream, item: TokenStream) -> TokenStream { - main::r#impl(attr, item) + shuttle_main::r#impl(attr, item) } #[proc_macro_error] diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index 27dc3a71f..f0983bc18 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -87,10 +87,7 @@ impl Endpoint { Ok(params) => params, Err(err) => { // This will error on invalid parameter syntax - emit_error!( - err.span(), - err - ); + emit_error!(err.span(), err); return None; } }; diff --git a/codegen/src/main/mod.rs b/codegen/src/shuttle_main/mod.rs similarity index 91% rename from codegen/src/main/mod.rs rename to codegen/src/shuttle_main/mod.rs index be3939920..c8a03d1da 100644 --- a/codegen/src/main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -20,7 +20,8 @@ pub(crate) fn r#impl(_attr: TokenStream, item: TokenStream) -> TokenStream { addr: std::net::SocketAddr, runtime: &shuttle_service::Runtime, ) -> shuttle_service::ServeHandle { - runtime.spawn(async move { service.bind(addr).await }) + use shuttle_service::Context; + runtime.spawn(async move { service.bind(addr).await.context("failed to bind service").map_err(Into::into) }) } #fn_decl @@ -228,6 +229,7 @@ impl ToTokens for Wrapper { runtime: &shuttle_service::Runtime, logger: shuttle_service::Logger, ) -> Result, shuttle_service::Error> { + use shuttle_service::Context; use shuttle_service::tracing_subscriber::prelude::*; #extra_imports @@ -249,15 +251,15 @@ impl ToTokens for Wrapper { .into_panic() .downcast_ref::<&str>() .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()); + .unwrap_or_else(|| "panicked setting logger".to_string()); shuttle_service::Error::BuildPanic(mes) } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e)) + shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to set logger")) } })?; - #(let #fn_inputs = #fn_inputs_builder::new()#fn_inputs_builder_options.build(#factory_ident, runtime).await?;)* + #(let #fn_inputs = #fn_inputs_builder::new()#fn_inputs_builder_options.build(#factory_ident, runtime).await.context(format!("failed to provision {}", stringify!(#fn_inputs_builder)))?;)* runtime.spawn(async { #fn_ident(#(#fn_inputs),*) @@ -271,11 +273,11 @@ impl ToTokens for Wrapper { .into_panic() .downcast_ref::<&str>() .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()); + .unwrap_or_else(|| "panicked calling main".to_string()); shuttle_service::Error::BuildPanic(mes) } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e)) + shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to call main")) } })? } @@ -320,6 +322,7 @@ mod tests { runtime: &shuttle_service::Runtime, logger: shuttle_service::Logger, ) -> Result, shuttle_service::Error> { + use shuttle_service::Context; use shuttle_service::tracing_subscriber::prelude::*; runtime.spawn_blocking(move || { let filter_layer = @@ -339,11 +342,11 @@ mod tests { .into_panic() .downcast_ref::<&str>() .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()); + .unwrap_or_else(|| "panicked setting logger".to_string()); shuttle_service::Error::BuildPanic(mes) } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e)) + shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to set logger")) } })?; @@ -359,11 +362,11 @@ mod tests { .into_panic() .downcast_ref::<&str>() .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()); + .unwrap_or_else(|| "panicked calling main".to_string()); shuttle_service::Error::BuildPanic(mes) } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e)) + shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to call main")) } })? } @@ -432,6 +435,7 @@ mod tests { runtime: &shuttle_service::Runtime, logger: shuttle_service::Logger, ) -> Result, shuttle_service::Error> { + use shuttle_service::Context; use shuttle_service::tracing_subscriber::prelude::*; use shuttle_service::ResourceBuilder; @@ -453,16 +457,16 @@ mod tests { .into_panic() .downcast_ref::<&str>() .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()); + .unwrap_or_else(|| "panicked setting logger".to_string()); shuttle_service::Error::BuildPanic(mes) } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e)) + shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to set logger")) } })?; - let pool = shuttle_shared_db::Postgres::new().build(factory, runtime).await?; - let redis = shuttle_shared_db::Redis::new().build(factory, runtime).await?; + let pool = shuttle_shared_db::Postgres::new().build(factory, runtime).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; + let redis = shuttle_shared_db::Redis::new().build(factory, runtime).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Redis)))?; runtime.spawn(async { complex(pool, redis) @@ -476,11 +480,11 @@ mod tests { .into_panic() .downcast_ref::<&str>() .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()); + .unwrap_or_else(|| "panicked calling main".to_string()); shuttle_service::Error::BuildPanic(mes) } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e)) + shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to call main")) } })? } @@ -593,6 +597,7 @@ mod tests { runtime: &shuttle_service::Runtime, logger: shuttle_service::Logger, ) -> Result, shuttle_service::Error> { + use shuttle_service::Context; use shuttle_service::tracing_subscriber::prelude::*; use shuttle_service::ResourceBuilder; @@ -614,15 +619,15 @@ mod tests { .into_panic() .downcast_ref::<&str>() .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()); + .unwrap_or_else(|| "panicked setting logger".to_string()); shuttle_service::Error::BuildPanic(mes) } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e)) + shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to set logger")) } })?; - let pool = shuttle_shared_db::Postgres::new().size("10Gb").public(false).build(factory, runtime).await?; + let pool = shuttle_shared_db::Postgres::new().size("10Gb").public(false).build(factory, runtime).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; runtime.spawn(async { complex(pool) @@ -636,11 +641,11 @@ mod tests { .into_panic() .downcast_ref::<&str>() .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()); + .unwrap_or_else(|| "panicked calling main".to_string()); shuttle_service::Error::BuildPanic(mes) } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e)) + shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to call main")) } })? } diff --git a/codegen/tests/ui/next/invalid-endpoint-syntax.stderr b/codegen/tests/ui/next/invalid-endpoint-syntax.stderr index 478bd56aa..b1fad595a 100644 --- a/codegen/tests/ui/next/invalid-endpoint-syntax.stderr +++ b/codegen/tests/ui/next/invalid-endpoint-syntax.stderr @@ -1,16 +1,10 @@ error: expected `,` - - = help: - --> tests/ui/next/invalid-endpoint-syntax.rs:2:64 | 2 | #[shuttle_codegen::endpoint(method = get, route = "/hello" extra = abundant)] | ^^^^^ error: expected `=` - - = help: - --> tests/ui/next/invalid-endpoint-syntax.rs:7:74 | 7 | #[shuttle_codegen::endpoint(method = get, route = "/goodbye", invalid)] diff --git a/common/Cargo.toml b/common/Cargo.toml index c54827c57..cdd16765b 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,30 +1,33 @@ [package] name = "shuttle-common" -version = "0.7.0" -edition = "2021" -license = "Apache-2.0" +version.workspace = true +edition.workspace = true +license.workspace = true description = "Common library for the shuttle platform (https://www.shuttle.rs/)" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -chrono = { version = "0.4.22", features = ["serde"] } -comfy-table = { version = "6.1.0", optional = true } +anyhow = { workspace = true, optional = true } +async-trait = { workspace = true , optional = true } +axum = { workspace = true, optional = true } +chrono = { workspace = true, features = ["serde"] } +comfy-table = { version = "6.1.3", optional = true } crossterm = { version = "0.25.0", optional = true } http = { version = "0.2.8", optional = true } http-serde = { version = "1.1.2", optional = true } hyper = { version = "0.14.23", optional = true } -once_cell = "1.13.1" +once_cell = { workspace = true } +reqwest = { version = "0.11.13", optional = true } rmp-serde = { version = "1.1.1", optional = true } -rustrict = "0.5.0" -serde = { version = "1.0.143", features = ["derive"] } -serde_json = { version = "1.0.85", optional = true } +rustrict = "0.5.5" +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true, optional = true } strum = { version = "0.24.1", features = ["derive"] } -tracing = "0.1.36" -uuid = { version = "1.1.1", features = ["v4", "serde"] } +tracing = { workspace = true } +uuid = { workspace = true, features = ["v4", "serde"] } [features] -default = ["models"] - -models = ["display", "serde_json", "http"] +backend = ["async-trait", "axum"] display = ["comfy-table", "crossterm"] axum-wasm = ["http-serde", "hyper", "rmp-serde"] +models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json"] diff --git a/common/src/backends/metrics.rs b/common/src/backends/metrics.rs new file mode 100644 index 000000000..9dabc5a1c --- /dev/null +++ b/common/src/backends/metrics.rs @@ -0,0 +1,35 @@ +use std::{collections::HashMap, convert::Infallible}; + +use async_trait::async_trait; +use axum::extract::{FromRequestParts, Path}; +use axum::http::request::Parts; +use tracing::Span; + +/// Used to record a bunch of metrics info +/// The tracing layer on the server should record a `request.params.` field for each parameter +/// that should be recorded +pub struct Metrics; + +#[async_trait] +impl FromRequestParts for Metrics +where + S: Send + Sync, +{ + type Rejection = Infallible; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + // Get path parameters if they exist + let Path(path): Path> = + match Path::from_request_parts(parts, state).await { + Ok(path) => path, + Err(_) => return Ok(Metrics), + }; + + let span = Span::current(); + + for (param, value) in path { + span.record(format!("request.params.{param}").as_str(), value); + } + Ok(Metrics) + } +} diff --git a/common/src/backends/mod.rs b/common/src/backends/mod.rs new file mode 100644 index 000000000..e14488328 --- /dev/null +++ b/common/src/backends/mod.rs @@ -0,0 +1 @@ +pub mod metrics; diff --git a/common/src/lib.rs b/common/src/lib.rs index 6d44adf67..6443b90a3 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -1,9 +1,12 @@ +#[cfg(feature = "backend")] +pub mod backends; pub mod database; pub mod deployment; pub mod log; #[cfg(feature = "models")] pub mod models; pub mod project; +pub mod storage_manager; #[cfg(feature = "axum-wasm")] pub mod wasm; diff --git a/common/src/models/error.rs b/common/src/models/error.rs index 5e5677925..7b20d5571 100644 --- a/common/src/models/error.rs +++ b/common/src/models/error.rs @@ -4,6 +4,7 @@ use comfy_table::Color; use crossterm::style::Stylize; use http::StatusCode; use serde::{Deserialize, Serialize}; +use tracing::{error, warn}; #[derive(Serialize, Deserialize, Debug)] pub struct ApiError { @@ -44,9 +45,13 @@ pub enum ErrorKind { ProjectAlreadyExists, ProjectNotReady, ProjectUnavailable, + CustomDomainNotFound, + InvalidCustomDomain, + CustomDomainAlreadyExists, InvalidOperation, Internal, NotReady, + ServiceUnavailable, } impl From for ApiError { @@ -54,6 +59,10 @@ impl From for ApiError { let (status, error_message) = match kind { ErrorKind::Internal => (StatusCode::INTERNAL_SERVER_ERROR, "internal server error"), ErrorKind::KeyMissing => (StatusCode::UNAUTHORIZED, "request is missing a key"), + ErrorKind::ServiceUnavailable => ( + StatusCode::SERVICE_UNAVAILABLE, + "we're experiencing a high workload right now, please try again in a little bit", + ), ErrorKind::KeyMalformed => (StatusCode::BAD_REQUEST, "request has an invalid key"), ErrorKind::BadHost => (StatusCode::BAD_REQUEST, "the 'Host' header is invalid"), ErrorKind::UserNotFound => (StatusCode::NOT_FOUND, "user not found"), @@ -66,7 +75,18 @@ impl From for ApiError { ErrorKind::ProjectUnavailable => { (StatusCode::BAD_GATEWAY, "project returned invalid response") } - ErrorKind::InvalidProjectName => (StatusCode::BAD_REQUEST, "invalid project name"), + ErrorKind::InvalidProjectName => ( + StatusCode::BAD_REQUEST, + r#" + Invalid project name. Project name must: + 1. start and end with alphanumeric characters. + 2. only contain lowercase characters. + 3. only contain characters inside of the alphanumeric range, except for `-`. + 4. not be empty. + 5. be shorter than 63 characters. + 6. not contain profanity. + 7. not be a reserved word."#, + ), ErrorKind::InvalidOperation => ( StatusCode::BAD_REQUEST, "the requested operation is invalid", @@ -75,6 +95,11 @@ impl From for ApiError { StatusCode::BAD_REQUEST, "a project with the same name already exists", ), + ErrorKind::InvalidCustomDomain => (StatusCode::BAD_REQUEST, "invalid custom domain"), + ErrorKind::CustomDomainNotFound => (StatusCode::NOT_FOUND, "custom domain not found"), + ErrorKind::CustomDomainAlreadyExists => { + (StatusCode::BAD_REQUEST, "custom domain already in use") + } ErrorKind::Unauthorized => (StatusCode::UNAUTHORIZED, "unauthorized"), ErrorKind::Forbidden => (StatusCode::FORBIDDEN, "forbidden"), ErrorKind::NotReady => (StatusCode::INTERNAL_SERVER_ERROR, "service not ready"), @@ -85,3 +110,40 @@ impl From for ApiError { } } } + +impl From for ApiError { + fn from(code: StatusCode) -> Self { + let message = match code { + StatusCode::OK | StatusCode::ACCEPTED | StatusCode::FOUND | StatusCode::SWITCHING_PROTOCOLS => { + unreachable!("we should not have an API error with a successfull status code") + } + StatusCode::FORBIDDEN => "this request is not allowed", + StatusCode::UNAUTHORIZED => { + "we were unable to authorize your request. Is your key still valid?" + }, + StatusCode::INTERNAL_SERVER_ERROR => "our server was unable to handle your request. A ticket should be created for us to fix this.", + StatusCode::SERVICE_UNAVAILABLE => "we're experiencing a high workload right now, please try again in a little bit", + StatusCode::BAD_REQUEST => { + warn!("responding to a BAD_REQUEST request with an unhelpful message. Use ErrorKind instead"); + "this request is invalid" + }, + StatusCode::NOT_FOUND => { + warn!("responding to a NOT_FOUND request with an unhelpful message. Use ErrorKind instead"); + "we don't serve this resource" + }, + StatusCode::BAD_GATEWAY => { + warn!("got a bad response from a deployer"); + "response from deployer is invalid. Please create a ticket to report this" + }, + _ => { + error!(%code, "got an unexpected status code"); + "an unexpected error occured. Please create a ticket to report this" + }, + }; + + Self { + message: message.to_string(), + status_code: code.as_u16(), + } + } +} diff --git a/common/src/models/mod.rs b/common/src/models/mod.rs index cd7acedf6..0236c641d 100644 --- a/common/src/models/mod.rs +++ b/common/src/models/mod.rs @@ -4,4 +4,47 @@ pub mod project; pub mod resource; pub mod secret; pub mod service; +pub mod stats; pub mod user; + +use anyhow::{Context, Result}; +use async_trait::async_trait; +use http::StatusCode; +use serde::de::DeserializeOwned; +use tracing::trace; + +#[async_trait] +pub trait ToJson { + async fn to_json(self) -> Result; +} + +#[async_trait] +impl ToJson for reqwest::Response { + async fn to_json(self) -> Result { + let status_code = self.status(); + let full = self.bytes().await?; + + trace!( + response = std::str::from_utf8(&full).unwrap_or_default(), + "parsing response to json" + ); + + if matches!( + status_code, + StatusCode::OK | StatusCode::SWITCHING_PROTOCOLS + ) { + serde_json::from_slice(&full).context("failed to parse a successfull response") + } else { + trace!("parsing response to common error"); + let res: error::ApiError = match serde_json::from_slice(&full) { + Ok(res) => res, + _ => { + trace!("getting error from status code"); + status_code.into() + } + }; + + Err(res.into()) + } + } +} diff --git a/common/src/models/project.rs b/common/src/models/project.rs index 12cf1cfc8..171c4e46a 100644 --- a/common/src/models/project.rs +++ b/common/src/models/project.rs @@ -46,3 +46,9 @@ impl State { } } } + +#[derive(Deserialize, Serialize)] +pub struct AdminResponse { + pub project_name: String, + pub account_name: String, +} diff --git a/common/src/models/stats.rs b/common/src/models/stats.rs new file mode 100644 index 000000000..a4a5035d4 --- /dev/null +++ b/common/src/models/stats.rs @@ -0,0 +1,13 @@ +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +#[derive(Deserialize, Serialize)] +pub struct LoadRequest { + pub id: Uuid, +} + +#[derive(Deserialize, Serialize)] +pub struct LoadResponse { + pub builds_count: usize, + pub has_capacity: bool, +} diff --git a/common/src/storage_manager.rs b/common/src/storage_manager.rs new file mode 100644 index 000000000..5a5fa1300 --- /dev/null +++ b/common/src/storage_manager.rs @@ -0,0 +1,69 @@ +use std::{fs, io, path::PathBuf}; + +use uuid::Uuid; + +/// Manager to take care of directories for storing project, services and deployment files +#[derive(Clone)] +pub struct StorageManager { + artifacts_path: PathBuf, +} + +impl StorageManager { + pub fn new(artifacts_path: PathBuf) -> Self { + Self { artifacts_path } + } + + /// Path of the directory that contains extracted service Cargo projects. + pub fn builds_path(&self) -> Result { + let builds_path = self.artifacts_path.join("shuttle-builds"); + fs::create_dir_all(&builds_path)?; + + Ok(builds_path) + } + + /// Path for a specific service + pub fn service_build_path>(&self, service_name: S) -> Result { + let builds_path = self.builds_path()?.join(service_name.as_ref()); + fs::create_dir_all(&builds_path)?; + + Ok(builds_path) + } + + /// The directory in which compiled '.so' files are stored. + pub fn libraries_path(&self) -> Result { + let libs_path = self.artifacts_path.join("shuttle-libs"); + fs::create_dir_all(&libs_path)?; + + Ok(libs_path) + } + + /// Path to `.so` for a service + pub fn deployment_library_path(&self, deployment_id: &Uuid) -> Result { + let library_path = self.libraries_path()?.join(deployment_id.to_string()); + + Ok(library_path) + } + + /// Path of the directory to store user files + pub fn storage_path(&self) -> Result { + let storage_path = self.artifacts_path.join("shuttle-storage"); + fs::create_dir_all(&storage_path)?; + + Ok(storage_path) + } + + /// Path to folder for storing deployment files + pub fn deployment_storage_path>( + &self, + service_name: S, + deployment_id: &Uuid, + ) -> Result { + let storage_path = self + .storage_path()? + .join(service_name.as_ref()) + .join(deployment_id.to_string()); + fs::create_dir_all(&storage_path)?; + + Ok(storage_path) + } +} diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index d7c575d17..db2804a32 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -1,60 +1,61 @@ [package] name = "shuttle-deployer" -version = "0.7.0" -edition = "2021" +version.workspace = true +edition.workspace = true +license.workspace = true description = "Service with instances created per project for handling the compilation, loading, and execution of Shuttle services" [dependencies] -anyhow = "1.0.58" -async-trait = "0.1.56" -axum = { version = "0.5.7", features = ["ws"] } -bytes = "1.1.0" -cargo = "0.64.0" -cargo_metadata = "0.15.0" -chrono = "0.4.22" +anyhow = { workspace = true } +async-trait = { workspace = true } +axum = { workspace = true, features = ["ws"] } +bytes = "1.3.0" +# TODO: debug the libgit2-sys conflict with cargo-edit when upgrading cargo to 0.66 +cargo = "0.65.0" +cargo_metadata = "0.15.2" +chrono = { workspace = true } clap = { version = "3.2.8", features = ["derive"] } crossbeam-channel = "0.5.6" -flate2 = "1.0.24" -fqdn = "0.2.2" -futures = "0.3.21" -hyper = { version = "0.14.20", features = ["client", "http1", "http2", "tcp" ] } +flate2 = "1.0.25" +fqdn = "0.2.3" +futures = "0.3.25" +hyper = { version = "0.14.23", features = ["client", "http1", "http2", "tcp" ] } # not great, but waiting for WebSocket changes to be merged hyper-reverse-proxy = { git = "https://github.com/chesedo/hyper-reverse-proxy", branch = "master" } -once_cell = "1.14.0" -opentelemetry = { version = "0.17.0", features = ["rt-tokio"] } -opentelemetry-datadog = { version = "0.5.0", features = ["reqwest-client"] } +once_cell = { workspace = true } +opentelemetry = { version = "0.18.0", features = ["rt-tokio"] } +opentelemetry-datadog = { version = "0.6.0", features = ["reqwest-client"] } +opentelemetry-http = "0.7.0" pipe = "0.4.0" -serde = "1.0.137" -serde_json = "1.0.81" -sqlx = { version = "0.6.0", features = ["runtime-tokio-native-tls", "sqlite", "chrono", "json", "migrate", "uuid"] } +serde = { workspace = true } +serde_json = { workspace = true } +sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "sqlite", "chrono", "json", "migrate", "uuid"] } strum = { version = "0.24.1", features = ["derive"] } tar = "0.4.38" -thiserror = "1.0.24" -tokio = { version = "1.19.2", features = ["fs", "process"] } +thiserror = { workspace = true } +tokio = { version = "1.22.0", features = ["fs", "process"] } toml = "0.5.9" -tonic = "0.8.2" -tower = { version = "0.4.12", features = ["make"] } +tonic = "0.8.3" +tower = { version = "0.4.13", features = ["make"] } tower-http = { version = "0.3.4", features = ["auth", "trace"] } -tracing = "0.1.35" -tracing-opentelemetry = "0.17.4" -tracing-subscriber = { version = "0.3.11", features = ["env-filter"] } -uuid = { version = "1.1.2", features = ["v4"] } +tracing = { workspace = true } +tracing-opentelemetry = "0.18.0" +tracing-subscriber = { workspace = true, features = ["env-filter"] } +uuid = { workspace = true, features = ["v4"] } [dependencies.shuttle-common] -version = "0.7.0" -path = "../common" +workspace = true +features= ["backend", "models"] [dependencies.shuttle-proto] -version = "0.7.0" -path = "../proto" +workspace = true [dependencies.shuttle-service] -version = "0.7.0" -path = "../service" -features = ["loader"] +workspace = true +features = ["loader", "codegen"] [dev-dependencies] -ctor = "0.1.22" +ctor = "0.1.26" hex = "0.4.3" rand = "0.8.5" tempdir = "0.3.7" diff --git a/deployer/prepare.sh b/deployer/prepare.sh new file mode 100755 index 000000000..70eac8a23 --- /dev/null +++ b/deployer/prepare.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env sh + +############################################################################### +# This file is used by our common Containerfile incase the container for this # +# service might need some extra preparation steps for its final image # +############################################################################### + +# Patch crates to be on same versions +mkdir -p $CARGO_HOME; \ +echo '[patch.crates-io] +shuttle-service = { path = "/usr/src/shuttle/service" } +shuttle-aws-rds = { path = "/usr/src/shuttle/resources/aws-rds" } +shuttle-persist = { path = "/usr/src/shuttle/resources/persist" } +shuttle-shared-db = { path = "/usr/src/shuttle/resources/shared-db" } +shuttle-secrets = { path = "/usr/src/shuttle/resources/secrets" } +shuttle-static-folder = { path = "/usr/src/shuttle/resources/static-folder" }' > $CARGO_HOME/config.toml + +# Make future crates requests to our own mirror +echo ' +[source.shuttle-crates-io-mirror] +registry = "http://panamax:8080/git/crates.io-index" +[source.crates-io] +replace-with = "shuttle-crates-io-mirror"' >> $CARGO_HOME/config.toml + +# Prefetch crates.io index from our mirror +# TODO: restore when we know how to prefetch from our mirror +# cd /usr/src/shuttle/service +# cargo fetch diff --git a/deployer/src/args.rs b/deployer/src/args.rs index 2950d1f23..87b467bbc 100644 --- a/deployer/src/args.rs +++ b/deployer/src/args.rs @@ -2,7 +2,8 @@ use std::{net::SocketAddr, path::PathBuf}; use clap::Parser; use fqdn::FQDN; -use shuttle_common::Port; +use hyper::Uri; +use shuttle_common::{project::ProjectName, Port}; /// Program to handle the deploys for a single project /// Handling includes, building, testing, and running each service @@ -33,6 +34,14 @@ pub struct Args { #[clap(long, default_value = "0.0.0.0:8000")] pub proxy_address: SocketAddr, + /// Address to reach gateway's control plane at + #[clap(long, default_value = "http://gateway:8001")] + pub gateway_uri: Uri, + + /// Project being served by this deployer + #[clap(long)] + pub project: ProjectName, + /// Secret that will be used to perform admin tasks on this deployer #[clap(long)] pub admin_secret: String, diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index f74d5039d..6cbf3edbb 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -400,7 +400,6 @@ mod tests { use axum::body::Bytes; use ctor::ctor; use flate2::{write::GzEncoder, Compression}; - use futures::FutureExt; use shuttle_proto::runtime::runtime_client::RuntimeClient; use tokio::{select, time::sleep}; use tonic::transport::Channel; @@ -409,7 +408,8 @@ mod tests { use crate::{ deployment::{ - deploy_layer::LogType, ActiveDeploymentsGetter, Built, DeploymentManager, Queued, + deploy_layer::LogType, gateway_client::BuildQueueClient, ActiveDeploymentsGetter, + Built, DeploymentManager, Queued, }, persistence::{SecretRecorder, State}, }; @@ -516,15 +516,29 @@ mod tests { } } + #[derive(Clone)] + struct StubBuildQueueClient; + + #[async_trait::async_trait] + impl BuildQueueClient for StubBuildQueueClient { + async fn get_slot( + &self, + _id: Uuid, + ) -> Result { + Ok(true) + } + + async fn release_slot( + &self, + _id: Uuid, + ) -> Result<(), crate::deployment::gateway_client::Error> { + Ok(()) + } + } + #[tokio::test(flavor = "multi_thread")] async fn deployment_to_be_queued() { - let deployment_manager = DeploymentManager::new( - get_runtime_client().await, - RECORDER.clone(), - RECORDER.clone(), - StubActiveDeploymentGetter, - PathBuf::from("/tmp"), - ); + let deployment_manager = get_deployment_manager().await; let queued = get_queue("sleep-async"); let id = queued.id; @@ -583,7 +597,7 @@ mod tests { }; select! { - _ = sleep(Duration::from_secs(120)) => { + _ = sleep(Duration::from_secs(180)) => { panic!("states should go into 'Running' for a valid service"); } _ = test => {} @@ -636,13 +650,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn deployment_self_stop() { - let deployment_manager = DeploymentManager::new( - get_runtime_client().await, - RECORDER.clone(), - RECORDER.clone(), - StubActiveDeploymentGetter, - PathBuf::from("/tmp"), - ); + let deployment_manager = get_deployment_manager().await; let queued = get_queue("self-stop"); let id = queued.id; @@ -706,7 +714,7 @@ mod tests { }; select! { - _ = sleep(Duration::from_secs(120)) => { + _ = sleep(Duration::from_secs(180)) => { panic!("states should go into 'Completed' when a service stops by itself"); } _ = test => {} @@ -715,13 +723,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn deployment_bind_panic() { - let deployment_manager = DeploymentManager::new( - get_runtime_client().await, - RECORDER.clone(), - RECORDER.clone(), - StubActiveDeploymentGetter, - PathBuf::from("/tmp"), - ); + let deployment_manager = get_deployment_manager().await; let queued = get_queue("bind-panic"); let id = queued.id; @@ -785,7 +787,7 @@ mod tests { }; select! { - _ = sleep(Duration::from_secs(120)) => { + _ = sleep(Duration::from_secs(180)) => { panic!("states should go into 'Crashed' panicing in bind"); } _ = test => {} @@ -794,13 +796,7 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn deployment_main_panic() { - let deployment_manager = DeploymentManager::new( - get_runtime_client().await, - RECORDER.clone(), - RECORDER.clone(), - StubActiveDeploymentGetter, - PathBuf::from("/tmp"), - ); + let deployment_manager = get_deployment_manager().await; let queued = get_queue("main-panic"); let id = queued.id; @@ -859,7 +855,7 @@ mod tests { }; select! { - _ = sleep(Duration::from_secs(120)) => { + _ = sleep(Duration::from_secs(180)) => { panic!("states should go into 'Crashed' when panicing in main"); } _ = test => {} @@ -868,13 +864,7 @@ mod tests { #[tokio::test] async fn deployment_from_run() { - let deployment_manager = DeploymentManager::new( - get_runtime_client().await, - RECORDER.clone(), - RECORDER.clone(), - StubActiveDeploymentGetter, - PathBuf::from("/tmp"), - ); + let deployment_manager = get_deployment_manager().await; let id = Uuid::new_v4(); deployment_manager @@ -882,6 +872,7 @@ mod tests { id, service_name: "run-test".to_string(), service_id: Uuid::new_v4(), + tracing_context: Default::default(), }) .await; @@ -921,13 +912,7 @@ mod tests { #[tokio::test] async fn scope_with_nil_id() { - let deployment_manager = DeploymentManager::new( - get_runtime_client().await, - RECORDER.clone(), - RECORDER.clone(), - StubActiveDeploymentGetter, - PathBuf::from("/tmp"), - ); + let deployment_manager = get_deployment_manager().await; let id = Uuid::nil(); deployment_manager @@ -935,8 +920,9 @@ mod tests { id, service_name: "nil_id".to_string(), service_id: Uuid::new_v4(), - data_stream: Box::pin(async { Ok(Bytes::from("violets are red")) }.into_stream()), + data: Bytes::from("violets are red").to_vec(), will_run_tests: false, + tracing_context: Default::default(), }) .await; @@ -952,6 +938,17 @@ mod tests { ); } + async fn get_deployment_manager() -> DeploymentManager { + DeploymentManager::builder() + .build_log_recorder(RECORDER.clone()) + .secret_recorder(RECORDER.clone()) + .active_deployment_getter(StubActiveDeploymentGetter) + .artifacts_path(PathBuf::from("/tmp")) + .runtime(get_runtime_client().await) + .queue_client(StubBuildQueueClient) + .build() + } + fn get_queue(name: &str) -> Queued { let enc = GzEncoder::new(Vec::new(), Compression::fast()); let mut tar = tar::Builder::new(enc); @@ -978,8 +975,9 @@ mod tests { id: Uuid::new_v4(), service_name: format!("deploy-layer-{name}"), service_id: Uuid::new_v4(), - data_stream: Box::pin(async { Ok(Bytes::from(bytes)) }.into_stream()), + data: bytes, will_run_tests: false, + tracing_context: Default::default(), } } } diff --git a/deployer/src/deployment/gateway_client.rs b/deployer/src/deployment/gateway_client.rs new file mode 100644 index 000000000..61846e4a6 --- /dev/null +++ b/deployer/src/deployment/gateway_client.rs @@ -0,0 +1,108 @@ +use hyper::{body, client::HttpConnector, Body, Client, Method, Request, Uri}; +use serde::{de::DeserializeOwned, Serialize}; +use shuttle_common::models::stats; +use thiserror::Error; +use tracing::trace; +use uuid::Uuid; + +#[derive(Error, Debug)] +pub enum Error { + #[error("Hyper error: {0}")] + Hyper(#[from] hyper::Error), + #[error("Serde JSON error: {0}")] + SerdeJson(#[from] serde_json::Error), + #[error("Hyper error: {0}")] + Http(#[from] hyper::http::Error), +} + +/// A client that can communicate with the build queue +#[async_trait::async_trait] +pub trait BuildQueueClient: Clone + Send + Sync + 'static { + /// Try to get a build slot. A false returned value means that the spot could not be acquire + async fn get_slot(&self, id: Uuid) -> Result; + + /// Release a build slot that was previously acquired + async fn release_slot(&self, id: Uuid) -> Result<(), Error>; +} + +/// Handles all calls to gateway +#[derive(Clone)] +pub struct GatewayClient { + client: Client, + base: Uri, +} + +impl GatewayClient { + pub fn new(uri: Uri) -> Self { + Self { + client: Client::new(), + base: uri, + } + } + + /// Make a post request to a gateway endpoint + pub async fn post( + &self, + path: &str, + body: Option, + ) -> Result { + self.request(Method::POST, path, body).await + } + + /// Make a delete request to a gateway endpoint + pub async fn delete( + &self, + path: &str, + body: Option, + ) -> Result { + self.request(Method::DELETE, path, body).await + } + + async fn request( + &self, + method: Method, + path: &str, + body: Option, + ) -> Result { + let uri = format!("{}{path}", self.base); + trace!(uri, "calling gateway"); + + let req = Request::builder() + .method(method) + .uri(uri) + .header("Content-Type", "application/json"); + + let req = if let Some(body) = body { + req.body(Body::from(serde_json::to_vec(&body)?)) + } else { + req.body(Body::empty()) + }; + + let resp = self.client.request(req?).await?; + + trace!(response = ?resp, "Load response"); + + let body = resp.into_body(); + let bytes = body::to_bytes(body).await?; + let json = serde_json::from_slice(&bytes)?; + + Ok(json) + } +} + +#[async_trait::async_trait] +impl BuildQueueClient for GatewayClient { + async fn get_slot(&self, id: Uuid) -> Result { + let body = stats::LoadRequest { id }; + let load: stats::LoadResponse = self.post("stats/load", Some(body)).await?; + + Ok(load.has_capacity) + } + + async fn release_slot(&self, id: Uuid) -> Result<(), Error> { + let body = stats::LoadRequest { id }; + let _load: stats::LoadResponse = self.delete("stats/load", Some(body)).await?; + + Ok(()) + } +} diff --git a/deployer/src/deployment/mod.rs b/deployer/src/deployment/mod.rs index 549f05ad6..c069e1e7f 100644 --- a/deployer/src/deployment/mod.rs +++ b/deployer/src/deployment/mod.rs @@ -1,4 +1,5 @@ pub mod deploy_layer; +pub mod gateway_client; mod queue; mod run; @@ -6,103 +7,93 @@ use std::path::PathBuf; pub use queue::Queued; pub use run::{ActiveDeploymentsGetter, Built}; +use shuttle_common::storage_manager::StorageManager; use shuttle_proto::runtime::runtime_client::RuntimeClient; use tonic::transport::Channel; -use tracing::instrument; +use tracing::{instrument, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; use crate::persistence::{SecretRecorder, State}; use tokio::sync::{broadcast, mpsc}; use uuid::Uuid; -use self::deploy_layer::LogRecorder; +use self::{deploy_layer::LogRecorder, gateway_client::BuildQueueClient}; const QUEUE_BUFFER_SIZE: usize = 100; const RUN_BUFFER_SIZE: usize = 100; const KILL_BUFFER_SIZE: usize = 10; -#[derive(Clone)] -pub struct DeploymentManager { - pipeline: Pipeline, - kill_send: KillSender, +pub struct DeploymentManagerBuilder { + build_log_recorder: Option, + secret_recorder: Option, + active_deployment_getter: Option, + artifacts_path: Option, + runtime_client: Option>, + queue_client: Option, } -impl DeploymentManager { - /// Create a new deployment manager. Manages one or more 'pipelines' for - /// processing service building, loading, and deployment. - pub fn new( - runtime_client: RuntimeClient, - build_log_recorder: impl LogRecorder, - secret_recorder: impl SecretRecorder, - active_deployment_getter: impl ActiveDeploymentsGetter, - artifacts_path: PathBuf, - ) -> Self { - let (kill_send, _) = broadcast::channel(KILL_BUFFER_SIZE); +impl DeploymentManagerBuilder +where + LR: LogRecorder, + SR: SecretRecorder, + ADG: ActiveDeploymentsGetter, + QC: BuildQueueClient, +{ + pub fn build_log_recorder(mut self, build_log_recorder: LR) -> Self { + self.build_log_recorder = Some(build_log_recorder); + + self + } - DeploymentManager { - pipeline: Pipeline::new( - kill_send.clone(), - runtime_client, - build_log_recorder, - secret_recorder, - active_deployment_getter, - artifacts_path, - ), - kill_send, - } + pub fn secret_recorder(mut self, secret_recorder: SR) -> Self { + self.secret_recorder = Some(secret_recorder); + + self } - #[instrument(skip(self), fields(id = %queued.id, state = %State::Queued))] - pub async fn queue_push(&self, queued: Queued) { - self.pipeline.queue_send.send(queued).await.unwrap(); + pub fn active_deployment_getter(mut self, active_deployment_getter: ADG) -> Self { + self.active_deployment_getter = Some(active_deployment_getter); + + self } - #[instrument(skip(self), fields(id = %built.id, state = %State::Built))] - pub async fn run_push(&self, built: Built) { - self.pipeline.run_send.send(built).await.unwrap(); + pub fn artifacts_path(mut self, artifacts_path: PathBuf) -> Self { + self.artifacts_path = Some(artifacts_path); + + self } - pub async fn kill(&self, id: Uuid) { - if self.kill_send.receiver_count() > 0 { - self.kill_send.send(id).unwrap(); - } + pub fn queue_client(mut self, queue_client: QC) -> Self { + self.queue_client = Some(queue_client); + + self } -} -/// ```no-test -/// queue channel all deployments here are State::Queued -/// | -/// v -/// queue task when taken from the channel by this task, deployments -/// enter the State::Building state and upon being -/// | built transition to the State::Built state -/// v -/// run channel all deployments here are State::Built -/// | -/// v -/// run task tasks enter the State::Running state and begin -/// executing -/// ``` -#[derive(Clone)] -struct Pipeline { - queue_send: QueueSender, - run_send: RunSender, -} + pub fn runtime(mut self, runtime_client: RuntimeClient) -> Self { + self.runtime_client = Some(runtime_client); -impl Pipeline { + self + } /// Creates two Tokio tasks, one for building queued services, the other for /// executing/deploying built services. Two multi-producer, single consumer /// channels are also created which are for moving on-going service /// deployments between the aforementioned tasks. - fn new( - kill_send: KillSender, - runtime_client: RuntimeClient, - build_log_recorder: impl LogRecorder, - secret_recorder: impl SecretRecorder, - active_deployment_getter: impl ActiveDeploymentsGetter, - artifacts_path: PathBuf, - ) -> Pipeline { + pub fn build(self) -> DeploymentManager { + let build_log_recorder = self + .build_log_recorder + .expect("a build log recorder to be set"); + let secret_recorder = self.secret_recorder.expect("a secret recorder to be set"); + let active_deployment_getter = self + .active_deployment_getter + .expect("an active deployment getter to be set"); + let artifacts_path = self.artifacts_path.expect("artifacts path to be set"); + let queue_client = self.queue_client.expect("a queue client to be set"); + let runtime_client = self.runtime_client.expect("a runtime client to be set"); + let (queue_send, queue_recv) = mpsc::channel(QUEUE_BUFFER_SIZE); let (run_send, run_recv) = mpsc::channel(RUN_BUFFER_SIZE); + let (kill_send, _) = broadcast::channel(KILL_BUFFER_SIZE); + let storage_manager = StorageManager::new(artifacts_path); let run_send_clone = run_send.clone(); @@ -111,21 +102,86 @@ impl Pipeline { run_send_clone, build_log_recorder, secret_recorder, - artifacts_path.clone(), + storage_manager.clone(), + queue_client, )); tokio::spawn(run::task( run_recv, runtime_client, - kill_send, + kill_send.clone(), active_deployment_getter, - artifacts_path, + storage_manager.clone(), )); - Pipeline { + DeploymentManager { queue_send, run_send, + kill_send, + storage_manager, + } + } +} + +#[derive(Clone)] +pub struct DeploymentManager { + queue_send: QueueSender, + run_send: RunSender, + kill_send: KillSender, + storage_manager: StorageManager, +} + +/// ```no-test +/// queue channel all deployments here are State::Queued until the get a slot from gateway +/// | +/// v +/// queue task when taken from the channel by this task, deployments +/// enter the State::Building state and upon being +/// | built transition to the State::Built state +/// v +/// run channel all deployments here are State::Built +/// | +/// v +/// run task tasks enter the State::Running state and begin +/// executing +/// ``` +impl DeploymentManager { + /// Create a new deployment manager. Manages one or more 'pipelines' for + /// processing service building, loading, and deployment. + pub fn builder() -> DeploymentManagerBuilder { + DeploymentManagerBuilder { + build_log_recorder: None, + secret_recorder: None, + active_deployment_getter: None, + artifacts_path: None, + runtime_client: None, + queue_client: None, + } + } + + pub async fn queue_push(&self, mut queued: Queued) { + let cx = Span::current().context(); + + opentelemetry::global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut queued.tracing_context); + }); + + self.queue_send.send(queued).await.unwrap(); + } + + #[instrument(skip(self), fields(id = %built.id, state = %State::Built))] + pub async fn run_push(&self, built: Built) { + self.run_send.send(built).await.unwrap(); + } + + pub async fn kill(&self, id: Uuid) { + if self.kill_send.receiver_count() > 0 { + self.kill_send.send(id).unwrap(); } } + + pub fn storage_manager(&self) -> StorageManager { + self.storage_manager.clone() + } } type QueueSender = mpsc::Sender; diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index 7b1222451..c5ae79822 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -1,29 +1,33 @@ use super::deploy_layer::{Log, LogRecorder, LogType}; +use super::gateway_client::BuildQueueClient; use super::{Built, QueueReceiver, RunSender, State}; use crate::error::{Error, Result, TestError}; use crate::persistence::{LogLevel, SecretRecorder}; +use shuttle_common::storage_manager::StorageManager; +use cargo::util::interning::InternedString; use cargo_metadata::Message; use chrono::Utc; use crossbeam_channel::Sender; +use opentelemetry::global; use serde_json::json; use shuttle_service::loader::{build_crate, get_config, Runtime}; -use tracing::{debug, error, info, instrument, trace}; +use tokio::time::{sleep, timeout}; +use tracing::{debug, debug_span, error, info, instrument, trace, warn, Instrument, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; use uuid::Uuid; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashMap}; use std::fmt; use std::fs::remove_file; use std::io::Read; use std::path::{Path, PathBuf}; -use std::pin::Pin; +use std::time::Duration; -use bytes::{BufMut, Bytes}; use cargo::core::compiler::{CompileMode, MessageFormat}; use cargo::core::Workspace; use cargo::ops::{CompileOptions, TestOptions}; use flate2::read::GzDecoder; -use futures::{Stream, StreamExt}; use tar::Archive; use tokio::fs; @@ -32,23 +36,11 @@ pub async fn task( run_send: RunSender, log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, - artifacts_path: PathBuf, + storage_manager: StorageManager, + queue_client: impl BuildQueueClient, ) { info!("Queue task started"); - // Path of the directory that contains extracted service Cargo projects. - let builds_path = artifacts_path.join("shuttle-builds"); - - // The directory in which compiled '.so' files are stored. - let libs_path = artifacts_path.join("shuttle-libs"); - - fs::create_dir_all(&builds_path) - .await - .expect("could not create builds directory"); - fs::create_dir_all(&libs_path) - .await - .expect("could not create libs directory"); - while let Some(queued) = recv.recv().await { let id = queued.id; @@ -57,31 +49,86 @@ pub async fn task( let run_send_cloned = run_send.clone(); let log_recorder = log_recorder.clone(); let secret_recorder = secret_recorder.clone(); - let builds_path = builds_path.clone(); - let libs_path = libs_path.clone(); + let storage_manager = storage_manager.clone(); + let queue_client = queue_client.clone(); tokio::spawn(async move { - match queued - .handle(builds_path, libs_path, log_recorder, secret_recorder) + let parent_cx = global::get_text_map_propagator(|propagator| { + propagator.extract(&queued.tracing_context) + }); + let span = debug_span!("builder"); + span.set_parent(parent_cx); + + async move { + match timeout( + Duration::from_secs(60 * 5), // Timeout after 5 minutes if the build queue hangs or it takes too long for a slot to become available + wait_for_queue(queue_client.clone(), id), + ) .await - { - Ok(built) => promote_to_run(built, run_send_cloned).await, - Err(err) => build_failed(&id, err), + { + Ok(_) => {} + Err(err) => return build_failed(&id, err), + } + + match queued + .handle(storage_manager, log_recorder, secret_recorder) + .await + { + Ok(built) => promote_to_run(built, run_send_cloned).await, + Err(err) => build_failed(&id, err), + } + + remove_from_queue(queue_client, id).await } + .instrument(span) + .await }); } } -#[instrument(fields(id = %_id, state = %State::Crashed))] -fn build_failed(_id: &Uuid, err: impl std::error::Error + 'static) { +#[instrument(skip(_id), fields(id = %_id, state = %State::Crashed))] +fn build_failed(_id: &Uuid, error: impl std::error::Error + 'static) { error!( - error = &err as &dyn std::error::Error, + error = &error as &dyn std::error::Error, "service build encountered an error" ); } +#[instrument(skip(queue_client), fields(state = %State::Queued))] +async fn wait_for_queue(queue_client: impl BuildQueueClient, id: Uuid) -> Result<()> { + loop { + let got_slot = queue_client.get_slot(id).await?; + + if got_slot { + break; + } + + info!("The build queue is currently full..."); + + sleep(Duration::from_secs(1)).await; + } + + Ok(()) +} + +async fn remove_from_queue(queue_client: impl BuildQueueClient, id: Uuid) { + match queue_client.release_slot(id).await { + Ok(_) => {} + Err(error) => warn!( + error = &error as &dyn std::error::Error, + "could not release build slot" + ), + } +} + #[instrument(fields(id = %built.id, state = %State::Built))] -async fn promote_to_run(built: Built, run_send: RunSender) { +async fn promote_to_run(mut built: Built, run_send: RunSender) { + let cx = Span::current().context(); + + opentelemetry::global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut built.tracing_context); + }); + if let Err(err) = run_send.send(built.clone()).await { build_failed(&built.id, err); } @@ -91,29 +138,24 @@ pub struct Queued { pub id: Uuid, pub service_name: String, pub service_id: Uuid, - pub data_stream: Pin> + Send + Sync>>, + pub data: Vec, pub will_run_tests: bool, + pub tracing_context: HashMap, } impl Queued { - #[instrument(name = "queued_handle", skip(self, builds_path, libs_path, log_recorder, secret_recorder), fields(id = %self.id, state = %State::Building))] + #[instrument(skip(self, storage_manager, log_recorder, secret_recorder), fields(id = %self.id, state = %State::Building))] async fn handle( self, - builds_path: PathBuf, - libs_path: PathBuf, + storage_manager: StorageManager, log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, ) -> Result { - info!("Fetching POSTed data"); - - let vec = extract_stream(self.data_stream).await?; - info!("Extracting received data"); - let project_path = builds_path.join(&self.service_name); - fs::create_dir_all(project_path.clone()).await?; + let project_path = storage_manager.service_build_path(&self.service_name)?; - extract_tar_gz_data(vec.as_slice(), &project_path)?; + extract_tar_gz_data(self.data.as_slice(), &project_path).await?; let secrets = get_secrets(&project_path).await?; set_secrets(secrets, &self.service_id, secret_recorder).await?; @@ -122,7 +164,7 @@ impl Queued { let (tx, rx): (crossbeam_channel::Sender, _) = crossbeam_channel::bounded(0); let id = self.id; - tokio::spawn(async move { + tokio::task::spawn_blocking(move || { while let Ok(message) = rx.recv() { trace!(?message, "received cargo message"); // TODO: change these to `info!(...)` as [valuable] support increases. @@ -171,12 +213,13 @@ impl Queued { info!("Moving built library"); - store_lib(libs_path, so_path, &self.id).await?; + store_lib(&storage_manager, so_path, &self.id).await?; let built = Built { id: self.id, service_name: self.service_name, service_id: self.service_id, + tracing_context: Default::default(), }; Ok(built) @@ -229,27 +272,28 @@ async fn set_secrets( Ok(()) } -#[instrument(skip(data_stream))] -async fn extract_stream( - mut data_stream: Pin> + Send + Sync>>, -) -> Result> { - let mut vec = Vec::new(); - while let Some(buf) = data_stream.next().await { - let buf = buf?; - debug!("Received {} bytes", buf.len()); - vec.put(buf); - } - - Ok(vec) -} - /// Equivalent to the command: `tar -xzf --strip-components 1` #[instrument(skip(data, dest))] -fn extract_tar_gz_data(data: impl Read, dest: impl AsRef) -> Result<()> { +async fn extract_tar_gz_data(data: impl Read, dest: impl AsRef) -> Result<()> { let tar = GzDecoder::new(data); let mut archive = Archive::new(tar); archive.set_overwrite(true); + // Clear directory first + let mut entries = fs::read_dir(&dest).await?; + while let Some(entry) = entries.next_entry().await? { + // Ignore the build cache directory + if ["target", "Cargo.lock"].contains(&entry.file_name().to_string_lossy().as_ref()) { + continue; + } + + if entry.metadata().await?.is_dir() { + fs::remove_dir_all(entry.path()).await?; + } else { + fs::remove_file(entry.path()).await?; + } + } + for entry in archive.entries()? { let mut entry = entry?; let path: PathBuf = entry.path()?.components().skip(1).collect(); @@ -286,36 +330,8 @@ async fn run_pre_deploy_tests( let (read, write) = pipe::pipe(); let project_path = project_path.to_owned(); - let handle = tokio::spawn(async move { - let config = get_config(write)?; - let manifest_path = project_path.join("Cargo.toml"); - - let ws = Workspace::new(&manifest_path, &config)?; - - let mut compile_opts = CompileOptions::new(&config, CompileMode::Test)?; - - compile_opts.build_config.message_format = MessageFormat::Json { - render_diagnostics: false, - short: false, - ansi: false, - }; - - let opts = TestOptions { - compile_opts, - no_run: false, - no_fail_fast: false, - }; - - let test_failures = cargo::ops::run_tests(&ws, &opts, &[])?; - - match test_failures { - Some(failures) => Err(failures.into()), - None => Ok(()), - } - }); - // This needs to be on a separate thread, else deployer will block (reason currently unknown :D) - tokio::spawn(async move { + tokio::task::spawn_blocking(move || { for message in Message::parse_stream(read) { match message { Ok(message) => { @@ -330,17 +346,49 @@ async fn run_pre_deploy_tests( } }); - handle.await? + let config = get_config(write)?; + let manifest_path = project_path.join("Cargo.toml"); + + let ws = Workspace::new(&manifest_path, &config)?; + + let mut compile_opts = CompileOptions::new(&config, CompileMode::Test)?; + + compile_opts.build_config.message_format = MessageFormat::Json { + render_diagnostics: false, + short: false, + ansi: false, + }; + + // We set the tests to build with the release profile since deployments compile + // with the release profile by default. This means crates don't need to be + // recompiled in debug mode for the tests, reducing memory usage during deployment. + compile_opts.build_config.requested_profile = InternedString::new("release"); + + // Build tests with a maximum of 4 workers. + compile_opts.build_config.jobs = 4; + + let opts = TestOptions { + compile_opts, + no_run: false, + no_fail_fast: false, + }; + + let test_failures = cargo::ops::run_tests(&ws, &opts, &[])?; + + match test_failures { + Some(failures) => Err(failures.into()), + None => Ok(()), + } } /// Store 'so' file in the libs folder -#[instrument(skip(storage_dir_path, so_path, id))] +#[instrument(skip(storage_manager, so_path, id))] async fn store_lib( - storage_dir_path: impl AsRef, + storage_manager: &StorageManager, so_path: impl AsRef, id: &Uuid, ) -> Result<()> { - let new_so_path = storage_dir_path.as_ref().join(id.to_string()); + let new_so_path = storage_manager.deployment_library_path(id)?; fs::rename(so_path, new_so_path).await?; @@ -351,6 +399,7 @@ async fn store_lib( mod tests { use std::{collections::BTreeMap, fs::File, io::Write, path::Path}; + use shuttle_common::storage_manager::StorageManager; use tempdir::TempDir; use tokio::fs; use uuid::Uuid; @@ -362,6 +411,37 @@ mod tests { let dir = TempDir::new("shuttle-extraction-test").unwrap(); let p = dir.path(); + // Files whose content should be replaced with the archive + fs::write(p.join("world.txt"), b"original text") + .await + .unwrap(); + + // Extra files that should be deleted + fs::write( + p.join("extra.txt"), + b"extra file at top level that should be deleted", + ) + .await + .unwrap(); + fs::create_dir_all(p.join("subdir")).await.unwrap(); + fs::write( + p.join("subdir/extra.txt"), + b"extra file in subdir that should be deleted", + ) + .await + .unwrap(); + + // Build cache in `/target` should not be cleared/deleted + fs::create_dir_all(p.join("target")).await.unwrap(); + fs::write(p.join("target/asset.txt"), b"some file in the build cache") + .await + .unwrap(); + + // Cargo.lock file shouldn't be deleted + fs::write(p.join("Cargo.lock"), "lock file contents shouldn't matter") + .await + .unwrap(); + // Binary data for an archive in the following form: // // - temp @@ -380,7 +460,9 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", ) .unwrap(); - super::extract_tar_gz_data(test_data.as_slice(), p).unwrap(); + super::extract_tar_gz_data(test_data.as_slice(), &p) + .await + .unwrap(); assert!(fs::read_to_string(p.join("world.txt")) .await .unwrap() @@ -390,8 +472,38 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", .unwrap() .starts_with("def")); + assert_eq!( + fs::metadata(p.join("extra.txt")).await.unwrap_err().kind(), + std::io::ErrorKind::NotFound, + "extra file should be deleted" + ); + assert_eq!( + fs::metadata(p.join("subdir/extra.txt")) + .await + .unwrap_err() + .kind(), + std::io::ErrorKind::NotFound, + "extra file in subdir should be deleted" + ); + + assert_eq!( + fs::read_to_string(p.join("target/asset.txt")) + .await + .unwrap(), + "some file in the build cache", + "build cache file should not be touched" + ); + + assert_eq!( + fs::read_to_string(p.join("Cargo.lock")).await.unwrap(), + "lock file contents shouldn't matter", + "Cargo lock file should not be touched" + ); + // Can we extract again without error? - super::extract_tar_gz_data(test_data.as_slice(), p).unwrap(); + super::extract_tar_gz_data(test_data.as_slice(), &p) + .await + .unwrap(); } #[tokio::test(flavor = "multi_thread")] @@ -399,7 +511,7 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", let root = Path::new(env!("CARGO_MANIFEST_DIR")); let (tx, rx) = crossbeam_channel::unbounded(); - tokio::spawn(async move { while rx.recv().is_ok() {} }); + tokio::task::spawn_blocking(move || while rx.recv().is_ok() {}); let failure_project_path = root.join("tests/resources/tests-fail"); assert!(matches!( @@ -417,22 +529,24 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", async fn store_lib() { let libs_dir = TempDir::new("lib-store").unwrap(); let libs_p = libs_dir.path(); + let storage_manager = StorageManager::new(libs_p.to_path_buf()); - let build_dir = TempDir::new("build-store").unwrap(); - let build_p = build_dir.path(); + let build_p = storage_manager.builds_path().unwrap(); let so_path = build_p.join("xyz.so"); let id = Uuid::new_v4(); fs::write(&so_path, "barfoo").await.unwrap(); - super::store_lib(&libs_p, &so_path, &id).await.unwrap(); + super::store_lib(&storage_manager, &so_path, &id) + .await + .unwrap(); // Old '.so' file gone? assert!(!so_path.exists()); assert_eq!( - fs::read_to_string(libs_p.join(id.to_string())) + fs::read_to_string(libs_p.join("shuttle-libs").join(id.to_string())) .await .unwrap(), "barfoo" diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index cf35d4e33..4837e882f 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -1,16 +1,20 @@ use std::{ + collections::HashMap, net::{Ipv4Addr, SocketAddr}, path::PathBuf, str::FromStr, }; use async_trait::async_trait; +use opentelemetry::global; use shuttle_common::project::ProjectName as ServiceName; +use shuttle_common::storage_manager::StorageManager; use shuttle_proto::runtime::{runtime_client::RuntimeClient, LoadRequest, StartRequest}; use tokio::task::JoinError; use tonic::transport::Channel; -use tracing::{error, info, instrument, trace}; +use tracing::{debug_span, error, info, instrument, trace, Instrument}; +use tracing_opentelemetry::OpenTelemetrySpanExt; use uuid::Uuid; use super::{KillReceiver, KillSender, RunReceiver, State}; @@ -24,13 +28,10 @@ pub async fn task( runtime_client: RuntimeClient, kill_send: KillSender, active_deployment_getter: impl ActiveDeploymentsGetter, - artifacts_path: PathBuf, + storage_manager: StorageManager, ) { info!("Run task started"); - // The directory in which compiled '.so' files are stored. - let libs_path = artifacts_path.join("shuttle-libs"); - while let Some(built) = recv.recv().await { let id = built.id; @@ -38,6 +39,7 @@ pub async fn task( let kill_send = kill_send.clone(); let kill_recv = kill_send.subscribe(); + let storage_manager = storage_manager.clone(); // todo: this is the port the legacy runtime is hardcoded to start services on let port = 7001; @@ -68,26 +70,34 @@ pub async fn task( Err(err) if err.is_cancelled() => stopped_cleanup(&id), Err(err) => start_crashed_cleanup(&id, err), }; - - let libs_path = libs_path.clone(); let runtime_client = runtime_client.clone(); tokio::spawn(async move { - if let Err(err) = built - .handle( - addr, - libs_path, - runtime_client, - kill_recv, - old_deployments_killer, - cleanup, - ) - .await - { - start_crashed_cleanup(&id, err) + let parent_cx = global::get_text_map_propagator(|propagator| { + propagator.extract(&built.tracing_context) + }); + let span = debug_span!("runner"); + span.set_parent(parent_cx); + + async move { + if let Err(err) = built + .handle( + addr, + storage_manager, + runtime_client, + kill_recv, + old_deployments_killer, + cleanup, + ) + .await + { + start_crashed_cleanup(&id, err) + } + + info!("deployment done"); } - - info!("deployment done"); + .instrument(span) + .await }); } } @@ -116,28 +126,28 @@ async fn kill_old_deployments( Ok(()) } -#[instrument(fields(id = %_id, state = %State::Completed))] +#[instrument(skip(_id), fields(id = %_id, state = %State::Completed))] fn completed_cleanup(_id: &Uuid) { info!("service finished all on its own"); } -#[instrument(fields(id = %_id, state = %State::Stopped))] +#[instrument(skip(_id), fields(id = %_id, state = %State::Stopped))] fn stopped_cleanup(_id: &Uuid) { info!("service was stopped by the user"); } -#[instrument(fields(id = %_id, state = %State::Crashed))] -fn crashed_cleanup(_id: &Uuid, err: impl std::error::Error + 'static) { +#[instrument(skip(_id), fields(id = %_id, state = %State::Crashed))] +fn crashed_cleanup(_id: &Uuid, error: impl std::error::Error + 'static) { error!( - error = &err as &dyn std::error::Error, + error = &error as &dyn std::error::Error, "service encountered an error" ); } -#[instrument(fields(id = %_id, state = %State::Crashed))] -fn start_crashed_cleanup(_id: &Uuid, err: impl std::error::Error + 'static) { +#[instrument(skip(_id), fields(id = %_id, state = %State::Crashed))] +fn start_crashed_cleanup(_id: &Uuid, error: impl std::error::Error + 'static) { error!( - error = &err as &dyn std::error::Error, + error = &error as &dyn std::error::Error, "service startup encountered an error" ); } @@ -157,15 +167,16 @@ pub struct Built { pub id: Uuid, pub service_name: String, pub service_id: Uuid, + pub tracing_context: HashMap, } impl Built { - #[instrument(name = "built_handle", skip(self, libs_path, runtime_client, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] + #[instrument(skip(self, storage_manager, runtime_client, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] #[allow(clippy::too_many_arguments)] async fn handle( self, address: SocketAddr, - libs_path: PathBuf, + storage_manager: StorageManager, runtime_client: RuntimeClient, kill_recv: KillReceiver, kill_old_deployments: impl futures::Future>, @@ -173,7 +184,8 @@ impl Built { + Send + 'static, ) -> Result<()> { - // todo: refactor this? + let so_path = storage_manager.deployment_library_path(&self.id)?; + kill_old_deployments.await?; info!("got handle for deployment"); @@ -181,7 +193,7 @@ impl Built { tokio::spawn(run( self.id, self.service_name, - libs_path, + so_path, runtime_client, address, kill_recv, @@ -196,7 +208,7 @@ impl Built { async fn run( id: Uuid, service_name: String, - libs_path: PathBuf, + so_path: PathBuf, mut runtime_client: RuntimeClient, _address: SocketAddr, _kill_recv: KillReceiver, @@ -206,10 +218,9 @@ async fn run( ) { info!( "loading project from: {}", - libs_path.clone().into_os_string().into_string().unwrap() + so_path.clone().into_os_string().into_string().unwrap() ); - let so_path = libs_path.join(id.to_string()); let load_request = tonic::Request::new(LoadRequest { path: so_path.into_os_string().into_string().unwrap(), service_name: service_name.clone(), @@ -235,14 +246,15 @@ async fn run( #[cfg(test)] mod tests { use std::{ - fs, net::{Ipv4Addr, SocketAddr}, path::PathBuf, process::Command, time::Duration, }; + use shuttle_common::storage_manager::StorageManager; use shuttle_proto::runtime::runtime_client::RuntimeClient; + use tempdir::TempDir; use tokio::{ sync::{broadcast, oneshot}, task::JoinError, @@ -256,7 +268,13 @@ mod tests { use super::Built; const RESOURCES_PATH: &str = "tests/resources"; - const LIBS_PATH: &str = "/tmp/shuttle-libs-tests"; + + fn get_storage_manager() -> StorageManager { + let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); + let path = tmp_dir.into_path(); + + StorageManager::new(path) + } async fn kill_old_deployments() -> crate::error::Result<()> { Ok(()) @@ -271,7 +289,7 @@ mod tests { // This test uses the kill signal to make sure a service does stop when asked to #[tokio::test] async fn can_be_killed() { - let built = make_so_and_built("sleep-async"); + let (built, storage_manager) = make_so_and_built("sleep-async"); let id = built.id; let (kill_send, kill_recv) = broadcast::channel(1); let (cleanup_send, cleanup_recv) = oneshot::channel(); @@ -292,7 +310,7 @@ mod tests { built .handle( addr, - PathBuf::from(LIBS_PATH), + storage_manager, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -316,7 +334,7 @@ mod tests { // This test does not use a kill signal to stop the service. Rather the service decided to stop on its own without errors #[tokio::test] async fn self_stop() { - let built = make_so_and_built("sleep-async"); + let (built, storage_manager) = make_so_and_built("sleep-async"); let (_kill_send, kill_recv) = broadcast::channel(1); let (cleanup_send, cleanup_recv) = oneshot::channel(); @@ -337,7 +355,7 @@ mod tests { built .handle( addr, - PathBuf::from(LIBS_PATH), + storage_manager, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -355,7 +373,7 @@ mod tests { // Test for panics in Service::bind #[tokio::test] async fn panic_in_bind() { - let built = make_so_and_built("bind-panic"); + let (built, storage_manager) = make_so_and_built("bind-panic"); let (_kill_send, kill_recv) = broadcast::channel(1); let (cleanup_send, cleanup_recv): (oneshot::Sender<()>, _) = oneshot::channel(); @@ -376,7 +394,7 @@ mod tests { built .handle( addr, - PathBuf::from(LIBS_PATH), + storage_manager, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -394,7 +412,7 @@ mod tests { // Test for panics in the main function #[tokio::test] async fn panic_in_main() { - let built = make_so_and_built("main-panic"); + let (built, storage_manager) = make_so_and_built("main-panic"); let (_kill_send, kill_recv) = broadcast::channel(1); let handle_cleanup = |_result| panic!("the service shouldn't even start"); @@ -403,7 +421,7 @@ mod tests { let result = built .handle( addr, - PathBuf::from(LIBS_PATH), + storage_manager, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -424,16 +442,18 @@ mod tests { id: Uuid::new_v4(), service_name: "test".to_string(), service_id: Uuid::new_v4(), + tracing_context: Default::default(), }; let (_kill_send, kill_recv) = broadcast::channel(1); let handle_cleanup = |_result| panic!("no service means no cleanup"); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); + let storage_manager = get_storage_manager(); let result = built .handle( addr, - PathBuf::from(LIBS_PATH), + storage_manager, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -451,7 +471,7 @@ mod tests { ); } - fn make_so_and_built(crate_name: &str) -> Built { + fn make_so_and_built(crate_name: &str) -> (Built, StorageManager) { let crate_dir: PathBuf = [RESOURCES_PATH, crate_name].iter().collect(); Command::new("cargo") @@ -472,17 +492,19 @@ mod tests { let id = Uuid::new_v4(); let so_path = crate_dir.join("target/release").join(lib_name); - let libs_path = PathBuf::from(LIBS_PATH); - fs::create_dir_all(&libs_path).unwrap(); - - let new_so_path = libs_path.join(id.to_string()); + let storage_manager = get_storage_manager(); + let new_so_path = storage_manager.deployment_library_path(&id).unwrap(); std::fs::copy(so_path, new_so_path).unwrap(); - Built { - id, - service_name: crate_name.to_string(), - service_id: Uuid::new_v4(), - } + ( + Built { + id, + service_name: crate_name.to_string(), + service_id: Uuid::new_v4(), + tracing_context: Default::default(), + }, + storage_manager, + ) } } diff --git a/deployer/src/error.rs b/deployer/src/error.rs index f7d3ecd45..e01766f1f 100644 --- a/deployer/src/error.rs +++ b/deployer/src/error.rs @@ -6,10 +6,10 @@ use shuttle_service::loader::LoaderError; use cargo::util::errors::CargoTestError; +use crate::deployment::gateway_client; + #[derive(Error, Debug)] pub enum Error { - #[error("Streaming error: {0}")] - Streaming(#[source] axum::Error), #[error("Internal I/O error: {0}")] InputOutput(#[from] io::Error), #[error("Build error: {0}")] @@ -26,6 +26,8 @@ pub enum Error { SecretsSet(#[source] Box), #[error("Failed to cleanup old deployments: {0}")] OldCleanup(#[source] Box), + #[error("Gateway client error: {0}")] + GatewayClient(#[from] gateway_client::Error), } #[derive(Error, Debug)] diff --git a/deployer/src/handlers/error.rs b/deployer/src/handlers/error.rs index b09fa24d1..f0fb98a0a 100644 --- a/deployer/src/handlers/error.rs +++ b/deployer/src/handlers/error.rs @@ -9,6 +9,8 @@ use shuttle_common::models::error::ApiError; #[derive(thiserror::Error, Debug)] pub enum Error { + #[error("Streaming error: {0}")] + Streaming(#[from] axum::Error), #[error("Persistence failure: {0}")] Persistence(#[from] crate::persistence::PersistenceError), #[error("Failed to convert {from} to {to}")] @@ -19,6 +21,8 @@ pub enum Error { }, #[error("record could not be found")] NotFound, + #[error("Custom error: {0}")] + Custom(#[from] anyhow::Error), } impl Serialize for Error { diff --git a/deployer/src/handlers/mod.rs b/deployer/src/handlers/mod.rs index e3873838e..3f2a83298 100644 --- a/deployer/src/handlers/mod.rs +++ b/deployer/src/handlers/mod.rs @@ -2,18 +2,26 @@ mod error; use axum::body::{Body, BoxBody}; use axum::extract::ws::{self, WebSocket}; -use axum::extract::{Extension, Path, Query}; +use axum::extract::{Extension, MatchedPath, Path, Query}; use axum::http::{Request, Response}; -use axum::routing::{get, Router}; +use axum::middleware::from_extractor; +use axum::routing::{get, post, Router}; use axum::{extract::BodyStream, Json}; +use bytes::BufMut; use chrono::{TimeZone, Utc}; use fqdn::FQDN; -use futures::TryStreamExt; +use futures::StreamExt; +use opentelemetry::global; +use opentelemetry_http::HeaderExtractor; +use shuttle_common::backends::metrics::Metrics; use shuttle_common::models::secret; +use shuttle_common::project::ProjectName; use shuttle_common::LogItem; +use shuttle_service::loader::clean_crate; use tower_http::auth::RequireAuthorizationLayer; use tower_http::trace::TraceLayer; -use tracing::{debug, debug_span, error, field, trace, Span}; +use tracing::{debug, debug_span, error, field, instrument, trace, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; use uuid::Uuid; use crate::deployment::{DeploymentManager, Queued}; @@ -24,19 +32,25 @@ use std::time::Duration; pub use {self::error::Error, self::error::Result}; +mod project; + pub fn make_router( persistence: Persistence, deployment_manager: DeploymentManager, proxy_fqdn: FQDN, admin_secret: String, -) -> Router { + project_name: ProjectName, +) -> Router { Router::new() .route("/projects/:project_name/services", get(list_services)) .route( "/projects/:project_name/services/:service_name", get(get_service).post(post_service).delete(delete_service), ) - .route("/projects/:project_name/services/:service_name/summary", get(get_service_summary)) + .route( + "/projects/:project_name/services/:service_name/summary", + get(get_service_summary), + ) .route( "/projects/:project_name/deployments/:deployment_id", get(get_deployment).delete(delete_deployment), @@ -45,31 +59,71 @@ pub fn make_router( "/projects/:project_name/ws/deployments/:deployment_id/logs", get(get_logs_subscribe), ) - .route("/projects/:project_name/deployments/:deployment_id/logs", get(get_logs)) + .route( + "/projects/:project_name/deployments/:deployment_id/logs", + get(get_logs), + ) .route( "/projects/:project_name/secrets/:service_name", get(get_secrets), ) + .route("/projects/:project_name/clean", post(post_clean)) .layer(Extension(persistence)) .layer(Extension(deployment_manager)) .layer(Extension(proxy_fqdn)) .layer(RequireAuthorizationLayer::bearer(&admin_secret)) // This route should be below the auth bearer since it does not need authentication .route("/projects/:project_name/status", get(get_status)) + .route_layer(from_extractor::()) .layer( TraceLayer::new_for_http() .make_span_with(|request: &Request| { - debug_span!("request", http.uri = %request.uri(), http.method = %request.method(), http.status_code = field::Empty, api_key = field::Empty) + let path = if let Some(path) = request.extensions().get::() { + path.as_str() + } else { + "" + }; + + let account_name = request + .headers() + .get("X-Shuttle-Account-Name") + .map(|value| value.to_str().unwrap_or_default()); + + let span = debug_span!( + "request", + http.uri = %request.uri(), + http.method = %request.method(), + http.status_code = field::Empty, + account.name = account_name, + // A bunch of extra things for metrics + // Should be able to make this clearer once `Valuable` support lands in tracing + request.path = path, + request.params.project_name = field::Empty, + request.params.service_name = field::Empty, + request.params.deployment_id = field::Empty, + ); + let parent_context = global::get_text_map_propagator(|propagator| { + propagator.extract(&HeaderExtractor(request.headers())) + }); + span.set_parent(parent_context); + + span }) .on_response( |response: &Response, latency: Duration, span: &Span| { span.record("http.status_code", response.status().as_u16()); - debug!(latency = format_args!("{} ns", latency.as_nanos()), "finished processing request"); + debug!( + latency = format_args!("{} ns", latency.as_nanos()), + "finished processing request" + ); }, ), ) + .route_layer(from_extractor::()) + .layer(Extension(project_name)) } +#[instrument(skip_all)] async fn list_services( Extension(persistence): Extension, ) -> Result>> { @@ -83,9 +137,10 @@ async fn list_services( Ok(Json(services)) } +#[instrument(skip(persistence))] async fn get_service( Extension(persistence): Extension, - Path((_project_name, service_name)): Path<(String, String)>, + Path((project_name, service_name)): Path<(String, String)>, ) -> Result> { if let Some(service) = persistence.get_service_by_name(&service_name).await? { let deployments = persistence @@ -120,6 +175,7 @@ async fn get_service( } } +#[instrument(skip_all, fields(%project_name, %service_name))] async fn get_service_summary( Extension(persistence): Extension, Extension(proxy_fqdn): Extension, @@ -138,7 +194,7 @@ async fn get_service_summary( .collect(); let response = shuttle_common::models::service::Summary { - uri: format!("https://{}.{proxy_fqdn}", project_name), + uri: format!("https://{proxy_fqdn}"), name: service.name, deployment, resources, @@ -150,12 +206,13 @@ async fn get_service_summary( } } +#[instrument(skip_all, fields(%project_name, %service_name))] async fn post_service( Extension(persistence): Extension, Extension(deployment_manager): Extension, - Path((_project_name, service_name)): Path<(String, String)>, + Path((project_name, service_name)): Path<(String, String)>, Query(params): Query>, - stream: BodyStream, + mut stream: BodyStream, ) -> Result> { let service = persistence.get_or_create_service(&service_name).await?; let id = Uuid::new_v4(); @@ -168,14 +225,23 @@ async fn post_service( address: None, }; + let mut data = Vec::new(); + while let Some(buf) = stream.next().await { + let buf = buf?; + debug!("Received {} bytes", buf.len()); + data.put(buf); + } + debug!("Received a total of {} bytes", data.len()); + persistence.insert_deployment(deployment.clone()).await?; let queued = Queued { id, service_name: service.name, service_id: service.id, - data_stream: Box::pin(stream.map_err(crate::error::Error::Streaming)), + data, will_run_tests: !params.contains_key("no-test"), + tracing_context: Default::default(), }; deployment_manager.queue_push(queued).await; @@ -183,10 +249,11 @@ async fn post_service( Ok(Json(deployment.into())) } +#[instrument(skip_all, fields(%project_name, %service_name))] async fn delete_service( Extension(persistence): Extension, Extension(deployment_manager): Extension, - Path((_project_name, service_name)): Path<(String, String)>, + Path((project_name, service_name)): Path<(String, String)>, ) -> Result> { if let Some(service) = persistence.get_service_by_name(&service_name).await? { let old_deployments = persistence @@ -225,9 +292,10 @@ async fn delete_service( } } +#[instrument(skip_all, fields(%project_name, %deployment_id))] async fn get_deployment( Extension(persistence): Extension, - Path((_project_name, deployment_id)): Path<(String, Uuid)>, + Path((project_name, deployment_id)): Path<(String, Uuid)>, ) -> Result> { if let Some(deployment) = persistence.get_deployment(&deployment_id).await? { Ok(Json(deployment.into())) @@ -236,10 +304,11 @@ async fn get_deployment( } } +#[instrument(skip_all, fields(%project_name, %deployment_id))] async fn delete_deployment( Extension(deployment_manager): Extension, Extension(persistence): Extension, - Path((_project_name, deployment_id)): Path<(String, Uuid)>, + Path((project_name, deployment_id)): Path<(String, Uuid)>, ) -> Result> { if let Some(deployment) = persistence.get_deployment(&deployment_id).await? { deployment_manager.kill(deployment.id).await; @@ -250,9 +319,10 @@ async fn delete_deployment( } } +#[instrument(skip_all, fields(%project_name, %deployment_id))] async fn get_logs( Extension(persistence): Extension, - Path((_project_name, deployment_id)): Path<(String, Uuid)>, + Path((project_name, deployment_id)): Path<(String, Uuid)>, ) -> Result>> { if let Some(deployment) = persistence.get_deployment(&deployment_id).await? { Ok(Json( @@ -293,7 +363,9 @@ async fn logs_websocket_handler(mut s: WebSocket, persistence: Persistence, id: return; } }; - let mut last_timestamp = Utc.timestamp(0, 0); + + // Unwrap is safe because it only returns None for out of range numbers or invalid nanosecond + let mut last_timestamp = Utc.timestamp_opt(0, 0).unwrap(); for log in backlog.into_iter() { last_timestamp = log.timestamp; @@ -327,9 +399,10 @@ async fn logs_websocket_handler(mut s: WebSocket, persistence: Persistence, id: let _ = s.close().await; } +#[instrument(skip_all, fields(%project_name, %service_name))] async fn get_secrets( Extension(persistence): Extension, - Path((_project_name, service_name)): Path<(String, String)>, + Path((project_name, service_name)): Path<(String, String)>, ) -> Result>> { if let Some(service) = persistence.get_service_by_name(&service_name).await? { let keys = persistence @@ -345,6 +418,20 @@ async fn get_secrets( } } +async fn post_clean( + Extension(deployment_manager): Extension, + Path(project_name): Path, +) -> Result>> { + let project_path = deployment_manager + .storage_manager() + .service_build_path(project_name) + .map_err(anyhow::Error::new)?; + + let lines = clean_crate(&project_path, true)?; + + Ok(Json(lines)) +} + async fn get_status() -> String { "Ok".to_string() } diff --git a/deployer/src/handlers/project.rs b/deployer/src/handlers/project.rs new file mode 100644 index 000000000..bafae003a --- /dev/null +++ b/deployer/src/handlers/project.rs @@ -0,0 +1,56 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use axum::extract::{Extension, FromRequestParts, Path}; +use axum::http::request::Parts; +use axum::RequestPartsExt; +use hyper::StatusCode; +use shuttle_common::project::ProjectName; +use tracing::error; + +/// Gaurd to ensure request are for the project served by this deployer +/// Note: this guard needs the `ProjectName` extension to be set +pub struct ProjectNameGuard; + +#[async_trait] +impl FromRequestParts for ProjectNameGuard +where + S: Send + Sync, +{ + type Rejection = StatusCode; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + // We expect some path parameters + let Path(path): Path> = + match Path::from_request_parts(parts, state).await { + Ok(path) => path, + Err(_) => return Err(StatusCode::NOT_FOUND), + }; + + // All our routes have the `project_name` parameter + let project_name = match path.get("project_name") { + Some(project_name) => project_name, + None => { + error!("ProjectNameGuard found no project name in path"); + return Err(StatusCode::INTERNAL_SERVER_ERROR); + } + }; + + // This extractor requires the ProjectName extension to be set + let Extension(expected_project_name) = match parts.extract::>().await + { + Ok(expected) => expected, + Err(_) => { + error!("ProjectName extension is not set"); + return Err(StatusCode::INTERNAL_SERVER_ERROR); + } + }; + + if project_name == expected_project_name.as_str() { + Ok(ProjectNameGuard) + } else { + error!(project_name, "project is not served by this deployer"); + Err(StatusCode::BAD_REQUEST) + } + } +} diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index 16dcd9992..7ba32683d 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -14,6 +14,8 @@ use shuttle_proto::runtime::runtime_client::RuntimeClient; use tonic::transport::Channel; use tracing::{error, info}; +use crate::deployment::gateway_client::GatewayClient; + mod args; mod deployment; mod error; @@ -22,19 +24,23 @@ mod persistence; mod proxy; pub async fn start(persistence: Persistence, runtime_client: RuntimeClient, args: Args) { - let deployment_manager = DeploymentManager::new( - runtime_client, - persistence.clone(), - persistence.clone(), - persistence.clone(), - args.artifacts_path, - ); + let deployment_manager = DeploymentManager::builder() + .build_log_recorder(persistence.clone()) + .secret_recorder(persistence.clone()) + .active_deployment_getter(persistence.clone()) + .artifacts_path(args.artifacts_path) + .runtime(runtime_client) + .queue_client(GatewayClient::new(args.gateway_uri)) + .build(); - for existing_deployment in persistence.get_all_runnable_deployments().await.unwrap() { + let runnable_deployments = persistence.get_all_runnable_deployments().await.unwrap(); + info!(count = %runnable_deployments.len(), "enqueuing runnable deployments"); + for existing_deployment in runnable_deployments { let built = Built { id: existing_deployment.id, service_name: existing_deployment.service_name, service_id: existing_deployment.service_id, + tracing_context: Default::default(), }; deployment_manager.run_push(built).await; } @@ -44,9 +50,12 @@ pub async fn start(persistence: Persistence, runtime_client: RuntimeClient(service_fn(move |req| { diff --git a/deployer/src/main.rs b/deployer/src/main.rs index 0259843b8..14edba8f5 100644 --- a/deployer/src/main.rs +++ b/deployer/src/main.rs @@ -3,6 +3,7 @@ use std::process::exit; use std::time::Duration; use clap::Parser; +use opentelemetry::global; use shuttle_deployer::{start, start_proxy, Args, DeployLayer, Persistence}; use shuttle_proto::runtime::runtime_client::RuntimeClient; use shuttle_proto::runtime::SubscribeLogsRequest; @@ -20,6 +21,8 @@ async fn main() { trace!(args = ?args, "parsed args"); + global::set_text_map_propagator(opentelemetry_datadog::DatadogPropagator::new()); + let fmt_layer = fmt::layer(); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) @@ -62,11 +65,9 @@ async fn main() { info!("connecting runtime client"); let conn = Endpoint::new("http://127.0.0.1:6001") .unwrap() - .connect_timeout(Duration::from_secs(5)) - .connect() - .await - .unwrap(); - let mut runtime_client = RuntimeClient::new(conn); + .connect_timeout(Duration::from_secs(5)); + + let mut runtime_client = RuntimeClient::connect(conn).await.unwrap(); let sender = persistence.get_log_sender(); let mut stream = runtime_client diff --git a/deployer/src/persistence/log.rs b/deployer/src/persistence/log.rs index 822982bc7..7613d9b3d 100644 --- a/deployer/src/persistence/log.rs +++ b/deployer/src/persistence/log.rs @@ -100,15 +100,9 @@ fn extract_message(fields: &Value) -> Option { return Some(message.as_str()?.to_string()); } - if let Some(message) = map.get("message") { - match message { - Value::Object(message_object) => { - if let Some(rendered) = message_object.get("rendered") { - return Some(rendered.as_str()?.to_string()); - } - } - Value::String(mes_str) => return Some(mes_str.to_string()), - _ => {} + if let Some(Value::Object(message_object)) = map.get("message") { + if let Some(rendered) = message_object.get("rendered") { + return Some(rendered.as_str()?.to_string()); } } } diff --git a/deployer/src/persistence/mod.rs b/deployer/src/persistence/mod.rs index 9ae1d8fc9..1550759e8 100644 --- a/deployer/src/persistence/mod.rs +++ b/deployer/src/persistence/mod.rs @@ -77,7 +77,7 @@ impl Persistence { let (log_send, log_recv): (crossbeam_channel::Sender, _) = crossbeam_channel::bounded(0); - let (stream_log_send, _) = broadcast::channel(32); + let (stream_log_send, _) = broadcast::channel(1); let stream_log_send_clone = stream_log_send.clone(); let pool_cloned = pool.clone(); @@ -478,7 +478,7 @@ mod tests { id, service_id, state: State::Queued, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 43, 33), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 43, 33).unwrap(), address: None, }; @@ -498,7 +498,10 @@ mod tests { .unwrap(); let update = p.get_deployment(&id).await.unwrap().unwrap(); assert_eq!(update.state, State::Built); - assert_ne!(update.last_update, Utc.ymd(2022, 4, 25).and_hms(4, 43, 33)); + assert_ne!( + update.last_update, + Utc.with_ymd_and_hms(2022, 4, 25, 4, 43, 33).unwrap() + ); } #[tokio::test(flavor = "multi_thread")] @@ -512,28 +515,28 @@ mod tests { id: Uuid::new_v4(), service_id: xyz_id, state: State::Crashed, - last_update: Utc.ymd(2022, 4, 25).and_hms(7, 29, 35), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 7, 29, 35).unwrap(), address: None, }; let deployment_stopped = Deployment { id: Uuid::new_v4(), service_id: xyz_id, state: State::Stopped, - last_update: Utc.ymd(2022, 4, 25).and_hms(7, 49, 35), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 7, 49, 35).unwrap(), address: None, }; let deployment_other = Deployment { id: Uuid::new_v4(), service_id, state: State::Running, - last_update: Utc.ymd(2022, 4, 25).and_hms(7, 39, 39), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 7, 39, 39).unwrap(), address: None, }; let deployment_running = Deployment { id: Uuid::new_v4(), service_id: xyz_id, state: State::Running, - last_update: Utc.ymd(2022, 4, 25).and_hms(7, 48, 29), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 7, 48, 29).unwrap(), address: Some(SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 9876)), }; @@ -570,35 +573,35 @@ mod tests { id: Uuid::new_v4(), service_id, state: State::Built, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 29, 33), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 29, 33).unwrap(), address: None, }, Deployment { id: id_1, service_id: foo_id, state: State::Running, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 29, 44), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 29, 44).unwrap(), address: None, }, Deployment { id: id_2, service_id: bar_id, state: State::Running, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 33, 48), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 33, 48).unwrap(), address: None, }, Deployment { id: Uuid::new_v4(), service_id: service_id2, state: State::Crashed, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 38, 52), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 38, 52).unwrap(), address: None, }, Deployment { id: id_3, service_id: foo_id, state: State::Running, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 42, 32), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 42, 32).unwrap(), address: None, }, ] { @@ -790,14 +793,14 @@ mod tests { id, service_id, state: State::Queued, // Should be different from the state recorded below - last_update: Utc.ymd(2022, 4, 29).and_hms(2, 39, 39), + last_update: Utc.with_ymd_and_hms(2022, 4, 29, 2, 39, 39).unwrap(), address: None, }) .await .unwrap(); let state = deploy_layer::Log { id, - timestamp: Utc.ymd(2022, 4, 29).and_hms(2, 39, 59), + timestamp: Utc.with_ymd_and_hms(2022, 4, 29, 2, 39, 59).unwrap(), state: State::Running, level: Level::Info, file: None, @@ -830,7 +833,7 @@ mod tests { id, service_id, state: State::Running, - last_update: Utc.ymd(2022, 4, 29).and_hms(2, 39, 59), + last_update: Utc.with_ymd_and_hms(2022, 4, 29, 2, 39, 59).unwrap(), address: Some(SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 12345)), } ); @@ -1006,35 +1009,35 @@ mod tests { id: Uuid::new_v4(), service_id, state: State::Built, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 29, 33), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 29, 33).unwrap(), address: None, }, Deployment { id: Uuid::new_v4(), service_id, state: State::Stopped, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 29, 44), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 29, 44).unwrap(), address: None, }, Deployment { id: id_1, service_id, state: State::Running, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 33, 48), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 33, 48).unwrap(), address: None, }, Deployment { id: Uuid::new_v4(), service_id, state: State::Crashed, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 38, 52), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 38, 52).unwrap(), address: None, }, Deployment { id: id_2, service_id, state: State::Running, - last_update: Utc.ymd(2022, 4, 25).and_hms(4, 42, 32), + last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 42, 32).unwrap(), address: None, }, ] { diff --git a/deployer/src/proxy.rs b/deployer/src/proxy.rs index 7a7dcf9f0..cbb216ac9 100644 --- a/deployer/src/proxy.rs +++ b/deployer/src/proxy.rs @@ -4,6 +4,7 @@ use std::{ }; use async_trait::async_trait; +use fqdn::FQDN; use hyper::{ client::{connect::dns::GaiResolver, HttpConnector}, header::{HeaderValue, HOST, SERVER}, @@ -11,7 +12,10 @@ use hyper::{ }; use hyper_reverse_proxy::{ProxyError, ReverseProxy}; use once_cell::sync::Lazy; +use opentelemetry::global; +use opentelemetry_http::HeaderExtractor; use tracing::{error, field, instrument, trace, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; static PROXY_CLIENT: Lazy>> = Lazy::new(|| ReverseProxy::new(Client::new())); @@ -20,14 +24,25 @@ static SERVER_HEADER: Lazy = Lazy::new(|| "shuttle.rs".parse().unwr #[instrument(name = "proxy_request", skip(address_getter), fields(http.method = %req.method(), http.uri = %req.uri(), http.status_code = field::Empty, service = field::Empty))] pub async fn handle( remote_address: SocketAddr, - fqdn: String, + fqdn: FQDN, req: Request, address_getter: impl AddressGetter, ) -> Result, Infallible> { - let host = match req.headers().get(HOST) { - Some(host) => host.to_str().unwrap_or_default().to_owned(), + let span = Span::current(); + let parent_context = global::get_text_map_propagator(|propagator| { + propagator.extract(&HeaderExtractor(req.headers())) + }); + span.set_parent(parent_context); + + let host: FQDN = match req.headers().get(HOST) { + Some(host) => host + .to_str() + .unwrap_or_default() + .parse::() + .unwrap_or_default() + .to_owned(), None => { - trace!("proxy request has to host header"); + trace!("proxy request has no host header"); return Ok(Response::builder() .status(StatusCode::BAD_REQUEST) .body(Body::empty()) @@ -35,33 +50,42 @@ pub async fn handle( } }; - let service = match host.strip_suffix(&fqdn) { - Some(service) => service, + if host != fqdn { + trace!(?host, "proxy won't serve foreign domain"); + return Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Body::from("this domain is not served by proxy")) + .unwrap()); + } + // We only have one service per project, and its name coincides + // with that of the project + let service = match req.headers().get("X-Shuttle-Project") { + Some(project) => project.to_str().unwrap_or_default().to_owned(), None => { - trace!(host, "proxy won't serve foreign domain"); + trace!("proxy request has no X-Shuttle-Project header"); return Ok(Response::builder() .status(StatusCode::BAD_REQUEST) - .body(Body::from("this domain is not served by proxy")) + .body(Body::from("request has no X-Shuttle-Project header")) .unwrap()); } }; // Record current service for tracing purposes - Span::current().record("service", service); + span.record("service", &service); - let proxy_address = match address_getter.get_address_for_service(service).await { + let proxy_address = match address_getter.get_address_for_service(&service).await { Ok(Some(address)) => address, Ok(None) => { - trace!(host, "host not found on this server"); - let response_body = format!("could not find service for host: {}", host); + trace!(?host, service, "service not found on this server"); + let response_body = format!("could not find service: {}", service); return Ok(Response::builder() .status(StatusCode::NOT_FOUND) .body(response_body.into()) .unwrap()); } Err(err) => { - error!(error = %err, host, "proxy failed to find address for host"); + error!(error = %err, service, "proxy failed to find address for host"); let response_body = format!("failed to find service for host: {}", host); return Ok(Response::builder() diff --git a/deployer/tests/deploy_layer/bind-panic/Cargo.toml b/deployer/tests/deploy_layer/bind-panic/Cargo.toml index 156d730a6..3ef90aa3d 100644 --- a/deployer/tests/deploy_layer/bind-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/bind-panic/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = "0.7.0" +shuttle-service = { version = "0.8.0", features = ["codegen"] } diff --git a/deployer/tests/deploy_layer/main-panic/Cargo.toml b/deployer/tests/deploy_layer/main-panic/Cargo.toml index 27c1c18cb..f6311505f 100644 --- a/deployer/tests/deploy_layer/main-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/main-panic/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = "0.7.0" +shuttle-service = { version = "0.8.0", features = ["codegen"] } diff --git a/deployer/tests/deploy_layer/self-stop/Cargo.toml b/deployer/tests/deploy_layer/self-stop/Cargo.toml index 4a05ac9ba..2e80c3243 100644 --- a/deployer/tests/deploy_layer/self-stop/Cargo.toml +++ b/deployer/tests/deploy_layer/self-stop/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = "0.7.0" +shuttle-service = { version = "0.8.0", features = ["codegen"] } diff --git a/deployer/tests/deploy_layer/sleep-async/Cargo.toml b/deployer/tests/deploy_layer/sleep-async/Cargo.toml index b83c654da..8870d819b 100644 --- a/deployer/tests/deploy_layer/sleep-async/Cargo.toml +++ b/deployer/tests/deploy_layer/sleep-async/Cargo.toml @@ -12,4 +12,4 @@ crate-type = ["cdylib"] [dependencies] tokio = { version = "1.0", features = ["time"]} -shuttle-service = "0.7.0" +shuttle-service = { version = "0.8.0", features = ["codegen"] } diff --git a/deployer/tests/resources/bind-panic/Cargo.toml b/deployer/tests/resources/bind-panic/Cargo.toml index 0a721bd4a..807f8044a 100644 --- a/deployer/tests/resources/bind-panic/Cargo.toml +++ b/deployer/tests/resources/bind-panic/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } +shuttle-service = { path = "../../../../service", features = ["codegen"] } diff --git a/deployer/tests/resources/main-panic/Cargo.toml b/deployer/tests/resources/main-panic/Cargo.toml index da7b5c841..76833b28c 100644 --- a/deployer/tests/resources/main-panic/Cargo.toml +++ b/deployer/tests/resources/main-panic/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } +shuttle-service = { path = "../../../../service", features = ["codegen"] } diff --git a/deployer/tests/resources/sleep-async/Cargo.toml b/deployer/tests/resources/sleep-async/Cargo.toml index c0dc45479..f02de505e 100644 --- a/deployer/tests/resources/sleep-async/Cargo.toml +++ b/deployer/tests/resources/sleep-async/Cargo.toml @@ -12,4 +12,4 @@ crate-type = ["cdylib"] [dependencies] tokio = { version = "1.0", features = ["time"]} -shuttle-service = { path = "../../../../service" } +shuttle-service = { path = "../../../../service", features = ["codegen"] } diff --git a/deployer/tests/resources/tests-fail/Cargo.toml b/deployer/tests/resources/tests-fail/Cargo.toml index 18f948a67..f678cc9a8 100644 --- a/deployer/tests/resources/tests-fail/Cargo.toml +++ b/deployer/tests/resources/tests-fail/Cargo.toml @@ -9,5 +9,5 @@ crate-type = ["cdylib"] [workspace] [dependencies] -rocket = "0.5.0-rc.1" -shuttle-service = { version = "0.3.3", features = ["web-rocket"] } +rocket = "0.5.0-rc.2" +shuttle-service = { path = "../../../../service", features = ["codegen", "web-rocket"] } diff --git a/deployer/tests/resources/tests-pass/Cargo.toml b/deployer/tests/resources/tests-pass/Cargo.toml index b3e5424eb..358114dae 100644 --- a/deployer/tests/resources/tests-pass/Cargo.toml +++ b/deployer/tests/resources/tests-pass/Cargo.toml @@ -9,5 +9,5 @@ crate-type = ["cdylib"] [workspace] [dependencies] -rocket = "0.5.0-rc.1" -shuttle-service = { version = "0.3.3", features = ["web-rocket"] } +rocket = "0.5.0-rc.2" +shuttle-service = { path = "../../../../service", features = ["codegen", "web-rocket"] } diff --git a/docker-compose.yml b/docker-compose.yml index 63960ad78..10edbccbc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,19 +2,22 @@ version: "3.7" volumes: gateway-vol: postgres-vol: + panamax-crates-vol: + panamax-io-index-vol: networks: user-net: attachable: true ipam: driver: default config: - - subnet: 10.99.0.0/24 + - subnet: 10.99.0.0/16 services: gateway: image: "${CONTAINER_REGISTRY}/gateway:${BACKEND_TAG}" depends_on: - provisioner ports: + - 7999:7999 - 8000:8000 - 8001:8001 deploy: @@ -42,16 +45,18 @@ services: environment: - RUST_LOG=${RUST_LOG} command: - - "--state=/var/lib/shuttle/gateway.sqlite" + - "--state=/var/lib/shuttle" - "start" - "--control=0.0.0.0:8001" - "--user=0.0.0.0:8000" - - "--image=${CONTAINER_REGISTRY}/deployer:${BACKEND_TAG}" + - "--bouncer=0.0.0.0:7999" + - "--image=${CONTAINER_REGISTRY}/deployer:${DEPLOYER_TAG}" - "--prefix=shuttle_" - "--network-name=${STACK}_user-net" - "--docker-host=/var/run/docker.sock" - "--provisioner-host=provisioner" - "--proxy-fqdn=${APPS_FQDN}" + - "--use-tls=${USE_TLS}" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8001"] interval: 1m @@ -131,6 +136,35 @@ services: - DD_APM_NON_LOCAL_TRAFFIC=true - DD_SITE=datadoghq.eu - DD_API_KEY=${DD_API_KEY} + - DD_ENV=${DD_ENV} + - DD_CONTAINER_LABELS_AS_TAGS={"project.name":"project_name"} + deploy: + placement: + constraints: + - node.hostname==controller + panamax: + image: "${CONTAINER_REGISTRY}/panamax:${PANAMAX_TAG}" + restart: always + networks: + user-net: + volumes: + - panamax-crates-vol:/mirror/crates + - panamax-io-index-vol:/mirror/crates.io-index + labels: + deck-chores.sync-mirror.command: panamax sync /mirror + deck-chores.sync-mirror.interval: 5 minutes + deck-chores.sync-mirror.max: 1 + deploy: + placement: + constraints: + - node.hostname==controller + deck-chores: + image: funkyfuture/deck-chores:1 + restart: unless-stopped + environment: + TIMEZONE: UTC + volumes: + - /var/run/docker.sock:/var/run/docker.sock deploy: placement: constraints: diff --git a/e2e/README.md b/e2e/README.md index 297ff3864..7d6caaf99 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -4,12 +4,16 @@ This crate runs all the end-to-end tests for shuttle. These tests must run again Running all the end-to-end tests may take a long time, so it is recommended to run individual tests shipped as part of each crate in the workspace first. ## Running the tests -Simply do +In the root of the repository, run: ```bash -$ SHUTTLE_API_KEY=test-key cargo test -- --nocapture +make test ``` -the `--nocapture` flag helps with logging errors as they arise instead of in one block at the end. +To run individual tests, in the root of the e2e directory run: + +```bash +POSTGRES_PASSWORD=postgres APPS_FQDN=unstable.shuttleapp.rs cargo test -- --nocapture +``` The server-side logs can be accessed with `docker compose logs`. diff --git a/e2e/tests/integration/actix_web.rs b/e2e/tests/integration/actix_web.rs new file mode 100644 index 000000000..f6a545889 --- /dev/null +++ b/e2e/tests/integration/actix_web.rs @@ -0,0 +1,23 @@ +use crossterm::style::Color; + +use crate::helpers::{self, APPS_FQDN}; + +#[test] +fn hello_world_actix_web() { + let client = helpers::Services::new_docker( + "hello-world (actix-web)", + "actix-web/hello-world", + Color::Green, + ); + client.deploy(); + + let request_text = client + .get("hello") + .header("Host", format!("hello-world-actix-web-app.{}", *APPS_FQDN)) + .send() + .unwrap() + .text() + .unwrap(); + + assert_eq!(request_text, "Hello World!"); +} diff --git a/e2e/tests/integration/axum.rs b/e2e/tests/integration/axum.rs index fc20183ce..698cd7e35 100644 --- a/e2e/tests/integration/axum.rs +++ b/e2e/tests/integration/axum.rs @@ -4,8 +4,9 @@ use crate::helpers::{self, APPS_FQDN}; #[test] fn hello_world_axum() { - let client = helpers::Services::new_docker("hello-world (axum)", Color::Green); - client.deploy("axum/hello-world"); + let client = + helpers::Services::new_docker("hello-world (axum)", "axum/hello-world", Color::Green); + client.deploy(); let request_text = client .get("hello") diff --git a/e2e/tests/integration/helpers/mod.rs b/e2e/tests/integration/helpers/mod.rs index f839373d1..f888830c8 100644 --- a/e2e/tests/integration/helpers/mod.rs +++ b/e2e/tests/integration/helpers/mod.rs @@ -42,12 +42,17 @@ shuttle-service = {{ path = "{}" }} shuttle-aws-rds = {{ path = "{}" }} shuttle-persist = {{ path = "{}" }} shuttle-shared-db = {{ path = "{}" }} -shuttle-secrets = {{ path = "{}" }}"#, +shuttle-secrets = {{ path = "{}" }} +shuttle-static-folder = {{ path = "{}" }}"#, WORKSPACE_ROOT.join("service").display(), WORKSPACE_ROOT.join("resources").join("aws-rds").display(), WORKSPACE_ROOT.join("resources").join("persist").display(), WORKSPACE_ROOT.join("resources").join("shared-db").display(), WORKSPACE_ROOT.join("resources").join("secrets").display(), + WORKSPACE_ROOT + .join("resources") + .join("static-folder") + .display(), ) .unwrap(); @@ -112,10 +117,10 @@ CARGO_HOME: {} let admin_key = if let Ok(key) = env::var("SHUTTLE_API_KEY") { key } else { - "test-key".to_string() + "e2e-test-key".to_string() }; - Command::new(DOCKER.as_os_str()) + _ = Command::new(DOCKER.as_os_str()) .args([ "compose", "--file", @@ -125,15 +130,14 @@ CARGO_HOME: {} "exec", "gateway", "/usr/local/bin/service", - "--state=/var/lib/shuttle/gateway.sqlite", + "--state=/var/lib/shuttle", "init", "--name", - "admin", + "test", "--key", &admin_key, ]) - .output() - .ensure_success("failed to create admin user on gateway"); + .output(); }; } @@ -214,12 +218,14 @@ pub fn spawn_and_log>( pub struct Services { api_addr: SocketAddr, proxy_addr: SocketAddr, + /// Path within the examples dir to a specific example + example_path: String, target: String, color: Color, } impl Services { - fn new_free(target: D, color: C) -> Self + fn new_free(target: D, example_path: D, color: C) -> Self where D: std::fmt::Display, C: Into, @@ -229,16 +235,25 @@ impl Services { proxy_addr: "127.0.0.1:8000".parse().unwrap(), target: target.to_string(), color: color.into(), + example_path: example_path.to_string(), } } - pub fn new_docker(target: D, color: C) -> Self + /// Initializes a a test client + /// + /// # Arguments + /// + /// * `target` - A string that describes the test target + /// * `example_path` - Path to a specific example within the examples dir, this is where + /// `project new` and `deploy` will run + /// * `color` - a preferably unique `crossterm::style::Color` to distinguish test logs + pub fn new_docker(target: D, example_path: D, color: C) -> Self where D: std::fmt::Display, C: Into, { let _ = *LOCAL_UP; - let service = Self::new_free(target, color); + let service = Self::new_free(target, example_path, color); service.wait_ready(Duration::from_secs(15)); // Make sure provisioner is ready, else deployers will fail to start up @@ -330,18 +345,18 @@ impl Services { panic!("timed out while waiting for mongodb to be ready"); } - pub fn wait_deployer_ready(&self, project_path: &str, mut timeout: Duration) { + pub fn wait_deployer_ready(&self, mut timeout: Duration) { let mut now = SystemTime::now(); while !timeout.is_zero() { let mut run = Command::new(WORKSPACE_ROOT.join("target/debug/cargo-shuttle")); if env::var("SHUTTLE_API_KEY").is_err() { - run.env("SHUTTLE_API_KEY", "test-key"); + run.env("SHUTTLE_API_KEY", "e2e-test-key"); } run.env("CARGO_HOME", CARGO_HOME.path()); run.args(["project", "status"]) - .current_dir(WORKSPACE_ROOT.join("examples").join(project_path)); + .current_dir(self.get_full_project_path()); let stdout = run.output().unwrap().stdout; let stdout = String::from_utf8(stdout).unwrap(); @@ -358,39 +373,33 @@ impl Services { panic!("timed out while waiting for deployer to be ready"); } - pub fn run_client<'s, I, P>(&self, args: I, path: P) -> Child + pub fn run_client<'s, I>(&self, args: I) -> Child where - P: AsRef, I: IntoIterator, { let mut run = Command::new(WORKSPACE_ROOT.join("target/debug/cargo-shuttle")); if env::var("SHUTTLE_API_KEY").is_err() { - run.env("SHUTTLE_API_KEY", "test-key"); + run.env("SHUTTLE_API_KEY", "e2e-test-key"); } run.env("CARGO_HOME", CARGO_HOME.path()); - run.args(args).current_dir(path); + run.args(args).current_dir(self.get_full_project_path()); spawn_and_log(&mut run, &self.target, self.color) } - pub fn deploy(&self, project_path: &str) { - self.run_client( - ["project", "new"], - WORKSPACE_ROOT.join("examples").join(project_path), - ) - .wait() - .ensure_success("failed to run deploy"); - - self.wait_deployer_ready(project_path, Duration::from_secs(120)); - - self.run_client( - ["deploy", "--allow-dirty"], - WORKSPACE_ROOT.join("examples").join(project_path), - ) - .wait() - .ensure_success("failed to run deploy"); + /// Starts a project and deploys a service for the example in `self.example_path` + pub fn deploy(&self) { + self.run_client(["project", "new"]) + .wait() + .ensure_success("failed to run deploy"); + + self.wait_deployer_ready(Duration::from_secs(120)); + + self.run_client(["deploy", "--allow-dirty"]) + .wait() + .ensure_success("failed to run deploy"); } pub fn get(&self, sub_path: &str) -> RequestBuilder { @@ -401,4 +410,16 @@ impl Services { pub fn post(&self, sub_path: &str) -> RequestBuilder { reqwest::blocking::Client::new().post(format!("http://{}/{}", self.proxy_addr, sub_path)) } + + /// Gets the full path: the path within examples to a specific example appended to the workspace root + pub fn get_full_project_path(&self) -> PathBuf { + WORKSPACE_ROOT.join("examples").join(&self.example_path) + } +} + +impl Drop for Services { + fn drop(&mut self) { + // Initiate project destruction on test completion + _ = self.run_client(["project", "rm"]).wait(); + } } diff --git a/e2e/tests/integration/main.rs b/e2e/tests/integration/main.rs index 95e06707c..8640c4c64 100644 --- a/e2e/tests/integration/main.rs +++ b/e2e/tests/integration/main.rs @@ -1,5 +1,6 @@ pub mod helpers; +pub mod actix_web; pub mod axum; pub mod poem; pub mod rocket; diff --git a/e2e/tests/integration/poem.rs b/e2e/tests/integration/poem.rs index 9c521b387..7f5a566bb 100644 --- a/e2e/tests/integration/poem.rs +++ b/e2e/tests/integration/poem.rs @@ -4,8 +4,9 @@ use crate::helpers::{self, APPS_FQDN}; #[test] fn hello_world_poem() { - let client = helpers::Services::new_docker("hello-world (poem)", Color::Cyan); - client.deploy("poem/hello-world"); + let client = + helpers::Services::new_docker("hello-world (poem)", "poem/hello-world", Color::Cyan); + client.deploy(); let request_text = client .get("hello") @@ -20,8 +21,8 @@ fn hello_world_poem() { #[test] fn postgres_poem() { - let client = helpers::Services::new_docker("postgres (poem)", Color::Blue); - client.deploy("poem/postgres"); + let client = helpers::Services::new_docker("postgres (poem)", "poem/postgres", Color::Blue); + client.deploy(); let add_response = client .post("todo") @@ -48,8 +49,8 @@ fn postgres_poem() { #[test] fn mongodb_poem() { - let client = helpers::Services::new_docker("mongo (poem)", Color::Green); - client.deploy("poem/mongodb"); + let client = helpers::Services::new_docker("mongo (poem)", "poem/mongodb", Color::Green); + client.deploy(); // post todo and get its generated objectId let add_response = client diff --git a/e2e/tests/integration/rocket.rs b/e2e/tests/integration/rocket.rs index e0f67cc79..bbf4d0017 100644 --- a/e2e/tests/integration/rocket.rs +++ b/e2e/tests/integration/rocket.rs @@ -4,8 +4,12 @@ use crate::helpers::{self, APPS_FQDN}; #[test] fn hello_world_rocket() { - let client = helpers::Services::new_docker("hello-world (rocket)", Color::DarkMagenta); - client.deploy("rocket/hello-world"); + let client = helpers::Services::new_docker( + "hello-world (rocket)", + "rocket/hello-world", + Color::DarkMagenta, + ); + client.deploy(); let request_text = client .get("hello") @@ -20,8 +24,9 @@ fn hello_world_rocket() { #[test] fn postgres_rocket() { - let client = helpers::Services::new_docker("postgres (rocket)", Color::Magenta); - client.deploy("rocket/postgres"); + let client = + helpers::Services::new_docker("postgres (rocket)", "rocket/postgres", Color::Magenta); + client.deploy(); let add_response = client .post("todo") @@ -47,8 +52,15 @@ fn postgres_rocket() { #[test] fn secrets_rocket() { - let client = helpers::Services::new_docker("secrets (rocket)", Color::Red); - client.deploy("rocket/secrets"); + let client = helpers::Services::new_docker("secrets (rocket)", "rocket/secrets", Color::Red); + let project_path = client.get_full_project_path(); + std::fs::copy( + project_path.join("Secrets.toml.example"), + project_path.join("Secrets.toml"), + ) + .unwrap(); + + client.deploy(); let secret_response: String = client .get("secret") .header("Host", format!("secrets-rocket-app.{}", *APPS_FQDN)) diff --git a/e2e/tests/integration/salvo.rs b/e2e/tests/integration/salvo.rs index c0749a0e4..01daf0b41 100644 --- a/e2e/tests/integration/salvo.rs +++ b/e2e/tests/integration/salvo.rs @@ -4,8 +4,9 @@ use crate::helpers::{self, APPS_FQDN}; #[test] fn hello_world_salvo() { - let client = helpers::Services::new_docker("hello-world (salvo)", Color::DarkRed); - client.deploy("salvo/hello-world"); + let client = + helpers::Services::new_docker("hello-world (salvo)", "salvo/hello-world", Color::DarkRed); + client.deploy(); let request_text = client .get("hello") diff --git a/e2e/tests/integration/thruster.rs b/e2e/tests/integration/thruster.rs index eabc89ab4..ad6a20919 100644 --- a/e2e/tests/integration/thruster.rs +++ b/e2e/tests/integration/thruster.rs @@ -4,8 +4,12 @@ use crate::helpers::{self, APPS_FQDN}; #[test] fn hello_world_thruster() { - let client = helpers::Services::new_docker("hello-world (thruster)", Color::DarkYellow); - client.deploy("thruster/hello-world"); + let client = helpers::Services::new_docker( + "hello-world (thruster)", + "thruster/hello-world", + Color::DarkYellow, + ); + client.deploy(); let request_text = client .get("hello") diff --git a/e2e/tests/integration/tide.rs b/e2e/tests/integration/tide.rs index 270d5c465..af4d487fe 100644 --- a/e2e/tests/integration/tide.rs +++ b/e2e/tests/integration/tide.rs @@ -4,8 +4,9 @@ use crate::helpers::{self, APPS_FQDN}; #[test] fn hello_world_tide() { - let client = helpers::Services::new_docker("hello-world (tide)", Color::DarkYellow); - client.deploy("tide/hello-world"); + let client = + helpers::Services::new_docker("hello-world (tide)", "tide/hello-world", Color::DarkYellow); + client.deploy(); let request_text = client .get("hello") diff --git a/e2e/tests/integration/tower.rs b/e2e/tests/integration/tower.rs index 57945a99a..5592332aa 100644 --- a/e2e/tests/integration/tower.rs +++ b/e2e/tests/integration/tower.rs @@ -4,8 +4,12 @@ use crate::helpers::{self, APPS_FQDN}; #[test] fn hello_world_tower() { - let client = helpers::Services::new_docker("hello-world (tower)", Color::DarkYellow); - client.deploy("tower/hello-world"); + let client = helpers::Services::new_docker( + "hello-world (tower)", + "tower/hello-world", + Color::DarkYellow, + ); + client.deploy(); let request_text = client .get("hello") diff --git a/e2e/tests/integration/warp.rs b/e2e/tests/integration/warp.rs index 36aef9535..802fa2733 100644 --- a/e2e/tests/integration/warp.rs +++ b/e2e/tests/integration/warp.rs @@ -1,11 +1,12 @@ -use colored::Color; +use crossterm::style::Color; use crate::helpers::{self, APPS_FQDN}; #[test] fn hello_world_warp() { - let client = helpers::Services::new_docker("hello-world (warp)", Color::Cyan); - client.deploy("warp/hello-world"); + let client = + helpers::Services::new_docker("hello-world (warp)", "warp/hello-world", Color::Cyan); + client.deploy(); let request_text = client .get("hello") @@ -15,5 +16,5 @@ fn hello_world_warp() { .text() .unwrap(); - assert_eq!(request_text, "Hello, world!"); + assert_eq!(request_text, "Hello, World!"); } diff --git a/examples b/examples new file mode 160000 index 000000000..8ada30396 --- /dev/null +++ b/examples @@ -0,0 +1 @@ +Subproject commit 8ada303965ff7ac14873358243bfa071ed11b7e8 diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 56e8b165f..000000000 --- a/examples/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Examples - -Some example apps to show what you can do with shuttle. - -## How to deploy the examples - -To deploy the examples, check out the repository locally - -```bash -$ git clone https://github.com/shuttle-hq/shuttle.git -``` - -navigate to an example root folder - -```bash -$ cd examples/axum/hello-world -``` - -Pick a project name that is something unique - in shuttle, -projects are globally unique. Then run - -```bash -$ cargo shuttle project new --name=$PROJECT_NAME -$ cargo shuttle deploy --name=$PROJECT_NAME -``` diff --git a/examples/axum/hello-world/Cargo.toml b/examples/axum/hello-world/Cargo.toml deleted file mode 100644 index 2ed0f8c58..000000000 --- a/examples/axum/hello-world/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -axum = "0.5" -shuttle-service = { version = "0.7.0", features = ["web-axum"] } -sync_wrapper = "0.1" diff --git a/examples/axum/hello-world/Shuttle.toml b/examples/axum/hello-world/Shuttle.toml deleted file mode 100644 index db50aed05..000000000 --- a/examples/axum/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-axum-app" \ No newline at end of file diff --git a/examples/axum/hello-world/src/lib.rs b/examples/axum/hello-world/src/lib.rs deleted file mode 100644 index 58137a394..000000000 --- a/examples/axum/hello-world/src/lib.rs +++ /dev/null @@ -1,14 +0,0 @@ -use axum::{routing::get, Router}; -use sync_wrapper::SyncWrapper; - -async fn hello_world() -> &'static str { - "Hello, world!" -} - -#[shuttle_service::main] -async fn axum() -> shuttle_service::ShuttleAxum { - let router = Router::new().route("/hello", get(hello_world)); - let sync_wrapper = SyncWrapper::new(router); - - Ok(sync_wrapper) -} diff --git a/examples/axum/websocket/Cargo.toml b/examples/axum/websocket/Cargo.toml deleted file mode 100644 index be6492154..000000000 --- a/examples/axum/websocket/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "websocket" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -axum = { version = "0.5", features = ["ws"] } -chrono = { version = "0.4", features = ["serde"] } -futures = "0.3" -hyper = { version = "0.14", features = ["client", "http2"] } -hyper-tls = "0.5" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -shuttle-service = { version = "0.7.0", features = ["web-axum"] } -sync_wrapper = "0.1" -tokio = { version = "1", features = ["full"] } diff --git a/examples/axum/websocket/Shuttle.toml b/examples/axum/websocket/Shuttle.toml deleted file mode 100644 index a98513a3a..000000000 --- a/examples/axum/websocket/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "websocket-axum-app" diff --git a/examples/axum/websocket/index.html b/examples/axum/websocket/index.html deleted file mode 100644 index f7fbdf5ca..000000000 --- a/examples/axum/websocket/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - Websocket status page - - - -
    -
    - Current API status -
    -
    -
    -
    -
    - Last check time -
    -
    -
    -
    -
    - Clients watching -
    -
    -
    - - - - - - diff --git a/examples/axum/websocket/src/lib.rs b/examples/axum/websocket/src/lib.rs deleted file mode 100644 index 2d7ad4a58..000000000 --- a/examples/axum/websocket/src/lib.rs +++ /dev/null @@ -1,132 +0,0 @@ -use std::{sync::Arc, time::Duration}; - -use axum::{ - extract::{ - ws::{Message, WebSocket}, - WebSocketUpgrade, - }, - response::{Html, IntoResponse}, - routing::get, - Extension, Router, -}; -use chrono::{DateTime, Utc}; -use futures::{SinkExt, StreamExt}; -use hyper::{Client, Uri}; -use hyper_tls::HttpsConnector; -use serde::Serialize; -use shuttle_service::ShuttleAxum; -use sync_wrapper::SyncWrapper; -use tokio::{ - sync::{watch, Mutex}, - time::sleep, -}; - -struct State { - clients_count: usize, - rx: watch::Receiver, -} - -const PAUSE_SECS: u64 = 15; -const STATUS_URI: &str = "https://api.shuttle.rs/status"; - -#[derive(Serialize)] -struct Response { - clients_count: usize, - datetime: DateTime, - is_up: bool, -} - -#[shuttle_service::main] -async fn main() -> ShuttleAxum { - let (tx, rx) = watch::channel(Message::Text("{}".to_string())); - - let state = Arc::new(Mutex::new(State { - clients_count: 0, - rx, - })); - - // Spawn a thread to continually check the status of the api - let state_send = state.clone(); - tokio::spawn(async move { - let duration = Duration::from_secs(PAUSE_SECS); - let https = HttpsConnector::new(); - let client = Client::builder().build::<_, hyper::Body>(https); - let uri: Uri = STATUS_URI.parse().unwrap(); - - loop { - let is_up = client.get(uri.clone()).await; - let is_up = is_up.is_ok(); - - let response = Response { - clients_count: state_send.lock().await.clients_count, - datetime: Utc::now(), - is_up, - }; - let msg = serde_json::to_string(&response).unwrap(); - - if tx.send(Message::Text(msg)).is_err() { - break; - } - - sleep(duration).await; - } - }); - - let router = Router::new() - .route("/", get(index)) - .route("/websocket", get(websocket_handler)) - .layer(Extension(state)); - - let sync_wrapper = SyncWrapper::new(router); - - Ok(sync_wrapper) -} - -async fn websocket_handler( - ws: WebSocketUpgrade, - Extension(state): Extension>>, -) -> impl IntoResponse { - ws.on_upgrade(|socket| websocket(socket, state)) -} - -async fn websocket(stream: WebSocket, state: Arc>) { - // By splitting we can send and receive at the same time. - let (mut sender, mut receiver) = stream.split(); - - let mut rx = { - let mut state = state.lock().await; - state.clients_count += 1; - state.rx.clone() - }; - - // This task will receive watch messages and forward it to this connected client. - let mut send_task = tokio::spawn(async move { - while let Ok(()) = rx.changed().await { - let msg = rx.borrow().clone(); - - if sender.send(msg).await.is_err() { - break; - } - } - }); - - // This task will receive messages from this client. - let mut recv_task = tokio::spawn(async move { - while let Some(Ok(Message::Text(text))) = receiver.next().await { - println!("this example does not read any messages, but got: {text}"); - } - }); - - // If any one of the tasks exit, abort the other. - tokio::select! { - _ = (&mut send_task) => recv_task.abort(), - _ = (&mut recv_task) => send_task.abort(), - }; - - // This client disconnected - state.lock().await.clients_count -= 1; -} - -async fn index() -> Html<&'static str> { - Html(include_str!("../index.html")) -} diff --git a/examples/poem/hello-world/Cargo.toml b/examples/poem/hello-world/Cargo.toml deleted file mode 100644 index 74a34fded..000000000 --- a/examples/poem/hello-world/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -poem = "1.3.35" -shuttle-service = { version = "0.7.0", features = ["web-poem"] } diff --git a/examples/poem/hello-world/Shuttle.toml b/examples/poem/hello-world/Shuttle.toml deleted file mode 100644 index 83fe477b1..000000000 --- a/examples/poem/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-poem-app" diff --git a/examples/poem/hello-world/src/lib.rs b/examples/poem/hello-world/src/lib.rs deleted file mode 100644 index f7630400d..000000000 --- a/examples/poem/hello-world/src/lib.rs +++ /dev/null @@ -1,13 +0,0 @@ -use poem::{get, handler, Route}; - -#[handler] -fn hello_world() -> &'static str { - "Hello, world!" -} - -#[shuttle_service::main] -async fn main() -> shuttle_service::ShuttlePoem { - let app = Route::new().at("/hello", get(hello_world)); - - Ok(app) -} diff --git a/examples/poem/mongodb/Cargo.toml b/examples/poem/mongodb/Cargo.toml deleted file mode 100644 index 41f6389b2..000000000 --- a/examples/poem/mongodb/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "mongodb-poem-app" -version = "0.1.0" -edition = "2021" - -[dependencies] -mongodb = "2.3.0" -poem = "1.3.35" -serde = { version = "1", features = ["derive"] } -serde_json = "1" -shuttle-service = { version = "0.7.0", features = ["web-poem"] } -shuttle-shared-db = { version = "0.7.0", features = ["mongodb"] } diff --git a/examples/poem/mongodb/Shuttle.toml b/examples/poem/mongodb/Shuttle.toml deleted file mode 100644 index d1a1e3a7f..000000000 --- a/examples/poem/mongodb/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "mongodb-poem-app" diff --git a/examples/poem/mongodb/src/lib.rs b/examples/poem/mongodb/src/lib.rs deleted file mode 100644 index a247a9488..000000000 --- a/examples/poem/mongodb/src/lib.rs +++ /dev/null @@ -1,73 +0,0 @@ -use mongodb::bson::doc; -use mongodb::bson::oid::ObjectId; -use mongodb::{Collection, Database}; -use poem::{ - error::{BadRequest, NotFoundError}, - get, handler, - middleware::AddData, - post, - web::{Data, Json}, - EndpointExt, FromRequest, Request, RequestBody, Result, Route, -}; -use serde::{Deserialize, Serialize}; - -struct ObjectIdGuard(ObjectId); - -#[poem::async_trait] -impl<'a> FromRequest<'a> for ObjectIdGuard { - async fn from_request(req: &'a Request, _body: &mut RequestBody) -> Result { - let id = req.path_params::()?; - let obj_id = ObjectId::parse_str(id).map_err(BadRequest)?; - Ok(ObjectIdGuard(obj_id)) - } -} - -#[handler] -async fn retrieve( - ObjectIdGuard(id): ObjectIdGuard, - collection: Data<&Collection>, -) -> Result> { - let filter = doc! {"_id": id}; - let todo = collection - .find_one(filter, None) - .await - .map_err(BadRequest)?; - - match todo { - Some(todo) => Ok(Json(serde_json::json!(todo))), - None => Err(NotFoundError.into()), - } -} - -#[handler] -async fn add(Json(todo): Json, collection: Data<&Collection>) -> Result { - let todo_id = collection - .insert_one(todo, None) - .await - .map_err(BadRequest)?; - - Ok(todo_id - .inserted_id - .as_object_id() - .expect("id is objectId") - .to_string()) -} - -#[shuttle_service::main] -async fn main( - #[shuttle_shared_db::MongoDb] db: Database, -) -> shuttle_service::ShuttlePoem { - let collection = db.collection::("todos"); - - let app = Route::new() - .at("/todo", post(add)) - .at("/todo/:id", get(retrieve)) - .with(AddData::new(collection)); - - Ok(app) -} - -#[derive(Debug, Serialize, Deserialize)] -struct Todo { - pub note: String, -} diff --git a/examples/poem/postgres/Cargo.toml b/examples/poem/postgres/Cargo.toml deleted file mode 100644 index 5eb3e6b6e..000000000 --- a/examples/poem/postgres/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "postgres" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -poem = "1.3.35" -serde = "1.0" -shuttle-service = { version = "0.7.0", features = ["web-poem"] } -shuttle-shared-db = { version = "0.7.0", features = ["postgres"] } -sqlx = { version = "0.6", features = ["runtime-tokio-native-tls", "postgres"] } diff --git a/examples/poem/postgres/Shuttle.toml b/examples/poem/postgres/Shuttle.toml deleted file mode 100644 index 33ccd0784..000000000 --- a/examples/poem/postgres/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "postgres-poem-app" diff --git a/examples/poem/postgres/schema.sql b/examples/poem/postgres/schema.sql deleted file mode 100644 index 460e7c23d..000000000 --- a/examples/poem/postgres/schema.sql +++ /dev/null @@ -1,6 +0,0 @@ -DROP TABLE IF EXISTS todos; - -CREATE TABLE todos ( - id serial PRIMARY KEY, - note TEXT NOT NULL -); diff --git a/examples/poem/postgres/src/lib.rs b/examples/poem/postgres/src/lib.rs deleted file mode 100644 index d25787d98..000000000 --- a/examples/poem/postgres/src/lib.rs +++ /dev/null @@ -1,60 +0,0 @@ -use poem::{ - error::BadRequest, - get, handler, - middleware::AddData, - post, - web::{Data, Json, Path}, - EndpointExt, Result, Route, -}; -use serde::{Deserialize, Serialize}; -use shuttle_service::error::CustomError; -use sqlx::{Executor, FromRow, PgPool}; - -#[handler] -async fn retrieve(Path(id): Path, state: Data<&PgPool>) -> Result> { - let todo = sqlx::query_as("SELECT * FROM todos WHERE id = $1") - .bind(id) - .fetch_one(state.0) - .await - .map_err(BadRequest)?; - - Ok(Json(todo)) -} - -#[handler] -async fn add(Json(data): Json, state: Data<&PgPool>) -> Result> { - let todo = sqlx::query_as("INSERT INTO todos(note) VALUES ($1) RETURNING id, note") - .bind(&data.note) - .fetch_one(state.0) - .await - .map_err(BadRequest)?; - - Ok(Json(todo)) -} - -#[shuttle_service::main] -async fn main( - #[shuttle_shared_db::Postgres] pool: PgPool, -) -> shuttle_service::ShuttlePoem { - pool.execute(include_str!("../schema.sql")) - .await - .map_err(CustomError::new)?; - - let app = Route::new() - .at("/todo", post(add)) - .at("/todo/:id", get(retrieve)) - .with(AddData::new(pool)); - - Ok(app) -} - -#[derive(Deserialize)] -struct TodoNew { - pub note: String, -} - -#[derive(Serialize, FromRow)] -struct Todo { - pub id: i32, - pub note: String, -} diff --git a/examples/rocket/authentication/Cargo.toml b/examples/rocket/authentication/Cargo.toml deleted file mode 100644 index 1b7fb7a03..000000000 --- a/examples/rocket/authentication/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "authentication" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -chrono = "0.4" -jsonwebtoken = { version = "8", default-features = false } -lazy_static = "1.4" -rocket = { version = "0.5.0-rc.2", features = ["json"] } -serde = { version = "1.0", features = ["derive"] } -shuttle-service = { version = "0.7.0", features = ["web-rocket"] } diff --git a/examples/rocket/authentication/README.md b/examples/rocket/authentication/README.md deleted file mode 100644 index b4f4f43f5..000000000 --- a/examples/rocket/authentication/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# Issue and verify JWT for authentication -This example shows how to use [Rocket request guards](https://rocket.rs/v0.5-rc/guide/requests/#request-guards) for authentication with [JSON Web Tokens](https://jwt.io/) (JWT for short). -The idea is that all requests authenticate first at https://authentication-rocket-app.shuttleapp.rs/login to get a JWT. -Then the JWT is sent with all requests requiring authentication using the HTTP header `Authorization: Bearer `. - -This example uses the [`jsonwebtoken`](https://github.com/Keats/jsonwebtoken) which supports symmetric and asymmetric secret encoding, built-in validations, and most JWT algorithms. -However, this example only makes use of symmetric encoding and validation on the expiration claim. - -## Structure -This example has two files to register routes and handle JWT claims. - -### src/main.rs -Three Rocker routes are registered in this file: -1. `/public`: a route that can be called without needing any authentication. -1. `/login`: a route for posting a JSON object with a username and password to get a JWT. -1. `/private`: a route that can only be accessed with a valid JWT. - -### src/claims.rs -The bulk of this example is in this file. Most of the code can be transferred to other frameworks except for the `FromRequest` implementation, which is Rocket specific. -This file contains a `Claims` object which can be expanded with more claims. A `Claims` can be created from a `Bearer ` string using `Claims::from_authorization()`. -And a `Claims` object can also be converted to a token using `to_token()`. - -## Deploy -After logging into shuttle, use the following command to deploy this example: - -```sh -$ cargo shuttle project new -$ cargo shuttle deploy -``` - -Now make a note of the `Host` for the deploy to use in the examples below. Or just use `authentication-rocket-app.shuttleapp.rs` as the host below. - -### Seeing it in action -First, we should be able to access the public endpoint without any authentication using: - -```sh -$ curl https:///public -``` - -But trying to access the private endpoint will fail with a 403 forbidden: - -```sh -$ curl https:///private -``` - -So let's get a JWT from the login route first: - - -```sh -$ curl --request POST --data '{"username": "username", "password": "password"}' https:///login -``` - -Accessing the private endpoint with the token will now succeed: - -```sh -$ curl --header "Authorization: Bearer " https:///private -``` - -The token is set to expire in 5 minutus, so wait a while and try to access the private endpoint again. Once the token has expired, a user will need to get a new token from login. -Since tokens usually have a longer than 5 minutes expiration time, we can create a `/refresh` endpoint that takes an active token and returns a new token with a refreshed expiration time. diff --git a/examples/rocket/authentication/Shuttle.toml b/examples/rocket/authentication/Shuttle.toml deleted file mode 100644 index 716d4370a..000000000 --- a/examples/rocket/authentication/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "authentication-rocket-app" diff --git a/examples/rocket/authentication/src/claims.rs b/examples/rocket/authentication/src/claims.rs deleted file mode 100644 index bce84a3fd..000000000 --- a/examples/rocket/authentication/src/claims.rs +++ /dev/null @@ -1,135 +0,0 @@ -use chrono::{Duration, Utc}; -use jsonwebtoken::{ - decode, encode, errors::ErrorKind, DecodingKey, EncodingKey, Header, Validation, -}; -use lazy_static::lazy_static; -use rocket::{ - http::Status, - request::{FromRequest, Outcome}, - response::status::Custom, -}; -use serde::{Deserialize, Serialize}; - -const BEARER: &str = "Bearer "; -const AUTHORIZATION: &str = "Authorization"; - -/// Key used for symmetric token encoding -const SECRET: &str = "secret"; - -lazy_static! { - /// Time before token expires (aka exp claim) - static ref TOKEN_EXPIRATION: Duration = Duration::minutes(5); -} - -// Used when decoding a token to `Claims` -#[derive(Debug, PartialEq)] -pub(crate) enum AuthenticationError { - Missing, - Decoding(String), - Expired, -} - -// Basic claim object. Only the `exp` claim (field) is required. Consult the `jsonwebtoken` documentation for other claims that can be validated. -// The `name` is a custom claim for this API -#[derive(Serialize, Deserialize, Debug)] -pub(crate) struct Claims { - pub(crate) name: String, - exp: usize, -} - -// Rocket specific request guard implementation -#[rocket::async_trait] -impl<'r> FromRequest<'r> for Claims { - type Error = AuthenticationError; - - async fn from_request(request: &'r rocket::Request<'_>) -> Outcome { - match request.headers().get_one(AUTHORIZATION) { - None => Outcome::Failure((Status::Forbidden, AuthenticationError::Missing)), - Some(value) => match Claims::from_authorization(value) { - Err(e) => Outcome::Failure((Status::Forbidden, e)), - Ok(claims) => Outcome::Success(claims), - }, - } - } -} - -impl Claims { - pub(crate) fn from_name(name: &str) -> Self { - Self { - name: name.to_string(), - exp: 0, - } - } - - /// Create a `Claims` from a 'Bearer ' value - fn from_authorization(value: &str) -> Result { - let token = value.strip_prefix(BEARER).map(str::trim); - - if token.is_none() { - return Err(AuthenticationError::Missing); - } - - // Safe to unwrap as we just confirmed it is not none - let token = token.unwrap(); - - // Use `jsonwebtoken` to get the claims from a JWT - // Consult the `jsonwebtoken` documentation for using other algorithms and validations (the default validation just checks the expiration claim) - let token = decode::( - token, - &DecodingKey::from_secret(SECRET.as_ref()), - &Validation::default(), - ) - .map_err(|e| match e.kind() { - ErrorKind::ExpiredSignature => AuthenticationError::Expired, - _ => AuthenticationError::Decoding(e.to_string()), - })?; - - Ok(token.claims) - } - - /// Converts this claims into a token string - pub(crate) fn into_token(mut self) -> Result> { - let expiration = Utc::now() - .checked_add_signed(*TOKEN_EXPIRATION) - .expect("failed to create an expiration time") - .timestamp(); - - self.exp = expiration as usize; - - // Construct and return JWT using `jsonwebtoken` - // Consult the `jsonwebtoken` documentation for using other algorithms and asymmetric keys - let token = encode( - &Header::default(), - &self, - &EncodingKey::from_secret(SECRET.as_ref()), - ) - .map_err(|e| Custom(Status::BadRequest, e.to_string()))?; - - Ok(token) - } -} - -#[cfg(test)] -mod tests { - use crate::claims::AuthenticationError; - - use super::Claims; - - #[test] - fn missing_bearer() { - let claim_err = Claims::from_authorization("no-Bearer-prefix").unwrap_err(); - - assert_eq!(claim_err, AuthenticationError::Missing); - } - - #[test] - fn to_token_and_back() { - let claim = Claims::from_name("test runner"); - let token = claim.into_token().unwrap(); - let token = format!("Bearer {token}"); - - let claim = Claims::from_authorization(&token).unwrap(); - - assert_eq!(claim.name, "test runner"); - } -} diff --git a/examples/rocket/authentication/src/lib.rs b/examples/rocket/authentication/src/lib.rs deleted file mode 100644 index 5fb1b103e..000000000 --- a/examples/rocket/authentication/src/lib.rs +++ /dev/null @@ -1,77 +0,0 @@ -use rocket::http::Status; -use rocket::response::status::Custom; -use rocket::serde::json::Json; -use serde::{Deserialize, Serialize}; - -mod claims; - -use claims::Claims; - -#[macro_use] -extern crate rocket; - -#[derive(Serialize)] -struct PublicResponse { - message: String, -} - -#[get("/public")] -fn public() -> Json { - Json(PublicResponse { - message: "This endpoint is open to anyone".to_string(), - }) -} - -#[derive(Serialize)] -struct PrivateResponse { - message: String, - user: String, -} - -// More details on Rocket request guards can be found here -// https://rocket.rs/v0.5-rc/guide/requests/#request-guards -#[get("/private")] -fn private(user: Claims) -> Json { - Json(PrivateResponse { - message: "The `Claims` request guard ensures only valid JWTs can access this endpoint" - .to_string(), - user: user.name, - }) -} - -#[derive(Deserialize)] -struct LoginRequest { - username: String, - password: String, -} - -#[derive(Serialize)] -struct LoginResponse { - token: String, -} - -/// Tries to authenticate a user. Successful authentications get a JWT -#[post("/login", data = "")] -fn login(login: Json) -> Result, Custom> { - // This should be real user validation code, but is left simple for this example - if login.username != "username" || login.password != "password" { - return Err(Custom( - Status::Unauthorized, - "account was not found".to_string(), - )); - } - - let claim = Claims::from_name(&login.username); - let response = LoginResponse { - token: claim.into_token()?, - }; - - Ok(Json(response)) -} - -#[shuttle_service::main] -async fn rocket() -> shuttle_service::ShuttleRocket { - let rocket = rocket::build().mount("/", routes![public, private, login]); - - Ok(rocket) -} diff --git a/examples/rocket/hello-world/Cargo.toml b/examples/rocket/hello-world/Cargo.toml deleted file mode 100644 index 0c179d821..000000000 --- a/examples/rocket/hello-world/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -rocket = "0.5.0-rc.2" -shuttle-service = { version = "0.7.0", features = ["web-rocket"] } diff --git a/examples/rocket/hello-world/Shuttle.toml b/examples/rocket/hello-world/Shuttle.toml deleted file mode 100644 index 6d22450a7..000000000 --- a/examples/rocket/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-rocket-app" diff --git a/examples/rocket/hello-world/src/lib.rs b/examples/rocket/hello-world/src/lib.rs deleted file mode 100644 index cb788deaf..000000000 --- a/examples/rocket/hello-world/src/lib.rs +++ /dev/null @@ -1,14 +0,0 @@ -#[macro_use] -extern crate rocket; - -#[get("/")] -fn index() -> &'static str { - "Hello, world!" -} - -#[shuttle_service::main] -async fn rocket() -> shuttle_service::ShuttleRocket { - let rocket = rocket::build().mount("/hello", routes![index]); - - Ok(rocket) -} diff --git a/examples/rocket/persist/Cargo.toml b/examples/rocket/persist/Cargo.toml deleted file mode 100644 index 1d893c6b6..000000000 --- a/examples/rocket/persist/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "persist" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -rocket = { version = "0.5.0-rc.1", features = ["json"] } -serde = { version = "1.0", features = ["derive"] } -shuttle-persist = "0.7.0" -shuttle-service = { version = "0.7.0", features = ["web-rocket"] } diff --git a/examples/rocket/persist/README.md b/examples/rocket/persist/README.md deleted file mode 100644 index 9a409c2ae..000000000 --- a/examples/rocket/persist/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Persist Example - -An example app to show what you can do with shuttle. - -## How to deploy the example - -To deploy the examples, check out the repository locally - -```bash -$ git clone https://github.com/shuttle-hq/shuttle.git -``` - -navigate to the Persist root folder - -```bash -$ cd examples/rocket/persist -``` - -Pick a project name that is something unique - in shuttle, -projects are globally unique. Then run - -```bash -$ cargo shuttle project new --name=$PROJECT_NAME -$ cargo shuttle deploy --name=$PROJECT_NAME -``` - -Once deployed you can post to the endpoint the following values: -```bash -curl -X POST -H "Content-Type: application/json" -d '{"date":"2020-12-22", "temp_high":5, "temp_low":5, "precipitation": 5}' {$PROJECT_NAME}.shuttleapp.rs -``` - -The json data will then persist within Shuttle it can be queried with the following curl request - -```bash -curl {$PROJECT_NAME}.shuttleapp.rs/2020-12-22 -``` diff --git a/examples/rocket/persist/Shuttle.toml b/examples/rocket/persist/Shuttle.toml deleted file mode 100644 index 8ab3c88f5..000000000 --- a/examples/rocket/persist/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "persist-rocket-app" diff --git a/examples/rocket/persist/src/lib.rs b/examples/rocket/persist/src/lib.rs deleted file mode 100644 index f85bcd42f..000000000 --- a/examples/rocket/persist/src/lib.rs +++ /dev/null @@ -1,63 +0,0 @@ -#[macro_use] -extern crate rocket; - -use rocket::response::status::BadRequest; -use rocket::serde::json::Json; -use rocket::State; -use serde::{Deserialize, Serialize}; - -use shuttle_persist::PersistInstance; - -#[derive(Serialize, Deserialize, Clone)] -struct Weather { - date: String, - temp_high: f32, - temp_low: f32, - precipitation: f32, -} - -struct MyState { - persist: PersistInstance, -} - -#[post("/", data = "")] -async fn add( - data: Json, - state: &State, -) -> Result, BadRequest> { - // Change data Json to Weather - let weather: Weather = data.into_inner(); - - let _state = state - .persist - .save::( - format!("weather_{}", &weather.date.as_str()).as_str(), - weather.clone(), - ) - .map_err(|e| BadRequest(Some(e.to_string())))?; - Ok(Json(weather)) -} - -#[get("/")] -async fn retrieve( - date: String, - state: &State, -) -> Result, BadRequest> { - let weather = state - .persist - .load::(format!("weather_{}", &date).as_str()) - .map_err(|e| BadRequest(Some(e.to_string())))?; - Ok(Json(weather)) -} - -#[shuttle_service::main] -async fn rocket( - #[shuttle_persist::Persist] persist: PersistInstance, -) -> shuttle_service::ShuttleRocket { - let state = MyState { persist }; - let rocket = rocket::build() - .mount("/", routes![retrieve, add]) - .manage(state); - - Ok(rocket) -} diff --git a/examples/rocket/postgres/Cargo.toml b/examples/rocket/postgres/Cargo.toml deleted file mode 100644 index aca7ced72..000000000 --- a/examples/rocket/postgres/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "postgres" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -rocket = { version = "0.5.0-rc.1", features = ["json"] } -serde = "1.0" -shuttle-service = { version = "0.7.0", features = ["web-rocket"] } -shuttle-shared-db = { version = "0.7.0", features = ["postgres"] } -sqlx = { version = "0.6", features = ["runtime-tokio-native-tls", "postgres"] } diff --git a/examples/rocket/postgres/Shuttle.toml b/examples/rocket/postgres/Shuttle.toml deleted file mode 100644 index 539d434b3..000000000 --- a/examples/rocket/postgres/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "postgres-rocket-app" diff --git a/examples/rocket/postgres/schema.sql b/examples/rocket/postgres/schema.sql deleted file mode 100644 index 460e7c23d..000000000 --- a/examples/rocket/postgres/schema.sql +++ /dev/null @@ -1,6 +0,0 @@ -DROP TABLE IF EXISTS todos; - -CREATE TABLE todos ( - id serial PRIMARY KEY, - note TEXT NOT NULL -); diff --git a/examples/rocket/postgres/src/lib.rs b/examples/rocket/postgres/src/lib.rs deleted file mode 100644 index dd036fe22..000000000 --- a/examples/rocket/postgres/src/lib.rs +++ /dev/null @@ -1,63 +0,0 @@ -#[macro_use] -extern crate rocket; - -use rocket::response::status::BadRequest; -use rocket::serde::json::Json; -use rocket::State; -use serde::{Deserialize, Serialize}; -use shuttle_service::error::CustomError; -use sqlx::{Executor, FromRow, PgPool}; - -#[get("/")] -async fn retrieve(id: i32, state: &State) -> Result, BadRequest> { - let todo = sqlx::query_as("SELECT * FROM todos WHERE id = $1") - .bind(id) - .fetch_one(&state.pool) - .await - .map_err(|e| BadRequest(Some(e.to_string())))?; - - Ok(Json(todo)) -} - -#[post("/", data = "")] -async fn add( - data: Json, - state: &State, -) -> Result, BadRequest> { - let todo = sqlx::query_as("INSERT INTO todos(note) VALUES ($1) RETURNING id, note") - .bind(&data.note) - .fetch_one(&state.pool) - .await - .map_err(|e| BadRequest(Some(e.to_string())))?; - - Ok(Json(todo)) -} - -struct MyState { - pool: PgPool, -} - -#[shuttle_service::main] -async fn rocket(#[shuttle_shared_db::Postgres] pool: PgPool) -> shuttle_service::ShuttleRocket { - pool.execute(include_str!("../schema.sql")) - .await - .map_err(CustomError::new)?; - - let state = MyState { pool }; - let rocket = rocket::build() - .mount("/todo", routes![retrieve, add]) - .manage(state); - - Ok(rocket) -} - -#[derive(Deserialize)] -struct TodoNew { - pub note: String, -} - -#[derive(Serialize, FromRow)] -struct Todo { - pub id: i32, - pub note: String, -} diff --git a/examples/rocket/secrets/Cargo.toml b/examples/rocket/secrets/Cargo.toml deleted file mode 100644 index 9526d6a60..000000000 --- a/examples/rocket/secrets/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "secrets" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -anyhow = "1.0.62" -rocket = { version = "0.5.0-rc.1", features = ["json"] } -shuttle-secrets = "0.7.0" -shuttle-service = { version = "0.7.0", features = ["web-rocket"] } diff --git a/examples/rocket/secrets/Secrets.toml b/examples/rocket/secrets/Secrets.toml deleted file mode 100644 index ceedf199e..000000000 --- a/examples/rocket/secrets/Secrets.toml +++ /dev/null @@ -1 +0,0 @@ -MY_API_KEY = 'the contents of my API key' diff --git a/examples/rocket/secrets/Shuttle.toml b/examples/rocket/secrets/Shuttle.toml deleted file mode 100644 index 7febf30c9..000000000 --- a/examples/rocket/secrets/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "secrets-rocket-app" diff --git a/examples/rocket/secrets/src/lib.rs b/examples/rocket/secrets/src/lib.rs deleted file mode 100644 index 65755319f..000000000 --- a/examples/rocket/secrets/src/lib.rs +++ /dev/null @@ -1,33 +0,0 @@ -#[macro_use] -extern crate rocket; - -use anyhow::anyhow; -use rocket::response::status::BadRequest; -use rocket::State; -use shuttle_secrets::SecretStore; - -#[get("/secret")] -async fn secret(state: &State) -> Result> { - Ok(state.secret.clone()) -} - -struct MyState { - secret: String, -} - -#[shuttle_service::main] -async fn rocket( - #[shuttle_secrets::Secrets] secret_store: SecretStore, -) -> shuttle_service::ShuttleRocket { - // get secret defined in `Secrets.toml` file. - let secret = if let Some(secret) = secret_store.get("MY_API_KEY") { - secret - } else { - return Err(anyhow!("secret was not found").into()); - }; - - let state = MyState { secret }; - let rocket = rocket::build().mount("/", routes![secret]).manage(state); - - Ok(rocket) -} diff --git a/examples/rocket/url-shortener/Cargo.toml b/examples/rocket/url-shortener/Cargo.toml deleted file mode 100644 index d33cba841..000000000 --- a/examples/rocket/url-shortener/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "url-shortener" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -nanoid = "0.4" -rocket = { version = "0.5.0-rc.2", features = ["json"] } -serde = "1.0" -shuttle-service = { version = "0.7.0", features = ["web-rocket"] } -shuttle-shared-db = { version = "0.7.0", features = ["postgres"] } -sqlx = { version = "0.6", features = ["runtime-tokio-native-tls", "postgres"] } -url = "2.2" diff --git a/examples/rocket/url-shortener/README.md b/examples/rocket/url-shortener/README.md deleted file mode 100644 index c8bf86842..000000000 --- a/examples/rocket/url-shortener/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Url Shortener - -A URL shortener that you can use from your terminal - built with shuttle, rocket and postgres/sqlx. - -## How to use it - -You can use this URL shortener directly from your terminal. Just copy and paste this command to your terminal and replace `` with the URL that you want to shorten - -```bash -curl -X POST -d '' https://s.shuttleapp.rs -``` - -like this - -```bash -curl -X POST -d 'https://docs.rs/shuttle-service/latest/shuttle_service/' https://s.shuttleapp.rs -``` - -you will get the shortened URL back (something like this `https://s.shuttleapp.rs/RvpVU_`) - -## Project structure - -The project consists of the following files - -- `Shuttle.toml` contains the name of the app (if name is `s` domain will be `s.shuttleapp.rs`) -- `migrations` folder is for DB migration files created by [sqlx-cli](https://github.com/launchbadge/sqlx/tree/master/sqlx-cli) -- `src/lib.rs` is where all the magic happens - it creates a shuttle service with two endpoints: one for creating new short URLs and one for handling shortened URLs. - -## How to deploy - -To deploy this app, check out the repository locally - -```bash -$ git clone https://github.com/shuttle-hq/shuttle.git -``` - -navigate to `examples/rocket/url-shortener` - -```bash -$ cd examples/rocket/url-shortener -``` - -install shuttle - -```bash -$ cargo install cargo-shuttle -``` - -login to shuttle - -```bash -$ cargo shuttle login -``` - -Pick a project name that is something unique - in shuttle, -projects are globally unique. Then run - -```bash -$ cargo shuttle project new --name=$PROJECT_NAME -$ cargo shuttle deploy --name=$PROJECT_NAME -``` diff --git a/examples/rocket/url-shortener/Shuttle.toml b/examples/rocket/url-shortener/Shuttle.toml deleted file mode 100644 index c7d177586..000000000 --- a/examples/rocket/url-shortener/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "s" diff --git a/examples/rocket/url-shortener/migrations/20220324143837_urls.sql b/examples/rocket/url-shortener/migrations/20220324143837_urls.sql deleted file mode 100644 index 16144095c..000000000 --- a/examples/rocket/url-shortener/migrations/20220324143837_urls.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE urls ( - id VARCHAR(6) PRIMARY KEY, - url VARCHAR NOT NULL -); diff --git a/examples/rocket/url-shortener/src/lib.rs b/examples/rocket/url-shortener/src/lib.rs deleted file mode 100644 index fa0f17ba1..000000000 --- a/examples/rocket/url-shortener/src/lib.rs +++ /dev/null @@ -1,83 +0,0 @@ -#[macro_use] -extern crate rocket; - -use rocket::{ - http::Status, - response::{status, Redirect}, - routes, State, -}; -use serde::Serialize; -use shuttle_service::{error::CustomError, ShuttleRocket}; -use sqlx::migrate::Migrator; -use sqlx::{FromRow, PgPool}; -use url::Url; - -struct AppState { - pool: PgPool, -} - -#[derive(Serialize, FromRow)] -struct StoredURL { - pub id: String, - pub url: String, -} - -#[get("/")] -async fn redirect(id: String, state: &State) -> Result> { - let stored_url: StoredURL = sqlx::query_as("SELECT * FROM urls WHERE id = $1") - .bind(id) - .fetch_one(&state.pool) - .await - .map_err(|err| match err { - sqlx::Error::RowNotFound => status::Custom( - Status::NotFound, - "the requested shortened URL does not exist".into(), - ), - _ => status::Custom( - Status::InternalServerError, - "something went wrong, sorry 🤷".into(), - ), - })?; - - Ok(Redirect::to(stored_url.url)) -} - -#[post("/", data = "")] -async fn shorten(url: String, state: &State) -> Result> { - let id = &nanoid::nanoid!(6); - - let parsed_url = Url::parse(&url).map_err(|err| { - status::Custom( - Status::UnprocessableEntity, - format!("url validation failed: {err}"), - ) - })?; - - sqlx::query("INSERT INTO urls(id, url) VALUES ($1, $2)") - .bind(id) - .bind(parsed_url.as_str()) - .execute(&state.pool) - .await - .map_err(|_| { - status::Custom( - Status::InternalServerError, - "something went wrong, sorry 🤷".into(), - ) - })?; - - Ok(format!("https://s.shuttleapp.rs/{id}")) -} - -static MIGRATOR: Migrator = sqlx::migrate!(); - -#[shuttle_service::main] -async fn rocket(#[shuttle_shared_db::Postgres] pool: PgPool) -> ShuttleRocket { - MIGRATOR.run(&pool).await.map_err(CustomError::new)?; - - let state = AppState { pool }; - let rocket = rocket::build() - .mount("/", routes![redirect, shorten]) - .manage(state); - - Ok(rocket) -} diff --git a/examples/salvo/hello-world/Cargo.toml b/examples/salvo/hello-world/Cargo.toml deleted file mode 100644 index 951a529c1..000000000 --- a/examples/salvo/hello-world/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -salvo = "0.34.3" -shuttle-service = { version = "0.7.0", features = ["web-salvo"] } diff --git a/examples/salvo/hello-world/Shuttle.toml b/examples/salvo/hello-world/Shuttle.toml deleted file mode 100644 index 152ba13ab..000000000 --- a/examples/salvo/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-salvo-app" diff --git a/examples/salvo/hello-world/src/lib.rs b/examples/salvo/hello-world/src/lib.rs deleted file mode 100644 index d5ce829d4..000000000 --- a/examples/salvo/hello-world/src/lib.rs +++ /dev/null @@ -1,13 +0,0 @@ -use salvo::prelude::*; - -#[handler] -async fn hello_world(res: &mut Response) { - res.render(Text::Plain("Hello, world!")); -} - -#[shuttle_service::main] -async fn salvo() -> shuttle_service::ShuttleSalvo { - let router = Router::with_path("hello").get(hello_world); - - Ok(router) -} diff --git a/examples/serenity/hello-world/Cargo.toml b/examples/serenity/hello-world/Cargo.toml deleted file mode 100644 index 741dc89d0..000000000 --- a/examples/serenity/hello-world/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -anyhow = "1.0.62" -serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } -shuttle-secrets = "0.7.0" -shuttle-service = { version = "0.7.0", features = ["bot-serenity"] } -tracing = "0.1.35" diff --git a/examples/serenity/hello-world/README.md b/examples/serenity/hello-world/README.md deleted file mode 100644 index 086084e4e..000000000 --- a/examples/serenity/hello-world/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Serenity Hello World Bot with Shuttle - -In this example we will deploy a Serenity bot with Shuttle that responds to the `!hello` command with `world!`. To run this bot we need a valid Discord Token. To get started log in to the [Discord developer portal](https://discord.com/developers/applications). - -1. Click the New Application button, name your application and click Create. -2. Navigate to the Bot tab in the lefthand menu, and add a new bot. -3. On the bot page click the Reset Token button to reveal your token. Put this token in your `Secrets.toml`. It's very important that you don't reveal your token to anyone, as it can be abused. Create a `.gitignore` file to omit your `Secrets.toml` from version control. -4. For the sake of this example, you also need to scroll down on the bot page to the Message Content Intent section and enable that option. - -To add the bot to a server we need to create an invite link. - -1. On your bot's application page, open the OAuth2 page via the lefthand panel. -2. Go to the URL Generator via the lefthand panel, and select the `bot` scope as well as the `Send Messages` permission in the Bot Permissions section. -3. Copy the URL, open it in your browser and select a Discord server you wish to invite the bot to. - -For more information please refer to the [Discord docs](https://discord.com/developers/docs/getting-started) as well as the [Serenity repo](https://github.com/serenity-rs/serenity) for more examples. diff --git a/examples/serenity/hello-world/Secrets.toml b/examples/serenity/hello-world/Secrets.toml deleted file mode 100644 index 966fdb0c4..000000000 --- a/examples/serenity/hello-world/Secrets.toml +++ /dev/null @@ -1 +0,0 @@ -DISCORD_TOKEN = 'the contents of my discord token' diff --git a/examples/serenity/hello-world/Shuttle.toml b/examples/serenity/hello-world/Shuttle.toml deleted file mode 100644 index 39fe09834..000000000 --- a/examples/serenity/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-serenity-bot" diff --git a/examples/serenity/hello-world/src/lib.rs b/examples/serenity/hello-world/src/lib.rs deleted file mode 100644 index 9c3716c5d..000000000 --- a/examples/serenity/hello-world/src/lib.rs +++ /dev/null @@ -1,46 +0,0 @@ -use anyhow::anyhow; -use serenity::async_trait; -use serenity::model::channel::Message; -use serenity::model::gateway::Ready; -use serenity::prelude::*; -use shuttle_secrets::SecretStore; -use tracing::{error, info}; - -struct Bot; - -#[async_trait] -impl EventHandler for Bot { - async fn message(&self, ctx: Context, msg: Message) { - if msg.content == "!hello" { - if let Err(e) = msg.channel_id.say(&ctx.http, "world!").await { - error!("Error sending message: {:?}", e); - } - } - } - - async fn ready(&self, _: Context, ready: Ready) { - info!("{} is connected!", ready.user.name); - } -} - -#[shuttle_service::main] -async fn serenity( - #[shuttle_secrets::Secrets] secret_store: SecretStore, -) -> shuttle_service::ShuttleSerenity { - // Get the discord token set in `Secrets.toml` - let token = if let Some(token) = secret_store.get("DISCORD_TOKEN") { - token - } else { - return Err(anyhow!("'DISCORD_TOKEN' was not found").into()); - }; - - // Set gateway intents, which decides what events the bot will be notified about - let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; - - let client = Client::builder(&token, intents) - .event_handler(Bot) - .await - .expect("Err creating client"); - - Ok(client) -} diff --git a/examples/serenity/postgres/Cargo.toml b/examples/serenity/postgres/Cargo.toml deleted file mode 100644 index 8310116f2..000000000 --- a/examples/serenity/postgres/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "serenity-postgres" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -anyhow = "1.0.62" -serde = "1.0" -serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } -shuttle-secrets = "0.7.0" -shuttle-service = { version = "0.7.0", features = ["bot-serenity"] } -shuttle-shared-db = { version = "0.7.0", features = ["postgres"] } -sqlx = { version = "0.6", features = ["runtime-tokio-native-tls", "postgres"] } -tracing = "0.1.35" diff --git a/examples/serenity/postgres/README.md b/examples/serenity/postgres/README.md deleted file mode 100644 index 271d3ee87..000000000 --- a/examples/serenity/postgres/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Serenity Todo List Bot with Shuttle - -In this example we will deploy a Serenity bot with Shuttle that can add, list and complete todos using [Application Commands](https://discord.com/developers/docs/interactions/application-commands). To persist the todos we need a database. We will have Shuttle provison a PostgreSQL database for us by enabling the `sqlx-postgres` feature for `shuttle-service` and passing `#[shared::Postgres] pool: PgPool` as an argument to our `main` function. - -To run this bot we need a valid Discord Token. To get started log in to the [Discord developer portal](https://discord.com/developers/applications). - -1. Click the New Application button, name your application and click Create. -2. Navigate to the Bot tab in the lefthand menu, and add a new bot. -3. On the bot page click the Reset Token button to reveal your token. Put this token in your `Secrets.toml`. It's very important that you don't reveal your token to anyone, as it can be abused. Create a `.gitignore` file to omit your `Secrets.toml` from version control. - -To add the bot to a server we need to create an invite link. - -1. On your bot's application page, open the OAuth2 page via the lefthand panel. -2. Go to the URL Generator via the lefthand panel, and select the `applications.commands` scope. -3. Copy the URL, open it in your browser and select a Discord server you wish to invite the bot to. - -For this example we also need a `GuildId`. - -1. Open your Discord client, open the User Settings and navigate to Advanced. Enable Developer Mode. -2. Right click the Discord server you'd like to use the bot in and click Copy Id. This is your Guild ID. -3. Store it in `Secrets.toml` and retrieve it like we did for the Discord Token. - -For more information please refer to the [Discord docs](https://discord.com/developers/docs/getting-started) as well as the [Serenity repo](https://github.com/serenity-rs/serenity) for more examples. diff --git a/examples/serenity/postgres/Secrets.toml b/examples/serenity/postgres/Secrets.toml deleted file mode 100644 index a3249ddae..000000000 --- a/examples/serenity/postgres/Secrets.toml +++ /dev/null @@ -1,2 +0,0 @@ -DISCORD_TOKEN = 'the contents of my discord token' -GUILD_ID = "123456789" diff --git a/examples/serenity/postgres/Shuttle.toml b/examples/serenity/postgres/Shuttle.toml deleted file mode 100644 index bc686807d..000000000 --- a/examples/serenity/postgres/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "postgres-serenity-bot" diff --git a/examples/serenity/postgres/schema.sql b/examples/serenity/postgres/schema.sql deleted file mode 100644 index 2e5ebbe0d..000000000 --- a/examples/serenity/postgres/schema.sql +++ /dev/null @@ -1,7 +0,0 @@ -DROP TABLE IF EXISTS todos; - -CREATE TABLE todos ( - id serial PRIMARY KEY, - user_id BIGINT NULL, - note TEXT NOT NULL -); diff --git a/examples/serenity/postgres/src/db.rs b/examples/serenity/postgres/src/db.rs deleted file mode 100644 index 29137b432..000000000 --- a/examples/serenity/postgres/src/db.rs +++ /dev/null @@ -1,54 +0,0 @@ -use sqlx::{FromRow, PgPool}; -use std::fmt::Write; - -#[derive(FromRow)] -struct Todo { - pub id: i32, - pub note: String, -} - -pub(crate) async fn add(pool: &PgPool, note: &str, user_id: i64) -> Result { - sqlx::query("INSERT INTO todos (note, user_id) VALUES ($1, $2)") - .bind(note) - .bind(user_id) - .execute(pool) - .await?; - - Ok(format!("Added `{}` to your todo list", note)) -} - -pub(crate) async fn complete( - pool: &PgPool, - index: &i64, - user_id: i64, -) -> Result { - let todo: Todo = sqlx::query_as( - "SELECT id, note FROM todos WHERE user_id = $1 ORDER BY id LIMIT 1 OFFSET $2", - ) - .bind(user_id) - .bind(index - 1) - .fetch_one(pool) - .await?; - - sqlx::query("DELETE FROM todos WHERE id = $1") - .bind(todo.id) - .execute(pool) - .await?; - - Ok(format!("Completed `{}`!", todo.note)) -} - -pub(crate) async fn list(pool: &PgPool, user_id: i64) -> Result { - let todos: Vec = - sqlx::query_as("SELECT note, id FROM todos WHERE user_id = $1 ORDER BY id") - .bind(user_id) - .fetch_all(pool) - .await?; - - let mut response = format!("You have {} pending todos:\n", todos.len()); - for (i, todo) in todos.iter().enumerate() { - writeln!(&mut response, "{}. {}", i + 1, todo.note).unwrap(); - } - - Ok(response) -} diff --git a/examples/serenity/postgres/src/lib.rs b/examples/serenity/postgres/src/lib.rs deleted file mode 100644 index 8815dcdb4..000000000 --- a/examples/serenity/postgres/src/lib.rs +++ /dev/null @@ -1,155 +0,0 @@ -use anyhow::Context as _; -use serenity::async_trait; -use serenity::model::application::command::CommandOptionType; -use serenity::model::application::interaction::application_command::CommandDataOptionValue; -use serenity::model::application::interaction::{Interaction, InteractionResponseType}; -use serenity::model::gateway::Ready; -use serenity::model::id::GuildId; -use serenity::prelude::*; -use shuttle_secrets::SecretStore; -use sqlx::{Executor, PgPool}; -use tracing::{error, info}; - -mod db; - -struct Bot { - database: PgPool, - guild_id: String, -} - -#[async_trait] -impl EventHandler for Bot { - async fn interaction_create(&self, ctx: Context, interaction: Interaction) { - let user_id: i64 = interaction - .clone() - .application_command() - .unwrap() - .user - .id - .into(); - - if let Interaction::ApplicationCommand(command) = interaction { - info!("Received command interaction: {:#?}", command); - - let content = match command.data.name.as_str() { - "todo" => { - let command = command.data.options.get(0).expect("Expected command"); - - // if the todo subcommand has a CommandOption the command is either `add` or `complete` - if let Some(subcommand) = command.options.get(0) { - match subcommand.resolved.as_ref().expect("Valid subcommand") { - CommandDataOptionValue::String(note) => { - db::add(&self.database, note, user_id).await.unwrap() - } - CommandDataOptionValue::Integer(index) => { - db::complete(&self.database, index, user_id) - .await - .unwrap_or_else(|_| { - "Please submit a valid index from your todo list" - .to_string() - }) - } - _ => "Please enter a valid todo".to_string(), - } - // if the todo subcommand doesn't have a CommandOption the command is `list` - } else { - db::list(&self.database, user_id).await.unwrap() - } - } - _ => "Command not implemented".to_string(), - }; - - if let Err(why) = command - .create_interaction_response(&ctx.http, |response| { - response - .kind(InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|message| message.content(content)) - }) - .await - { - error!("Cannot respond to slash command: {}", why); - } - } - } - - async fn ready(&self, ctx: Context, ready: Ready) { - info!("{} is connected!", ready.user.name); - - let guild_id = GuildId(self.guild_id.parse().unwrap()); - - let _ = GuildId::set_application_commands(&guild_id, &ctx.http, |commands| { - commands.create_application_command(|command| { - command - .name("todo") - .description("Add, list and complete todos") - .create_option(|option| { - option - .name("add") - .description("Add a new todo") - .kind(CommandOptionType::SubCommand) - .create_sub_option(|option| { - option - .name("note") - .description("The todo note to add") - .kind(CommandOptionType::String) - .min_length(2) - .max_length(100) - .required(true) - }) - }) - .create_option(|option| { - option - .name("complete") - .description("The todo to complete") - .kind(CommandOptionType::SubCommand) - .create_sub_option(|option| { - option - .name("index") - .description("The index of the todo to complete") - .kind(CommandOptionType::Integer) - .min_int_value(1) - .required(true) - }) - }) - .create_option(|option| { - option - .name("list") - .description("List your todos") - .kind(CommandOptionType::SubCommand) - }) - }) - }) - .await; - } -} - -#[shuttle_service::main] -async fn serenity( - #[shuttle_shared_db::Postgres] pool: PgPool, - #[shuttle_secrets::Secrets] secret_store: SecretStore, -) -> shuttle_service::ShuttleSerenity { - // Get the discord token set in `Secrets.toml` - let token = secret_store - .get("DISCORD_TOKEN") - .context("'DISCORD_TOKEN' was not found")?; - // Get the guild_id set in `Secrets.toml` - let guild_id = secret_store - .get("GUILD_ID") - .context("'GUILD_ID' was not found")?; - - // Run the schema migration - pool.execute(include_str!("../schema.sql")) - .await - .context("failed to run migrations")?; - - let bot = Bot { - database: pool, - guild_id, - }; - let client = Client::builder(&token, GatewayIntents::empty()) - .event_handler(bot) - .await - .expect("Err creating client"); - - Ok(client) -} diff --git a/examples/thruster/hello-world/Cargo.toml b/examples/thruster/hello-world/Cargo.toml deleted file mode 100644 index ed56f40b7..000000000 --- a/examples/thruster/hello-world/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -shuttle-service = { version = "0.7.0", features = ["web-thruster"] } -thruster = { version = "1.2.6", features = ["hyper_server"] } diff --git a/examples/thruster/hello-world/Shuttle.toml b/examples/thruster/hello-world/Shuttle.toml deleted file mode 100644 index 8dca93fff..000000000 --- a/examples/thruster/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-thruster-app" diff --git a/examples/thruster/hello-world/src/lib.rs b/examples/thruster/hello-world/src/lib.rs deleted file mode 100644 index 1e6de6dab..000000000 --- a/examples/thruster/hello-world/src/lib.rs +++ /dev/null @@ -1,17 +0,0 @@ -use thruster::{ - context::basic_hyper_context::{generate_context, BasicHyperContext as Ctx, HyperRequest}, - m, middleware_fn, App, HyperServer, MiddlewareNext, MiddlewareResult, ThrusterServer, -}; - -#[middleware_fn] -async fn hello(mut context: Ctx, _next: MiddlewareNext) -> MiddlewareResult { - context.body("Hello, World!"); - Ok(context) -} - -#[shuttle_service::main] -async fn thruster() -> shuttle_service::ShuttleThruster> { - Ok(HyperServer::new( - App::::create(generate_context, ()).get("/hello", m![hello]), - )) -} diff --git a/examples/thruster/postgres/Cargo.toml b/examples/thruster/postgres/Cargo.toml deleted file mode 100644 index 34f22dcbf..000000000 --- a/examples/thruster/postgres/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "postgres" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -hyper = "0.14.20" -serde = { version = "1.0", features = ["derive"] } -serde_json = { version = "1.0" } -shuttle-aws-rds = { version = "0.7.0", features = ["postgres"] } -shuttle-service = { version = "0.7.0", features = ["web-thruster"] } -sqlx = { version = "0.6", features = ["runtime-tokio-native-tls", "postgres"] } -thruster = { version = "1.2.6", features = ["hyper_server"] } diff --git a/examples/thruster/postgres/Shuttle.toml b/examples/thruster/postgres/Shuttle.toml deleted file mode 100644 index 4ffbeb3e5..000000000 --- a/examples/thruster/postgres/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "postgres-tide-app" diff --git a/examples/thruster/postgres/schema.sql b/examples/thruster/postgres/schema.sql deleted file mode 100644 index 460e7c23d..000000000 --- a/examples/thruster/postgres/schema.sql +++ /dev/null @@ -1,6 +0,0 @@ -DROP TABLE IF EXISTS todos; - -CREATE TABLE todos ( - id serial PRIMARY KEY, - note TEXT NOT NULL -); diff --git a/examples/thruster/postgres/src/lib.rs b/examples/thruster/postgres/src/lib.rs deleted file mode 100644 index 14a1e8626..000000000 --- a/examples/thruster/postgres/src/lib.rs +++ /dev/null @@ -1,111 +0,0 @@ -use serde::{Deserialize, Serialize}; -use shuttle_service::error::CustomError; -use sqlx::{Executor, FromRow, PgPool}; -use thruster::{ - context::{hyper_request::HyperRequest, typed_hyper_context::TypedHyperContext}, - errors::{ErrorSet, ThrusterError}, - m, middleware_fn, App, Context, HyperServer, MiddlewareNext, MiddlewareResult, ThrusterServer, -}; - -type Ctx = TypedHyperContext; - -#[derive(Deserialize)] -struct TodoNew { - pub note: String, -} - -#[derive(Serialize, FromRow)] -struct Todo { - pub id: i32, - pub note: String, -} - -struct ServerConfig { - pool: PgPool, -} - -#[derive(Clone)] -struct RequestConfig { - pool: PgPool, -} - -fn generate_context(request: HyperRequest, state: &ServerConfig, _path: &str) -> Ctx { - Ctx::new( - request, - RequestConfig { - pool: state.pool.clone(), - }, - ) -} - -#[middleware_fn] -async fn retrieve(mut context: Ctx, _next: MiddlewareNext) -> MiddlewareResult { - let id: i32 = context - .query_params - .get("id") - .ok_or_else(|| { - ThrusterError::parsing_error( - Ctx::new_without_request(context.extra.clone()), - "id is required", - ) - })? - .parse() - .map_err(|_e| { - ThrusterError::parsing_error( - Ctx::new_without_request(context.extra.clone()), - "id must be a number", - ) - })?; - - let todo: Todo = sqlx::query_as("SELECT * FROM todos WHERE id = $1") - .bind(id) - .fetch_one(&context.extra.pool) - .await - .map_err(|_e| { - ThrusterError::not_found_error(Ctx::new_without_request(context.extra.clone())) - })?; - - context.set_body(serde_json::to_vec(&todo).unwrap()); - - Ok(context) -} - -#[middleware_fn] -async fn add(context: Ctx, _next: MiddlewareNext) -> MiddlewareResult { - let extra = context.extra.clone(); - - let (body, mut context) = context - .get_body() - .await - .map_err(|_e| ThrusterError::generic_error(Ctx::new_without_request(extra)))?; - let data: TodoNew = serde_json::from_str(&body).map_err(|_e| { - ThrusterError::generic_error(Ctx::new_without_request(context.extra.clone())) - })?; - - let todo: Todo = sqlx::query_as("INSERT INTO todos(note) VALUES ($1) RETURNING id, note") - .bind(&data.note) - .fetch_one(&context.extra.pool) - .await - .map_err(|_e| { - ThrusterError::generic_error(Ctx::new_without_request(context.extra.clone())) - })?; - - context.set_body(serde_json::to_vec(&todo).unwrap()); - - Ok(context) -} - -#[shuttle_service::main] -async fn thruster( - #[shuttle_aws_rds::Postgres] pool: PgPool, -) -> shuttle_service::ShuttleThruster> { - pool.execute(include_str!("../schema.sql")) - .await - .map_err(CustomError::new)?; - - Ok(HyperServer::new( - App::::create(generate_context, ServerConfig { pool }) - .post("/todos", m![add]) - .get("/todos/:id", m![retrieve]), - )) -} diff --git a/examples/tide/hello-world/Cargo.toml b/examples/tide/hello-world/Cargo.toml deleted file mode 100644 index e331caaf4..000000000 --- a/examples/tide/hello-world/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -shuttle-service = { version = "0.7.0", features = ["web-tide"] } -tide = "0.16.0" diff --git a/examples/tide/hello-world/Shuttle.toml b/examples/tide/hello-world/Shuttle.toml deleted file mode 100644 index 319271968..000000000 --- a/examples/tide/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-tide-app" diff --git a/examples/tide/hello-world/src/lib.rs b/examples/tide/hello-world/src/lib.rs deleted file mode 100644 index db95792bd..000000000 --- a/examples/tide/hello-world/src/lib.rs +++ /dev/null @@ -1,9 +0,0 @@ -#[shuttle_service::main] -async fn tide() -> shuttle_service::ShuttleTide<()> { - let mut app = tide::new(); - app.with(tide::log::LogMiddleware::new()); - - app.at("/hello").get(|_| async { Ok("Hello, world!") }); - - Ok(app) -} diff --git a/examples/tide/postgres/Cargo.toml b/examples/tide/postgres/Cargo.toml deleted file mode 100644 index 1c46c424a..000000000 --- a/examples/tide/postgres/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "postgres" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde = { version = "1.0", features = ["derive"] } -shuttle-aws-rds = { version = "0.7.0", features = ["postgres"] } -shuttle-service = { version = "0.7.0", features = ["web-tide"] } -sqlx = { version = "0.6", features = ["runtime-tokio-native-tls", "postgres"] } -tide = "0.16.0" diff --git a/examples/tide/postgres/Shuttle.toml b/examples/tide/postgres/Shuttle.toml deleted file mode 100644 index 4ffbeb3e5..000000000 --- a/examples/tide/postgres/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "postgres-tide-app" diff --git a/examples/tide/postgres/schema.sql b/examples/tide/postgres/schema.sql deleted file mode 100644 index 460e7c23d..000000000 --- a/examples/tide/postgres/schema.sql +++ /dev/null @@ -1,6 +0,0 @@ -DROP TABLE IF EXISTS todos; - -CREATE TABLE todos ( - id serial PRIMARY KEY, - note TEXT NOT NULL -); diff --git a/examples/tide/postgres/src/lib.rs b/examples/tide/postgres/src/lib.rs deleted file mode 100644 index 0ad8dd16f..000000000 --- a/examples/tide/postgres/src/lib.rs +++ /dev/null @@ -1,56 +0,0 @@ -use serde::{Deserialize, Serialize}; -use shuttle_service::{error::CustomError, ShuttleTide}; -use sqlx::{Executor, FromRow, PgPool}; -use tide::{Body, Request}; - -async fn retrieve(req: Request) -> tide::Result { - let id: i32 = req.param("id")?.parse()?; - let todo: Todo = sqlx::query_as("SELECT * FROM todos WHERE id = $1") - .bind(id) - .fetch_one(&req.state().pool) - .await?; - - Body::from_json(&todo).map(Into::into) -} - -async fn add(mut req: Request) -> tide::Result { - let data: TodoNew = req.body_json().await?; - let todo: Todo = sqlx::query_as("INSERT INTO todos(note) VALUES ($1) RETURNING id, note") - .bind(&data.note) - .fetch_one(&req.state().pool) - .await?; - - Body::from_json(&todo).map(Into::into) -} - -#[derive(Clone)] -struct MyState { - pool: PgPool, -} - -#[shuttle_service::main] -async fn tide(#[shuttle_aws_rds::Postgres] pool: PgPool) -> ShuttleTide { - pool.execute(include_str!("../schema.sql")) - .await - .map_err(CustomError::new)?; - - let state = MyState { pool }; - let mut app = tide::with_state(state); - - app.with(tide::log::LogMiddleware::new()); - app.at("/todo").post(add); - app.at("/todo/:id").get(retrieve); - - Ok(app) -} - -#[derive(Deserialize)] -struct TodoNew { - pub note: String, -} - -#[derive(Serialize, FromRow)] -struct Todo { - pub id: i32, - pub note: String, -} diff --git a/examples/tower/hello-world/Cargo.toml b/examples/tower/hello-world/Cargo.toml deleted file mode 100644 index 45fc5516c..000000000 --- a/examples/tower/hello-world/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -hyper = { version = "0.14", features = ["full"] } -shuttle-service = { version = "0.7.0", features = ["web-tower"] } -tower = { version = "0.4", features = ["full"] } diff --git a/examples/tower/hello-world/Shuttle.toml b/examples/tower/hello-world/Shuttle.toml deleted file mode 100644 index b99b1f923..000000000 --- a/examples/tower/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-tower-app" diff --git a/examples/tower/hello-world/src/lib.rs b/examples/tower/hello-world/src/lib.rs deleted file mode 100644 index 20a495455..000000000 --- a/examples/tower/hello-world/src/lib.rs +++ /dev/null @@ -1,34 +0,0 @@ -use std::convert::Infallible; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; - -#[derive(Clone)] -struct HelloWorld; - -impl tower::Service> for HelloWorld { - type Response = hyper::Response; - type Error = Infallible; - type Future = Pin> + Send + Sync>>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, _req: hyper::Request) -> Self::Future { - let body = hyper::Body::from("Hello, world!"); - let resp = hyper::Response::builder() - .status(200) - .body(body) - .expect("Unable to create the `hyper::Response` object"); - - let fut = async { Ok(resp) }; - - Box::pin(fut) - } -} - -#[shuttle_service::main] -async fn tower() -> Result { - Ok(HelloWorld) -} diff --git a/examples/warp/hello-world/Cargo.toml b/examples/warp/hello-world/Cargo.toml deleted file mode 100644 index 9bfc17ab5..000000000 --- a/examples/warp/hello-world/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "hello-world" -version = "0.1.0" -edition = "2021" - -[lib] - -[dependencies] -shuttle-service = { version = "0.7.0", features = ["web-warp"] } -warp = "0.3.2" diff --git a/examples/warp/hello-world/Shuttle.toml b/examples/warp/hello-world/Shuttle.toml deleted file mode 100644 index a8e7f48a1..000000000 --- a/examples/warp/hello-world/Shuttle.toml +++ /dev/null @@ -1 +0,0 @@ -name = "hello-world-warp-app" diff --git a/examples/warp/hello-world/src/lib.rs b/examples/warp/hello-world/src/lib.rs deleted file mode 100644 index 0b8eb6db9..000000000 --- a/examples/warp/hello-world/src/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -use warp::Filter; -use warp::Reply; - -#[shuttle_service::main] -async fn warp() -> shuttle_service::ShuttleWarp<(impl Reply,)> { - let route = warp::any().map(|| "Hello, World"); - Ok(route.boxed()) -} diff --git a/extras/panamax/Containerfile b/extras/panamax/Containerfile new file mode 100644 index 000000000..911b930f1 --- /dev/null +++ b/extras/panamax/Containerfile @@ -0,0 +1,7 @@ +ARG PANAMAX_TAG= + +FROM panamaxrs/panamax:${PANAMAX_TAG} + +COPY mirror.toml /mirror/mirror.toml + +CMD ["serve", "/mirror"] diff --git a/extras/panamax/mirror.toml b/extras/panamax/mirror.toml new file mode 100644 index 000000000..e43bbaa31 --- /dev/null +++ b/extras/panamax/mirror.toml @@ -0,0 +1,128 @@ +# This is a Panamax mirror. It is a self-contained directory made to be easily copied +# to an offline network or machine via rsync, USB, or another method. + +# When offline, Panamax also includes a "serve" command that can be used to serve +# rustup and cargo clients from the mirror. This will also give setup instructions +# on the homepage. + +[mirror] +# Global mirror settings. + + +# Number of download retries before giving up. +retries = 5 + + +# Contact information for the user agent. +# This is entirely optional, and is not required for the crates.io CDN. +# You may want to set this if you are mirroring from somewhere else. +# contact = "your@email.com" + + +[rustup] +# These are the configuration parameters for the rustup half of the mirror. +# This will download the rustup-init files, as well as all components needed +# to run Rust on a machine. + + +# Perform rustup synchronization. Set this to false if you only want to mirror crates.io. +sync = false + + +# Whether to mirror XZ archives. These archives are more efficiently compressed +# than the GZ archives, and rustup uses them by default. +download_xz = true +# Whether to mirror GZ archives, for further backwards compatibility with rustup. +download_gz = false + + +# Number of downloads that can be ran in parallel. +download_threads = 16 + + +# Where to download rustup files from. +source = "https://static.rust-lang.org" + + +# How many historical versions of Rust to keep. +# Setting these to 1 will keep only the latest version. +# Setting these to 2 or higher will keep the latest version, as well as historical versions. +# Setting these to 0 will stop Panamax from downloading the release entirely. +# Removing the line will keep all release versions. +keep_latest_stables = 1 +keep_latest_betas = 1 +keep_latest_nightlies = 1 + + +# Pinned versions of Rust to download and keep alongside latest stable/beta/nightly +# Version specifiers should be in the rustup toolchain format: +# +# [-][-] +# +# = stable|beta|nightly|| +# = YYYY-MM-DD +# = +# +# e.g. valid versions could be "1.42", "1.42.0", and "nightly-2014-12-18" +# Uncomment the following lines to pin extra rust versions: + +#pinned_rust_versions = [ +# "1.42" +#] + + +# UNIX platforms to include in the mirror +# Uncomment the following lines to limit which platforms get downloaded. +# This affects both rustup-inits and components. + +# platforms_unix = [ +# "arm-unknown-linux-gnueabi", +# "x86_64-unknown-linux-gnu", +# "x86_64-unknown-linux-musl", +# ] + + +# Windows platforms to include in the mirror +# Uncomment the following lines to limit which platforms get downloaded. +# This affects both rustup-inits and components. + +# platforms_windows = [ +# "x86_64-pc-windows-gnu", +# "x86_64-pc-windows-msvc", +# ] + + +# Whether to download the rustc-dev component. +# This component isn't always needed, so setting this to false can save lots of space. +download_dev = false + + +[crates] +# These are the configuration parameters for the crates.io half of the mirror. +# This will download the crates.io-index, as well as the crates themselves. +# Once downloaded, it will then (optionally) rewrite the config.json to point to your mirror. + + +# Perform crates synchronization. Set this to false if you only want to mirror rustup. +sync = true + + +# Number of downloads that can be ran in parallel. +download_threads = 64 + + +# Where to download the crates from. +# The default, "https://crates.io/api/v1/crates", will actually instead use the corresponding +# url at https://static.crates.io in order to avoid a redirect and rate limiting +source = "https://crates.io/api/v1/crates" + + +# Where to clone the crates.io-index repository from. +source_index = "https://github.com/rust-lang/crates.io-index" + + +# URL where this mirror's crates directory can be accessed from. +# Used for rewriting crates.io-index's config.json. +# Remove this parameter to perform no rewriting. +# If removed, the `panamax rewrite` command can be used later. +base_url = "http://panamax:8080/crates" diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 034d66282..932b2e7a8 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -1,45 +1,59 @@ [package] name = "shuttle-gateway" -version = "0.7.0" -edition = "2021" +version.workspace = true +edition.workspace = true +license.workspace = true publish = false [dependencies] -async-trait = "0.1.52" -axum = { version = "0.5.8", features = [ "headers" ] } -base64 = "0.13" -bollard = "0.13" -chrono = "0.4" -clap = { version = "4.0.0", features = [ "derive" ] } -fqdn = "0.2.2" -futures = "0.3.21" +acme2 = "0.5.1" +async-trait = { workspace = true } +axum = { workspace = true, features = [ "headers" ] } +axum-server = { version = "0.4.4", features = [ "tls-rustls" ] } +base64 = "0.13.1" +bollard = "0.13.0" +chrono = { workspace = true } +clap = { version = "4.0.27", features = [ "derive" ] } +fqdn = "0.2.3" +futures = "0.3.25" http = "0.2.8" -hyper = { version = "0.14.19", features = [ "stream" ] } +hyper = { version = "0.14.23", features = [ "stream" ] } # not great, but waiting for WebSocket changes to be merged hyper-reverse-proxy = { git = "https://github.com/chesedo/hyper-reverse-proxy", branch = "bug/host_header" } -once_cell = "1.14.0" -opentelemetry = { version = "0.17.0", features = ["rt-tokio"] } -opentelemetry-datadog = { version = "0.5.0", features = ["reqwest-client"] } +instant-acme = "0.1.1" +lazy_static = "1.4.0" +num_cpus = "1.14.0" +once_cell = { workspace = true } +opentelemetry = { version = "0.18.0", features = ["rt-tokio"] } +opentelemetry-datadog = { version = "0.6.0", features = ["reqwest-client"] } +opentelemetry-http = "0.7.0" +pem = "1.1.0" rand = "0.8.5" -regex = "1.5.5" -serde = { version = "1.0.137", features = [ "derive" ] } -serde_json = "1.0.81" -sqlx = { version = "0.5.11", features = [ "sqlite", "json", "runtime-tokio-rustls", "migrate" ] } -tokio = { version = "1.17", features = [ "full" ] } +rcgen = "0.10.0" +rustls = "0.20.7" +rustls-pemfile = "1.0.1" +serde = { workspace = true, features = [ "derive" ] } +serde_json = { workspace = true } +sqlx = { version = "0.6.2", features = [ "sqlite", "json", "runtime-tokio-native-tls", "migrate" ] } +strum = { version = "0.24.1", features = ["derive"] } +tokio = { version = "1.22.0", features = [ "full" ] } tower = { version = "0.4.13", features = [ "steer" ] } tower-http = { version = "0.3.4", features = ["trace"] } -tracing = "0.1.35" -tracing-opentelemetry = "0.17.4" -tracing-subscriber = { version = "0.3.11", features = ["env-filter"] } +tracing = { workspace = true } +tracing-opentelemetry = "0.18.0" +tracing-subscriber = { workspace = true, features = ["env-filter"] } +ttl_cache = "0.5.1" +uuid = { workspace = true, features = [ "v4" ] } [dependencies.shuttle-common] -version = "0.7.0" -path = "../common" +workspace = true +features = ["backend", "models"] [dev-dependencies] -anyhow = "1" -base64 = "0.13" -colored = "2" -portpicker = "0.1" -snailquote = "0.3" +anyhow = { workspace = true } +base64 = "0.13.1" +colored = "2.0.0" +portpicker = "0.1.1" +snailquote = "0.3.1" tempfile = "3.3.0" + diff --git a/gateway/README.md b/gateway/README.md new file mode 100644 index 000000000..8450081ab --- /dev/null +++ b/gateway/README.md @@ -0,0 +1,8 @@ +# shuttle-gateway + +## Tests +To run the tests for gateway, follow the steps in [contributing](https://github.com/shuttle-hq/shuttle/blob/main/CONTRIBUTING.md) to set up your local environment. Then, from the root of the repository, run: + +```bash +SHUTTLE_TESTS_RUNTIME_IMAGE=public.ecr.aws/shuttle-dev/deployer:latest SHUTTLE_TESTS_NETWORK=shuttle-dev_user-net cargo test --package shuttle-gateway --all-features -- --nocapture +``` diff --git a/gateway/migrations/0001_add_top_level_account_perms.sql b/gateway/migrations/0001_add_top_level_account_perms.sql new file mode 100644 index 000000000..15731aed2 --- /dev/null +++ b/gateway/migrations/0001_add_top_level_account_perms.sql @@ -0,0 +1 @@ +ALTER TABLE accounts ADD account_tier TEXT DEFAULT "basic" NOT NULL; diff --git a/gateway/migrations/0002_custom_domains.sql b/gateway/migrations/0002_custom_domains.sql new file mode 100644 index 000000000..d4178810d --- /dev/null +++ b/gateway/migrations/0002_custom_domains.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS custom_domains ( + fqdn TEXT PRIMARY KEY, + project_name TEXT NOT NULL REFERENCES projects (project_name), + certificate TEXT NOT NULL, + private_key TEXT NOT NULL +); diff --git a/gateway/prepare.sh b/gateway/prepare.sh new file mode 100755 index 000000000..6a52d3030 --- /dev/null +++ b/gateway/prepare.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +############################################################################### +# This file is used by our common Containerfile incase the container for this # +# service might need some extra preparation steps for its final image # +############################################################################### + +# Nothing to prepare in container image here diff --git a/gateway/src/acme.rs b/gateway/src/acme.rs new file mode 100644 index 000000000..4f448df1e --- /dev/null +++ b/gateway/src/acme.rs @@ -0,0 +1,402 @@ +use std::collections::HashMap; +use std::sync::Arc; +use std::task::{Context, Poll}; +use std::time::Duration; + +use axum::body::boxed; +use axum::response::Response; +use fqdn::FQDN; +use futures::future::BoxFuture; +use hyper::server::conn::AddrStream; +use hyper::{Body, Request}; +use instant_acme::{ + Account, AccountCredentials, Authorization, AuthorizationStatus, Challenge, ChallengeType, + Identifier, KeyAuthorization, LetsEncrypt, NewAccount, NewOrder, Order, OrderStatus, +}; +use rcgen::{Certificate, CertificateParams, DistinguishedName}; +use tokio::sync::Mutex; +use tokio::time::sleep; +use tower::{Layer, Service}; +use tracing::{error, trace, warn}; + +use crate::proxy::AsResponderTo; +use crate::{Error, ProjectName}; + +const MAX_RETRIES: usize = 15; + +#[derive(Debug, Eq, PartialEq)] +pub struct CustomDomain { + pub fqdn: FQDN, + pub project_name: ProjectName, + pub certificate: String, + pub private_key: String, +} + +/// An ACME client implementation that completes Http01 challenges +/// It is safe to clone this type as it functions as a singleton +#[derive(Clone, Default)] +pub struct AcmeClient(Arc>>); + +impl AcmeClient { + pub fn new() -> Self { + Self(Arc::new(Mutex::new(HashMap::default()))) + } + + async fn add_http01_challenge_authorization(&self, token: String, key: KeyAuthorization) { + trace!(token, "saving acme http01 challenge"); + self.0.lock().await.insert(token, key); + } + + async fn get_http01_challenge_authorization(&self, token: &str) -> Option { + self.0 + .lock() + .await + .get(token) + .map(|key| key.as_str().to_owned()) + } + + async fn remove_http01_challenge_authorization(&self, token: &str) { + trace!(token, "removing acme http01 challenge"); + self.0.lock().await.remove(token); + } + + /// Create a new ACME account that can be restored using by deserializing the returned JSON into a [instant_acme::AccountCredentials] + pub async fn create_account( + &self, + email: &str, + acme_server: Option, + ) -> Result { + let acme_server = acme_server.unwrap_or_else(|| LetsEncrypt::Production.url().to_string()); + + trace!(email, acme_server, "creating acme account"); + + let account: NewAccount = NewAccount { + contact: &[&format!("mailto:{email}")], + terms_of_service_agreed: true, + only_return_existing: false, + }; + + let account = Account::create(&account, &acme_server) + .await + .map_err(|error| { + error!(%error, "got error while creating acme account"); + AcmeClientError::AccountCreation + })?; + + let credentials = serde_json::to_value(account.credentials()).map_err(|error| { + error!(%error, "got error while extracting credentials from acme account"); + AcmeClientError::Serializing + })?; + + Ok(credentials) + } + + /// Create an ACME-signed certificate and return it and its + /// associated PEM-encoded private key + pub async fn create_certificate( + &self, + identifier: &str, + challenge_type: ChallengeType, + credentials: AccountCredentials<'_>, + ) -> Result<(String, String), AcmeClientError> { + trace!(identifier, "requesting acme certificate"); + + let account = Account::from_credentials(credentials).map_err(|error| { + error!( + error = &error as &dyn std::error::Error, + "failed to convert acme credentials into account" + ); + AcmeClientError::AccountCreation + })?; + + let (mut order, state) = account + .new_order(&NewOrder { + identifiers: &[Identifier::Dns(identifier.to_string())], + }) + .await + .map_err(|error| { + error!(%error, "failed to order certificate"); + AcmeClientError::OrderCreation + })?; + + let authorizations = + order + .authorizations(&state.authorizations) + .await + .map_err(|error| { + error!(%error, "failed to get authorizations information"); + AcmeClientError::AuthorizationCreation + })?; + + // There should only ever be 1 authorization as we only provide 1 domain at a time + debug_assert!(authorizations.len() == 1); + let authorization = &authorizations[0]; + + trace!(?authorization, "got authorization"); + + self.complete_challenge(challenge_type, authorization, &mut order) + .await?; + + let certificate = { + let mut params = CertificateParams::new(vec![identifier.to_owned()]); + params.distinguished_name = DistinguishedName::new(); + Certificate::from_params(params).map_err(|error| { + error!(%error, "failed to create certificate"); + AcmeClientError::CertificateCreation + })? + }; + let signing_request = certificate.serialize_request_der().map_err(|error| { + error!(%error, "failed to create certificate signing request"); + AcmeClientError::CertificateSigning + })?; + + let certificate_chain = order + .finalize(&signing_request, &state.finalize) + .await + .map_err(|error| { + error!(%error, "failed to finalize certificate request"); + AcmeClientError::OrderFinalizing + })?; + + Ok((certificate_chain, certificate.serialize_private_key_pem())) + } + + fn find_challenge( + ty: ChallengeType, + authorization: &Authorization, + ) -> Result<&Challenge, AcmeClientError> { + authorization + .challenges + .iter() + .find(|c| c.r#type == ty) + .ok_or_else(|| { + error!("http-01 challenge not found"); + AcmeClientError::MissingChallenge + }) + } + + async fn wait_for_termination(&self, order: &mut Order) -> Result<(), AcmeClientError> { + // Exponential backoff until order changes status + let mut tries = 1; + let mut delay = Duration::from_millis(250); + let state = loop { + sleep(delay).await; + let state = order.state().await.map_err(|error| { + error!(%error, "got error while fetching state"); + AcmeClientError::FetchingState + })?; + + trace!(?state, "order state refreshed"); + match state.status { + OrderStatus::Ready => break state, + OrderStatus::Invalid => { + return Err(AcmeClientError::ChallengeInvalid); + } + OrderStatus::Pending => { + delay *= 2; + tries += 1; + if tries < MAX_RETRIES { + trace!(?state, tries, attempt_in=?delay, "order not yet ready"); + } else { + error!(?state, tries, "order not ready in {MAX_RETRIES} tries"); + return Err(AcmeClientError::ChallengeTimeout); + } + } + _ => unreachable!(), + } + }; + + trace!(?state, "challenge completed"); + + Ok(()) + } + + async fn complete_challenge( + &self, + ty: ChallengeType, + authorization: &Authorization, + order: &mut Order, + ) -> Result<(), AcmeClientError> { + // Don't complete challenge for orders that are already valid + if let AuthorizationStatus::Valid = authorization.status { + return Ok(()); + } + let challenge = Self::find_challenge(ty, authorization)?; + match ty { + ChallengeType::Http01 => self.complete_http01_challenge(challenge, order).await, + ChallengeType::Dns01 => { + self.complete_dns01_challenge(&authorization.identifier, challenge, order) + .await + } + _ => Err(AcmeClientError::ChallengeNotSupported), + } + } + + async fn complete_dns01_challenge( + &self, + identifier: &Identifier, + challenge: &Challenge, + order: &mut Order, + ) -> Result<(), AcmeClientError> { + let Identifier::Dns(domain) = identifier; + + let digest = order.key_authorization(challenge).dns_value(); + warn!("dns-01 challenge: _acme-challenge.{domain} 300 IN TXT \"{digest}\""); + + // Wait 60 secs to insert the record manually and for it to + // propagate before moving on + sleep(Duration::from_secs(60)).await; + + order + .set_challenge_ready(&challenge.url) + .await + .map_err(|error| { + error!(%error, "failed to mark challenge as ready"); + AcmeClientError::SetReadyFailed + })?; + + self.wait_for_termination(order).await + } + + async fn complete_http01_challenge( + &self, + challenge: &Challenge, + order: &mut Order, + ) -> Result<(), AcmeClientError> { + trace!(?challenge, "will complete challenge"); + + self.add_http01_challenge_authorization( + challenge.token.clone(), + order.key_authorization(challenge), + ) + .await; + + order + .set_challenge_ready(&challenge.url) + .await + .map_err(|error| { + error!(%error, "failed to mark challenge as ready"); + AcmeClientError::SetReadyFailed + })?; + + let res = self.wait_for_termination(order).await; + + self.remove_http01_challenge_authorization(&challenge.token) + .await; + + res + } +} + +#[derive(Debug, strum::Display)] +pub enum AcmeClientError { + AccountCreation, + AuthorizationCreation, + CertificateCreation, + CertificateSigning, + ChallengeInvalid, + ChallengeTimeout, + FetchingState, + OrderCreation, + OrderFinalizing, + MissingChallenge, + ChallengeNotSupported, + Serializing, + SetReadyFailed, +} + +impl std::error::Error for AcmeClientError {} + +pub struct ChallengeResponderLayer { + client: AcmeClient, +} + +impl ChallengeResponderLayer { + pub fn new(client: AcmeClient) -> Self { + Self { client } + } +} + +impl Layer for ChallengeResponderLayer { + type Service = ChallengeResponder; + + fn layer(&self, inner: S) -> Self::Service { + ChallengeResponder { + client: self.client.clone(), + inner, + } + } +} + +pub struct ChallengeResponder { + client: AcmeClient, + inner: S, +} + +impl<'r, S> AsResponderTo<&'r AddrStream> for ChallengeResponder +where + S: AsResponderTo<&'r AddrStream>, +{ + fn as_responder_to(&self, req: &'r AddrStream) -> Self { + Self { + client: self.client.clone(), + inner: self.inner.as_responder_to(req), + } + } +} + +impl Service> for ChallengeResponder +where + S: Service, Response = Response, Error = Error> + Send + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = BoxFuture<'static, Result>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, req: Request) -> Self::Future { + if !req.uri().path().starts_with("/.well-known/acme-challenge/") { + let future = self.inner.call(req); + return Box::pin(async move { + let response: Response = future.await?; + Ok(response) + }); + } + + let token = match req + .uri() + .path() + .strip_prefix("/.well-known/acme-challenge/") + { + Some(token) => token.to_string(), + None => { + return Box::pin(async { + Ok(Response::builder() + .status(404) + .body(boxed(Body::empty())) + .unwrap()) + }) + } + }; + + trace!(token, "responding to certificate challenge"); + + let client = self.client.clone(); + + Box::pin(async move { + let (status, body) = match client.get_http01_challenge_authorization(&token).await { + Some(key) => (200, Body::from(key)), + None => (404, Body::empty()), + }; + + Ok(Response::builder() + .status(status) + .body(boxed(body)) + .unwrap()) + }) + } +} diff --git a/gateway/src/api/latest.rs b/gateway/src/api/latest.rs index 2d760368d..9b7093f1a 100644 --- a/gateway/src/api/latest.rs +++ b/gateway/src/api/latest.rs @@ -1,27 +1,45 @@ +use std::io::Cursor; +use std::net::SocketAddr; use std::sync::Arc; use std::time::Duration; use axum::body::{Body, BoxBody}; -use axum::extract::{Extension, Path}; +use axum::extract::{Extension, MatchedPath, Path, State}; use axum::http::Request; +use axum::middleware::from_extractor; use axum::response::Response; -use axum::routing::{any, get}; +use axum::routing::{any, get, post}; use axum::{Json as AxumJson, Router}; +use fqdn::FQDN; +use futures::Future; use http::StatusCode; +use instant_acme::{AccountCredentials, ChallengeType}; use serde::{Deserialize, Serialize}; -use shuttle_common::models::{project, user}; +use shuttle_common::backends::metrics::Metrics; +use shuttle_common::models::error::ErrorKind; +use shuttle_common::models::{project, stats, user}; use tokio::sync::mpsc::Sender; +use tokio::sync::{Mutex, MutexGuard}; use tower_http::trace::TraceLayer; -use tracing::{debug, debug_span, field, Span}; +use tracing::{debug, debug_span, field, instrument, Span}; +use ttl_cache::TtlCache; +use uuid::Uuid; +use crate::acme::{AcmeClient, CustomDomain}; use crate::auth::{Admin, ScopedUser, User}; -use crate::worker::Work; +use crate::project::{Project, ProjectCreating}; +use crate::task::{self, BoxedTask, TaskResult}; +use crate::tls::GatewayCertResolver; +use crate::worker::WORKER_QUEUE_SIZE; use crate::{AccountName, Error, GatewayService, ProjectName}; +pub const SVC_DEGRADED_THRESHOLD: usize = 128; + #[derive(Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum GatewayStatus { Healthy, + Degraded, Unhealthy, } @@ -37,6 +55,12 @@ impl StatusResponse { } } + pub fn degraded() -> Self { + Self { + status: GatewayStatus::Degraded, + } + } + pub fn unhealthy() -> Self { Self { status: GatewayStatus::Unhealthy, @@ -44,18 +68,20 @@ impl StatusResponse { } } +#[instrument(skip_all, fields(%account_name))] async fn get_user( - Extension(service): Extension>, + State(RouterState { service, .. }): State, Path(account_name): Path, _: Admin, ) -> Result, Error> { - let user = service.user_from_account_name(account_name).await?; + let user = User::retrieve_from_account_name(&service, account_name).await?; Ok(AxumJson(user.into())) } +#[instrument(skip_all, fields(%account_name))] async fn post_user( - Extension(service): Extension>, + State(RouterState { service, .. }): State, Path(account_name): Path, _: Admin, ) -> Result, Error> { @@ -64,8 +90,9 @@ async fn post_user( Ok(AxumJson(user.into())) } +#[instrument(skip(service))] async fn get_project( - Extension(service): Extension>, + State(RouterState { service, .. }): State, ScopedUser { scope, .. }: ScopedUser, ) -> Result, Error> { let state = service.find_project(&scope).await?.into(); @@ -77,60 +104,82 @@ async fn get_project( Ok(AxumJson(response)) } +#[instrument(skip_all, fields(%project))] async fn post_project( - Extension(service): Extension>, - Extension(sender): Extension>, + State(RouterState { + service, sender, .. + }): State, User { name, .. }: User, Path(project): Path, ) -> Result, Error> { - let work = service.create_project(project.clone(), name).await?; - - let name = work.project_name.to_string(); - let state = work.work.clone().into(); + let state = service + .create_project(project.clone(), name.clone()) + .await?; - sender.send(work).await?; + service + .new_task() + .project(project.clone()) + .send(&sender) + .await?; - let response = project::Response { name, state }; + let response = project::Response { + name: project.to_string(), + state: state.into(), + }; Ok(AxumJson(response)) } +#[instrument(skip_all, fields(%project))] async fn delete_project( - Extension(service): Extension>, - Extension(sender): Extension>, - ScopedUser { - scope: _, - user: User { name, .. }, - }: ScopedUser, - Path(project): Path, + State(RouterState { + service, sender, .. + }): State, + ScopedUser { scope: project, .. }: ScopedUser, ) -> Result, Error> { - let work = service.destroy_project(project, name).await?; + let state = service.find_project(&project).await?; + + let mut response = project::Response { + name: project.to_string(), + state: state.into(), + }; + + if response.state == shuttle_common::models::project::State::Destroyed { + return Ok(AxumJson(response)); + } - let name = work.project_name.to_string(); - let state = work.work.clone().into(); + // if project exists and isn't `Destroyed`, send destroy task + service + .new_task() + .project(project) + .and_then(task::destroy()) + .send(&sender) + .await?; - sender.send(work).await?; + response.state = shuttle_common::models::project::State::Destroying; - let response = project::Response { name, state }; Ok(AxumJson(response)) } +#[instrument(skip_all, fields(scope = %scoped_user.scope))] async fn route_project( - Extension(service): Extension>, - ScopedUser { scope, .. }: ScopedUser, + State(RouterState { service, .. }): State, + scoped_user: ScopedUser, req: Request, ) -> Result, Error> { - service.route(&scope, req).await + service.route(&scoped_user, req).await } -async fn get_status(Extension(sender): Extension>) -> Response { - let (status, body) = if !sender.is_closed() && sender.capacity() > 0 { - (StatusCode::OK, StatusResponse::healthy()) - } else { +async fn get_status(State(RouterState { sender, .. }): State) -> Response { + let (status, body) = if sender.is_closed() || sender.capacity() == 0 { ( StatusCode::INTERNAL_SERVER_ERROR, StatusResponse::unhealthy(), ) + } else if sender.capacity() < WORKER_QUEUE_SIZE - SVC_DEGRADED_THRESHOLD { + (StatusCode::OK, StatusResponse::degraded()) + } else { + (StatusCode::OK, StatusResponse::healthy()) }; let body = serde_json::to_vec(&body).unwrap(); @@ -140,33 +189,314 @@ async fn get_status(Extension(sender): Extension>) -> Response, sender: Sender) -> Router { - debug!("making api route"); - Router::::new() - .route( - "/", - get(get_status) - ) - .route( - "/projects/:project", - get(get_project).delete(delete_project).post(post_project) - ) - .route("/users/:account_name", get(get_user).post(post_user)) - .route("/projects/:project/*any", any(route_project)) - .layer(Extension(service)) - .layer(Extension(sender)) - .layer( +#[instrument(skip_all)] +async fn post_load( + State(RouterState { running_builds, .. }): State, + AxumJson(build): AxumJson, +) -> Result, Error> { + let mut running_builds = running_builds.lock().await; + let mut load = calculate_capacity(&mut running_builds); + + if load.has_capacity + && running_builds + .insert(build.id, (), Duration::from_secs(60 * 10)) + .is_none() + { + // Only increase when an item was not already in the queue + load.builds_count += 1; + } + + Ok(AxumJson(load)) +} + +#[instrument(skip_all)] +async fn delete_load( + State(RouterState { running_builds, .. }): State, + AxumJson(build): AxumJson, +) -> Result, Error> { + let mut running_builds = running_builds.lock().await; + running_builds.remove(&build.id); + + let load = calculate_capacity(&mut running_builds); + + Ok(AxumJson(load)) +} + +#[instrument(skip_all)] +async fn get_load_admin( + _: Admin, + State(RouterState { running_builds, .. }): State, +) -> Result, Error> { + let mut running_builds = running_builds.lock().await; + + let load = calculate_capacity(&mut running_builds); + + Ok(AxumJson(load)) +} + +#[instrument(skip_all)] +async fn delete_load_admin( + _: Admin, + State(RouterState { running_builds, .. }): State, +) -> Result, Error> { + let mut running_builds = running_builds.lock().await; + running_builds.clear(); + + let load = calculate_capacity(&mut running_builds); + + Ok(AxumJson(load)) +} + +fn calculate_capacity(running_builds: &mut MutexGuard>) -> stats::LoadResponse { + let active = running_builds.iter().count(); + let capacity = running_builds.capacity(); + let has_capacity = active < capacity; + + stats::LoadResponse { + builds_count: active, + has_capacity, + } +} + +#[instrument(skip_all)] +async fn revive_projects( + _: Admin, + State(RouterState { + service, sender, .. + }): State, +) -> Result<(), Error> { + crate::project::exec::revive(service, sender) + .await + .map_err(|_| Error::from_kind(ErrorKind::Internal)) +} + +#[instrument(skip_all, fields(%email, ?acme_server))] +async fn create_acme_account( + _: Admin, + Extension(acme_client): Extension, + Path(email): Path, + AxumJson(acme_server): AxumJson>, +) -> Result, Error> { + let res = acme_client.create_account(&email, acme_server).await?; + + Ok(AxumJson(res)) +} + +#[instrument(skip_all, fields(%project_name, %fqdn))] +async fn request_acme_certificate( + _: Admin, + State(RouterState { + service, sender, .. + }): State, + Extension(acme_client): Extension, + Extension(resolver): Extension>, + Path((project_name, fqdn)): Path<(ProjectName, String)>, + AxumJson(credentials): AxumJson>, +) -> Result { + let fqdn: FQDN = fqdn + .parse() + .map_err(|_err| Error::from(ErrorKind::InvalidCustomDomain))?; + + let (certs, private_key) = match service.project_details_for_custom_domain(&fqdn).await { + Ok(CustomDomain { + certificate, + private_key, + .. + }) => (certificate, private_key), + Err(err) if err.kind() == ErrorKind::CustomDomainNotFound => { + let (certs, private_key) = acme_client + .create_certificate(&fqdn.to_string(), ChallengeType::Http01, credentials) + .await?; + service + .create_custom_domain(project_name.clone(), &fqdn, &certs, &private_key) + .await?; + (certs, private_key) + } + Err(err) => return Err(err), + }; + + // destroy and recreate the project with the new domain + service + .new_task() + .project(project_name) + .and_then(task::destroy()) + .and_then(task::run_until_done()) + .and_then(task::run({ + let fqdn = fqdn.to_string(); + move |ctx| { + let fqdn = fqdn.clone(); + async move { + let creating = ProjectCreating::new_with_random_initial_key(ctx.project_name) + .with_fqdn(fqdn); + TaskResult::Done(Project::Creating(creating)) + } + } + })) + .send(&sender) + .await?; + + let mut buf = Vec::new(); + buf.extend(certs.as_bytes()); + buf.extend(private_key.as_bytes()); + resolver + .serve_pem(&fqdn.to_string(), Cursor::new(buf)) + .await?; + + Ok("certificate created".to_string()) +} + +async fn get_projects( + _: Admin, + State(RouterState { service, .. }): State, +) -> Result>, Error> { + let projects = service + .iter_projects_detailed() + .await? + .into_iter() + .map(Into::into) + .collect(); + + Ok(AxumJson(projects)) +} + +#[derive(Clone)] +pub(crate) struct RouterState { + pub service: Arc, + pub sender: Sender, + pub running_builds: Arc>>, +} + +pub struct ApiBuilder { + router: Router, + service: Option>, + sender: Option>, + bind: Option, +} + +impl Default for ApiBuilder { + fn default() -> Self { + Self::new() + } +} + +impl ApiBuilder { + pub fn new() -> Self { + Self { + router: Router::new(), + service: None, + sender: None, + bind: None, + } + } + + pub fn with_acme(mut self, acme: AcmeClient, resolver: Arc) -> Self { + self.router = self + .router + .route("/admin/acme/:email", post(create_acme_account)) + .route( + "/admin/acme/request/:project_name/:fqdn", + post(request_acme_certificate), + ) + .layer(Extension(acme)) + .layer(Extension(resolver)); + self + } + + pub fn with_service(mut self, service: Arc) -> Self { + self.service = Some(service); + self + } + + pub fn with_sender(mut self, sender: Sender) -> Self { + self.sender = Some(sender); + self + } + + pub fn binding_to(mut self, addr: SocketAddr) -> Self { + self.bind = Some(addr); + self + } + + pub fn with_default_traces(mut self) -> Self { + self.router = self.router.route_layer(from_extractor::()).layer( TraceLayer::new_for_http() .make_span_with(|request: &Request| { - debug_span!("request", http.uri = %request.uri(), http.method = %request.method(), http.status_code = field::Empty, api_key = field::Empty) + let path = if let Some(path) = request.extensions().get::() { + path.as_str() + } else { + "" + }; + + debug_span!( + "request", + http.uri = %request.uri(), + http.method = %request.method(), + http.status_code = field::Empty, + account.name = field::Empty, + // A bunch of extra things for metrics + // Should be able to make this clearer once `Valuable` support lands in tracing + request.path = path, + request.params.project_name = field::Empty, + request.params.account_name = field::Empty, + ) }) .on_response( |response: &Response, latency: Duration, span: &Span| { span.record("http.status_code", response.status().as_u16()); - debug!(latency = format_args!("{} ns", latency.as_nanos()), "finished processing request"); + debug!( + latency = format_args!("{} ns", latency.as_nanos()), + "finished processing request" + ); }, ), - ) + ); + self + } + + pub fn with_default_routes(mut self) -> Self { + self.router = self + .router + .route("/", get(get_status)) + .route( + "/projects/:project_name", + get(get_project).delete(delete_project).post(post_project), + ) + .route("/users/:account_name", get(get_user).post(post_user)) + .route("/projects/:project_name/*any", any(route_project)) + .route("/stats/load", post(post_load).delete(delete_load)) + .route("/admin/projects", get(get_projects)) + .route("/admin/revive", post(revive_projects)) + .route( + "/admin/stats/load", + get(get_load_admin).delete(delete_load_admin), + ); + self + } + + pub fn into_router(self) -> Router { + let service = self.service.expect("a GatewayService is required"); + let sender = self.sender.expect("a task Sender is required"); + + // Allow about 4 cores per build + let mut concurrent_builds = num_cpus::get() / 4; + if concurrent_builds < 1 { + concurrent_builds = 1; + } + + let running_builds = Arc::new(Mutex::new(TtlCache::new(concurrent_builds))); + + self.router.with_state(RouterState { + service, + sender, + running_builds, + }) + } + + pub fn serve(self) -> impl Future> { + let bind = self.bind.expect("a socket address to bind to is required"); + let router = self.into_router(); + axum::Server::bind(&bind).serve(router.into_make_service()) + } } #[cfg(test)] @@ -185,22 +515,24 @@ pub mod tests { use super::*; use crate::service::GatewayService; use crate::tests::{RequestBuilderExt, World}; - use crate::worker::Work; #[tokio::test] async fn api_create_get_delete_projects() -> anyhow::Result<()> { let world = World::new().await; - let service = - Arc::new(GatewayService::init(world.args(), world.fqdn(), world.pool()).await); + let service = Arc::new(GatewayService::init(world.args(), world.pool()).await); - let (sender, mut receiver) = channel::(256); + let (sender, mut receiver) = channel::(256); tokio::spawn(async move { while receiver.recv().await.is_some() { // do not do any work with inbound requests } }); - let mut router = make_api(Arc::clone(&service), sender); + let mut router = ApiBuilder::new() + .with_service(Arc::clone(&service)) + .with_sender(sender) + .with_default_routes() + .into_router(); let neo = service.create_user("neo".parse().unwrap()).await?; @@ -320,23 +652,35 @@ pub mod tests { .await .unwrap(); + // delete returns 404 for project that doesn't exist + router + .call(delete_project("resurrections").with_header(&authorization)) + .map_ok(|resp| { + assert_eq!(resp.status(), StatusCode::NOT_FOUND); + }) + .await + .unwrap(); + Ok(()) } #[tokio::test] async fn api_create_get_users() -> anyhow::Result<()> { let world = World::new().await; - let service = - Arc::new(GatewayService::init(world.args(), world.fqdn(), world.pool()).await); + let service = Arc::new(GatewayService::init(world.args(), world.pool()).await); - let (sender, mut receiver) = channel::(256); + let (sender, mut receiver) = channel::(256); tokio::spawn(async move { while receiver.recv().await.is_some() { // do not do any work with inbound requests } }); - let mut router = make_api(Arc::clone(&service), sender); + let mut router = ApiBuilder::new() + .with_service(Arc::clone(&service)) + .with_sender(sender) + .with_default_routes() + .into_router(); let get_neo = || { Request::builder() @@ -416,10 +760,9 @@ pub mod tests { #[tokio::test(flavor = "multi_thread")] async fn status() { let world = World::new().await; - let service = - Arc::new(GatewayService::init(world.args(), world.fqdn(), world.pool()).await); + let service = Arc::new(GatewayService::init(world.args(), world.pool()).await); - let (sender, mut receiver) = channel::(1); + let (sender, mut receiver) = channel::(1); let (ctl_send, ctl_recv) = oneshot::channel(); let (done_send, done_recv) = oneshot::channel(); let worker = tokio::spawn(async move { @@ -433,7 +776,11 @@ pub mod tests { } }); - let mut router = make_api(Arc::clone(&service), sender.clone()); + let mut router = ApiBuilder::new() + .with_service(Arc::clone(&service)) + .with_sender(sender) + .with_default_routes() + .into_router(); let get_status = || { Request::builder() @@ -471,6 +818,7 @@ pub mod tests { assert_eq!(resp.status(), StatusCode::OK); worker.abort(); + let _ = worker.await; let resp = router.call(get_status()).await.unwrap(); assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR); diff --git a/gateway/src/api/mod.rs b/gateway/src/api/mod.rs index e7eb5861f..27f571e54 100644 --- a/gateway/src/api/mod.rs +++ b/gateway/src/api/mod.rs @@ -1,2 +1 @@ pub mod latest; -pub use latest::make_api; diff --git a/gateway/src/args.rs b/gateway/src/args.rs index 5f65a7480..fd720025b 100644 --- a/gateway/src/args.rs +++ b/gateway/src/args.rs @@ -1,20 +1,26 @@ -use std::net::SocketAddr; +use std::{net::SocketAddr, path::PathBuf}; -use clap::{Parser, Subcommand}; +use clap::{Parser, Subcommand, ValueEnum}; use fqdn::FQDN; use crate::auth::Key; #[derive(Parser, Debug)] pub struct Args { - /// Uri to the `.sqlite` file used to store state - #[arg(long, default_value = "./gateway.sqlite")] - pub state: String, + /// Where to store gateway state (such as sqlite state, and certs) + #[arg(long, default_value = "./")] + pub state: PathBuf, #[command(subcommand)] pub command: Commands, } +#[derive(Debug, Clone, Copy, ValueEnum)] +pub enum UseTls { + Disable, + Enable, +} + #[derive(Subcommand, Debug)] pub enum Commands { Start(StartArgs), @@ -26,9 +32,31 @@ pub struct StartArgs { /// Address to bind the control plane to #[arg(long, default_value = "127.0.0.1:8001")] pub control: SocketAddr, - /// Address to bind the user plane to + /// Address to bind the bouncer service to + #[arg(long, default_value = "127.0.0.1:7999")] + pub bouncer: SocketAddr, + /// Address to bind the user proxy to #[arg(long, default_value = "127.0.0.1:8000")] pub user: SocketAddr, + /// Allows to disable the use of TLS in the user proxy service (DANGEROUS) + #[arg(long, default_value = "enable")] + pub use_tls: UseTls, + #[command(flatten)] + pub context: ContextArgs, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct InitArgs { + /// Name of initial account to create + #[arg(long)] + pub name: String, + /// Key to assign to initial account + #[arg(long)] + pub key: Option, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct ContextArgs { /// Default image to deploy user runtimes into #[arg(long, default_value = "public.ecr.aws/shuttle/deployer:latest")] pub image: String, @@ -40,23 +68,13 @@ pub struct StartArgs { /// the provisioner service #[arg(long, default_value = "provisioner")] pub provisioner_host: String, - /// The path to the docker daemon socket - #[arg(long, default_value = "/var/run/docker.sock")] - pub docker_host: String, /// The Docker Network name in which to deploy user runtimes #[arg(long, default_value = "shuttle_default")] pub network_name: String, /// FQDN where the proxy can be reached at - #[arg(long)] + #[arg(long, default_value = "shuttleapp.rs")] pub proxy_fqdn: FQDN, -} - -#[derive(clap::Args, Debug, Clone)] -pub struct InitArgs { - /// Name of initial account to create - #[arg(long)] - pub name: String, - /// Key to assign to initial account - #[arg(long)] - pub key: Option, + /// The path to the docker daemon socket + #[arg(long, default_value = "/var/run/docker.sock")] + pub docker_host: String, } diff --git a/gateway/src/auth.rs b/gateway/src/auth.rs index 5c66cceee..2e1b84b19 100644 --- a/gateway/src/auth.rs +++ b/gateway/src/auth.rs @@ -1,13 +1,15 @@ -use std::fmt::Formatter; +use std::fmt::{Debug, Formatter}; use std::str::FromStr; -use std::sync::Arc; -use axum::extract::{Extension, FromRequest, Path, RequestParts, TypedHeader}; +use axum::extract::{FromRef, FromRequestParts, Path, TypedHeader}; use axum::headers::authorization::Bearer; use axum::headers::Authorization; +use axum::http::request::Parts; use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; +use tracing::{trace, Span}; +use crate::api::latest::RouterState; use crate::service::GatewayService; use crate::{AccountName, Error, ErrorKind, ProjectName}; @@ -23,17 +25,21 @@ impl Key { } #[async_trait] -impl FromRequest for Key +impl FromRequestParts for Key where - B: Send, + S: Send + Sync, { type Rejection = Error; - async fn from_request(req: &mut RequestParts) -> Result { - TypedHeader::>::from_request(req) + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let key = TypedHeader::>::from_request_parts(parts, state) .await .map_err(|_| Error::from(ErrorKind::KeyMissing)) - .and_then(|TypedHeader(Authorization(bearer))| bearer.token().trim().parse()) + .and_then(|TypedHeader(Authorization(bearer))| bearer.token().trim().parse())?; + + trace!(%key, "got bearer key"); + + Ok(key) } } @@ -57,8 +63,6 @@ impl Key { } } -const FALSE: fn() -> bool = || false; - /// A wrapper for a guard that verifies an API key is associated with a /// valid user. /// @@ -70,28 +74,136 @@ pub struct User { pub name: AccountName, pub key: Key, pub projects: Vec, - #[serde(skip_serializing_if = "std::ops::Not::not")] - #[serde(default = "FALSE")] + pub permissions: Permissions, +} + +impl User { + pub fn is_super_user(&self) -> bool { + self.permissions.is_super_user() + } + + pub fn new_with_defaults(name: AccountName, key: Key) -> Self { + Self { + name, + key, + projects: Vec::new(), + permissions: Permissions::default(), + } + } + + pub async fn retrieve_from_account_name( + svc: &GatewayService, + name: AccountName, + ) -> Result { + let key = svc.key_from_account_name(&name).await?; + let permissions = svc.get_permissions(&name).await?; + let projects = svc.iter_user_projects(&name).await?.collect(); + Ok(User { + name, + key, + projects, + permissions, + }) + } + + pub async fn retrieve_from_key(svc: &GatewayService, key: Key) -> Result { + let name = svc.account_name_from_key(&key).await?; + trace!(%name, "got account name from key"); + + let permissions = svc.get_permissions(&name).await?; + let projects = svc.iter_user_projects(&name).await?.collect(); + Ok(User { + name, + key, + projects, + permissions, + }) + } +} + +#[derive(Clone, Copy, Deserialize, PartialEq, Eq, Serialize, Debug, sqlx::Type)] +#[sqlx(rename_all = "lowercase")] +pub enum AccountTier { + Basic, + Pro, + Team, +} + +#[derive(Default)] +pub struct PermissionsBuilder { + tier: Option, + super_user: Option, +} + +impl PermissionsBuilder { + pub fn super_user(mut self, is_super_user: bool) -> Self { + self.super_user = Some(is_super_user); + self + } + + pub fn tier(mut self, tier: AccountTier) -> Self { + self.tier = Some(tier); + self + } + + pub fn build(self) -> Permissions { + Permissions { + tier: self.tier.unwrap_or(AccountTier::Basic), + super_user: self.super_user.unwrap_or_default(), + } + } +} + +#[derive(Clone, Deserialize, PartialEq, Eq, Serialize, Debug)] +pub struct Permissions { + pub tier: AccountTier, pub super_user: bool, } +impl Default for Permissions { + fn default() -> Self { + Self { + tier: AccountTier::Basic, + super_user: false, + } + } +} + +impl Permissions { + pub fn builder() -> PermissionsBuilder { + PermissionsBuilder::default() + } + + pub fn tier(&self) -> &AccountTier { + &self.tier + } + + pub fn is_super_user(&self) -> bool { + self.super_user + } +} + #[async_trait] -impl FromRequest for User +impl FromRequestParts for User where - B: Send, + S: Send + Sync, + RouterState: FromRef, { type Rejection = Error; - async fn from_request(req: &mut RequestParts) -> Result { - let key = Key::from_request(req).await?; - let Extension(service) = Extension::>::from_request(req) - .await - .unwrap(); - let user = service - .user_from_key(key) + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let key = Key::from_request_parts(parts, state).await?; + + let RouterState { service, .. } = RouterState::from_ref(state); + + let user = User::retrieve_from_key(&service, key) .await // Absord any error into `Unauthorized` .map_err(|e| Error::source(ErrorKind::Unauthorized, e))?; + + // Record current account name for tracing purposes + Span::current().record("account.name", &user.name.to_string()); + Ok(user) } } @@ -121,22 +233,25 @@ pub struct ScopedUser { } #[async_trait] -impl FromRequest for ScopedUser +impl FromRequestParts for ScopedUser where - B: Send, + S: Send + Sync, + RouterState: FromRef, { type Rejection = Error; - async fn from_request(req: &mut RequestParts) -> Result { - let user = User::from_request(req).await?; - let scope = match Path::::from_request(req).await { + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let user = User::from_request_parts(parts, state).await?; + + let scope = match Path::::from_request_parts(parts, state).await { Ok(Path(p)) => p, - Err(_) => Path::<(ProjectName, String)>::from_request(req) + Err(_) => Path::<(ProjectName, String)>::from_request_parts(parts, state) .await .map(|Path((p, _))| p) .unwrap(), }; - if user.super_user || user.projects.contains(&scope) { + + if user.is_super_user() || user.projects.contains(&scope) { Ok(Self { user, scope }) } else { Err(Error::from(ErrorKind::ProjectNotFound)) @@ -149,15 +264,17 @@ pub struct Admin { } #[async_trait] -impl FromRequest for Admin +impl FromRequestParts for Admin where - B: Send, + S: Send + Sync, + RouterState: FromRef, { type Rejection = Error; - async fn from_request(req: &mut RequestParts) -> Result { - let user = User::from_request(req).await?; - if user.super_user { + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let user = User::from_request_parts(parts, state).await?; + + if user.is_super_user() { Ok(Self { user }) } else { Err(Error::from(ErrorKind::Forbidden)) diff --git a/gateway/src/lib.rs b/gateway/src/lib.rs index d5d2980bd..09c60b79d 100644 --- a/gateway/src/lib.rs +++ b/gateway/src/lib.rs @@ -8,29 +8,29 @@ use std::io; use std::pin::Pin; use std::str::FromStr; +use acme::AcmeClientError; use axum::response::{IntoResponse, Response}; use axum::Json; use bollard::Docker; use futures::prelude::*; -use once_cell::sync::Lazy; -use regex::Regex; use serde::{Deserialize, Deserializer, Serialize}; use shuttle_common::models::error::{ApiError, ErrorKind}; use tokio::sync::mpsc::error::SendError; use tracing::error; +pub mod acme; pub mod api; pub mod args; pub mod auth; pub mod project; pub mod proxy; pub mod service; +pub mod task; +pub mod tls; pub mod worker; use crate::service::{ContainerSettings, GatewayService}; -static PROJECT_REGEX: Lazy = Lazy::new(|| Regex::new("^[a-zA-Z0-9\\-_]{3,64}$").unwrap()); - /// Server-side errors that do not have to do with the user runtime /// should be [`Error`]s. /// @@ -80,7 +80,19 @@ impl From for Error { impl From> for Error { fn from(_: SendError) -> Self { - Self::from(ErrorKind::NotReady) + Self::from(ErrorKind::ServiceUnavailable) + } +} + +impl From for Error { + fn from(_: io::Error) -> Self { + Self::from(ErrorKind::Internal) + } +} + +impl From for Error { + fn from(error: AcmeClientError) -> Self { + Self::source(ErrorKind::Internal, error) } } @@ -107,10 +119,33 @@ impl std::fmt::Display for Error { impl StdError for Error {} -#[derive(Debug, sqlx::Type, Serialize, Clone, PartialEq, Eq)] +#[derive(Debug, sqlx::Type, Serialize, Clone, PartialEq, Eq, Hash)] #[sqlx(transparent)] pub struct ProjectName(String); +impl ProjectName { + pub fn as_str(&self) -> &str { + self.0.as_str() + } + + pub fn is_valid(&self) -> bool { + let name = self.0.clone(); + + fn is_valid_char(byte: u8) -> bool { + matches!(byte, b'a'..=b'z' | b'0'..=b'9' | b'-') + } + + // each label in a hostname can be between 1 and 63 chars + let is_invalid_length = name.len() > 63; + + !(name.bytes().any(|byte| !is_valid_char(byte)) + || name.ends_with('-') + || name.starts_with('-') + || name.is_empty() + || is_invalid_length) + } +} + impl<'de> Deserialize<'de> for ProjectName { fn deserialize(deserializer: D) -> Result where @@ -126,11 +161,9 @@ impl FromStr for ProjectName { type Err = Error; fn from_str(s: &str) -> Result { - if PROJECT_REGEX.is_match(s) { - Ok(Self(s.to_string())) - } else { - Err(Error::from_kind(ErrorKind::InvalidProjectName)) - } + s.parse::() + .map_err(|_| Error::from_kind(ErrorKind::InvalidProjectName)) + .map(|pn| Self(pn.to_string())) } } @@ -169,22 +202,37 @@ impl<'de> Deserialize<'de> for AccountName { } } -pub trait Context<'c>: Send + Sync { - fn docker(&self) -> &'c Docker; +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ProjectDetails { + pub project_name: ProjectName, + pub account_name: AccountName, +} + +impl From for shuttle_common::models::project::AdminResponse { + fn from(project: ProjectDetails) -> Self { + Self { + project_name: project.project_name.to_string(), + account_name: project.account_name.to_string(), + } + } +} + +pub trait DockerContext: Send + Sync { + fn docker(&self) -> &Docker; - fn container_settings(&self) -> &'c ContainerSettings; + fn container_settings(&self) -> &ContainerSettings; } #[async_trait] -pub trait Service<'c> { - type Context: Context<'c>; +pub trait Service { + type Context; - type State: EndState<'c>; + type State: EndState; type Error; /// Asks for the latest available context for task execution - fn context(&'c self) -> Self::Context; + fn context(&self) -> Self::Context; /// Commit a state update to persistence async fn update(&self, state: &Self::State) -> Result<(), Self::Error>; @@ -193,42 +241,39 @@ pub trait Service<'c> { /// A generic state which can, when provided with a [`Context`], do /// some work and advance itself #[async_trait] -pub trait State<'c>: Send + Sized + Clone { +pub trait State: Send { type Next; type Error; - async fn next>(self, ctx: &C) -> Result; + async fn next(self, ctx: &Ctx) -> Result; } -/// A [`State`] which contains all its transitions, including -/// failures -pub trait EndState<'c> +pub type StateTryStream<'c, St, Err> = Pin> + Send + 'c>>; + +pub trait EndState where - Self: State<'c, Error = Infallible, Next = Self>, + Self: State, { - type ErrorVariant; - fn is_done(&self) -> bool; - - fn into_result(self) -> Result; } -pub type StateTryStream<'c, St, Err> = Pin> + Send + 'c>>; - -pub trait EndStateExt<'c>: EndState<'c> { +pub trait EndStateExt: TryState + EndState +where + Ctx: Sync, + Self: Clone, +{ /// Convert the state into a [`TryStream`] that yields /// the generated states. /// /// This stream will not end. - fn into_stream(self, ctx: Ctx) -> StateTryStream<'c, Self, Self::ErrorVariant> + fn into_stream<'c>(self, ctx: &'c Ctx) -> StateTryStream<'c, Self, Self::ErrorVariant> where Self: 'c, - Ctx: 'c + Context<'c>, { Box::pin(stream::try_unfold((self, ctx), |(state, ctx)| async move { state - .next(&ctx) + .next(ctx) .await .unwrap() // EndState's `next` is Infallible .into_result() @@ -237,29 +282,42 @@ pub trait EndStateExt<'c>: EndState<'c> { } } -impl<'c, S> EndStateExt<'c> for S where S: EndState<'c> {} +impl EndStateExt for S +where + S: Clone + TryState + EndState, + Ctx: Send + Sync, +{ +} + +/// A [`State`] which contains all its transitions, including +/// failures +pub trait TryState: Sized { + type ErrorVariant; + + fn into_result(self) -> Result; +} -pub trait IntoEndState<'c, E> +pub trait IntoTryState where - E: EndState<'c>, + S: TryState, { - fn into_end_state(self) -> Result; + fn into_try_state(self) -> Result; } -impl<'c, E, S, Err> IntoEndState<'c, E> for Result +impl IntoTryState for Result where - E: EndState<'c> + From + From, + S: TryState + From + From, { - fn into_end_state(self) -> Result { - self.map(|s| E::from(s)).or_else(|err| Ok(E::from(err))) + fn into_try_state(self) -> Result { + self.map(|s| S::from(s)).or_else(|err| Ok(S::from(err))) } } #[async_trait] -pub trait Refresh: Sized { +pub trait Refresh: Sized { type Error: StdError; - async fn refresh<'c, C: Context<'c>>(self, ctx: &C) -> Result; + async fn refresh(self, ctx: &Ctx) -> Result; } #[cfg(test)] @@ -281,18 +339,18 @@ pub mod tests { use hyper::http::Uri; use hyper::{Body, Client as HyperClient, Request, Response, StatusCode}; use rand::distributions::{Alphanumeric, DistString, Distribution, Uniform}; - use shuttle_common::models::{project, service}; + use shuttle_common::models::{project, service, user}; use sqlx::SqlitePool; use tokio::sync::mpsc::channel; - use tracing::info; - use crate::api::make_api; - use crate::args::StartArgs; + use crate::acme::AcmeClient; + use crate::api::latest::ApiBuilder; + use crate::args::{ContextArgs, StartArgs, UseTls}; use crate::auth::User; - use crate::proxy::make_proxy; + use crate::proxy::UserServiceBuilder; use crate::service::{ContainerSettings, GatewayService, MIGRATIONS}; use crate::worker::Worker; - use crate::Context; + use crate::DockerContext; macro_rules! value_block_helper { ($next:ident, $block:block) => { @@ -355,7 +413,7 @@ pub mod tests { $($(#[$($meta:tt)*])* $($patterns:pat_param)|+ $(if $guards:expr)? $(=> $mores:block)?,)+ } => {{ let state = $state; - let mut stream = crate::EndStateExt::into_stream(state, $ctx); + let mut stream = crate::EndStateExt::into_stream(state, &$ctx); assert_stream_matches!( stream, $($(#[$($meta)*])* $($patterns)|+ $(if $guards)? $(=> $mores)?,)+ @@ -485,21 +543,19 @@ pub mod tests { args: StartArgs, hyper: HyperClient, pool: SqlitePool, - fqdn: String, + acme_client: AcmeClient, } - #[derive(Clone, Copy)] - pub struct WorldContext<'c> { - pub docker: &'c Docker, - pub container_settings: &'c ContainerSettings, - pub hyper: &'c HyperClient, - pub fqdn: &'c str, + #[derive(Clone)] + pub struct WorldContext { + pub docker: Docker, + pub container_settings: ContainerSettings, + pub hyper: HyperClient, } impl World { pub async fn new() -> Self { let docker = Docker::connect_with_local_defaults().unwrap(); - let fqdn = "test.shuttleapp.rs".to_string(); docker .list_images::<&str>(None) @@ -509,8 +565,10 @@ pub mod tests { let control: i16 = Uniform::from(9000..10000).sample(&mut rand::thread_rng()); let user = control + 1; + let bouncer = user + 1; let control = format!("127.0.0.1:{control}").parse().unwrap(); let user = format!("127.0.0.1:{user}").parse().unwrap(); + let bouncer = format!("127.0.0.1:{bouncer}").parse().unwrap(); let prefix = format!( "shuttle_test_{}_", @@ -529,17 +587,21 @@ pub mod tests { let args = StartArgs { control, - docker_host, user, - image, - prefix, - provisioner_host, - network_name, - proxy_fqdn: FQDN::from_str(&fqdn).unwrap(), + bouncer, + use_tls: UseTls::Disable, + context: ContextArgs { + docker_host, + image, + prefix, + provisioner_host, + network_name, + proxy_fqdn: FQDN::from_str("test.shuttleapp.rs").unwrap(), + }, }; - let settings = ContainerSettings::builder(&docker, fqdn.clone()) - .from_args(&args) + let settings = ContainerSettings::builder(&docker) + .from_args(&args.context) .await; let hyper = HyperClient::builder().build(HttpConnector::new()); @@ -547,18 +609,20 @@ pub mod tests { let pool = SqlitePool::connect("sqlite::memory:").await.unwrap(); MIGRATIONS.run(&pool).await.unwrap(); + let acme_client = AcmeClient::new(); + Self { docker, settings, args, hyper, pool, - fqdn, + acme_client, } } - pub fn args(&self) -> StartArgs { - self.args.clone() + pub fn args(&self) -> ContextArgs { + self.args.context.clone() } pub fn pool(&self) -> SqlitePool { @@ -569,48 +633,52 @@ pub mod tests { Client::new(addr).with_hyper_client(self.hyper.clone()) } - pub fn fqdn(&self) -> String { - self.fqdn.clone() + pub fn fqdn(&self) -> FQDN { + self.args().proxy_fqdn + } + + pub fn acme_client(&self) -> AcmeClient { + self.acme_client.clone() } } impl World { pub fn context(&self) -> WorldContext { WorldContext { - docker: &self.docker, - container_settings: &self.settings, - hyper: &self.hyper, - fqdn: &self.fqdn, + docker: self.docker.clone(), + container_settings: self.settings.clone(), + hyper: self.hyper.clone(), } } } - impl<'c> Context<'c> for WorldContext<'c> { - fn docker(&self) -> &'c Docker { - self.docker + impl DockerContext for WorldContext { + fn docker(&self) -> &Docker { + &self.docker } - fn container_settings(&self) -> &'c ContainerSettings { - self.container_settings + fn container_settings(&self) -> &ContainerSettings { + &self.container_settings } } #[tokio::test] async fn end_to_end() { let world = World::new().await; - let service = - Arc::new(GatewayService::init(world.args(), world.fqdn(), world.pool()).await); - let worker = Worker::new(Arc::clone(&service)); + let service = Arc::new(GatewayService::init(world.args(), world.pool()).await); + let worker = Worker::new(); let (log_out, mut log_in) = channel(256); tokio::spawn({ let sender = worker.sender(); async move { while let Some(work) = log_in.recv().await { - info!("work: {work:?}"); - sender.send(work).await.unwrap() + sender + .send(work) + .await + .map_err(|_| "could not send work") + .unwrap(); } - info!("work channel closed"); } }); @@ -621,28 +689,33 @@ pub mod tests { } }; - let api = make_api(Arc::clone(&service), log_out); let api_addr = format!("127.0.0.1:{}", base_port).parse().unwrap(); - let serve_api = hyper::Server::bind(&api_addr).serve(api.into_make_service()); let api_client = world.client(api_addr); - - let proxy = make_proxy(Arc::clone(&service), world.fqdn()); - let proxy_addr = format!("127.0.0.1:{}", base_port + 1).parse().unwrap(); - let serve_proxy = hyper::Server::bind(&proxy_addr).serve(proxy); - let proxy_client = world.client(proxy_addr); + let api = ApiBuilder::new() + .with_service(Arc::clone(&service)) + .with_sender(log_out) + .with_default_routes() + .binding_to(api_addr); + + let user_addr: SocketAddr = format!("127.0.0.1:{}", base_port + 1).parse().unwrap(); + let proxy_client = world.client(user_addr); + let user = UserServiceBuilder::new() + .with_service(Arc::clone(&service)) + .with_public(world.fqdn()) + .with_user_proxy_binding_to(user_addr); let _gateway = tokio::spawn(async move { tokio::select! { _ = worker.start() => {}, - _ = serve_api => {}, - _ = serve_proxy => {} + _ = api.serve() => {}, + _ = user.serve() => {} } }); let User { key, name, .. } = service.create_user("neo".parse().unwrap()).await.unwrap(); service.set_super_user(&name, true).await.unwrap(); - let User { key, .. } = api_client + let user::Response { key, .. } = api_client .request( Request::post("/users/trinity") .with_header(&Authorization::bearer(key.as_str()).unwrap()) @@ -742,6 +815,7 @@ pub mod tests { .request( Request::get("/hello") .header("Host", "matrix.test.shuttleapp.rs") + .header("x-shuttle-project", "matrix") .body(Body::empty()) .unwrap(), ) @@ -777,10 +851,27 @@ pub mod tests { ) .await .unwrap(); - println!("{resp:?}"); - if matches!(resp.status(), StatusCode::NOT_FOUND) { + let resp = serde_json::from_slice::(resp.body().as_slice()).unwrap(); + if matches!(resp.state, project::State::Destroyed) { break; } }); + + // Attempting to delete already Destroyed project will return Destroyed + api_client + .request( + Request::delete("/projects/matrix") + .with_header(&authorization) + .body(Body::empty()) + .unwrap(), + ) + .map_ok(|resp| { + assert_eq!(resp.status(), StatusCode::OK); + let resp = + serde_json::from_slice::(resp.body().as_slice()).unwrap(); + assert_eq!(resp.state, project::State::Destroyed); + }) + .await + .unwrap(); } } diff --git a/gateway/src/main.rs b/gateway/src/main.rs index 5a01f5e48..b2912034d 100644 --- a/gateway/src/main.rs +++ b/gateway/src/main.rs @@ -1,18 +1,25 @@ use clap::Parser; +use fqdn::FQDN; use futures::prelude::*; -use shuttle_gateway::args::{Args, Commands, InitArgs}; +use instant_acme::{AccountCredentials, ChallengeType}; +use opentelemetry::global; +use shuttle_gateway::acme::{AcmeClient, CustomDomain}; +use shuttle_gateway::api::latest::{ApiBuilder, SVC_DEGRADED_THRESHOLD}; +use shuttle_gateway::args::StartArgs; +use shuttle_gateway::args::{Args, Commands, InitArgs, UseTls}; use shuttle_gateway::auth::Key; -use shuttle_gateway::proxy::make_proxy; +use shuttle_gateway::proxy::UserServiceBuilder; use shuttle_gateway::service::{GatewayService, MIGRATIONS}; -use shuttle_gateway::worker::{Work, Worker}; -use shuttle_gateway::{api::make_api, args::StartArgs}; -use shuttle_gateway::{Refresh, Service}; +use shuttle_gateway::task; +use shuttle_gateway::tls::{make_tls_acceptor, ChainAndPrivateKey}; +use shuttle_gateway::worker::{Worker, WORKER_QUEUE_SIZE}; use sqlx::migrate::MigrateDatabase; use sqlx::{query, Sqlite, SqlitePool}; -use std::io; -use std::path::Path; +use std::io::{self, Cursor}; +use std::path::{Path, PathBuf}; use std::sync::Arc; -use tracing::{debug, error, info, trace}; +use std::time::Duration; +use tracing::{debug, error, info, info_span, trace, warn, Instrument}; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; #[tokio::main(flavor = "multi_thread")] @@ -21,6 +28,8 @@ async fn main() -> io::Result<()> { trace!(args = ?args, "parsed args"); + global::set_text_map_propagator(opentelemetry_datadog::DatadogPropagator::new()); + let fmt_layer = fmt::layer(); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) @@ -38,8 +47,11 @@ async fn main() -> io::Result<()> { .with(opentelemetry) .init(); - if !Path::new(&args.state).exists() { - Sqlite::create_database(&args.state).await.unwrap(); + let db_path = args.state.join("gateway.sqlite"); + let db_uri = db_path.to_str().unwrap(); + + if !db_path.exists() { + Sqlite::create_database(db_uri).await.unwrap(); } info!( @@ -48,61 +60,38 @@ async fn main() -> io::Result<()> { .unwrap() .to_string_lossy() ); - let db = SqlitePool::connect(&args.state).await.unwrap(); + let db = SqlitePool::connect(db_uri).await.unwrap(); MIGRATIONS.run(&db).await.unwrap(); match args.command { - Commands::Start(start_args) => start(db, start_args).await, + Commands::Start(start_args) => start(db, args.state, start_args).await, Commands::Init(init_args) => init(db, init_args).await, } } -async fn start(db: SqlitePool, args: StartArgs) -> io::Result<()> { - let fqdn = args - .proxy_fqdn - .to_string() - .trim_end_matches('.') - .to_string(); - let gateway = Arc::new(GatewayService::init(args.clone(), fqdn.clone(), db).await); +async fn start(db: SqlitePool, fs: PathBuf, args: StartArgs) -> io::Result<()> { + let gateway = Arc::new(GatewayService::init(args.context.clone(), db).await); - let worker = Worker::new(Arc::clone(&gateway)); + let worker = Worker::new(); let sender = worker.sender(); - let gateway_clone = gateway.clone(); - let sender_clone = sender.clone(); - - tokio::spawn(async move { - for Work { - project_name, - account_name, - work, - } in gateway_clone - .iter_projects() + for (project_name, _) in gateway + .iter_projects() + .await + .expect("could not list projects") + { + gateway + .clone() + .new_task() + .project(project_name) + .and_then(task::refresh()) + .send(&sender) .await - .expect("could not list projects") - { - match work.refresh(&gateway_clone.context()).await { - Ok(work) => sender_clone - .send(Work { - account_name, - project_name, - work, - }) - .await - .unwrap(), - Err(err) => { - error!( - error = %err, - %account_name, - %project_name, - "could not refresh state. Skipping it for now.", - ); - } - } - } - }); + .ok() + .unwrap(); + } let worker_handle = tokio::spawn( worker @@ -111,20 +100,114 @@ async fn start(db: SqlitePool, args: StartArgs) -> io::Result<()> { .map_err(|err| error!("worker error: {}", err)), ); - let api = make_api(Arc::clone(&gateway), sender); + // Every 60secs go over all `::Ready` projects and check their + // health + let ambulance_handle = tokio::spawn({ + let gateway = Arc::clone(&gateway); + let sender = sender.clone(); + async move { + loop { + tokio::time::sleep(Duration::from_secs(60)).await; + if sender.capacity() < WORKER_QUEUE_SIZE - SVC_DEGRADED_THRESHOLD { + // if degraded, don't stack more health checks + warn!( + sender.capacity = sender.capacity(), + "skipping health checks" + ); + continue; + } + + if let Ok(projects) = gateway.iter_projects().await { + let span = info_span!( + "running health checks", + healthcheck.num_projects = projects.len() + ); + + let gateway = gateway.clone(); + let sender = sender.clone(); + async move { + for (project_name, _) in projects { + if let Ok(handle) = gateway + .new_task() + .project(project_name) + .and_then(task::check_health()) + .send(&sender) + .await + { + // we wait for the check to be done before + // queuing up the next one + handle.await + } + } + } + .instrument(span) + .await; + } + } + } + }); + + let acme_client = AcmeClient::new(); + + let mut api_builder = ApiBuilder::new() + .with_service(Arc::clone(&gateway)) + .with_sender(sender) + .binding_to(args.control); - let api_handle = tokio::spawn(axum::Server::bind(&args.control).serve(api.into_make_service())); + let mut user_builder = UserServiceBuilder::new() + .with_service(Arc::clone(&gateway)) + .with_public(args.context.proxy_fqdn.clone()) + .with_user_proxy_binding_to(args.user) + .with_bouncer(args.bouncer); - let proxy = make_proxy(gateway, fqdn); + if let UseTls::Enable = args.use_tls { + let (resolver, tls_acceptor) = make_tls_acceptor(); - let proxy_handle = tokio::spawn(hyper::Server::bind(&args.user).serve(proxy)); + user_builder = user_builder + .with_acme(acme_client.clone()) + .with_tls(tls_acceptor); + + api_builder = api_builder.with_acme(acme_client.clone(), resolver.clone()); + + for CustomDomain { + fqdn, + certificate, + private_key, + .. + } in gateway.iter_custom_domains().await.unwrap() + { + let mut buf = Vec::new(); + buf.extend(certificate.as_bytes()); + buf.extend(private_key.as_bytes()); + resolver + .serve_pem(&fqdn.to_string(), Cursor::new(buf)) + .await + .unwrap(); + } + + tokio::spawn(async move { + // make sure we have a certificate for ourselves + let certs = init_certs(fs, args.context.proxy_fqdn.clone(), acme_client.clone()).await; + resolver.serve_default_der(certs).await.unwrap(); + }); + } else { + warn!("TLS is disabled in the proxy service. This is only acceptable in testing, and should *never* be used in deployments."); + }; + + let api_handle = api_builder + .with_default_routes() + .with_default_traces() + .serve(); + + let user_handle = user_builder.serve(); debug!("starting up all services"); tokio::select!( _ = worker_handle => info!("worker handle finished"), - _ = api_handle => info!("api handle finished"), - _ = proxy_handle => info!("proxy handle finished"), + _ = api_handle => error!("api handle finished"), + _ = user_handle => error!("user handle finished"), + _ = ambulance_handle => error!("ambulance handle finished"), ); Ok(()) @@ -146,3 +229,47 @@ async fn init(db: SqlitePool, args: InitArgs) -> io::Result<()> { println!("`{}` created as super user with key: {key}", args.name); Ok(()) } + +async fn init_certs>(fs: P, public: FQDN, acme: AcmeClient) -> ChainAndPrivateKey { + let tls_path = fs.as_ref().join("ssl.pem"); + + match ChainAndPrivateKey::load_pem(&tls_path) { + Ok(valid) => valid, + Err(_) => { + let creds_path = fs.as_ref().join("acme.json"); + warn!( + "no valid certificate found at {}, creating one...", + tls_path.display() + ); + + if !creds_path.exists() { + panic!( + "no ACME credentials found at {}, cannot continue with certificate creation", + creds_path.display() + ); + } + + let creds = std::fs::File::open(creds_path).unwrap(); + let creds: AccountCredentials = serde_json::from_reader(&creds).unwrap(); + + let identifier = format!("*.{public}"); + + // Use ::Dns01 challenge because that's the only supported + // challenge type for wildcard domains + let (chain, private_key) = acme + .create_certificate(&identifier, ChallengeType::Dns01, creds) + .await + .unwrap(); + + let mut buf = Vec::new(); + buf.extend(chain.as_bytes()); + buf.extend(private_key.as_bytes()); + + let certs = ChainAndPrivateKey::parse_pem(Cursor::new(buf)).unwrap(); + + certs.clone().save_pem(&tls_path).unwrap(); + + certs + } + } +} diff --git a/gateway/src/project.rs b/gateway/src/project.rs index 18a841889..e77f4a62e 100644 --- a/gateway/src/project.rs +++ b/gateway/src/project.rs @@ -1,4 +1,5 @@ -use std::convert::Infallible; +use std::collections::HashMap; +use std::convert::{identity, Infallible}; use std::net::{IpAddr, SocketAddr}; use std::time::Duration; @@ -6,17 +7,23 @@ use bollard::container::{ Config, CreateContainerOptions, RemoveContainerOptions, StopContainerOptions, }; use bollard::errors::Error as DockerError; -use bollard::models::{ - ContainerConfig, ContainerInspectResponse, ContainerStateStatusEnum, HealthStatusEnum, -}; +use bollard::models::{ContainerInspectResponse, ContainerStateStatusEnum}; +use bollard::system::EventsOptions; +use fqdn::FQDN; use futures::prelude::*; +use http::uri::InvalidUri; +use http::Uri; +use hyper::client::HttpConnector; +use hyper::Client; +use once_cell::sync::Lazy; +use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; -use tokio::time; -use tracing::{debug, error}; +use tokio::time::{self, timeout}; +use tracing::{debug, error, instrument}; use crate::{ - ContainerSettings, Context, EndState, Error, ErrorKind, IntoEndState, ProjectName, Refresh, - State, + ContainerSettings, DockerContext, EndState, Error, ErrorKind, IntoTryState, ProjectName, + Refresh, State, TryState, }; macro_rules! safe_unwrap { @@ -55,17 +62,79 @@ macro_rules! impl_from_variant { } const RUNTIME_API_PORT: u16 = 8001; +const MAX_RESTARTS: usize = 3; + +// Client used for health checks +static CLIENT: Lazy> = Lazy::new(Client::new); +// Health check must succeed within 10 seconds +static IS_HEALTHY_TIMEOUT: Duration = Duration::from_secs(10); #[async_trait] -impl Refresh for ContainerInspectResponse { +impl Refresh for ContainerInspectResponse +where + Ctx: DockerContext, +{ type Error = DockerError; - async fn refresh<'c, C: Context<'c>>(self, ctx: &C) -> Result { + async fn refresh(self, ctx: &Ctx) -> Result { ctx.docker() .inspect_container(self.id.as_ref().unwrap(), None) .await } } +pub trait ContainerInspectResponseExt { + fn container(&self) -> &ContainerInspectResponse; + + fn project_name(&self, prefix: &str) -> Result { + // This version can't be enabled while there are active + // deployers before v0.8.0 since the don't have this label + // TODO: switch to this version when you notice all deployers + // are greater than v0.8.0 + // let name = safe_unwrap!(container.config.labels.get("project.name")).to_string(); + + let container = self.container(); + let container_name = safe_unwrap!(container.name.strip_prefix("/")).to_string(); + safe_unwrap!(container_name.strip_prefix(prefix).strip_suffix("_run")) + .parse::() + .map_err(|_| ProjectError::internal("invalid project name")) + } + + fn find_arg_and_then<'s, F, O>(&'s self, find: &str, and_then: F) -> Result + where + F: FnOnce(&'s str) -> O, + O: 's, + { + let mut args = self.args()?.iter(); + let out = if args.any(|arg| arg.as_str() == find) { + args.next().map(|s| and_then(s.as_str())) + } else { + None + }; + out.ok_or_else(|| ProjectError::internal(format!("no such argument: {find}"))) + } + + fn args(&self) -> Result<&Vec, ProjectError> { + let container = self.container(); + Ok(safe_unwrap!(container.args)) + } + + fn fqdn(&self) -> Result { + self.find_arg_and_then("--proxy-fqdn", identity)? + .parse() + .map_err(|_| ProjectError::internal("invalid value for --proxy-fqdn")) + } + + fn initial_key(&self) -> Result { + self.find_arg_and_then("--admin-secret", str::to_owned) + } +} + +impl ContainerInspectResponseExt for ContainerInspectResponse { + fn container(&self) -> &ContainerInspectResponse { + self + } +} + impl From for Error { fn from(err: DockerError) -> Self { error!(error = %err, "internal Docker error"); @@ -110,6 +179,10 @@ impl Project { } } + pub fn create(project_name: ProjectName) -> Self { + Self::Creating(ProjectCreating::new_with_random_initial_key(project_name)) + } + pub fn destroy(self) -> Result { if let Some(container) = self.container() { Ok(Self::Destroying(ProjectDestroying { container })) @@ -118,6 +191,14 @@ impl Project { } } + pub fn is_ready(&self) -> bool { + matches!(self, Self::Ready(_)) + } + + pub fn is_destroyed(&self) -> bool { + matches!(self, Self::Destroyed(_)) + } + pub fn target_ip(&self) -> Result, Error> { match self.clone() { Self::Ready(project_ready) => Ok(Some(*project_ready.target_ip())), @@ -158,6 +239,14 @@ impl Project { } } + pub fn initial_key(&self) -> Option<&str> { + if let Self::Creating(creating) = self { + Some(creating.initial_key()) + } else { + None + } + } + pub fn container_id(&self) -> Option { self.container().and_then(|container| container.id) } @@ -180,27 +269,31 @@ impl From for shuttle_common::models::project::State { } #[async_trait] -impl<'c> State<'c> for Project { +impl State for Project +where + Ctx: DockerContext, +{ type Next = Self; type Error = Infallible; - async fn next>(self, ctx: &C) -> Result { + #[instrument(skip_all, fields(state = %self.state()))] + async fn next(self, ctx: &Ctx) -> Result { let previous = self.clone(); let previous_state = previous.state(); let mut new = match self { - Self::Creating(creating) => creating.next(ctx).await.into_end_state(), - Self::Starting(ready) => ready.next(ctx).await.into_end_state(), + Self::Creating(creating) => creating.next(ctx).await.into_try_state(), + Self::Starting(ready) => ready.next(ctx).await.into_try_state(), Self::Started(started) => match started.next(ctx).await { Ok(ProjectReadying::Ready(ready)) => Ok(ready.into()), Ok(ProjectReadying::Started(started)) => Ok(started.into()), Err(err) => Ok(Self::Errored(err)), }, - Self::Ready(ready) => ready.next(ctx).await.into_end_state(), - Self::Stopped(stopped) => stopped.next(ctx).await.into_end_state(), - Self::Stopping(stopping) => stopping.next(ctx).await.into_end_state(), - Self::Destroying(destroying) => destroying.next(ctx).await.into_end_state(), - Self::Destroyed(destroyed) => destroyed.next(ctx).await.into_end_state(), + Self::Ready(ready) => ready.next(ctx).await.into_try_state(), + Self::Stopped(stopped) => stopped.next(ctx).await.into_try_state(), + Self::Stopping(stopping) => stopping.next(ctx).await.into_try_state(), + Self::Destroying(destroying) => destroying.next(ctx).await.into_try_state(), + Self::Destroyed(destroyed) => destroyed.next(ctx).await.into_try_state(), Self::Errored(errored) => Ok(Self::Errored(errored)), }; @@ -222,15 +315,17 @@ impl<'c> State<'c> for Project { } } -impl<'c> EndState<'c> for Project { - type ErrorVariant = ProjectError; - +impl EndState for Project +where + Ctx: DockerContext, +{ fn is_done(&self) -> bool { - matches!( - self, - Self::Errored(_) | Self::Ready(_) | Self::Stopped(_) | Self::Destroyed(_) - ) + matches!(self, Self::Errored(_) | Self::Ready(_) | Self::Destroyed(_)) } +} + +impl TryState for Project { + type ErrorVariant = ProjectError; fn into_result(self) -> Result { match self { @@ -241,7 +336,10 @@ impl<'c> EndState<'c> for Project { } #[async_trait] -impl Refresh for Project { +impl Refresh for Project +where + Ctx: DockerContext, +{ type Error = Error; /// TODO: we could be a bit more clever than this by using the @@ -249,24 +347,21 @@ impl Refresh for Project { /// state which is probably prone to erroneously setting the /// project into the wrong state if the docker is transitioning /// the state of its resources under us - async fn refresh<'c, C: Context<'c>>(self, ctx: &C) -> Result { - let _container = if let Some(container_id) = self.container_id() { - Some(ctx.docker().inspect_container(&container_id, None).await?) - } else { - None - }; - + async fn refresh(self, ctx: &Ctx) -> Result { let refreshed = match self { Self::Creating(creating) => Self::Creating(creating), Self::Starting(ProjectStarting { container }) | Self::Started(ProjectStarted { container, .. }) | Self::Ready(ProjectReady { container, .. }) | Self::Stopping(ProjectStopping { container }) - | Self::Stopped(ProjectStopped { container }) => { - let container = container.refresh(ctx).await?; - match container.state.as_ref().unwrap().status.as_ref().unwrap() { + | Self::Stopped(ProjectStopped { container }) => match container + .clone() + .refresh(ctx) + .await + { + Ok(container) => match container.state.as_ref().unwrap().status.as_ref().unwrap() { ContainerStateStatusEnum::RUNNING => { - Self::Started(ProjectStarted { container }) + Self::Started(ProjectStarted::new(container)) } ContainerStateStatusEnum::CREATED => { Self::Starting(ProjectStarting { container }) @@ -278,8 +373,19 @@ impl Refresh for Project { "container resource has drifted out of sync: cannot recover", )) } + }, + Err(DockerError::DockerResponseServerError { + status_code: 404, .. + }) => { + // container not found, let's try to recreate it + // with the same image + let project_name = container.project_name(&ctx.container_settings().prefix)?; + let initial_key = container.initial_key()?; + let creating = ProjectCreating::new(project_name, initial_key).from(container); + Self::Creating(creating) } - } + Err(err) => return Err(err.into()), + }, Self::Destroying(destroying) => Self::Destroying(destroying), Self::Destroyed(destroyed) => Self::Destroyed(destroyed), Self::Errored(err) => Self::Errored(err), @@ -288,10 +394,18 @@ impl Refresh for Project { } } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct ProjectCreating { project_name: ProjectName, + /// The admin secret with which the start deployer initial_key: String, + /// Override the default fqdn (`${project_name}.${public}`) + fqdn: Option, + /// Override the default image (specified in the args to this gateway) + image: Option, + /// Configuration will be extracted from there if specified (will + /// take precedence over other overrides) + from: Option, } impl ProjectCreating { @@ -299,14 +413,41 @@ impl ProjectCreating { Self { project_name, initial_key, + fqdn: None, + image: None, + from: None, } } + pub fn from(mut self, from: ContainerInspectResponse) -> Self { + self.from = Some(from); + self + } + + pub fn with_fqdn(mut self, fqdn: String) -> Self { + self.fqdn = Some(fqdn); + self + } + + pub fn new_with_random_initial_key(project_name: ProjectName) -> Self { + let initial_key = Alphanumeric.sample_string(&mut rand::thread_rng(), 32); + Self::new(project_name, initial_key) + } + + pub fn with_image(mut self, image: String) -> Self { + self.image = Some(image); + self + } + pub fn project_name(&self) -> &ProjectName { &self.project_name } - fn container_name<'c, C: Context<'c>>(&self, ctx: &C) -> String { + pub fn initial_key(&self) -> &str { + &self.initial_key + } + + fn container_name(&self, ctx: &C) -> String { let prefix = &ctx.container_settings().prefix; let Self { project_name, .. } = &self; @@ -314,23 +455,25 @@ impl ProjectCreating { format!("{prefix}{project_name}_run") } - fn generate_container_config<'c, C: Context<'c>>( + fn generate_container_config( &self, ctx: &C, ) -> (CreateContainerOptions, Config) { let ContainerSettings { - image, + image: default_image, prefix, provisioner_host, network_name, network_id, - fqdn, + fqdn: public, .. } = ctx.container_settings(); let Self { initial_key, project_name, + fqdn, + image, .. } = &self; @@ -338,39 +481,43 @@ impl ProjectCreating { name: self.container_name(ctx), }; - let container_config: ContainerConfig = deserialize_json!({ - "Image": image, - "Hostname": format!("{prefix}{project_name}"), - "Labels": { - "shuttle_prefix": prefix - }, - "Cmd": [ - "--admin-secret", - initial_key, - "--api-address", - format!("0.0.0.0:{RUNTIME_API_PORT}"), - "--provisioner-address", - provisioner_host, - "--provisioner-port", - "8000", - "--proxy-address", - "0.0.0.0:8000", - "--proxy-fqdn", - fqdn, - "--artifacts-path", - "/opt/shuttle", - "--state", - "/opt/shuttle/deployer.sqlite", - ], - "Env": [ - "RUST_LOG=debug", - ], - "Healthcheck": { - "Interval": 60_000_000_000i64, // Every minute - "Timeout": 15_000_000_000i64, // 15 seconds - "Test": ["CMD", "curl", format!("localhost:8001/projects/{project_name}/status")], - }, - }); + let container_config = self + .from + .as_ref() + .and_then(|container| container.config.clone()) + .unwrap_or_else(|| { + deserialize_json!({ + "Image": image.as_ref().unwrap_or(default_image), + "Hostname": format!("{prefix}{project_name}"), + "Labels": { + "shuttle.prefix": prefix, + "shuttle.project": project_name, + }, + "Cmd": [ + "--admin-secret", + initial_key, + "--project", + project_name, + "--api-address", + format!("0.0.0.0:{RUNTIME_API_PORT}"), + "--provisioner-address", + provisioner_host, + "--provisioner-port", + "8000", + "--proxy-address", + "0.0.0.0:8000", + "--proxy-fqdn", + fqdn.clone().unwrap_or(format!("{project_name}.{public}")), + "--artifacts-path", + "/opt/shuttle", + "--state", + "/opt/shuttle/deployer.sqlite", + ], + "Env": [ + "RUST_LOG=debug", + ] + }) + }); let mut config = Config::::from(container_config); @@ -387,7 +534,13 @@ impl ProjectCreating { "Target": "/opt/shuttle", "Source": format!("{prefix}{project_name}_vol"), "Type": "volume" - }] + }], + // https://docs.docker.com/config/containers/resource_constraints/#memory + "Memory": 6442450000i64, // 6 GiB hard limit + "MemoryReservation": 4295000000i64, // 4 GiB soft limit, applied if host is low on memory + // https://docs.docker.com/config/containers/resource_constraints/#cpu + "CpuPeriod": 100000i64, + "CpuQuota": 400000i64 }); debug!( @@ -402,11 +555,15 @@ Config: {config:#?} } #[async_trait] -impl<'c> State<'c> for ProjectCreating { +impl State for ProjectCreating +where + Ctx: DockerContext, +{ type Next = ProjectStarting; type Error = ProjectError; - async fn next>(self, ctx: &C) -> Result { + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { let container_name = self.container_name(ctx); let container = ctx .docker() @@ -435,11 +592,15 @@ pub struct ProjectStarting { } #[async_trait] -impl<'c> State<'c> for ProjectStarting { +impl State for ProjectStarting +where + Ctx: DockerContext, +{ type Next = ProjectStarted; type Error = ProjectError; - async fn next>(self, ctx: &C) -> Result { + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { let container_id = self.container.id.as_ref().unwrap(); ctx.docker() .start_container::(container_id, None) @@ -453,15 +614,25 @@ impl<'c> State<'c> for ProjectStarting { } })?; - Ok(Self::Next { - container: self.container.refresh(ctx).await?, - }) + let container = self.container.refresh(ctx).await?; + + Ok(Self::Next::new(container)) } } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct ProjectStarted { container: ContainerInspectResponse, + service: Option, +} + +impl ProjectStarted { + pub fn new(container: ContainerInspectResponse) -> Self { + Self { + container, + service: None, + } + } } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -471,32 +642,42 @@ pub enum ProjectReadying { } #[async_trait] -impl<'c> State<'c> for ProjectStarted { +impl State for ProjectStarted +where + Ctx: DockerContext, +{ type Next = ProjectReadying; type Error = ProjectError; - async fn next>(self, ctx: &C) -> Result { + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { time::sleep(Duration::from_secs(1)).await; + let container = self.container.refresh(ctx).await?; - if matches!( - safe_unwrap!(container.state.health.status), - HealthStatusEnum::HEALTHY - ) { - let service = Service::from_container(container.clone())?; + let mut service = match self.service { + Some(service) => service, + None => Service::from_container(ctx, container.clone())?, + }; + + if service.is_healthy().await { Ok(Self::Next::Ready(ProjectReady { container, service })) } else { - let created = chrono::DateTime::parse_from_rfc3339(safe_unwrap!(container.created)) - .map_err(|_err| { - ProjectError::internal("invalid `created` response from Docker daemon") - })?; + let started_at = + chrono::DateTime::parse_from_rfc3339(safe_unwrap!(container.state.started_at)) + .map_err(|_err| { + ProjectError::internal("invalid `started_at` response from Docker daemon") + })?; let now = chrono::offset::Utc::now(); - if created + chrono::Duration::seconds(120) < now { + if started_at + chrono::Duration::seconds(120) < now { return Err(ProjectError::internal( "project did not become healthy in time", )); } - Ok(Self::Next::Started(ProjectStarted { container })) + Ok(Self::Next::Started(ProjectStarted { + container, + service: Some(service), + })) } } } @@ -508,48 +689,91 @@ pub struct ProjectReady { } #[async_trait] -impl<'c> State<'c> for ProjectReady { +impl State for ProjectReady +where + Ctx: DockerContext, +{ type Next = Self; type Error = ProjectError; - async fn next>(self, _ctx: &C) -> Result { + #[instrument(skip_all)] + async fn next(mut self, _ctx: &Ctx) -> Result { Ok(self) } } impl ProjectReady { - pub fn name(&self) -> &str { + pub fn name(&self) -> &ProjectName { &self.service.name } pub fn target_ip(&self) -> &IpAddr { &self.service.target } + + pub async fn is_healthy(&mut self) -> bool { + self.service.is_healthy().await + } +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct HealthCheckRecord { + at: chrono::DateTime, + is_healthy: bool, +} + +impl HealthCheckRecord { + pub fn new(is_healthy: bool) -> Self { + Self { + at: chrono::Utc::now(), + is_healthy, + } + } } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Service { - name: String, + name: ProjectName, target: IpAddr, + last_check: Option, } impl Service { - pub fn from_container(container: ContainerInspectResponse) -> Result { - let container_name = safe_unwrap!(container.name.strip_prefix("/")).to_string(); - - let resource_name = safe_unwrap!(container_name.strip_suffix("_run")).to_string(); + pub fn from_container( + ctx: &Ctx, + container: ContainerInspectResponse, + ) -> Result { + let resource_name = container.project_name(&ctx.container_settings().prefix)?; let network = safe_unwrap!(container.network_settings.networks) .values() .next() .ok_or_else(|| ProjectError::internal("project was not linked to a network"))?; - let target = safe_unwrap!(network.ip_address).parse().unwrap(); + + let target = safe_unwrap!(network.ip_address) + .parse() + .map_err(|_| ProjectError::internal("project did not join the network"))?; Ok(Self { name: resource_name, target, + last_check: None, }) } + + pub fn uri>(&self, path: S) -> Result { + format!("http://{}:8001{}", self.target, path.as_ref()) + .parse::() + .map_err(|err| err.into()) + } + + pub async fn is_healthy(&mut self) -> bool { + let uri = self.uri(format!("/projects/{}/status", self.name)).unwrap(); + let resp = timeout(IS_HEALTHY_TIMEOUT, CLIENT.get(uri)).await; + let is_healthy = matches!(resp, Ok(Ok(res)) if res.status().is_success()); + self.last_check = Some(HealthCheckRecord::new(is_healthy)); + is_healthy + } } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -558,12 +782,16 @@ pub struct ProjectStopping { } #[async_trait] -impl<'c> State<'c> for ProjectStopping { +impl State for ProjectStopping +where + Ctx: DockerContext, +{ type Next = ProjectStopped; type Error = ProjectError; - async fn next>(self, ctx: &C) -> Result { + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { let Self { container } = self; ctx.docker() .stop_container( @@ -583,15 +811,50 @@ pub struct ProjectStopped { } #[async_trait] -impl<'c> State<'c> for ProjectStopped { +impl State for ProjectStopped +where + Ctx: DockerContext, +{ type Next = ProjectStarting; type Error = ProjectError; - async fn next>(self, _ctx: &C) -> Result { - // If stopped, try to restart - Ok(ProjectStarting { - container: self.container, - }) + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { + let container = self.container; + + let since = (chrono::Utc::now() - chrono::Duration::minutes(15)) + .timestamp() + .to_string(); + let until = chrono::Utc::now().timestamp().to_string(); + + // Filter and collect `start` events for this project in the last 15 minutes + let start_events = ctx + .docker() + .events(Some(EventsOptions::<&str> { + since: Some(since), + until: Some(until), + filters: HashMap::from([ + ("container", vec![safe_unwrap!(container.id).as_str()]), + ("event", vec!["start"]), + ]), + })) + .try_collect::>() + .await?; + + let start_event_count = start_events.len(); + debug!( + "project started {} times in the last 15 minutes", + start_event_count + ); + + // If stopped, and has not restarted too much, try to restart + if start_event_count < MAX_RESTARTS { + Ok(ProjectStarting { container }) + } else { + Err(ProjectError::internal( + "too many restarts in the last 15 minutes", + )) + } } } @@ -601,11 +864,15 @@ pub struct ProjectDestroying { } #[async_trait] -impl<'c> State<'c> for ProjectDestroying { +impl State for ProjectDestroying +where + Ctx: DockerContext, +{ type Next = ProjectDestroyed; type Error = ProjectError; - async fn next>(self, ctx: &C) -> Result { + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { let container_id = self.container.id.as_ref().unwrap(); ctx.docker() .stop_container(container_id, Some(StopContainerOptions { t: 1 })) @@ -633,11 +900,15 @@ pub struct ProjectDestroyed { } #[async_trait] -impl<'c> State<'c> for ProjectDestroyed { +impl State for ProjectDestroyed +where + Ctx: DockerContext, +{ type Next = ProjectDestroyed; type Error = ProjectError; - async fn next>(self, _ctx: &C) -> Result { + #[instrument(skip_all)] + async fn next(self, _ctx: &Ctx) -> Result { Ok(self) } } @@ -684,6 +955,30 @@ impl From for ProjectError { } } +impl From for ProjectError { + fn from(uri: InvalidUri) -> Self { + error!(%uri, "failed to create a health check URI"); + + Self { + kind: ProjectErrorKind::Internal, + message: uri.to_string(), + ctx: None, + } + } +} + +impl From for ProjectError { + fn from(err: hyper::Error) -> Self { + error!(error = %err, "failed to check project's health"); + + Self { + kind: ProjectErrorKind::Internal, + message: err.to_string(), + ctx: None, + } + } +} + impl From for Error { fn from(err: ProjectError) -> Self { Self::source(ErrorKind::Internal, err) @@ -691,19 +986,82 @@ impl From for Error { } #[async_trait] -impl<'c> State<'c> for ProjectError { +impl State for ProjectError +where + Ctx: DockerContext, +{ type Next = Self; type Error = Infallible; - async fn next>(self, _ctx: &C) -> Result { + #[instrument(skip_all)] + async fn next(self, _ctx: &Ctx) -> Result { Ok(self) } } +pub mod exec { + + use std::sync::Arc; + + use bollard::service::ContainerState; + use tokio::sync::mpsc::Sender; + + use crate::{ + service::GatewayService, + task::{self, BoxedTask, TaskResult}, + }; + + use super::*; + + pub async fn revive( + gateway: Arc, + sender: Sender, + ) -> Result<(), ProjectError> { + for (project_name, _) in gateway + .iter_projects() + .await + .expect("could not list projects") + { + if let Project::Errored(ProjectError { ctx: Some(ctx), .. }) = + gateway.find_project(&project_name).await.unwrap() + { + if let Some(container) = ctx.container() { + if let Ok(container) = gateway + .context() + .docker() + .inspect_container(safe_unwrap!(container.id), None) + .await + { + if let Some(ContainerState { + status: Some(ContainerStateStatusEnum::EXITED), + .. + }) = container.state + { + debug!("{} will be revived", project_name.clone()); + _ = gateway + .new_task() + .project(project_name) + .and_then(task::run(|ctx| async move { + TaskResult::Done(Project::Stopped(ProjectStopped { + container: ctx.state.container().unwrap(), + })) + })) + .send(&sender) + .await; + } + } + } + } + } + + Ok(()) + } +} + #[cfg(test)] pub mod tests { - use bollard::models::{ContainerState, Health}; + use bollard::models::ContainerState; use futures::prelude::*; use hyper::{Body, Request, StatusCode}; @@ -722,6 +1080,9 @@ pub mod tests { Project::Creating(ProjectCreating { project_name: "my-project-test".parse().unwrap(), initial_key: "test".to_string(), + fqdn: None, + image: None, + from: None, }), #[assertion = "Container created, assigned an `id`"] Ok(Project::Starting(ProjectStarting { @@ -752,20 +1113,17 @@ pub mod tests { futures::pin_mut!(delay); let mut project_readying = project_started .unwrap() - .into_stream(ctx) + .into_stream(&ctx) .take_until(delay) .try_skip_while(|state| future::ready(Ok(!matches!(state, Project::Ready(_))))); let project_ready = assert_stream_matches!( project_readying, - #[assertion = "Container is ready, in a healthy state"] + #[assertion = "Container is ready"] Ok(Project::Ready(ProjectReady { container: ContainerInspectResponse { state: Some(ContainerState { - health: Some(Health { - status: Some(HealthStatusEnum::HEALTHY), - .. - }), + status: Some(ContainerStateStatusEnum::RUNNING), .. }), .. diff --git a/gateway/src/proxy.rs b/gateway/src/proxy.rs index 012604ed4..aa51b0e9c 100644 --- a/gateway/src/proxy.rs +++ b/gateway/src/proxy.rs @@ -1,35 +1,178 @@ +use std::convert::Infallible; use std::future::Future; +use std::io; use std::net::SocketAddr; use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; -use axum::body::HttpBody; +use axum::headers::{Error as HeaderError, Header, HeaderMapExt, HeaderName, HeaderValue, Host}; use axum::response::{IntoResponse, Response}; +use axum_server::accept::DefaultAcceptor; +use axum_server::tls_rustls::RustlsAcceptor; +use fqdn::{fqdn, FQDN}; +use futures::future::{ready, Ready}; use futures::prelude::*; -use hyper::body::Body; +use hyper::body::{Body, HttpBody}; use hyper::client::connect::dns::GaiResolver; use hyper::client::HttpConnector; use hyper::server::conn::AddrStream; use hyper::{Client, Request}; use hyper_reverse_proxy::ReverseProxy; use once_cell::sync::Lazy; -use tower::Service; -use tracing::debug; +use opentelemetry::global; +use opentelemetry_http::HeaderInjector; +use tower::{Service, ServiceBuilder}; +use tracing::{debug_span, error, field, trace}; +use tracing_opentelemetry::OpenTelemetrySpanExt; +use crate::acme::{AcmeClient, ChallengeResponderLayer, CustomDomain}; use crate::service::GatewayService; use crate::{Error, ErrorKind, ProjectName}; static PROXY_CLIENT: Lazy>> = Lazy::new(|| ReverseProxy::new(Client::new())); -pub struct ProxyService { +pub trait AsResponderTo { + fn as_responder_to(&self, req: R) -> Self; + + fn into_make_service(self) -> ResponderMakeService + where + Self: Sized, + { + ResponderMakeService { inner: self } + } +} + +pub struct ResponderMakeService { + inner: S, +} + +impl<'r, S> Service<&'r AddrStream> for ResponderMakeService +where + S: AsResponderTo<&'r AddrStream>, +{ + type Response = S; + type Error = Infallible; + type Future = Ready>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: &'r AddrStream) -> Self::Future { + ready(Ok(self.inner.as_responder_to(req))) + } +} + +lazy_static::lazy_static! { + pub static ref X_SHUTTLE_PROJECT: HeaderName = HeaderName::from_static("x-shuttle-project"); +} + +pub struct XShuttleProject(ProjectName); + +impl Header for XShuttleProject { + fn name() -> &'static HeaderName { + &X_SHUTTLE_PROJECT + } + + fn encode>(&self, values: &mut E) { + values.extend(std::iter::once( + HeaderValue::from_str(self.0.as_str()).unwrap(), + )); + } + + fn decode<'i, I>(values: &mut I) -> Result + where + Self: Sized, + I: Iterator, + { + values + .last() + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.parse().ok()) + .map(Self) + .ok_or_else(HeaderError::invalid) + } +} + +#[derive(Clone)] +pub struct UserProxy { gateway: Arc, remote_addr: SocketAddr, - fqdn: String, + public: FQDN, +} + +impl<'r> AsResponderTo<&'r AddrStream> for UserProxy { + fn as_responder_to(&self, addr_stream: &'r AddrStream) -> Self { + let mut responder = self.clone(); + responder.remote_addr = addr_stream.remote_addr(); + responder + } } -impl Service> for ProxyService { +impl UserProxy { + async fn proxy(self, mut req: Request) -> Result { + let span = debug_span!("proxy", http.method = %req.method(), http.host = ?req.headers().get("Host"), http.uri = %req.uri(), http.status_code = field::Empty, project = field::Empty); + trace!(?req, "serving proxy request"); + + let fqdn = req + .headers() + .typed_get::() + .map(|host| fqdn!(host.hostname())) + .ok_or_else(|| Error::from_kind(ErrorKind::ProjectNotFound))?; + + let project_name = + if fqdn.is_subdomain_of(&self.public) && fqdn.depth() - self.public.depth() == 1 { + fqdn.labels() + .next() + .unwrap() + .to_owned() + .parse() + .map_err(|_| Error::from_kind(ErrorKind::ProjectNotFound))? + } else if let Ok(CustomDomain { project_name, .. }) = + self.gateway.project_details_for_custom_domain(&fqdn).await + { + project_name + } else { + return Err(Error::from_kind(ErrorKind::ProjectNotFound)); + }; + + req.headers_mut() + .typed_insert(XShuttleProject(project_name.clone())); + + let project = self.gateway.find_project(&project_name).await?; + + // Record current project for tracing purposes + span.record("project", &project_name.to_string()); + + let target_ip = project + .target_ip()? + .ok_or_else(|| Error::from_kind(ErrorKind::ProjectNotReady))?; + + let target_url = format!("http://{}:{}", target_ip, 8000); + + let cx = span.context(); + + global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut HeaderInjector(req.headers_mut())) + }); + + let proxy = PROXY_CLIENT + .call(self.remote_addr.ip(), &target_url, req) + .await + .map_err(|_| Error::from_kind(ErrorKind::ProjectUnavailable))?; + + let (parts, body) = proxy.into_parts(); + let body = ::map_err(body, axum::Error::new).boxed_unsync(); + + span.record("http.status_code", parts.status.as_u16()); + + Ok(Response::from_parts(parts, body)) + } +} + +impl Service> for UserProxy { type Response = Response; type Error = Error; type Future = @@ -40,51 +183,57 @@ impl Service> for ProxyService { } fn call(&mut self, req: Request) -> Self::Future { - let remote_addr = self.remote_addr.ip(); - let gateway = Arc::clone(&self.gateway); - let fqdn = self.fqdn.clone(); - Box::pin( - async move { - let project_str = req - .headers() - .get("Host") - .map(|head| head.to_str().unwrap()) - .and_then(|host| host.strip_suffix('.').unwrap_or(host).strip_suffix(&fqdn)) - .ok_or_else(|| Error::from_kind(ErrorKind::ProjectNotFound))?; - - let project_name: ProjectName = project_str - .parse() - .map_err(|_| Error::from_kind(ErrorKind::InvalidProjectName))?; + self.clone() + .proxy(req) + .or_else(|err: Error| future::ready(Ok(err.into_response()))) + .boxed() + } +} - let project = gateway.find_project(&project_name).await?; +#[derive(Clone)] +pub struct Bouncer { + gateway: Arc, + public: FQDN, +} - let target_ip = project - .target_ip()? - .ok_or_else(|| Error::from_kind(ErrorKind::ProjectNotReady))?; +impl<'r> AsResponderTo<&'r AddrStream> for Bouncer { + fn as_responder_to(&self, _req: &'r AddrStream) -> Self { + self.clone() + } +} - let target_url = format!("http://{}:{}", target_ip, 8000); +impl Bouncer { + async fn bounce(self, req: Request) -> Result { + let mut resp = Response::builder(); - let proxy = PROXY_CLIENT - .call(remote_addr, &target_url, req) - .await - .map_err(|_| Error::from_kind(ErrorKind::ProjectUnavailable))?; + let host = req.headers().typed_get::().unwrap(); + let hostname = host.hostname(); + let fqdn = fqdn!(hostname); - let (parts, body) = proxy.into_parts(); - let body = ::map_err(body, axum::Error::new).boxed_unsync(); - Ok(Response::from_parts(parts, body)) - } - .or_else(|err: Error| future::ready(Ok(err.into_response()))), - ) - } -} + let path = req.uri(); -pub struct MakeProxyService { - gateway: Arc, - fqdn: String, + if fqdn.is_subdomain_of(&self.public) + || self + .gateway + .project_details_for_custom_domain(&fqdn) + .await + .is_ok() + { + resp = resp + .status(301) + .header("Location", format!("https://{hostname}{path}")); + } else { + resp = resp.status(404); + } + + let body = ::map_err(Body::empty(), axum::Error::new).boxed_unsync(); + + Ok(resp.body(body).unwrap()) + } } -impl<'r> Service<&'r AddrStream> for MakeProxyService { - type Response = ProxyService; +impl Service> for Bouncer { + type Response = Response; type Error = Error; type Future = Pin> + Send + 'static>>; @@ -93,25 +242,134 @@ impl<'r> Service<&'r AddrStream> for MakeProxyService { Poll::Ready(Ok(())) } - fn call(&mut self, target: &'r AddrStream) -> Self::Future { - let gateway = Arc::clone(&self.gateway); - let remote_addr = target.remote_addr(); - let fqdn = self.fqdn.clone(); - Box::pin(async move { - Ok(ProxyService { - remote_addr, - gateway, - fqdn, - }) - }) + fn call(&mut self, req: Request) -> Self::Future { + self.clone().bounce(req).boxed() } } -pub fn make_proxy(gateway: Arc, fqdn: String) -> MakeProxyService { - debug!("making proxy"); +pub struct UserServiceBuilder { + service: Option>, + acme: Option, + tls_acceptor: Option>, + bouncer_binds_to: Option, + user_binds_to: Option, + public: Option, +} + +impl Default for UserServiceBuilder { + fn default() -> Self { + Self::new() + } +} + +impl UserServiceBuilder { + pub fn new() -> Self { + Self { + service: None, + public: None, + acme: None, + tls_acceptor: None, + bouncer_binds_to: None, + user_binds_to: None, + } + } + + pub fn with_public(mut self, public: FQDN) -> Self { + self.public = Some(public); + self + } - MakeProxyService { - gateway, - fqdn: format!(".{fqdn}"), + pub fn with_service(mut self, service: Arc) -> Self { + self.service = Some(service); + self + } + + pub fn with_bouncer(mut self, bound_to: SocketAddr) -> Self { + self.bouncer_binds_to = Some(bound_to); + self + } + + pub fn with_user_proxy_binding_to(mut self, bound_to: SocketAddr) -> Self { + self.user_binds_to = Some(bound_to); + self + } + + pub fn with_acme(mut self, acme: AcmeClient) -> Self { + self.acme = Some(acme); + self + } + + pub fn with_tls(mut self, acceptor: RustlsAcceptor) -> Self { + self.tls_acceptor = Some(acceptor); + self + } + + pub fn serve(self) -> impl Future> { + let service = self.service.expect("a GatewayService is required"); + let public = self.public.expect("a public FQDN is required"); + let user_binds_to = self + .user_binds_to + .expect("a socket address to bind to is required"); + + let user_proxy = UserProxy { + gateway: service.clone(), + remote_addr: "127.0.0.1:80".parse().unwrap(), + public: public.clone(), + }; + + let bouncer = self.bouncer_binds_to.as_ref().map(|_| Bouncer { + gateway: service.clone(), + public: public.clone(), + }); + + let mut futs = Vec::new(); + if let Some(tls_acceptor) = self.tls_acceptor { + // TLS is enabled + let bouncer = bouncer.expect("TLS cannot be enabled without a bouncer"); + let bouncer_binds_to = self.bouncer_binds_to.unwrap(); + + let acme = self + .acme + .expect("TLS cannot be enabled without an ACME client"); + + let bouncer = ServiceBuilder::new() + .layer(ChallengeResponderLayer::new(acme)) + .service(bouncer); + + let bouncer = axum_server::Server::bind(bouncer_binds_to) + .serve(bouncer.into_make_service()) + .map(|handle| ("bouncer (with challenge responder)", handle)) + .boxed(); + + futs.push(bouncer); + + let user_with_tls = axum_server::Server::bind(user_binds_to) + .acceptor(tls_acceptor) + .serve(user_proxy.into_make_service()) + .map(|handle| ("user proxy (with TLS)", handle)) + .boxed(); + futs.push(user_with_tls); + } else { + if let Some(bouncer) = bouncer { + // bouncer is enabled + let bouncer_binds_to = self.bouncer_binds_to.unwrap(); + let bouncer = axum_server::Server::bind(bouncer_binds_to) + .serve(bouncer.into_make_service()) + .map(|handle| ("bouncer (without challenge responder)", handle)) + .boxed(); + futs.push(bouncer); + } + + let user_without_tls = axum_server::Server::bind(user_binds_to) + .serve(user_proxy.into_make_service()) + .map(|handle| ("user proxy (no TLS)", handle)) + .boxed(); + futs.push(user_without_tls); + } + + future::select_all(futs.into_iter()).map(|((name, resolved), _, _)| { + error!(service = %name, "exited early"); + resolved + }) } } diff --git a/gateway/src/service.rs b/gateway/src/service.rs index 2cae0e7bf..20ca92a05 100644 --- a/gateway/src/service.rs +++ b/gateway/src/service.rs @@ -7,24 +7,30 @@ use axum::http::Request; use axum::response::Response; use bollard::network::ListNetworksOptions; use bollard::{Docker, API_DEFAULT_VERSION}; +use fqdn::Fqdn; +use http::HeaderValue; use hyper::client::connect::dns::GaiResolver; use hyper::client::HttpConnector; use hyper::Client; use hyper_reverse_proxy::ReverseProxy; use once_cell::sync::Lazy; -use rand::distributions::{Alphanumeric, DistString}; +use opentelemetry::global; +use opentelemetry_http::HeaderInjector; use sqlx::error::DatabaseError; use sqlx::migrate::Migrator; use sqlx::sqlite::SqlitePool; use sqlx::types::Json as SqlxJson; use sqlx::{query, Error as SqlxError, Row}; -use tracing::debug; +use tracing::{debug, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; -use crate::args::StartArgs; -use crate::auth::{Key, User}; -use crate::project::{self, Project}; -use crate::worker::Work; -use crate::{AccountName, Context, Error, ErrorKind, ProjectName, Service}; +use crate::acme::CustomDomain; +use crate::args::ContextArgs; +use crate::auth::{Key, Permissions, ScopedUser, User}; +use crate::project::Project; +use crate::task::{BoxedTask, TaskBuilder}; +use crate::worker::TaskRouter; +use crate::{AccountName, DockerContext, Error, ErrorKind, ProjectDetails, ProjectName}; pub static MIGRATIONS: Migrator = sqlx::migrate!("./migrations"); static PROXY_CLIENT: Lazy>> = @@ -43,33 +49,35 @@ pub struct ContainerSettingsBuilder<'d> { image: Option, provisioner: Option, network_name: Option, - fqdn: String, + fqdn: Option, } impl<'d> ContainerSettingsBuilder<'d> { - pub fn new(docker: &'d Docker, fqdn: String) -> Self { + pub fn new(docker: &'d Docker) -> Self { Self { docker, prefix: None, image: None, provisioner: None, network_name: None, - fqdn, + fqdn: None, } } - pub async fn from_args(self, args: &StartArgs) -> ContainerSettings { - let StartArgs { + pub async fn from_args(self, args: &ContextArgs) -> ContainerSettings { + let ContextArgs { prefix, network_name, provisioner_host, image, + proxy_fqdn, .. } = args; self.prefix(prefix) .image(image) .provisioner_host(provisioner_host) .network_name(network_name) + .fqdn(proxy_fqdn) .build() .await } @@ -94,6 +102,11 @@ impl<'d> ContainerSettingsBuilder<'d> { self } + pub fn fqdn(mut self, fqdn: S) -> Self { + self.fqdn = Some(fqdn.to_string().trim_end_matches('.').to_string()); + self + } + /// Resolves the Docker network ID for the given network name. /// /// # Panics @@ -125,7 +138,7 @@ impl<'d> ContainerSettingsBuilder<'d> { let network_name = self.network_name.take().unwrap(); let network_id = self.resolve_network_id(&network_name).await; - let fqdn = self.fqdn; + let fqdn = self.fqdn.take().unwrap(); ContainerSettings { prefix, @@ -138,6 +151,7 @@ impl<'d> ContainerSettingsBuilder<'d> { } } +#[derive(Clone)] pub struct ContainerSettings { pub prefix: String, pub image: String, @@ -148,8 +162,8 @@ pub struct ContainerSettings { } impl ContainerSettings { - pub fn builder(docker: &Docker, fqdn: String) -> ContainerSettingsBuilder { - ContainerSettingsBuilder::new(docker, fqdn) + pub fn builder(docker: &Docker) -> ContainerSettingsBuilder { + ContainerSettingsBuilder::new(docker) } } @@ -165,8 +179,8 @@ impl GatewayContextProvider { pub fn context(&self) -> GatewayContext { GatewayContext { - docker: &self.docker, - settings: &self.settings, + docker: self.docker.clone(), + settings: self.settings.clone(), } } } @@ -174,6 +188,7 @@ impl GatewayContextProvider { pub struct GatewayService { provider: GatewayContextProvider, db: SqlitePool, + task_router: TaskRouter, } impl GatewayService { @@ -181,23 +196,28 @@ impl GatewayService { /// /// * `args` - The [`Args`] with which the service was /// started. Will be passed as [`Context`] to workers and state. - pub async fn init(args: StartArgs, fqdn: String, db: SqlitePool) -> Self { + pub async fn init(args: ContextArgs, db: SqlitePool) -> Self { let docker = Docker::connect_with_unix(&args.docker_host, 60, API_DEFAULT_VERSION).unwrap(); - let container_settings = ContainerSettings::builder(&docker, fqdn) - .from_args(&args) - .await; + let container_settings = ContainerSettings::builder(&docker).from_args(&args).await; let provider = GatewayContextProvider::new(docker, container_settings); - Self { provider, db } + let task_router = TaskRouter::new(); + + Self { + provider, + db, + task_router, + } } pub async fn route( &self, - project_name: &ProjectName, + scoped_user: &ScopedUser, mut req: Request, ) -> Result, Error> { + let project_name = &scoped_user.scope; let target_ip = self .find_project(project_name) .await? @@ -213,6 +233,17 @@ impl GatewayService { debug!(target_url, "routing control"); + let headers = req.headers_mut(); + headers.append( + "X-Shuttle-Account-Name", + HeaderValue::from_str(&scoped_user.user.name.to_string()).unwrap(), + ); + + let cx = Span::current().context(); + global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut HeaderInjector(headers)) + }); + let resp = PROXY_CLIENT .call("127.0.0.1".parse().unwrap(), &target_url, req) .await @@ -221,16 +252,14 @@ impl GatewayService { Ok(resp) } - pub async fn iter_projects(&self) -> Result, Error> { - let iter = query("SELECT * FROM projects") + pub async fn iter_projects( + &self, + ) -> Result, Error> { + let iter = query("SELECT project_name, account_name FROM projects") .fetch_all(&self.db) .await? .into_iter() - .map(|row| Work { - project_name: row.get("project_name"), - work: row.get::, _>("project_state").0, - account_name: row.get("account_name"), - }); + .map(|row| (row.get("project_name"), row.get("account_name"))); Ok(iter) } @@ -247,24 +276,38 @@ impl GatewayService { .ok_or_else(|| Error::from_kind(ErrorKind::ProjectNotFound)) } - async fn update_project( + pub async fn update_project( &self, project_name: &ProjectName, project: &Project, ) -> Result<(), Error> { let query = match project { - Project::Destroyed(_) => { - query("DELETE FROM projects WHERE project_name = ?1").bind(project_name) - } + Project::Creating(state) => query( + "UPDATE projects SET initial_key = ?1, project_state = ?2 WHERE project_name = ?3", + ) + .bind(state.initial_key()) + .bind(SqlxJson(project)) + .bind(project_name), _ => query("UPDATE projects SET project_state = ?1 WHERE project_name = ?2") .bind(SqlxJson(project)) .bind(project_name), }; - query.execute(&self.db).await?; Ok(()) } + pub async fn account_name_from_project( + &self, + project_name: &ProjectName, + ) -> Result { + query("SELECT account_name FROM projects WHERE project_name = ?1") + .bind(project_name) + .fetch_optional(&self.db) + .await? + .map(|row| row.get("account_name")) + .ok_or_else(|| Error::from(ErrorKind::ProjectNotFound)) + } + pub async fn key_from_account_name(&self, account_name: &AccountName) -> Result { let key = query("SELECT key FROM accounts WHERE account_name = ?1") .bind(account_name) @@ -298,30 +341,6 @@ impl GatewayService { Ok(control_key) } - pub async fn user_from_account_name(&self, name: AccountName) -> Result { - let key = self.key_from_account_name(&name).await?; - let super_user = self.is_super_user(&name).await?; - let projects = self.iter_user_projects(&name).await?.collect(); - Ok(User { - name, - key, - projects, - super_user, - }) - } - - pub async fn user_from_key(&self, key: Key) -> Result { - let name = self.account_name_from_key(&key).await?; - let super_user = self.is_super_user(&name).await?; - let projects = self.iter_user_projects(&name).await?.collect(); - Ok(User { - name, - key, - projects, - super_user, - }) - } - pub async fn create_user(&self, name: AccountName) -> Result { let key = Key::new_random(); query("INSERT INTO accounts (account_name, key) VALUES (?1, ?2)") @@ -341,38 +360,53 @@ impl GatewayService { // Otherwise this is internal err.into() })?; - Ok(User { - name, - key, - projects: Vec::default(), - super_user: false, - }) + Ok(User::new_with_defaults(name, key)) + } + + pub async fn get_permissions(&self, account_name: &AccountName) -> Result { + let permissions = + query("SELECT super_user, account_tier FROM accounts WHERE account_name = ?1") + .bind(account_name) + .fetch_optional(&self.db) + .await? + .map(|row| { + Permissions::builder() + .super_user(row.try_get("super_user").unwrap()) + .tier(row.try_get("account_tier").unwrap()) + .build() + }) + .unwrap_or_default(); // defaults to `false` (i.e. not super user) + Ok(permissions) } - pub async fn is_super_user(&self, account_name: &AccountName) -> Result { - let is_super_user = query("SELECT super_user FROM accounts WHERE account_name = ?1") + pub async fn set_super_user( + &self, + account_name: &AccountName, + super_user: bool, + ) -> Result<(), Error> { + query("UPDATE accounts SET super_user = ?1 WHERE account_name = ?2") + .bind(super_user) .bind(account_name) - .fetch_optional(&self.db) - .await? - .map(|row| row.try_get("super_user").unwrap()) - .unwrap_or(false); // defaults to `false` (i.e. not super user) - Ok(is_super_user) + .execute(&self.db) + .await?; + Ok(()) } - pub async fn set_super_user( + pub async fn set_permissions( &self, account_name: &AccountName, - value: bool, + permissions: &Permissions, ) -> Result<(), Error> { - query("UPDATE accounts SET super_user = ?1 WHERE account_name = ?2") - .bind(value) + query("UPDATE accounts SET super_user = ?1, account_tier = ?2 WHERE account_name = ?3") + .bind(permissions.super_user) + .bind(permissions.tier) .bind(account_name) .execute(&self.db) .await?; Ok(()) } - async fn iter_user_projects( + pub async fn iter_user_projects( &self, AccountName(account_name): &AccountName, ) -> Result, Error> { @@ -389,18 +423,51 @@ impl GatewayService { &self, project_name: ProjectName, account_name: AccountName, - ) -> Result { - let initial_key = Alphanumeric.sample_string(&mut rand::thread_rng(), 32); + ) -> Result { + if let Some(row) = query("SELECT project_name, account_name, initial_key, project_state FROM projects WHERE project_name = ?1 AND account_name = ?2") + .bind(&project_name) + .bind(&account_name) + .fetch_optional(&self.db) + .await? + { + // If the project already exists and belongs to this account + let project = row.get::, _>("project_state").0; + if project.is_destroyed() { + // But is in `::Destroyed` state, recreate it + let project = Project::create(project_name.clone()); + self.update_project(&project_name, &project).await?; + Ok(project) + } else { + // Otherwise it already exists + Err(Error::from_kind(ErrorKind::ProjectAlreadyExists)) + } + } else { + // Check if project name is valid according to new rules if it + // doesn't exist. + // TODO: remove this check when we update the project name rules + // in shuttle-common + if project_name.is_valid() { + // Otherwise attempt to create a new one. This will fail + // outright if the project already exists (this happens if + // it belongs to another account). + self.insert_project(project_name, account_name).await + } else { + Err(Error::from_kind(ErrorKind::InvalidProjectName)) + } + } + } - let project = SqlxJson(Project::Creating(project::ProjectCreating::new( - project_name.clone(), - initial_key.clone(), - ))); + pub async fn insert_project( + &self, + project_name: ProjectName, + account_name: AccountName, + ) -> Result { + let project = SqlxJson(Project::create(project_name.clone())); query("INSERT INTO projects (project_name, account_name, initial_key, project_state) VALUES (?1, ?2, ?3, ?4)") .bind(&project_name) .bind(&account_name) - .bind(&initial_key) + .bind(project.initial_key().unwrap()) .bind(&project) .execute(&self.db) .await @@ -418,66 +485,103 @@ impl GatewayService { let project = project.0; - Ok(Work { - project_name, - account_name, - work: project, - }) + Ok(project) } - pub async fn destroy_project( + pub async fn create_custom_domain( &self, project_name: ProjectName, - account_name: AccountName, - ) -> Result { - let project = self.find_project(&project_name).await?.destroy()?; + fqdn: &Fqdn, + certs: &str, + private_key: &str, + ) -> Result<(), Error> { + query("INSERT OR REPLACE INTO custom_domains (fqdn, project_name, certificate, private_key) VALUES (?1, ?2, ?3, ?4)") + .bind(fqdn.to_string()) + .bind(&project_name) + .bind(certs) + .bind(private_key) + .execute(&self.db) + .await?; - Ok(Work { - project_name, - account_name, - work: project, - }) + Ok(()) } - fn context(&self) -> GatewayContext { - self.provider.context() + pub async fn iter_custom_domains(&self) -> Result, Error> { + query("SELECT fqdn, project_name, certificate, private_key FROM custom_domains") + .fetch_all(&self.db) + .await + .map(|res| { + res.into_iter().map(|row| CustomDomain { + fqdn: row.get::<&str, _>("fqdn").parse().unwrap(), + project_name: row.try_get("project_name").unwrap(), + certificate: row.get("certificate"), + private_key: row.get("private_key"), + }) + }) + .map_err(|_| Error::from_kind(ErrorKind::Internal)) } -} -#[async_trait] -impl<'c> Service<'c> for Arc { - type Context = GatewayContext<'c>; + pub async fn project_details_for_custom_domain( + &self, + fqdn: &Fqdn, + ) -> Result { + let custom_domain = query( + "SELECT fqdn, project_name, certificate, private_key FROM custom_domains WHERE fqdn = ?1", + ) + .bind(fqdn.to_string()) + .fetch_optional(&self.db) + .await? + .map(|row| CustomDomain { + fqdn: row.get::<&str, _>("fqdn").parse().unwrap(), + project_name: row.try_get("project_name").unwrap(), + certificate: row.get("certificate"), + private_key: row.get("private_key"), + }) + .ok_or_else(|| Error::from(ErrorKind::CustomDomainNotFound))?; + Ok(custom_domain) + } - type State = Work; + pub async fn iter_projects_detailed( + &self, + ) -> Result, Error> { + let iter = query("SELECT project_name, account_name FROM projects") + .fetch_all(&self.db) + .await? + .into_iter() + .map(|row| ProjectDetails { + project_name: row.try_get("project_name").unwrap(), + account_name: row.try_get("account_name").unwrap(), + }); + Ok(iter) + } - type Error = Error; + pub fn context(&self) -> GatewayContext { + self.provider.context() + } - fn context(&'c self) -> Self::Context { - GatewayService::context(self) + /// Create a builder for a new [ProjectTask] + pub fn new_task(self: &Arc) -> TaskBuilder { + TaskBuilder::new(self.clone()) } - async fn update( - &self, - Work { - project_name, work, .. - }: &Self::State, - ) -> Result<(), Self::Error> { - self.update_project(project_name, work).await + pub fn task_router(&self) -> TaskRouter { + self.task_router.clone() } } -pub struct GatewayContext<'c> { - docker: &'c Docker, - settings: &'c ContainerSettings, +#[derive(Clone)] +pub struct GatewayContext { + docker: Docker, + settings: ContainerSettings, } -impl<'c> Context<'c> for GatewayContext<'c> { - fn docker(&self) -> &'c Docker { - self.docker +impl DockerContext for GatewayContext { + fn docker(&self) -> &Docker { + &self.docker } - fn container_settings(&self) -> &'c ContainerSettings { - self.settings + fn container_settings(&self) -> &ContainerSettings { + &self.settings } } @@ -486,45 +590,50 @@ pub mod tests { use std::str::FromStr; + use fqdn::FQDN; + use super::*; + use crate::auth::AccountTier; + use crate::task::{self, TaskResult}; use crate::tests::{assert_err_kind, World}; + use crate::{Error, ErrorKind}; #[tokio::test] async fn service_create_find_user() -> anyhow::Result<()> { let world = World::new().await; - let svc = GatewayService::init(world.args(), world.fqdn(), world.pool()).await; + let svc = GatewayService::init(world.args(), world.pool()).await; let account_name: AccountName = "test_user_123".parse()?; assert_err_kind!( - svc.user_from_account_name(account_name.clone()).await, + User::retrieve_from_account_name(&svc, account_name.clone()).await, ErrorKind::UserNotFound ); assert_err_kind!( - svc.user_from_key(Key::from_str("123").unwrap()).await, + User::retrieve_from_key(&svc, Key::from_str("123").unwrap()).await, ErrorKind::UserNotFound ); let user = svc.create_user(account_name.clone()).await?; assert_eq!( - svc.user_from_account_name(account_name.clone()).await?, + User::retrieve_from_account_name(&svc, account_name.clone()).await?, user ); - assert!(!svc.is_super_user(&account_name).await?); - let User { name, key, projects, - super_user, + permissions, } = user; assert!(projects.is_empty()); - assert!(!super_user); + assert!(!permissions.is_super_user()); + + assert_eq!(*permissions.tier(), AccountTier::Basic); assert_eq!(name, account_name); @@ -543,9 +652,10 @@ pub mod tests { #[tokio::test] async fn service_create_find_delete_project() -> anyhow::Result<()> { let world = World::new().await; - let svc = Arc::new(GatewayService::init(world.args(), world.fqdn(), world.pool()).await); + let svc = Arc::new(GatewayService::init(world.args(), world.pool()).await); let neo: AccountName = "neo".parse().unwrap(); + let trinity: AccountName = "trinity".parse().unwrap(); let matrix: ProjectName = "matrix".parse().unwrap(); let creating_same_project_name = |project: &Project, project_name: &ProjectName| { @@ -556,35 +666,160 @@ pub mod tests { }; svc.create_user(neo.clone()).await.unwrap(); + svc.create_user(trinity.clone()).await.unwrap(); - let work = svc + let project = svc .create_project(matrix.clone(), neo.clone()) .await .unwrap(); - // work work work work - let project = work.work; - assert!(creating_same_project_name(&project, &matrix)); assert_eq!(svc.find_project(&matrix).await.unwrap(), project); + assert_eq!( + svc.iter_projects_detailed() + .await + .unwrap() + .next() + .expect("to get one project with its user"), + ProjectDetails { + project_name: matrix.clone(), + account_name: neo.clone(), + } + ); - let work = svc.destroy_project(matrix.clone(), neo).await.unwrap(); - - let project = work.work; - - assert!(matches!(&project, Project::Destroyed(_))); + let mut work = svc + .new_task() + .project(matrix.clone()) + .and_then(task::destroy()) + .build(); - svc.update_project(&matrix, &project).await.unwrap(); + while let TaskResult::Pending(_) = work.poll(()).await {} + assert!(matches!(work.poll(()).await, TaskResult::Done(()))); + // After project has been destroyed... assert!(matches!( svc.find_project(&matrix).await, + Ok(Project::Destroyed(_)) + )); + + // If recreated by a different user + assert!(matches!( + svc.create_project(matrix.clone(), trinity.clone()).await, Err(Error { - kind: ErrorKind::ProjectNotFound, + kind: ErrorKind::ProjectAlreadyExists, .. }) )); + // If recreated by the same user + assert!(matches!( + svc.create_project(matrix, neo).await, + Ok(Project::Creating(_)) + )); + + Ok(()) + } + + #[tokio::test] + async fn service_create_ready_kill_restart_docker() -> anyhow::Result<()> { + let world = World::new().await; + let svc = Arc::new(GatewayService::init(world.args(), world.pool()).await); + + let neo: AccountName = "neo".parse().unwrap(); + let matrix: ProjectName = "matrix".parse().unwrap(); + + svc.create_user(neo.clone()).await.unwrap(); + svc.create_project(matrix.clone(), neo.clone()) + .await + .unwrap(); + + let mut task = svc.new_task().project(matrix.clone()).build(); + + while let TaskResult::Pending(_) = task.poll(()).await { + // keep polling + } + + let project = svc.find_project(&matrix).await.unwrap(); + println!("{:?}", project); + assert!(project.is_ready()); + + let container = project.container().unwrap(); + svc.context() + .docker() + .kill_container::(container.name.unwrap().strip_prefix('/').unwrap(), None) + .await + .unwrap(); + + println!("killed container"); + + let mut ambulance_task = svc + .new_task() + .project(matrix.clone()) + .and_then(task::check_health()) + .build(); + + // the first poll will trigger a refresh + let _ = ambulance_task.poll(()).await; + + let project = svc.find_project(&matrix).await.unwrap(); + println!("{:?}", project); + assert!(!project.is_ready()); + + // the subsequent will trigger a restart task + while let TaskResult::Pending(_) = ambulance_task.poll(()).await { + // keep polling + } + + let project = svc.find_project(&matrix).await.unwrap(); + println!("{:?}", project); + assert!(project.is_ready()); + + Ok(()) + } + + #[tokio::test] + async fn service_create_find_custom_domain() -> anyhow::Result<()> { + let world = World::new().await; + let svc = Arc::new(GatewayService::init(world.args(), world.pool()).await); + + let account: AccountName = "neo".parse().unwrap(); + let project_name: ProjectName = "matrix".parse().unwrap(); + let domain: FQDN = "neo.the.matrix".parse().unwrap(); + let certificate = "dummy certificate"; + let private_key = "dummy private key"; + + svc.create_user(account.clone()).await.unwrap(); + + assert_err_kind!( + svc.project_details_for_custom_domain(&domain).await, + ErrorKind::CustomDomainNotFound + ); + + let _ = svc + .create_project(project_name.clone(), account.clone()) + .await + .unwrap(); + + svc.create_custom_domain(project_name.clone(), &domain, certificate, private_key) + .await + .unwrap(); + + let custom_domain = svc + .project_details_for_custom_domain(&domain) + .await + .unwrap(); + + assert_eq!(custom_domain.project_name, project_name); + assert_eq!(custom_domain.certificate, certificate); + assert_eq!(custom_domain.private_key, private_key); + + assert_err_kind!( + svc.create_custom_domain(project_name.clone(), &domain, certificate, private_key) + .await, + ErrorKind::CustomDomainAlreadyExists + ); + Ok(()) } } diff --git a/gateway/src/task.rs b/gateway/src/task.rs new file mode 100644 index 000000000..dc506306a --- /dev/null +++ b/gateway/src/task.rs @@ -0,0 +1,556 @@ +use futures::Future; +use std::collections::VecDeque; +use std::marker::PhantomData; +use std::pin::Pin; +use std::sync::Arc; +use std::time::{Duration, Instant}; +use tokio::sync::mpsc::Sender; +use tokio::sync::oneshot; +use tokio::time::{sleep, timeout}; +use tracing::{error, info, info_span, warn}; +use uuid::Uuid; + +use crate::project::*; +use crate::service::{GatewayContext, GatewayService}; +use crate::worker::TaskRouter; +use crate::{AccountName, EndState, Error, ErrorKind, ProjectName, Refresh, State}; + +// Default maximum _total_ time a task is allowed to run +pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(300); +// Maximum time we'll wait for a task to successfully be sent down the channel +pub const TASK_SEND_TIMEOUT: Duration = Duration::from_secs(9); +// Maximum time before a task is considered degraded +pub const PROJECT_TASK_MAX_IDLE_TIMEOUT: Duration = Duration::from_secs(60); + +#[async_trait] +pub trait Task: Send { + type Output; + + type Error; + + async fn poll(&mut self, ctx: Ctx) -> TaskResult; +} + +#[async_trait] +impl Task for Box +where + Ctx: Send + 'static, + T: Task + ?Sized, +{ + type Output = T::Output; + + type Error = T::Error; + + async fn poll(&mut self, ctx: Ctx) -> TaskResult { + self.as_mut().poll(ctx).await + } +} + +#[must_use] +#[derive(Debug, PartialEq, Eq)] +pub enum TaskResult { + /// More work needs to be done + Pending(R), + /// No further work needed + Done(R), + /// Try again later + TryAgain, + /// Task has been cancelled + Cancelled, + /// Task has failed + Err(E), +} + +impl TaskResult { + pub fn ok(self) -> Option { + match self { + Self::Pending(r) | Self::Done(r) => Some(r), + _ => None, + } + } + + pub fn to_str(&self) -> &str { + match self { + Self::Pending(_) => "pending", + Self::Done(_) => "done", + Self::TryAgain => "try again", + Self::Cancelled => "cancelled", + Self::Err(_) => "error", + } + } + + pub fn is_done(&self) -> bool { + match self { + Self::Done(_) | Self::Cancelled | Self::Err(_) => true, + Self::TryAgain | Self::Pending(_) => false, + } + } + + pub fn as_ref(&self) -> TaskResult<&R, &E> { + match self { + Self::Pending(r) => TaskResult::Pending(r), + Self::Done(r) => TaskResult::Done(r), + Self::TryAgain => TaskResult::TryAgain, + Self::Cancelled => TaskResult::Cancelled, + Self::Err(e) => TaskResult::Err(e), + } + } +} + +pub fn run(f: F) -> impl Task +where + F: FnMut(ProjectContext) -> Fut + Send + 'static, + Fut: Future> + Send + 'static, +{ + RunFn { + f, + _output: PhantomData, + } +} + +pub fn refresh() -> impl Task { + run(|ctx: ProjectContext| async move { + match ctx.state.refresh(&ctx.gateway).await { + Ok(new) => TaskResult::Done(new), + Err(err) => TaskResult::Err(err), + } + }) +} + +pub fn destroy() -> impl Task { + run(|ctx| async move { + match ctx.state.destroy() { + Ok(state) => TaskResult::Done(state), + Err(err) => TaskResult::Err(err), + } + }) +} + +pub fn check_health() -> impl Task { + run(|ctx| async move { + match ctx.state.refresh(&ctx.gateway).await { + Ok(Project::Ready(mut ready)) => { + if ready.is_healthy().await { + TaskResult::Done(Project::Ready(ready)) + } else { + TaskResult::Done(Project::Ready(ready).stop().unwrap()) + } + } + Ok(update) => TaskResult::Done(update), + Err(err) => TaskResult::Err(err), + } + }) +} + +pub fn run_until_done() -> impl Task { + RunUntilDone +} + +pub struct TaskBuilder { + project_name: Option, + service: Arc, + timeout: Option, + tasks: VecDeque>, +} + +impl TaskBuilder { + pub fn new(service: Arc) -> Self { + Self { + service, + project_name: None, + timeout: None, + tasks: VecDeque::new(), + } + } +} + +impl TaskBuilder { + pub fn project(mut self, name: ProjectName) -> Self { + self.project_name = Some(name); + self + } + + pub fn and_then(mut self, task: T) -> Self + where + T: Task + 'static, + { + self.tasks.push_back(Box::new(task)); + self + } + + pub fn with_timeout(mut self, duration: Duration) -> Self { + self.timeout = Some(duration); + self + } + + pub fn build(mut self) -> BoxedTask { + self.tasks.push_back(Box::new(RunUntilDone)); + + let timeout = self.timeout.unwrap_or(DEFAULT_TIMEOUT); + + Box::new(WithTimeout::on( + timeout, + ProjectTask { + uuid: Uuid::new_v4(), + project_name: self.project_name.expect("project_name is required"), + service: self.service, + tasks: self.tasks, + }, + )) + } + + pub async fn send(self, sender: &Sender) -> Result { + let project_name = self.project_name.clone().expect("project_name is required"); + let task_router = self.service.task_router(); + let (task, handle) = AndThenNotify::after(self.build()); + let task = Route::::to(project_name, Box::new(task), task_router); + match timeout(TASK_SEND_TIMEOUT, sender.send(Box::new(task))).await { + Ok(Ok(_)) => Ok(handle), + _ => Err(Error::from_kind(ErrorKind::ServiceUnavailable)), + } + } +} + +pub struct Route { + project_name: ProjectName, + inner: Option, + router: TaskRouter, +} + +impl Route { + pub fn to(project_name: ProjectName, what: T, router: TaskRouter) -> Self { + Self { + project_name, + inner: Some(what), + router, + } + } +} + +#[async_trait] +impl Task<()> for Route { + type Output = (); + + type Error = Error; + + async fn poll(&mut self, _ctx: ()) -> TaskResult { + if let Some(task) = self.inner.take() { + match self.router.route(&self.project_name, task).await { + Ok(_) => TaskResult::Done(()), + Err(_) => TaskResult::Err(Error::from_kind(ErrorKind::Internal)), + } + } else { + TaskResult::Done(()) + } + } +} + +pub struct RunFn { + f: F, + _output: PhantomData, +} + +#[async_trait] +impl Task for RunFn +where + F: FnMut(ProjectContext) -> Fut + Send, + Fut: Future> + Send, +{ + type Output = Project; + + type Error = Error; + + async fn poll(&mut self, ctx: ProjectContext) -> TaskResult { + (self.f)(ctx).await + } +} + +/// Advance a project's state until it's returning `is_done` +pub struct RunUntilDone; + +#[async_trait] +impl Task for RunUntilDone { + type Output = Project; + + type Error = Error; + + async fn poll(&mut self, ctx: ProjectContext) -> TaskResult { + if !>::is_done(&ctx.state) { + TaskResult::Pending(ctx.state.next(&ctx.gateway).await.unwrap()) + } else { + TaskResult::Done(ctx.state) + } + } +} + +pub struct TaskHandle { + rx: oneshot::Receiver<()>, +} + +impl Future for TaskHandle { + type Output = (); + + fn poll( + mut self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll { + Pin::new(&mut self.rx).poll(cx).map(|_| ()) + } +} + +pub struct AndThenNotify { + inner: T, + notify: Option>, +} + +impl AndThenNotify { + pub fn after(task: T) -> (Self, TaskHandle) { + let (tx, rx) = oneshot::channel(); + ( + Self { + inner: task, + notify: Some(tx), + }, + TaskHandle { rx }, + ) + } +} + +#[async_trait] +impl Task for AndThenNotify +where + Ctx: Send + 'static, + T: Task, +{ + type Output = T::Output; + + type Error = T::Error; + + async fn poll(&mut self, ctx: Ctx) -> TaskResult { + let out = self.inner.poll(ctx).await; + + if out.is_done() { + let _ = self.notify.take().unwrap().send(()); + } + + out + } +} + +pub struct WithTimeout { + inner: T, + start: Option, + timeout: Duration, +} + +impl WithTimeout { + pub fn on(timeout: Duration, inner: T) -> Self { + Self { + inner, + start: None, + timeout, + } + } +} + +#[async_trait] +impl Task for WithTimeout +where + Ctx: Send + 'static, + T: Task, +{ + type Output = T::Output; + + type Error = T::Error; + + async fn poll(&mut self, ctx: Ctx) -> TaskResult { + if self.start.is_none() { + self.start = Some(Instant::now()); + } + + if Instant::now() - *self.start.as_ref().unwrap() > self.timeout { + warn!( + "task has timed out: was running for more than {}s", + self.timeout.as_secs() + ); + return TaskResult::Cancelled; + } + + self.inner.poll(ctx).await + } +} + +/// A collection of tasks scoped to a specific project. +/// +/// All the tasks in the collection are run to completion. If an error +/// is encountered, the `ProjectTask` completes early passing through +/// the error. The value returned by the inner tasks upon their +/// completion is committed back to persistence through +/// [GatewayService]. +pub struct ProjectTask { + uuid: Uuid, + project_name: ProjectName, + service: Arc, + tasks: VecDeque, +} + +impl ProjectTask { + pub fn uuid(&self) -> &Uuid { + &self.uuid + } +} + +/// A context for tasks which are scoped to a specific project. +/// +/// This will be always instantiated with the latest known state of +/// the project and gives access to the broader gateway context. +#[derive(Clone)] +pub struct ProjectContext { + /// The name of the project this task is about + pub project_name: ProjectName, + /// The name of the user the project belongs to + pub account_name: AccountName, + /// The gateway context in which this task is running + pub gateway: GatewayContext, + /// The last known state of the project + pub state: Project, +} + +pub type BoxedTask = Box>; + +#[async_trait] +impl Task<()> for ProjectTask +where + T: Task, +{ + type Output = (); + + type Error = Error; + + async fn poll(&mut self, _: ()) -> TaskResult { + if self.tasks.is_empty() { + return TaskResult::Done(()); + } + + let ctx = self.service.context(); + + let project = match self.service.find_project(&self.project_name).await { + Ok(project) => project, + Err(err) => return TaskResult::Err(err), + }; + + let account_name = match self + .service + .account_name_from_project(&self.project_name) + .await + { + Ok(account_name) => account_name, + Err(err) => return TaskResult::Err(err), + }; + + let project_ctx = ProjectContext { + project_name: self.project_name.clone(), + account_name: account_name.clone(), + gateway: ctx, + state: project, + }; + + let span = info_span!( + "polling project", + ctx.project = ?project_ctx.project_name, + ctx.account = ?project_ctx.account_name, + ctx.state = project_ctx.state.state() + ); + let _ = span.enter(); + + let task = self.tasks.front_mut().unwrap(); + + let timeout = sleep(PROJECT_TASK_MAX_IDLE_TIMEOUT); + let res = { + let mut poll = task.poll(project_ctx); + tokio::select! { + res = &mut poll => res, + _ = timeout => { + warn!( + project_name = ?self.project_name, + account_name = ?account_name, + "a task has been idling for a long time" + ); + poll.await + } + } + }; + + if let Some(update) = res.as_ref().ok() { + info!(new_state = ?update.state(), "new state"); + match self + .service + .update_project(&self.project_name, update) + .await + { + Ok(_) => { + info!(new_state = ?update.state(), "successfully updated project state"); + } + Err(err) => { + error!(err = %err, "could not update project state"); + return TaskResult::Err(err); + } + } + } + + info!(result = res.to_str(), "poll result"); + + match res { + TaskResult::Pending(_) => TaskResult::Pending(()), + TaskResult::TryAgain => TaskResult::TryAgain, + TaskResult::Done(_) => { + let _ = self.tasks.pop_front().unwrap(); + if self.tasks.is_empty() { + TaskResult::Done(()) + } else { + TaskResult::Pending(()) + } + } + TaskResult::Cancelled => TaskResult::Cancelled, + TaskResult::Err(err) => { + error!(err = %err, "project task failure"); + TaskResult::Err(err) + } + } + } +} + +#[cfg(test)] +pub mod tests { + use super::*; + + struct NeverEnding; + + #[async_trait] + impl Task<()> for NeverEnding { + type Output = (); + + type Error = (); + + async fn poll(&mut self, _ctx: ()) -> TaskResult { + TaskResult::Pending(()) + } + } + + #[tokio::test] + async fn task_with_timeout() -> anyhow::Result<()> { + let timeout = Duration::from_secs(1); + + let mut task_with_timeout = WithTimeout::on(timeout, NeverEnding); + + let start = Instant::now(); + + while let TaskResult::Pending(()) = task_with_timeout.poll(()).await { + assert!(Instant::now() - start <= timeout + Duration::from_secs(1)); + } + + assert_eq!(task_with_timeout.poll(()).await, TaskResult::Cancelled); + + Ok(()) + } +} diff --git a/gateway/src/tls.rs b/gateway/src/tls.rs new file mode 100644 index 000000000..6e3ee8292 --- /dev/null +++ b/gateway/src/tls.rs @@ -0,0 +1,165 @@ +use std::collections::HashMap; +use std::fs::File; +use std::io::{BufReader, Read, Write}; +use std::path::Path; +use std::sync::Arc; + +use axum_server::accept::DefaultAcceptor; +use axum_server::tls_rustls::{RustlsAcceptor, RustlsConfig}; +use futures::executor::block_on; +use pem::Pem; +use rustls::server::{ClientHello, ResolvesServerCert}; +use rustls::sign::{self, CertifiedKey}; +use rustls::{Certificate, PrivateKey, ServerConfig}; +use rustls_pemfile::Item; +use shuttle_common::models::error::ErrorKind; +use tokio::runtime::Handle; +use tokio::sync::RwLock; + +use crate::Error; + +#[derive(Clone)] +pub struct ChainAndPrivateKey { + chain: Vec, + private_key: PrivateKey, +} + +impl ChainAndPrivateKey { + pub fn parse_pem(rd: R) -> Result { + let mut private_key = None; + let mut chain = Vec::new(); + + for item in rustls_pemfile::read_all(&mut BufReader::new(rd)) + .map_err(|_| Error::from_kind(ErrorKind::Internal))? + { + match item { + Item::X509Certificate(cert) => chain.push(Certificate(cert)), + Item::ECKey(key) | Item::PKCS8Key(key) | Item::RSAKey(key) => { + private_key = Some(PrivateKey(key)) + } + _ => return Err(Error::from_kind(ErrorKind::Internal)), + } + } + + Ok(Self { + chain, + private_key: private_key.unwrap(), + }) + } + + pub fn load_pem>(path: P) -> Result { + let rd = File::open(path)?; + Self::parse_pem(rd) + } + + pub fn into_pem(self) -> Result { + let mut pems = Vec::new(); + for cert in self.chain { + pems.push(Pem { + tag: "CERTIFICATE".to_string(), + contents: cert.0, + }); + } + + pems.push(Pem { + tag: "PRIVATE KEY".to_string(), + contents: self.private_key.0, + }); + + Ok(pem::encode_many(&pems)) + } + + pub fn into_certified_key(self) -> Result { + let signing_key = sign::any_supported_type(&self.private_key) + .map_err(|_| Error::from_kind(ErrorKind::Internal))?; + Ok(CertifiedKey::new(self.chain, signing_key)) + } + + pub fn save_pem>(self, path: P) -> Result<(), Error> { + let as_pem = self.into_pem()?; + let mut f = File::create(path)?; + f.write_all(as_pem.as_bytes())?; + Ok(()) + } +} + +pub struct GatewayCertResolver { + keys: RwLock>>, + default: RwLock>>, +} + +impl Default for GatewayCertResolver { + fn default() -> Self { + Self::new() + } +} + +impl GatewayCertResolver { + pub fn new() -> Self { + Self { + keys: RwLock::new(HashMap::default()), + default: RwLock::new(None), + } + } + + /// Get the loaded [CertifiedKey] associated with the given + /// domain. + pub async fn get(&self, sni: &str) -> Option> { + self.keys.read().await.get(sni).map(Arc::clone) + } + + pub async fn serve_default_der(&self, certs: ChainAndPrivateKey) -> Result<(), Error> { + *self.default.write().await = Some(Arc::new(certs.into_certified_key()?)); + Ok(()) + } + + pub async fn serve_default_pem(&self, rd: R) -> Result<(), Error> { + let certs = ChainAndPrivateKey::parse_pem(rd)?; + self.serve_default_der(certs).await + } + + /// Load a new certificate chain and private key to serve when + /// receiving incoming TLS connections for the given domain. + pub async fn serve_der(&self, sni: &str, certs: ChainAndPrivateKey) -> Result<(), Error> { + let certified_key = certs.into_certified_key()?; + self.keys + .write() + .await + .insert(sni.to_string(), Arc::new(certified_key)); + Ok(()) + } + + pub async fn serve_pem(&self, sni: &str, rd: R) -> Result<(), Error> { + let certs = ChainAndPrivateKey::parse_pem(rd)?; + self.serve_der(sni, certs).await + } +} + +impl ResolvesServerCert for GatewayCertResolver { + fn resolve(&self, client_hello: ClientHello) -> Option> { + let sni = client_hello.server_name()?; + let handle = Handle::current(); + let _ = handle.enter(); + block_on(async move { + if let Some(cert) = self.get(sni).await { + Some(cert) + } else { + self.default.read().await.clone() + } + }) + } +} + +pub fn make_tls_acceptor() -> (Arc, RustlsAcceptor) { + let resolver = Arc::new(GatewayCertResolver::new()); + + let mut server_config = ServerConfig::builder() + .with_safe_defaults() + .with_no_client_auth() + .with_cert_resolver(Arc::clone(&resolver) as Arc); + server_config.alpn_protocols = vec![b"http/1.1".to_vec()]; + + let rustls_config = RustlsConfig::from_config(Arc::new(server_config)); + + (resolver, RustlsAcceptor::new(rustls_config)) +} diff --git a/gateway/src/worker.rs b/gateway/src/worker.rs index ee71dfd8a..b81bb1ad0 100644 --- a/gateway/src/worker.rs +++ b/gateway/src/worker.rs @@ -1,88 +1,37 @@ -use std::fmt::Debug; +use std::collections::HashMap; use std::sync::Arc; +use tokio::sync::mpsc::error::SendError; use tokio::sync::mpsc::{channel, Receiver, Sender}; +use tokio::sync::RwLock; use tracing::{debug, info}; -use crate::project::Project; -use crate::service::GatewayService; -use crate::{AccountName, Context, EndState, Error, ProjectName, Refresh, Service, State}; +use crate::task::{BoxedTask, TaskResult}; +use crate::{Error, ProjectName}; -#[must_use] -#[derive(Debug, Clone)] -pub struct Work { - pub project_name: ProjectName, - pub account_name: AccountName, - pub work: W, -} - -#[async_trait] -impl Refresh for Work -where - W: Refresh + Send, -{ - type Error = W::Error; +pub const WORKER_QUEUE_SIZE: usize = 2048; - async fn refresh<'c, C: Context<'c>>(self, ctx: &C) -> Result { - Ok(Self { - project_name: self.project_name, - account_name: self.account_name, - work: self.work.refresh(ctx).await?, - }) - } -} - -#[async_trait] -impl<'c, W> State<'c> for Work -where - W: State<'c>, -{ - type Next = Work; - - type Error = W::Error; - - async fn next>(self, ctx: &C) -> Result { - Ok(Work:: { - project_name: self.project_name, - account_name: self.account_name, - work: self.work.next(ctx).await?, - }) - } +pub struct Worker { + send: Option>, + recv: Receiver, } -impl<'c, W> EndState<'c> for Work +impl Default for Worker where - W: EndState<'c>, + W: Send, { - type ErrorVariant = W::ErrorVariant; - - fn is_done(&self) -> bool { - self.work.is_done() - } - - fn into_result(self) -> Result { - Ok(Self { - project_name: self.project_name, - account_name: self.account_name, - work: self.work.into_result()?, - }) + fn default() -> Self { + Self::new() } } -pub struct Worker, W = Work> { - service: Svc, - send: Option>, - recv: Receiver, -} - -impl Worker +impl Worker where W: Send, { - pub fn new(service: Svc) -> Self { - let (send, recv) = channel(32); + pub fn new() -> Self { + let (send, recv) = channel(WORKER_QUEUE_SIZE); Self { - service, send: Some(send), recv, } @@ -97,11 +46,7 @@ where } } -impl Worker -where - Svc: for<'c> Service<'c, State = W, Error = Error>, - W: Debug + Send + for<'c> EndState<'c>, -{ +impl Worker { /// Starts the worker, waiting and processing elements from the /// queue until the last sending end for the channel is dropped, /// at which point this future resolves. @@ -116,24 +61,14 @@ where debug!("starting worker"); while let Some(mut work) = self.recv.recv().await { - debug!(?work, "received work"); loop { - work = { - let context = self.service.context(); - - // Safety: EndState's transitions are Infallible - work.next(&context).await.unwrap() - }; - - match self.service.update(&work).await { - Ok(_) => {} - Err(err) => info!("failed to update a state: {}\nstate: {:?}", err, work), - }; - - if work.is_done() { - break; - } else { - debug!(?work, "work not done yet"); + match work.poll(()).await { + TaskResult::Done(_) | TaskResult::Cancelled => break, + TaskResult::Pending(_) | TaskResult::TryAgain => continue, + TaskResult::Err(err) => { + info!("task failed: {err}"); + break; + } } } } @@ -142,121 +77,52 @@ where } } -#[cfg(test)] -pub mod tests { - use std::convert::Infallible; - - use anyhow::anyhow; - use tokio::sync::Mutex; - - use super::*; - use crate::tests::{World, WorldContext}; - - pub struct DummyService { - world: World, - state: Mutex>, - } - - impl DummyService<()> { - pub async fn new() -> DummyService { - let world = World::new().await; - DummyService { - world, - state: Mutex::new(None), - } - } - } - - #[async_trait] - impl<'c, S> Service<'c> for DummyService - where - S: EndState<'c> + Sync, - { - type Context = WorldContext<'c>; - - type State = S; - - type Error = Error; - - fn context(&'c self) -> Self::Context { - self.world.context() - } +pub struct TaskRouter { + table: Arc>>>, +} - async fn update(&self, state: &Self::State) -> Result<(), Self::Error> { - let mut lock = self.state.lock().await; - *lock = Some(Self::State::clone(state)); - Ok(()) +impl Clone for TaskRouter { + fn clone(&self) -> Self { + Self { + table: self.table.clone(), } } +} - #[derive(Debug, PartialEq, Eq, Clone)] - pub struct FiniteState { - count: usize, - max_count: usize, - } - - #[async_trait] - impl<'c> State<'c> for FiniteState { - type Next = Self; - - type Error = Infallible; - - async fn next>(mut self, _ctx: &C) -> Result { - if self.count < self.max_count { - self.count += 1; - } - Ok(self) - } +impl Default for TaskRouter { + fn default() -> Self { + Self::new() } +} - impl<'c> EndState<'c> for FiniteState { - type ErrorVariant = anyhow::Error; - - fn is_done(&self) -> bool { - self.count == self.max_count - } - - fn into_result(self) -> Result { - if self.count > self.max_count { - Err(anyhow!( - "count is over max_count: {} > {}", - self.count, - self.max_count - )) - } else { - Ok(self) - } +impl TaskRouter { + pub fn new() -> Self { + Self { + table: Arc::new(RwLock::new(HashMap::new())), } } +} - #[tokio::test] - async fn worker_queue_and_proceed_until_done() { - let svc = DummyService::new::().await; - - let worker = Worker::new(svc); - - { +impl TaskRouter { + pub async fn route( + &self, + name: &ProjectName, + task: BoxedTask, + ) -> Result<(), SendError> { + let mut table = self.table.write().await; + if let Some(sender) = table.get(name) { + sender.send(task).await + } else { + let worker = Worker::new(); let sender = worker.sender(); - let state = FiniteState { - count: 0, - max_count: 42, - }; + tokio::spawn(worker.start()); - sender.send(state).await.unwrap(); - } + let res = sender.send(task).await; - let Worker { - service: DummyService { state, .. }, - .. - } = worker.start().await.unwrap(); + table.insert(name.clone(), sender); - assert_eq!( - *state.lock().await, - Some(FiniteState { - count: 42, - max_count: 42 - }) - ); + res + } } } diff --git a/gateway/tests/hello_world.crate b/gateway/tests/hello_world.crate index d4f72b6be50d084966e3c273d72c05b33e353b61..038d4d03e2fe22bcf8b7b13dc48ffc2b2ad057f9 100644 GIT binary patch delta 895 zcmV-_1AzRc2c`#*G=D7HnTHMV(zFebEkKfCC=4T|<&(vk5)G1y;}!YuJ4#+X+bLS0 zS+*j&FMJX2h4eiSc}`IX*;+~^rY+wKJiqP5OwHuYZLDv2o=EQxE%Sq~5}%|OMGwwf z3HrguK8>g!biy9B2Tve{HcSB=JX87L0Jt-5+yU4w4Rp!^8h^P_5GCE?{4Z^l68gtUf?ae;?f%G`Sum4Q&e+tk2Jnt$3xT?=WIRXHPB*FMI`;>) z{2wIU!~cnezh`779?QpP@E?RxcNhOb*b8g?KY<*=_1m*6czt$$3e*mNyT15kczt#< zJU@R2Z%%(by?-2DpT2^h-@(c7^38>F=p4fDDdtctgk)2m&mdOJpavtsqzDRUTpP85 zGLK-%g#cDiIx)jzCd7&ixVcmr6Z}tfVUuo$%2ua2pj0lyrXse9+%Cn z#a_ABvjkSM0H*BDs{NXj>oQiDAh4zVWKw3z-Al!1Jg3Mv+bYARkOiNkSb>moZo^-} zloNj{%ndYb@L3V3kjcss-MMTcut`C{72-e4dDcaFNL&75nHw@iQ9Gjri|1^HV+W_) z&?&)>;D3gG7`RT(GPI*DDqf$Zoi7={brfnTXu4E%$)ezsF*RGqQ?dGZTfOV~EfssE z($;F77RCr{X;im7#vQf3^_n0v1-YiFk-Nl6tMcHEotmcq6aFt#?GgEZP4K&|Z@E73 zqh8=smUirX5cQ*P?ESa9xo<=^WbuXEu*WG6vVX(asldC-3Oh7FpFhAJ6CA-OsQ~V4 zGWeJAe^vcNkN5)o9RB^t-@|{WU*rEN->2{& z`Mq8IclzCKjsK^p|3(>$mAommtrzYLs=O+Qpkjd^9OrN}L(_2EZgcD;IdHn;?;1^L z{dff5y`;mVvJR-6`up#rw>F`Upv3bgXoT3o2wUkQ4E#C_~zwJd#&E(B(q;GhhNbe6V^MijRKFOfhdvM-L zFbqERX+-^?+Zj-M@B~t5!xX^5GnJ1HfIH*H9f9rAK&LFAk$;;EV%ASy4F;^!4TIxh zr#BoXaTMb5Fhu%^j-yv`=*PZGYWGLh%z~Mea>k~PHGp?4TL{!`C8If-cDhM5*SSBa z<^Le*9{x`({5>Nx@mM~-fd8P=>+j+}=nOhF{+~b&;rh+l75s8`ehSo%f4{!?b$oqx zGCn_l2d__mJAb_#U!VRAKfQyK@#X6a=g>KXw<+dOEQDk+&u0)RW>ABXU{VByGp>zV zL77LeB%Ig+5~(0#cbpbLBr_rv9&*8rRa|nD z0vUl@RGQ0NgG|dt5fR z7JKDh&k|V40+_NptM+SBuFF^v9G+=jn` zm?sG;%ndYb@L3V1kjcss-MK6j*rXuf3h{5|JnN!7q%D7u%ng~MsGZ4zMRPX8se>^$ zbV~38xPKkL6Sz*!GPI*DDqf$Zoi7={brfnTXu4E%$)e!ll$x#MsaSowt={+imWsSm zX=}Ak3u6SfG^$%3;hq|4B*;ubu4!uGE-`FX9^9!@)AWDB|7EH@BLA-mez)~4*9U%Y z5crg(T{|E2hP`j>{kOZhZ$vg^@s-@L$0-l8!++GNz`M%|J2XI_Kf)dp9KmO)0Pbrt z_?Pj2RsBSd_yYVA{{5c6hyU)d#{W~u1E^nvt;H4#w?^Bu!@pKhn;6|w`myW3&*8u4 z4|eh29rpV*{-2`$n`A6f@}|(XUbr);@~R+$iUq!RoWscsO~Y-w&8d^*!0C>^Yc!$t zBX@lFk`9l`I-qjuufLDp*n~QQGNWF&&b`%N-}*P}TYogl7|*8;)2loJGFiE*Z0@aH z-$$3#d!q6psQ2lCQFTV6u;3zYG`&m~xsA6>ZF)>7Sx|lVVp0Y^ZPJdciHmuoQfxZ) Uo1&IlYI%OV diff --git a/migrator/.gitignore b/migrator/.gitignore deleted file mode 100644 index a063a0a46..000000000 --- a/migrator/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -users.toml -users.sql -dump.sql diff --git a/migrator/Cargo.toml b/migrator/Cargo.toml deleted file mode 100644 index a3f4c56fc..000000000 --- a/migrator/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "migrator" -version = "0.1.0" -edition = "2021" - -[workspace] - -[dependencies] -rand = "0.8.5" -shuttle-common = { path = "../common" } -toml = "0.5.9" diff --git a/migrator/db_script.sh b/migrator/db_script.sh deleted file mode 100755 index d92bbc275..000000000 --- a/migrator/db_script.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env sh - - -ssh ubuntu@18.133.52.140 "docker exec pg pg_dumpall -U postgres > dump.sql" -scp ubuntu@18.133.52.140:~/dump.sql dump.sql - -scp dump.sql database.shuttle.internal:~/dump.sql - -# docker cp dump.sql 123:/dump.sql -# docker exec 123 psql -f dump.sql -U postgres diff --git a/migrator/script.sh b/migrator/script.sh deleted file mode 100755 index 68b80976c..000000000 --- a/migrator/script.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -scp ubuntu@18.133.52.140:/opt/shuttle/user-data/users/users.toml users.toml -cargo run -- users.toml > users.sql - - -scp users.sql controller.shuttle.internal:~/users.sql -ssh controller.shuttle.internal "cat ~/users.sql | sudo sqlite3 /var/lib/docker/volumes/shuttle-dev_gateway-vol/_data/gateway.sqlite" diff --git a/migrator/src/main.rs b/migrator/src/main.rs deleted file mode 100644 index 0ddab79a5..000000000 --- a/migrator/src/main.rs +++ /dev/null @@ -1,185 +0,0 @@ -use rand::distributions::{Alphanumeric, DistString}; -use shuttle_common::project::ProjectName; -use std::{ - env::args, - fmt::{Display, Formatter}, - fs, - str::FromStr, -}; - -fn main() { - let mut args = args(); - let _ = args.next(); - let file = args - .next() - .expect("expected a users.toml file to convert to .sql"); - let data = fs::read_to_string(file).expect("to read data file"); - let toml = toml::from_str(&data).expect("to parse data file"); - - let users = parse_value(toml); - - for user in users { - println!("{user}"); - } -} - -#[derive(Eq, PartialEq, Debug)] -struct User { - key: String, - name: String, - projects: Vec, -} - -impl From<(&String, &toml::Value)> for User { - fn from((key, value): (&String, &toml::Value)) -> User { - let (name, projects) = match value { - toml::Value::Table(table) => { - let name = table - .get("name") - .expect("user to have a name") - .as_str() - .expect("name to be a string") - .to_string(); - let projects = table - .get("projects") - .expect("user to have projects") - .as_array() - .expect("projects to be an array") - .iter() - .map(|value| value.as_str().expect("project to be a string")) - .filter_map(|project_name| match project_name.len() { - 3..=64 => match ProjectName::from_str(project_name) { - Ok(project_name) => Some(project_name), - Err(err) => { - eprintln!("{err}"); - None - } - }, - _ => { - eprintln!("project name is too long/short: {project_name}"); - None - } - }) - .collect(); - - (name, projects) - } - other => panic!("unexpected '{other}' at user level"), - }; - - Self { - key: key.to_string(), - name, - projects, - } - } -} - -impl Display for User { - fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { - write!( - f, - "INSERT INTO accounts(account_name, key, super_user) VALUES('{}', '{}', 0);", - self.name, self.key - )?; - - for project in self.projects.iter() { - let initial_key = Alphanumeric.sample_string(&mut rand::thread_rng(), 32); - let state = format!("{{\"creating\": {{\"project_name\": \"{project}\", \"initial_key\": \"{initial_key}\"}}}}"); - - write!( - f, - "\nINSERT INTO projects(project_name, account_name, project_state, initial_key) VALUES('{}', '{}', '{}', '{}');", - project, - self.name, - state, - initial_key, - )?; - } - - write!(f, "\n") - } -} - -fn parse_value(value: toml::Value) -> Vec { - match value { - toml::Value::Table(table) => table.iter().map(Into::into).collect(), - _ => vec![], - } -} - -#[cfg(test)] -mod tests { - use super::User; - - fn get_dummy() -> toml::Value { - r#" -[key1] -name = 'name1' -projects = [] - -[key2] -name = 'name2' -projects = [ - 'project1', - 'project2', -] -"# - .parse() - .unwrap() - } - - #[test] - fn parse_value() { - let value = get_dummy(); - let actual = super::parse_value(value); - - let expected = vec![ - User { - key: "key1".to_string(), - name: "name1".to_string(), - projects: vec![], - }, - User { - key: "key2".to_string(), - name: "name2".to_string(), - projects: vec!["project1".parse().unwrap(), "project2".parse().unwrap()], - }, - ]; - - assert_eq!(actual, expected); - } - - #[test] - fn display() { - let input = User { - key: "key".to_string(), - name: "name".to_string(), - projects: vec!["project1".parse().unwrap(), "project2".parse().unwrap()], - }; - - let actual = input.to_string(); - - assert!( - actual.starts_with( - "INSERT INTO accounts(account_name, key, super_user) VALUES('name', 'key', 0);" - ), - "got: {}", - actual - ); - assert!( - actual.contains( - "INSERT INTO projects(project_name, account_name, project_state, initial_key) VALUES('project1', 'name', '{\"creating\": {\"project_name\": \"project1\", \"initial_key\": " - ), - "got: {}", - actual - ); - assert!( - actual.contains( - "INSERT INTO projects(project_name, account_name, project_state, initial_key) VALUES('project2', 'name', '{\"creating\": {\"project_name\": \"project2\", \"initial_key\": " - ), - "got: {}", - actual - ); - } -} diff --git a/proto/Cargo.toml b/proto/Cargo.toml index bfe263cc4..4f92e4e55 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -1,18 +1,19 @@ [package] name = "shuttle-proto" -version = "0.7.0" -edition = "2021" +version.workspace = true +edition.workspace = true +license.workspace = true publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -prost = "0.11.0" +prost = "0.11.2" prost-types = "0.11.0" -tonic = "0.8.2" +tonic = "0.8.3" [dependencies.shuttle-common] -version = "0.7.0" -path = "../common" +workspace = true +features = ["models"] [build-dependencies] -tonic-build = "0.8.0" +tonic-build = "0.8.3" diff --git a/provisioner/Cargo.toml b/provisioner/Cargo.toml index 35fd0791a..91b1bff91 100644 --- a/provisioner/Cargo.toml +++ b/provisioner/Cargo.toml @@ -1,36 +1,35 @@ [package] name = "shuttle-provisioner" -version = "0.7.0" -edition = "2021" +version.workspace = true +edition.workspace = true +license.workspace = true description = "Service responsible for provisioning and managing resources for services" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -aws-config = "0.47.0" -aws-sdk-rds = "0.17.0" -aws-smithy-types = "0.47.0" +aws-config = "0.51.0" +aws-sdk-rds = "0.21.0" clap = { version = "3.2.17", features = ["derive", "env"] } -fqdn = "0.2.2" -mongodb = "2.3.0" -prost = "0.11.0" +fqdn = "0.2.3" +mongodb = "2.3.1" +prost = "0.11.2" rand = "0.8.5" -sqlx = { version = "0.6.1", features = ["postgres", "runtime-tokio-native-tls"] } -thiserror = "1.0.32" -tokio = { version = "1.20.1", features = ["macros", "rt-multi-thread"] } -tonic = "0.8.2" -tracing = "0.1.36" -tracing-subscriber = "0.3.15" +sqlx = { version = "0.6.2", features = ["postgres", "runtime-tokio-native-tls"] } +thiserror = { workspace = true } +tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } +tonic = "0.8.3" +tracing = { workspace = true } +tracing-subscriber = { workspace = true } [dependencies.shuttle-proto] -version = "0.7.0" -path = "../proto" +workspace = true [dev-dependencies] -ctor = "0.1.23" -once_cell = "1.13.1" +ctor = "0.1.26" +once_cell = { workspace = true } portpicker = "0.1.1" -serde_json = "1.0.83" +serde_json = { workspace = true } [build-dependencies] -tonic-build = "0.8.0" +tonic-build = "0.8.3" diff --git a/provisioner/prepare.sh b/provisioner/prepare.sh new file mode 100755 index 000000000..6a52d3030 --- /dev/null +++ b/provisioner/prepare.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +############################################################################### +# This file is used by our common Containerfile incase the container for this # +# service might need some extra preparation steps for its final image # +############################################################################### + +# Nothing to prepare in container image here diff --git a/provisioner/src/lib.rs b/provisioner/src/lib.rs index 7c8b08a16..a877a6dd9 100644 --- a/provisioner/src/lib.rs +++ b/provisioner/src/lib.rs @@ -3,7 +3,6 @@ use std::time::Duration; pub use args::Args; use aws_config::timeout; use aws_sdk_rds::{error::ModifyDBInstanceErrorKind, model::DbInstance, types::SdkError, Client}; -use aws_smithy_types::tristate::TriState; pub use error::Error; use mongodb::{bson::doc, options::ClientOptions}; use rand::Rng; @@ -51,10 +50,10 @@ impl MyProvisioner { let mongodb_client = mongodb::Client::with_options(mongodb_options)?; // Default timeout is too long so lowering it - let api_timeout_config = timeout::Api::new() - .with_call_timeout(TriState::Set(Duration::from_secs(120))) - .with_call_attempt_timeout(TriState::Set(Duration::from_secs(120))); - let timeout_config = timeout::Config::new().with_api_timeouts(api_timeout_config); + let timeout_config = timeout::TimeoutConfig::builder() + .operation_timeout(Duration::from_secs(120)) + .operation_attempt_timeout(Duration::from_secs(120)) + .build(); let aws_config = aws_config::from_env() .timeout_config(timeout_config) diff --git a/provisioner/src/main.rs b/provisioner/src/main.rs index 329348c83..3c42acf90 100644 --- a/provisioner/src/main.rs +++ b/provisioner/src/main.rs @@ -1,4 +1,4 @@ -use std::net::SocketAddr; +use std::{net::SocketAddr, time::Duration}; use clap::Parser; use shuttle_provisioner::{Args, MyProvisioner, ProvisionerServer}; @@ -31,6 +31,7 @@ async fn main() -> Result<(), Box> { println!("starting provisioner on {}", addr); Server::builder() + .http2_keepalive_interval(Some(Duration::from_secs(30))) // Prevent deployer clients from loosing connection #ENG-219 .add_service(ProvisionerServer::new(provisioner)) .serve(addr) .await?; diff --git a/resources/aws-rds/Cargo.toml b/resources/aws-rds/Cargo.toml index 1b17ac11a..2403eeaad 100644 --- a/resources/aws-rds/Cargo.toml +++ b/resources/aws-rds/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-aws-rds" -version = "0.7.0" +version = "0.8.0" edition = "2021" license = "Apache-2.0" description = "Plugin to provision AWS RDS resources" @@ -10,8 +10,8 @@ keywords = ["shuttle-service", "rds"] [dependencies] async-trait = "0.1.56" paste = "1.0.7" -shuttle-service = { path = "../../service", version = "0.7.0", default-features = false } -sqlx = { version = "0.6.0", features = ["runtime-tokio-native-tls"] } +shuttle-service = { path = "../../service", version = "0.8.0" } +sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"] } tokio = { version = "1.19.2", features = ["rt"] } [features] diff --git a/resources/aws-rds/README.md b/resources/aws-rds/README.md index 519c9ec15..b48228fe1 100644 --- a/resources/aws-rds/README.md +++ b/resources/aws-rds/README.md @@ -13,5 +13,5 @@ Add `shuttle-aws-rds` to the dependencies for your service. Every engine is behi | MySql | mysql | shuttle_aws_rds::MySql | | MariaDB | mariadb | shuttle_aws_rds::MariaDB | -An example using the Tide framework can be found on [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/tide/postgres) +An example using the Tide framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/tide/postgres) diff --git a/resources/persist/Cargo.toml b/resources/persist/Cargo.toml index ee13d37f3..837caf372 100644 --- a/resources/persist/Cargo.toml +++ b/resources/persist/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-persist" -version = "0.7.0" +version = "0.8.0" edition = "2021" license = "Apache-2.0" description = "Plugin for persist objects" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "persistence"] async-trait = "0.1.56" bincode = "1.2.1" serde = { version = "1.0.0", features = ["derive"] } -shuttle-common = { path = "../../common", version = "0.7.0" } -shuttle-service = { path = "../../service", version = "0.7.0", default-features = false } +shuttle-common = { path = "../../common", version = "0.8.0" } +shuttle-service = { path = "../../service", version = "0.8.0" } thiserror = "1.0.32" tokio = { version = "1.19.2", features = ["rt"] } diff --git a/resources/persist/README.md b/resources/persist/README.md index 1f7638a2c..333bf75ba 100644 --- a/resources/persist/README.md +++ b/resources/persist/README.md @@ -4,5 +4,5 @@ This plugin allows persisting struct that implement `serde::Serialize` and loadi ## Usage Add `shuttle-persist` to the dependencies for your service. You can get this resource using the `shuttle-persist::Persist` attribute to get a `PersistInstance`. Object can now be saved using `PersistInstance.save()` and loaded again using `PersistInstance.load()`. -An example using the Rocket framework can be found on [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/rocket/persist) +An example using the Rocket framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/rocket/persist) diff --git a/resources/secrets/Cargo.toml b/resources/secrets/Cargo.toml index 0bbecd62c..f5b1b713e 100644 --- a/resources/secrets/Cargo.toml +++ b/resources/secrets/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-secrets" -version = "0.7.0" +version = "0.8.0" edition = "2021" license = "Apache-2.0" description = "Plugin to for managing secrets on shuttle" @@ -9,5 +9,5 @@ keywords = ["shuttle-service", "secrets"] [dependencies] async-trait = "0.1.56" -shuttle-service = { path = "../../service", version = "0.7.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.8.0" } tokio = { version = "1.19.2", features = ["rt"] } diff --git a/resources/secrets/README.md b/resources/secrets/README.md index 157bd2b16..08e7912a5 100644 --- a/resources/secrets/README.md +++ b/resources/secrets/README.md @@ -8,4 +8,4 @@ with the secrets you'd like to store. Make sure to add `Secrets.toml` to a `.git Next, pass `#[shuttle_secrets::Secrets] secret_store: SecretStore` as an argument to your `shuttle_service::main` function. `SecretStore::get` can now be called to retrieve your API keys and other secrets at runtime. -An example using the Rocket framework can be found on [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/rocket/secrets) +An example using the Rocket framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/rocket/secrets) diff --git a/resources/shared-db/Cargo.toml b/resources/shared-db/Cargo.toml index fce73e2cf..6e205e6aa 100644 --- a/resources/shared-db/Cargo.toml +++ b/resources/shared-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-shared-db" -version = "0.7.0" +version = "0.8.0" edition = "2021" license = "Apache-2.0" description = "Plugin for managing shared databases on shuttle" @@ -10,8 +10,8 @@ keywords = ["shuttle-service", "database"] [dependencies] async-trait = "0.1.56" mongodb = { version = "2.3.0", optional = true } -shuttle-service = { path = "../../service", version = "0.7.0", default-features = false } -sqlx = { version = "0.6.1", features = ["runtime-tokio-native-tls"], optional = true } +shuttle-service = { path = "../../service", version = "0.8.0" } +sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"], optional = true } tokio = { version = "1.19.2", features = ["rt"] } [features] diff --git a/resources/shared-db/README.md b/resources/shared-db/README.md index 5b3e4029e..a3b1c877c 100644 --- a/resources/shared-db/README.md +++ b/resources/shared-db/README.md @@ -9,5 +9,5 @@ Add `shuttle-shared-db` to the dependencies for your service. Every type of shar | Postgres | postgres | shuttle_shared_db::Postgres | | MongoDB | mongodb | shuttle_shared_db::MongoDb | -An example using the Rocket framework can be found on [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/rocket/postgres) +An example using the Rocket framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/rocket/postgres) diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml new file mode 100644 index 000000000..4ac0f8671 --- /dev/null +++ b/resources/static-folder/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "shuttle-static-folder" +version = "0.8.0" +edition = "2021" +license = "Apache-2.0" +description = "Plugin to get a static folder at runtime on shuttle" +keywords = ["shuttle-service", "static-folder"] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1.56" +shuttle-service = { path = "../../service", version = "0.8.0" } +tokio = { version = "1.19.2", features = ["rt"] } + +[dev-dependencies] +tempdir = "0.3.7" +tokio = { version = "1.19.2", features = ["macros"] } diff --git a/resources/static-folder/README.md b/resources/static-folder/README.md new file mode 100644 index 000000000..48e27ba32 --- /dev/null +++ b/resources/static-folder/README.md @@ -0,0 +1,29 @@ +# Shuttle Static Folder +This plugin allows services to get the path to a static folder at runtime + +## Usage +Add `shuttle-static-folder` to the dependencies for your service. This resource can be using by the `shuttle_static_folder::StaticFolder` attribute to get a `PathBuf` with the location of the static folder. + +An example using the Axum framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/axum/websocket) + +``` rust +#[shuttle_service::main] +async fn main( + #[shuttle_static_folder::StaticFolder] static_folder: PathBuf, +) -> __ { ... } +``` + +### Parameters +| Parameter | Type | Default | Description | +|-----------|------|----------|--------------------------------------------------------------------| +| folder | str | `static` | The relative path, from the crate root, to the directory containing static files to deploy | + +### Example: Using the public folder instead +Since this plugin defaults to the `static` folder, the arguments can be used to use the `public` folder instead. + +``` rust +#[shuttle_service::main] +async fn main( + #[shuttle_static_folder::StaticFolder(folder = "public")] public_folder: PathBuf, +) -> __ { ... } +``` diff --git a/resources/static-folder/src/lib.rs b/resources/static-folder/src/lib.rs new file mode 100644 index 000000000..259288dd9 --- /dev/null +++ b/resources/static-folder/src/lib.rs @@ -0,0 +1,229 @@ +use async_trait::async_trait; +use shuttle_service::{ + error::{CustomError, Error as ShuttleError}, + Factory, ResourceBuilder, +}; +use std::{ + fs::rename, + path::{Path, PathBuf}, +}; +use tokio::runtime::Runtime; + +pub struct StaticFolder<'a> { + /// The folder to reach at runtime. Defaults to `static` + folder: &'a str, +} + +pub enum Error { + AbsolutePath, + TransversedUp, +} + +impl<'a> StaticFolder<'a> { + pub fn folder(mut self, folder: &'a str) -> Self { + self.folder = folder; + + self + } +} + +#[async_trait] +impl<'a> ResourceBuilder for StaticFolder<'a> { + fn new() -> Self { + Self { folder: "static" } + } + + async fn build( + self, + factory: &mut dyn Factory, + _runtime: &Runtime, + ) -> Result { + let folder = Path::new(self.folder); + + // Prevent users from users from reading anything outside of their crate's build folder + if folder.is_absolute() { + return Err(Error::AbsolutePath)?; + } + + let input_dir = factory.get_build_path()?.join(self.folder); + + match input_dir.canonicalize() { + Ok(canonical_path) if canonical_path != input_dir => return Err(Error::TransversedUp)?, + Ok(_) => { + // The path did not change to outside the crate's build folder + } + Err(err) => return Err(err)?, + } + + let output_dir = factory.get_storage_path()?.join(self.folder); + + rename(input_dir, output_dir.clone())?; + + Ok(output_dir) + } +} + +impl From for shuttle_service::Error { + fn from(error: Error) -> Self { + let msg = match error { + Error::AbsolutePath => "Cannot use an absolute path for a static folder", + Error::TransversedUp => "Cannot transverse out of crate for a static folder", + }; + + ShuttleError::Custom(CustomError::msg(msg)) + } +} + +#[cfg(test)] +mod tests { + use std::fs::{self}; + use std::path::PathBuf; + + use async_trait::async_trait; + use shuttle_service::{Factory, ResourceBuilder}; + use tempdir::TempDir; + + use crate::StaticFolder; + + struct MockFactory { + temp_dir: TempDir, + } + + // Will have this tree across all the tests + // . + // ├── build + // │   └── static + // │    └── note.txt + // ├── storage + // │   └── static + // │    └── note.txt + // └── escape + //    └── passwd + impl MockFactory { + fn new() -> Self { + Self { + temp_dir: TempDir::new("static_folder").unwrap(), + } + } + + fn build_path(&self) -> PathBuf { + self.get_path("build") + } + + fn storage_path(&self) -> PathBuf { + self.get_path("storage") + } + + fn escape_path(&self) -> PathBuf { + self.get_path("escape") + } + + fn get_path(&self, folder: &str) -> PathBuf { + let path = self.temp_dir.path().join(folder); + + if !path.exists() { + fs::create_dir(&path).unwrap(); + } + + path + } + } + + #[async_trait] + impl Factory for MockFactory { + async fn get_db_connection_string( + &mut self, + _db_type: shuttle_service::database::Type, + ) -> Result { + panic!("no static folder test should try to get a db connection string") + } + + async fn get_secrets( + &mut self, + ) -> Result, shuttle_service::Error> { + panic!("no static folder test should try to get secrets") + } + + fn get_service_name(&self) -> shuttle_service::ServiceName { + panic!("no static folder test should try to get the service name") + } + + fn get_build_path(&self) -> Result { + Ok(self.build_path()) + } + + fn get_storage_path(&self) -> Result { + Ok(self.storage_path()) + } + } + + #[tokio::test] + async fn copies_folder() { + let mut factory = MockFactory::new(); + + let input_file_path = factory.build_path().join("static").join("note.txt"); + fs::create_dir_all(input_file_path.parent().unwrap()).unwrap(); + fs::write(input_file_path, "Hello, test!").unwrap(); + + let expected_file = factory.storage_path().join("static").join("note.txt"); + assert!(!expected_file.exists(), "input file should not exist yet"); + + // Call plugin + let static_folder = StaticFolder::new(); + + let runtime = tokio::runtime::Runtime::new().unwrap(); + let actual_folder = static_folder.build(&mut factory, &runtime).await.unwrap(); + + assert_eq!( + actual_folder, + factory.storage_path().join("static"), + "expect path to the static folder" + ); + assert!(expected_file.exists(), "expected input file to be created"); + assert_eq!( + fs::read_to_string(expected_file).unwrap(), + "Hello, test!", + "expected file content to match" + ); + + runtime.shutdown_background(); + } + + #[tokio::test] + #[should_panic(expected = "Cannot use an absolute path for a static folder")] + async fn cannot_use_absolute_path() { + let mut factory = MockFactory::new(); + let static_folder = StaticFolder::new(); + let runtime = tokio::runtime::Runtime::new().unwrap(); + + let _ = static_folder + .folder("/etc") + .build(&mut factory, &runtime) + .await + .unwrap(); + + runtime.shutdown_background(); + } + + #[tokio::test] + #[should_panic(expected = "Cannot transverse out of crate for a static folder")] + async fn cannot_transverse_up() { + let mut factory = MockFactory::new(); + + let password_file_path = factory.escape_path().join("passwd"); + fs::create_dir_all(password_file_path.parent().unwrap()).unwrap(); + fs::write(password_file_path, "qwerty").unwrap(); + + // Call plugin + let static_folder = StaticFolder::new(); + + let runtime = tokio::runtime::Runtime::new().unwrap(); + let _ = static_folder + .folder("../escape") + .build(&mut factory, &runtime) + .await + .unwrap(); + + runtime.shutdown_background(); + } +} diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 2aea4596c..a790bd94a 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,40 +1,38 @@ [package] name = "shuttle-runtime" version = "0.1.0" -edition = "2021" +edition.workspace = true +license.workspace = true publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = "1.0.62" -async-trait = "0.1.58" +anyhow = { workspace = true } +async-trait = { workspace = true } cap-std = "0.26.0" clap ={ version = "4.0.18", features = ["derive"] } hyper = { version = "0.14.23", features = ["full"] } rmp-serde = { version = "1.1.1" } serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } -thiserror = "1.0.37" -tokio = { version = "=1.20.1", features = ["full"] } +thiserror = { workspace = true } +tokio = { version = "=1.22.0", features = ["full"] } tokio-stream = "0.1.11" tonic = "0.8.2" -tracing = "0.1.37" -tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } -uuid = { version = "1.1.2", features = ["v4"] } +tracing = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter"] } +uuid = { workspace = true, features = ["v4"] } wasi-common = "2.0.0" wasmtime = "2.0.0" wasmtime-wasi = "2.0.0" [dependencies.shuttle-common] -version = "0.7.0" -path = "../common" +workspace = true features = ["axum-wasm"] [dependencies.shuttle-proto] -version = "0.7.0" -path = "../proto" +workspace = true [dependencies.shuttle-service] -version = "0.7.0" -default-features = false +workspace = true +version = "0.8.0" features = ["loader"] -path = "../service" diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 0960136ce..18e0f8147 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -8,7 +8,7 @@ use std::{ use anyhow::anyhow; use async_trait::async_trait; -use shuttle_common::LogItem; +use shuttle_common::{storage_manager::StorageManager, LogItem}; use shuttle_proto::{ provisioner::provisioner_client::ProvisionerClient, runtime::{ @@ -76,25 +76,11 @@ impl Runtime for Legacy { let service_port = 7001; let service_address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), service_port); - let request = request.into_inner(); - let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) .await .expect("failed to connect to provisioner"); let abstract_factory = AbstractProvisionerFactory::new(provisioner_client); - let service_name = ServiceName::from_str(request.service_name.as_str()) - .map_err(|err| Status::from_error(Box::new(err)))?; - - let mut factory = abstract_factory.get_factory(service_name); - - let logs_tx = self.logs_tx.lock().unwrap().clone(); - - let deployment_id = - Uuid::from_str(std::str::from_utf8(&request.deployment_id).unwrap()).unwrap(); - - let logger = Logger::new(logs_tx, deployment_id); - let so_path = self .so_path .lock() @@ -106,6 +92,25 @@ impl Runtime for Legacy { .map_err(|err| Status::from_error(Box::new(err)))? .clone(); + let storage_manager = StorageManager::new(so_path.clone()); + + let StartRequest { + deployment_id, + service_name, + } = request.into_inner(); + + let service_name = ServiceName::from_str(service_name.as_str()) + .map_err(|err| Status::from_error(Box::new(err)))?; + + let deployment_id = Uuid::from_str(std::str::from_utf8(&deployment_id).unwrap()).unwrap(); + + let mut factory = + abstract_factory.get_factory(service_name, deployment_id, storage_manager); + + let logs_tx = self.logs_tx.lock().unwrap().clone(); + + let logger = Logger::new(logs_tx, deployment_id); + trace!(%service_address, "starting"); let service = load_service(service_address, so_path, &mut factory, logger) .await diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs index 6a99d6d4b..28bd9d7c9 100644 --- a/runtime/src/provisioner_factory.rs +++ b/runtime/src/provisioner_factory.rs @@ -1,20 +1,26 @@ -use std::collections::BTreeMap; +use std::{collections::BTreeMap, path::PathBuf}; use async_trait::async_trait; -use shuttle_common::{database, DatabaseReadyInfo}; +use shuttle_common::{database, storage_manager::StorageManager, DatabaseReadyInfo}; use shuttle_proto::provisioner::{ database_request::DbType, provisioner_client::ProvisionerClient, DatabaseRequest, }; use shuttle_service::{Factory, ServiceName}; use tonic::{transport::Channel, Request}; use tracing::{debug, info, trace}; +use uuid::Uuid; /// Trait to make it easy to get a factory (service locator) for each service being started pub trait AbstractFactory: Send + 'static { type Output: Factory; /// Get a factory for a specific service - fn get_factory(&self, service_name: ServiceName) -> Self::Output; + fn get_factory( + &self, + service_name: ServiceName, + deployment_id: Uuid, + storage_manager: StorageManager, + ) -> Self::Output; } /// An abstract factory that makes factories which uses provisioner @@ -26,8 +32,18 @@ pub struct AbstractProvisionerFactory { impl AbstractFactory for AbstractProvisionerFactory { type Output = ProvisionerFactory; - fn get_factory(&self, service_name: ServiceName) -> Self::Output { - ProvisionerFactory::new(self.provisioner_client.clone(), service_name) + fn get_factory( + &self, + service_name: ServiceName, + deployment_id: Uuid, + storage_manager: StorageManager, + ) -> Self::Output { + ProvisionerFactory::new( + self.provisioner_client.clone(), + service_name, + deployment_id, + storage_manager, + ) } } @@ -40,6 +56,8 @@ impl AbstractProvisionerFactory { /// A factory (service locator) which goes through the provisioner crate pub struct ProvisionerFactory { service_name: ServiceName, + deployment_id: Uuid, + storage_manager: StorageManager, provisioner_client: ProvisionerClient, info: Option, secrets: Option>, @@ -49,10 +67,14 @@ impl ProvisionerFactory { pub(crate) fn new( provisioner_client: ProvisionerClient, service_name: ServiceName, + deployment_id: Uuid, + storage_manager: StorageManager, ) -> Self { Self { provisioner_client, service_name, + deployment_id, + storage_manager, info: None, secrets: None, } @@ -108,4 +130,16 @@ impl Factory for ProvisionerFactory { fn get_service_name(&self) -> ServiceName { self.service_name.clone() } + + fn get_build_path(&self) -> Result { + self.storage_manager + .service_build_path(self.service_name.as_str()) + .map_err(Into::into) + } + + fn get_storage_path(&self) -> Result { + self.storage_manager + .deployment_storage_path(self.service_name.as_str(), &self.deployment_id) + .map_err(Into::into) + } } diff --git a/scripts/publish.sh b/scripts/publish.sh deleted file mode 100755 index a879a795d..000000000 --- a/scripts/publish.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash -# -# Little script to publish to crates.io -# Usage: publish.sh x.y.z -# -# Dependencies: git, ripgrep - -set -ueo pipefail - -function publish-folder() -{ - local folder=$1 - - echo "Publishing $folder" - cd $folder - cargo publish - cd .. - - sleep 5 -} - -function main() -{ - version=$1 - - echo $version | rg "\d+\.\d+\.\d+" || { echo "first argument must be in the form x.y.z"; exit 1; } - - publish-folder "common" - publish-folder "codegen" - publish-folder "service" - publish-folder "resources/secrets" - publish-folder "cargo-shuttle" - - publish-folder "resources/aws-rds" - publish-folder "resources/persist" - publish-folder "resources/shared-db" - - git tag "v$version" - git push upstream "v$version" - - echo "Success!! Now tell about it on Discord :D" -} - -main "${1-*}" diff --git a/scripts/release.sh b/scripts/release.sh deleted file mode 100755 index b7f21fd6e..000000000 --- a/scripts/release.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash -# -# Little script to release a new version. -# Usage: release.sh x.y.z -# -# Dependencies: git, cargo-edit, ripgrep - -set -ueo pipefail - -function update-cargo-versions() -{ - local version=$1 - - cargo set-version --workspace $version - git commit -am "chore: v$version" -} - -function update-examples-versions() -{ - local version=$1 - - for d in examples/*/*/; - do - cd "$d" - - if [[ -f Cargo.toml ]] - then - cargo add shuttle-service@$version - fi - - cd ../../../ - done - - # Update docs in service and README - rg "shuttle-service = \{ version" --files-with-matches service/ | xargs sed -i "s/shuttle-service = { version = \"[[:digit:]]*.[[:digit:]]*.[[:digit:]]*\"/shuttle-service = { version = \"$version\"/g" - sed -i "s/shuttle-service = { version = \"[[:digit:]]*.[[:digit:]]*.[[:digit:]]*\"/shuttle-service = { version = \"$version\"/g" README.md - - git commit -am "docs: v$version" -} - -function update-resources-versions() -{ - local version=$1 - - for d in resources/*/; - do - cd "$d" - - if [[ -f Cargo.toml ]] - then - cargo add shuttle-service@$version - fi - - cd ../../ - done - - git commit -am "chore: resources v$version" -} - -function main() -{ - version=$1 - - echo $version | rg "\d+\.\d+\.\d+" || { echo "first argument must be in the form x.y.z"; exit 1; } - - echo "Will try to update to version $version" - git checkout -b "chore/v$version" - - update-cargo-versions $version - update-resources-versions $version - update-examples-versions $version - - echo "Success!! You can now merge this branch" - echo "" - echo "Thereafter run:" - echo "./publish.sh $version" -} - -main "${1-*}" diff --git a/service/Cargo.toml b/service/Cargo.toml index 5b1695b93..08512f6e7 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "shuttle-service" -version = "0.7.0" -edition = "2021" -license = "Apache-2.0" +version = "0.8.0" +edition.workspace = true +license.workspace = true description = "Service traits and macros to deploy on the shuttle platform (https://www.shuttle.rs/)" homepage = "https://www.shuttle.rs" @@ -10,33 +10,36 @@ homepage = "https://www.shuttle.rs" doctest = false [dependencies] -anyhow = "1.0.62" -async-trait = "0.1.57" -axum = { version = "0.5.15", optional = true } -bincode = { version = "1.2.1", optional = true } -cargo = { version = "0.64.0", optional = true } -cargo_metadata = "0.15.0" -chrono = "=0.4.22" +actix-web = { version = "4.2.1", optional = true } +anyhow = { workspace = true } +async-trait = { workspace = true } +axum = { workspace = true, optional = true } +bincode = { version = "1.3.3", optional = true } +# TODO: debug the libgit2-sys conflict with cargo-edit when upgrading cargo to 0.66 +cargo = { version = "0.65.0", optional = true } +cargo_metadata = "0.15.2" +chrono = { workspace = true } crossbeam-channel = "0.5.6" -futures = { version = "0.3.23", features = ["std"] } -hyper = { version = "0.14.20", features = ["server", "tcp", "http1"], optional = true } -libloading = { version = "0.7.3", optional = true } +futures = { version = "0.3.25", features = ["std"] } +hyper = { version = "0.14.23", features = ["server", "tcp", "http1"], optional = true } +libloading = { version = "0.7.4", optional = true } +num_cpus = { version = "1.14.0", optional = true } pipe = "0.4.0" -poem = { version = "1.3.40", optional = true } +poem = { version = "1.3.49", optional = true } rocket = { version = "0.5.0-rc.2", optional = true } -salvo = { version = "0.34.3", optional = true } -serde_json = "1.0.83" +salvo = { version = "0.37.5", optional = true } +serde_json = { workspace = true } serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"], optional = true } sync_wrapper = { version = "0.1.1", optional = true } -thiserror = "1.0.32" -thruster = { version = "1.2.6", optional = true } +thiserror = { workspace = true } +thruster = { version = "1.3.0", optional = true } tide = { version = "0.16.0", optional = true } -tokio = { version = "=1.20.1", features = ["rt", "rt-multi-thread", "sync"] } +tokio = { version = "=1.22.0", features = ["rt", "rt-multi-thread", "sync"] } tower = { version = "0.4.13", features = ["make"], optional = true } -tracing = "0.1.36" -tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } -uuid = { version = "1.1.2", features = ["v4"] } -warp = { version = "0.3.2", optional = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter"] } +uuid = { workspace = true, features = ["v4"] } +warp = { version = "0.3.3", optional = true } # Tide does not have tokio support. So make sure async-std is compatible with tokio # https://github.com/http-rs/tide/issues/791 @@ -46,26 +49,23 @@ optional = true features = ["tokio1"] [dependencies.shuttle-codegen] -version = "0.7.0" -path = "../codegen" +workspace = true optional = true +[dependencies.shuttle-common] +workspace = true + [dev-dependencies] portpicker = "0.1.1" -sqlx = { version = "0.6.1", features = ["runtime-tokio-native-tls", "postgres"] } -tokio = { version = "1.20.1", features = ["macros"] } -uuid = { version = "1.1.2", features = ["v4"] } - -[dependencies.shuttle-common] -version = "0.7.0" -default-features = false -path = "../common" +sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } +tokio = { version = "1.22.0", features = ["macros"] } +uuid = { workspace = true, features = ["v4"] } [features] -default = ["codegen"] codegen = ["shuttle-codegen"] loader = ["cargo", "libloading"] +web-actix-web = ["actix-web", "num_cpus"] web-axum = ["axum", "sync_wrapper"] web-rocket = ["rocket"] web-thruster = ["thruster"] diff --git a/service/src/lib.rs b/service/src/lib.rs index ce39ce9f0..aafe1f887 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -27,7 +27,7 @@ //! be a library crate with a `shuttle-service` dependency with the `web-rocket` feature on the `shuttle-service` dependency. //! //! ```toml -//! shuttle-service = { version = "0.7.0", features = ["web-rocket"] } +//! shuttle-service = { version = "0.8.0", features = ["web-rocket"] } //! ``` //! //! A boilerplate code for your rocket project can also be found in `src/lib.rs`: @@ -52,7 +52,7 @@ //! ``` //! //! See the [shuttle_service::main][main] macro for more information on supported services - such as `axum`. -//! Or look at more complete examples [in the repository](https://github.com/shuttle-hq/shuttle/tree/main/examples), but +//! Or look at [more complete examples](https://github.com/shuttle-hq/examples), but //! take note that the examples may update before official releases. //! //! ## Running locally @@ -108,8 +108,8 @@ //! Add `shuttle-shared-db` as a dependency with the `postgres` feature, and add `sqlx` as a dependency with the `runtime-tokio-native-tls` and `postgres` features inside `Cargo.toml`: //! //! ```toml -//! shuttle-shared-db = { version = "0.7.0", features = ["postgres"] } -//! sqlx = { version = "0.6.1", features = ["runtime-tokio-native-tls", "postgres"] } +//! shuttle-shared-db = { version = "0.8.0", features = ["postgres"] } +//! sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } //! ``` //! //! Now update the `#[shuttle_service::main]` function to take in a `PgPool`: @@ -213,11 +213,13 @@ use std::collections::BTreeMap; use std::future::Future; use std::net::SocketAddr; +use std::path::PathBuf; use std::pin::Pin; pub use async_trait::async_trait; // Pub uses by `codegen` +pub use anyhow::Context; pub use tokio::runtime::Runtime; pub use tracing; pub use tracing_subscriber; @@ -255,13 +257,15 @@ extern crate shuttle_codegen; /// /// | Return type | Feature flag | Service | Version | Example | /// | ------------------------------------- | ------------ | ------------------------------------------- | ---------- | ----------------------------------------------------------------------------------- | -/// | `ShuttleRocket` | web-rocket | [rocket](https://docs.rs/rocket/0.5.0-rc.2) | 0.5.0-rc.2 | [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/rocket/hello-world) | -/// | `ShuttleAxum` | web-axum | [axum](https://docs.rs/axum/0.5) | 0.5 | [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/axum/hello-world) | -/// | `ShuttleSalvo` | web-salvo | [salvo](https://docs.rs/salvo/0.34.3) | 0.34.3 | [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/salvo/hello-world) | -/// | `ShuttleTide` | web-tide | [tide](https://docs.rs/tide/0.16.0) | 0.16.0 | [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/tide/hello-world) | -/// | `ShuttlePoem` | web-poem | [poem](https://docs.rs/poem/1.3.35) | 1.3.35 | [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/poem/hello-world) | -/// | `Result` | web-tower | [tower](https://docs.rs/tower/0.4.12) | 0.14.12 | [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/tower/hello-world) | -/// | `ShuttleSerenity` | bot-serenity | [serenity](https://docs.rs/serenity/0.11.5) | 0.11.5 | [GitHub](https://github.com/shuttle-hq/shuttle/tree/main/examples/serenity/hello-world) | +/// | `ShuttleRocket` | web-rocket | [rocket](https://docs.rs/rocket/0.5.0-rc.2) | 0.5.0-rc.2 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/rocket/hello-world) | +/// | `ShuttleAxum` | web-axum | [axum](https://docs.rs/axum/0.5) | 0.5 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/axum/hello-world) | +/// | `ShuttleSalvo` | web-salvo | [salvo](https://docs.rs/salvo/0.34.3) | 0.34.3 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/salvo/hello-world) | +/// | `ShuttleTide` | web-tide | [tide](https://docs.rs/tide/0.16.0) | 0.16.0 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/tide/hello-world) | +/// | `ShuttlePoem` | web-poem | [poem](https://docs.rs/poem/1.3.35) | 1.3.35 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/poem/hello-world) | +/// | `Result` | web-tower | [tower](https://docs.rs/tower/0.4.12) | 0.14.12 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/tower/hello-world) | +/// | `ShuttleSerenity` | bot-serenity | [serenity](https://docs.rs/serenity/0.11.5) | 0.11.5 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/serenity/hello-world) | +/// | `ShuttleActixWeb` | web-actix-web| [actix-web](https://docs.rs/actix-web/4.2.1)| 4.2.1 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/actix-web/hello-world) | + /// /// # Getting shuttle managed resources /// Shuttle is able to manage resource dependencies for you. These resources are passed in as inputs to your `#[shuttle_service::main]` function and are configured using attributes: @@ -309,6 +313,12 @@ pub trait Factory: Send + Sync { /// Get the name for the service being deployed fn get_service_name(&self) -> ServiceName; + + /// Get the path where the build files are stored for this service + fn get_build_path(&self) -> Result; + + /// Get the path where files can be stored for this deployment + fn get_storage_path(&self) -> Result; } /// Used to get resources of type `T` from factories. @@ -543,6 +553,28 @@ impl Service for sync_wrapper::SyncWrapper { } } +#[cfg(feature = "web-actix-web")] +#[async_trait] +impl Service for F +where + F: FnOnce(&mut actix_web::web::ServiceConfig) + Sync + Send + Clone + 'static, +{ + async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), Error> { + // Start a worker for each cpu, but no more than 4. + let worker_count = num_cpus::get().max(4); + + let srv = actix_web::HttpServer::new(move || actix_web::App::new().configure(self.clone())) + .workers(worker_count) + .bind(addr)? + .run(); + srv.await.map_err(error::CustomError::new)?; + + Ok(()) + } +} +#[cfg(feature = "web-actix-web")] +pub type ShuttleActixWeb = Result; + #[cfg(feature = "web-axum")] pub type ShuttleAxum = Result, Error>; @@ -550,7 +582,7 @@ pub type ShuttleAxum = Result, Error>; #[async_trait] impl Service for salvo::Router { async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { - salvo::Server::new(salvo::listener::TcpListener::bind(&addr)) + salvo::Server::new(salvo::listener::TcpListener::bind(addr)) .serve(self) .await; diff --git a/service/src/loader.rs b/service/src/loader.rs index 109b714c7..b57bffc70 100644 --- a/service/src/loader.rs +++ b/service/src/loader.rs @@ -7,7 +7,7 @@ use std::path::{Path, PathBuf}; use anyhow::{anyhow, Context}; use cargo::core::compiler::{CompileKind, CompileMode, CompileTarget, MessageFormat}; use cargo::core::{Manifest, PackageId, Shell, Summary, Verbosity, Workspace}; -use cargo::ops::{compile, CompileOptions}; +use cargo::ops::{clean, compile, CleanOptions, CompileOptions}; use cargo::util::interning::InternedString; use cargo::util::{homedir, ToSemver}; use cargo::Config; @@ -50,7 +50,7 @@ impl Loader { /// function called `ENTRYPOINT_SYMBOL_NAME`, likely automatically generated /// using the [`shuttle_service::main`][crate::main] macro. pub fn from_so_file>(so_path: P) -> Result { - trace!("loading {:?}", so_path.as_ref().to_str()); + trace!(so_path = so_path.as_ref().to_str(), "loading .so path"); unsafe { let lib = Library::new(so_path).map_err(LoaderError::Load)?; @@ -117,34 +117,8 @@ pub async fn build_crate( let (read, write) = pipe::pipe(); let project_path = project_path.to_owned(); - let handle = tokio::spawn(async move { - trace!("started thread to build crate"); - let config = get_config(write)?; - let manifest_path = project_path.join("Cargo.toml"); - let mut ws = Workspace::new(&manifest_path, &config)?; - - let current = ws.current_mut().map_err(|_| anyhow!("A Shuttle project cannot have a virtual manifest file - please ensure your Cargo.toml file specifies it as a library."))?; - let manifest = current.manifest_mut(); - ensure_cdylib(manifest)?; - - let summary = current.manifest_mut().summary_mut(); - make_name_unique(summary, deployment_id); - check_version(summary)?; - check_no_panic(&ws)?; - - let opts = get_compile_options(&config, release_mode, wasm)?; - let compilation = compile(&ws, &opts); - - let path = compilation?.cdylibs[0].path.clone(); - Ok(if wasm { - Runtime::Next(path) - } else { - Runtime::Legacy(path) - }) - }); - // This needs to be on a separate thread, else deployer will block (reason currently unknown :D) - tokio::spawn(async move { + tokio::task::spawn_blocking(move || { trace!("started thread to to capture build output stream"); for message in Message::parse_stream(read) { trace!(?message, "parsed cargo message"); @@ -161,7 +135,73 @@ pub async fn build_crate( } }); - handle.await? + let config = get_config(write)?; + let manifest_path = project_path.join("Cargo.toml"); + let mut ws = Workspace::new(&manifest_path, &config)?; + + let current = ws.current_mut().map_err(|_| anyhow!("A Shuttle project cannot have a virtual manifest file - please ensure your Cargo.toml file specifies it as a library."))?; + let manifest = current.manifest_mut(); + ensure_cdylib(manifest)?; + + let summary = current.manifest_mut().summary_mut(); + make_name_unique(summary, deployment_id); + check_version(summary)?; + check_no_panic(&ws)?; + + let opts = get_compile_options(&config, release_mode, wasm)?; + let compilation = compile(&ws, &opts); + + let path = compilation?.cdylibs[0].path.clone(); + Ok(if wasm { + Runtime::Next(path) + } else { + Runtime::Legacy(path) + }) +} + +pub fn clean_crate(project_path: &Path, release_mode: bool) -> anyhow::Result> { + let (read, write) = pipe::pipe(); + let project_path = project_path.to_owned(); + + tokio::task::spawn_blocking(move || { + let config = get_config(write).unwrap(); + let manifest_path = project_path.join("Cargo.toml"); + let ws = Workspace::new(&manifest_path, &config).unwrap(); + + let requested_profile = if release_mode { + InternedString::new("release") + } else { + InternedString::new("dev") + }; + + let opts = CleanOptions { + config: &config, + spec: Vec::new(), + targets: Vec::new(), + requested_profile, + profile_specified: true, + doc: false, + }; + + clean(&ws, &opts).unwrap(); + }); + + let mut lines = Vec::new(); + + for message in Message::parse_stream(read) { + trace!(?message, "parsed cargo message"); + match message { + Ok(Message::TextLine(line)) => { + lines.push(line); + } + Ok(_) => {} + Err(error) => { + error!("failed to parse cargo message: {error}"); + } + } + } + + Ok(lines) } /// Get the default compile config with output redirected to writer @@ -199,6 +239,12 @@ fn get_compile_options( InternedString::new("dev") }; + // This sets the max workers for cargo build to 4 for release mode (aka deployment), + // but leaves it as default (num cpus) for local runs + if release_mode { + opts.build_config.jobs = 4 + }; + opts.build_config.requested_kinds = vec![if wasm { CompileKind::Target(CompileTarget::new("wasm32-unknown-unknown")?) } else { diff --git a/service/tests/integration/loader.rs b/service/tests/integration/loader.rs index 352b5edf4..ba42c3807 100644 --- a/service/tests/integration/loader.rs +++ b/service/tests/integration/loader.rs @@ -60,6 +60,14 @@ impl Factory for DummyFactory { async fn get_secrets(&mut self) -> Result, Error> { panic!("did not expect any loader test to get secrets") } + + fn get_build_path(&self) -> Result { + panic!("did not expect any loader test to get the build path") + } + + fn get_storage_path(&self) -> Result { + panic!("did not expect any loader test to get the storage path") + } } #[test] diff --git a/service/tests/resources/bind-panic/Cargo.toml b/service/tests/resources/bind-panic/Cargo.toml index eb3331848..f48c8442b 100644 --- a/service/tests/resources/bind-panic/Cargo.toml +++ b/service/tests/resources/bind-panic/Cargo.toml @@ -9,4 +9,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../" } +shuttle-service = { path = "../../../", features = ["codegen"] } diff --git a/service/tests/resources/build-panic/Cargo.toml b/service/tests/resources/build-panic/Cargo.toml index 93a0b14e8..8f8cb8167 100644 --- a/service/tests/resources/build-panic/Cargo.toml +++ b/service/tests/resources/build-panic/Cargo.toml @@ -9,4 +9,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../" } +shuttle-service = { path = "../../../", features = ["codegen"] } diff --git a/service/tests/resources/is-cdylib/Cargo.toml b/service/tests/resources/is-cdylib/Cargo.toml index 99083de80..903e50335 100644 --- a/service/tests/resources/is-cdylib/Cargo.toml +++ b/service/tests/resources/is-cdylib/Cargo.toml @@ -10,4 +10,4 @@ crate-type = ["cdylib", "staticlib"] [dependencies] rocket = "0.5.0-rc.2" -shuttle-service = { path = "../../../", features = ["web-rocket"] } +shuttle-service = { path = "../../../", features = ["codegen", "web-rocket"] } diff --git a/service/tests/resources/not-cdylib/Cargo.toml b/service/tests/resources/not-cdylib/Cargo.toml index 47a2afa53..09fc3c69c 100644 --- a/service/tests/resources/not-cdylib/Cargo.toml +++ b/service/tests/resources/not-cdylib/Cargo.toml @@ -10,4 +10,4 @@ crate-type = ["staticlib"] [dependencies] rocket = "0.5.0-rc.2" -shuttle-service = { path = "../../../", features = ["web-rocket"] } +shuttle-service = { path = "../../../", features = ["codegen", "web-rocket"] } diff --git a/service/tests/resources/not-shuttle/Cargo.toml b/service/tests/resources/not-shuttle/Cargo.toml index 99bfa8a3c..b7fe25901 100644 --- a/service/tests/resources/not-shuttle/Cargo.toml +++ b/service/tests/resources/not-shuttle/Cargo.toml @@ -9,4 +9,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = "0.7.0" +shuttle-service = "0.8.0" diff --git a/service/tests/resources/sleep-async/Cargo.toml b/service/tests/resources/sleep-async/Cargo.toml index 84f976cce..9b4d8ca16 100644 --- a/service/tests/resources/sleep-async/Cargo.toml +++ b/service/tests/resources/sleep-async/Cargo.toml @@ -9,5 +9,5 @@ crate-type = ["cdylib"] [workspace] [dependencies] -tokio = { version = "1.0", features = ["time"]} -shuttle-service = { path = "../../../" } +tokio = { version = "1.22.0", features = ["time"] } +shuttle-service = { path = "../../../", features = ["codegen"] } diff --git a/service/tests/resources/sleep/Cargo.toml b/service/tests/resources/sleep/Cargo.toml index 40b0f6d1f..4bc2899dd 100644 --- a/service/tests/resources/sleep/Cargo.toml +++ b/service/tests/resources/sleep/Cargo.toml @@ -9,4 +9,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../" } +shuttle-service = { path = "../../../", features = ["codegen"] } diff --git a/service/tests/resources/sqlx-pool/Cargo.toml b/service/tests/resources/sqlx-pool/Cargo.toml index e3672cfe1..0f6163f37 100644 --- a/service/tests/resources/sqlx-pool/Cargo.toml +++ b/service/tests/resources/sqlx-pool/Cargo.toml @@ -9,6 +9,6 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../" } +shuttle-service = { path = "../../../", features = ["codegen"] } shuttle-shared-db = { path = "../../../../resources/shared-db", features = ["postgres"] } -sqlx = { version = "0.6", features = [ "runtime-tokio-native-tls" ] } +sqlx = { version = "0.6.2", features = [ "runtime-tokio-native-tls" ] } diff --git a/shell.nix b/shell.nix index 3dd8886d1..6cce93e2c 100644 --- a/shell.nix +++ b/shell.nix @@ -1,7 +1,7 @@ let moz_overlay = import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz); # Pin to stable from https://status.nixos.org/ - nixpkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/3d47bbaa26e7a771059d828eecf3bd8bf28a8b0f.tar.gz") { overlays = [ moz_overlay ]; }; + nixpkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/596a8e828c5dfa504f91918d0fa4152db3ab5502.tar.gz") { overlays = [ moz_overlay ]; }; in with nixpkgs; stdenv.mkDerivation { @@ -11,10 +11,10 @@ in pkg-config ]; buildInputs = with nixpkgs; [ - ((rustChannelOf{ channel = "1.63.0"; }).rust.override { + ((rustChannelOf{ channel = "1.65.0"; }).rust.override { targets = ["wasm32-wasi"]; + extensions = ["rust-src"]; }) - rust-analyzer cargo-watch terraform awscli2 @@ -27,6 +27,8 @@ in datadog-agent sccache sqlite + fastmod + pebble ]; PROTOC = "${protobuf}/bin/protoc"; diff --git a/terraform/.gitignore b/terraform/.gitignore deleted file mode 100644 index 3f5ca68ad..000000000 --- a/terraform/.gitignore +++ /dev/null @@ -1 +0,0 @@ -terraform.tfvars diff --git a/terraform/backend.tf b/terraform/backend.tf deleted file mode 100644 index ba4a24881..000000000 --- a/terraform/backend.tf +++ /dev/null @@ -1,40 +0,0 @@ -terraform { - backend "s3" { - bucket = "unveil-terraform-state" - key = "unveil.tfstate" - region = "eu-west-2" - } - - required_providers { - aws = { - source = "hashicorp/aws" - version = "~> 4.0" - } - cloudinit = { - source = "hashicorp/cloudinit" - version = "~> 2.0" - } - random = { - source = "hashicorp/random" - version = "~> 3.0" - } - } - - required_version = ">= 0.14.9" -} - -provider "aws" { - region = "eu-west-2" -} - -module "shuttle" { - source = "./modules/shuttle" - - api_fqdn = "api.shuttle.rs" - db_fqdn = "db.shuttle.rs" - proxy_fqdn = "shuttleapp.rs" - postgres_password = var.postgres_password - mongodb_password = var.mongodb_password - shuttle_admin_secret = var.shuttle_admin_secret - instance_type = "c6g.4xlarge" -} diff --git a/terraform/containers.tf b/terraform/containers.tf deleted file mode 100644 index de61d8ad9..000000000 --- a/terraform/containers.tf +++ /dev/null @@ -1,15 +0,0 @@ -provider "aws" { - alias = "us_east_1" - region = "us-east-1" -} - -resource "aws_ecrpublic_repository" "backend" { - provider = aws.us_east_1 - - repository_name = "backend" - - catalog_data { - architectures = ["x86-64"] - operating_systems = ["Linux"] - } -} diff --git a/terraform/modules/shuttle/README.md b/terraform/modules/shuttle/README.md deleted file mode 100644 index aff97c744..000000000 --- a/terraform/modules/shuttle/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# AWS shuttle module -This module contains all the resources needed to deploy shuttle on AWS. The basic architecture is to create: -1. A single EC2 instance to run shuttle and PostgresDB -1. Two Route53 zones - one for the shuttle api; another to reach user services hosted by shuttle (called the proxy) -1. Three Load Balancers - one for the api, proxy, and PostgresDB respectively - -## Usage guide -The following terraform can be used as a starting point for using this module: - -```tf -module "shuttle" { - source = "github.com/shuttle-hq/shuttle/terraform/modules/shuttle" - - api_fqdn = "api.test.shuttle.rs" - db_fqdn = "db.test.shuttle.rs" - proxy_fqdn = "test.shuttleapp.rs" - postgres_password = "password" - shuttle_admin_secret = "12345" -} - -output "api_name_servers" { - value = module.shuttle.api_name_servers -} - -output "db_name_servers" { - value = module.shuttle.db_name_servers -} - -output "user_name_servers" { - value = module.shuttle.user_name_servers -} - -output "initial_user_key" { - value = module.shuttle.initial_user_key - description = "Key given to the initial shuttle user" -} -``` - -The shuttle api will be reachable at `api_fqdn` while hosted services will be subdomains of `proxy_fqdn`. The `postgres_password` sets the root password for Postgres and `shuttle_admin_secret` will be the secret needed to add more user keys to shuttle by an admin user. Shuttle does create the first user key though. This key is stored in the `initial_user_key` output variable. - -Just running `terraform apply` for the first time will fail since SSl certificates will be created for the api and proxy domains which will be verified. This verification will fail since it uses DNS that will be missing on first setup. So for first setups rather run the following: - -``` sh -terraform apply --target module.shuttle.aws_route53_zone.user --target module.shuttle.aws_route53_zone.api --target module.shuttle.aws_route53_zone.db -``` - -This command will create just the DNS zones needed for the api and proxy. Now use the `api_name_servers`, `db_name_servers` and `user_name_servers` outputs from this module to manually add NS records for `api_fqdn`, `db_fqdn` and `proxy_fqdn` in your DNS provider respectively. - -Once these records have propagated, a `terraform apply` command will succeed. - -## Allowing outside connections to the shared PostgresDB instance -Currently, the shared DB is started within a Docker container with a default configuration. This configuration does not allow external connections. Therefore you will need to manually whitelist external IP addresses which should be allowed to connect to the instance. - -First login to the VM instance, then edit the file at `/opt/shuttle/conf/postgres/pg_hba.conf` by adding a line similar to the following. - -``` -host all all 0.0.0.0/0 md5 -``` - -The `0.0.0.0/0` address can be replaced with a more target IP subset. - -Finally, restart the shuttle service using - -``` sh -sudo systemctl status shuttle-backend.service -``` - diff --git a/terraform/modules/shuttle/api.tf b/terraform/modules/shuttle/api.tf deleted file mode 100644 index 17713a4fe..000000000 --- a/terraform/modules/shuttle/api.tf +++ /dev/null @@ -1,68 +0,0 @@ -resource "aws_apigatewayv2_api" "backend" { - name = "shuttle-api-gateway" - protocol_type = "HTTP" - disable_execute_api_endpoint = true -} - -resource "aws_apigatewayv2_domain_name" "backend" { - domain_name = aws_acm_certificate.api.domain_name - - domain_name_configuration { - certificate_arn = aws_acm_certificate.api.arn - endpoint_type = "REGIONAL" - security_policy = "TLS_1_2" - } -} - -resource "aws_apigatewayv2_api_mapping" "backend" { - api_id = aws_apigatewayv2_api.backend.id - domain_name = aws_apigatewayv2_domain_name.backend.id - stage = aws_apigatewayv2_stage.alpha.id -} - -resource "aws_apigatewayv2_vpc_link" "private" { - name = "shuttle-api-gateway-vpc-link" - - security_group_ids = [aws_default_security_group.default.id] - subnet_ids = [aws_subnet.backend_a.id, aws_subnet.backend_b.id] -} - -resource "aws_apigatewayv2_integration" "backend" { - api_id = aws_apigatewayv2_api.backend.id - - integration_type = "HTTP_PROXY" - integration_uri = aws_lb_listener.api.arn - integration_method = "ANY" - - request_parameters = { - "overwrite:path" = "$request.path" - } - - connection_type = "VPC_LINK" - connection_id = aws_apigatewayv2_vpc_link.private.id -} - -resource "aws_apigatewayv2_stage" "alpha" { - api_id = aws_apigatewayv2_api.backend.id - - name = "valpha" - - auto_deploy = true - - access_log_settings { - destination_arn = aws_cloudwatch_log_group.api_gateway.arn - format = < { - name = dvo.resource_record_name - record = dvo.resource_record_value - type = dvo.resource_record_type - zone_id = aws_route53_zone.user.zone_id - } - } - - allow_overwrite = true - name = each.value.name - records = [each.value.record] - ttl = 60 - type = each.value.type - zone_id = each.value.zone_id -} - -resource "aws_route53_record" "user_alias" { - zone_id = aws_route53_zone.user.zone_id - name = "*.${var.proxy_fqdn}" - type = "A" - - alias { - name = aws_lb.user.dns_name - zone_id = aws_lb.user.zone_id - evaluate_target_health = true - } -} - -resource "aws_acm_certificate_validation" "user" { - certificate_arn = aws_acm_certificate.user.arn - validation_record_fqdns = [for record in aws_route53_record.user : record.fqdn] -} - -resource "aws_route53_zone" "api" { - name = var.api_fqdn -} - -resource "aws_acm_certificate" "api" { - domain_name = var.api_fqdn - - validation_method = "DNS" - - lifecycle { - create_before_destroy = true - } -} - -resource "aws_route53_record" "api" { - for_each = { - for dvo in aws_acm_certificate.api.domain_validation_options : dvo.domain_name => { - name = dvo.resource_record_name - record = dvo.resource_record_value - type = dvo.resource_record_type - zone_id = aws_route53_zone.api.zone_id - } - } - - allow_overwrite = true - name = each.value.name - records = [each.value.record] - ttl = 60 - type = each.value.type - zone_id = each.value.zone_id -} - -resource "aws_route53_record" "api_alias" { - zone_id = aws_route53_zone.api.zone_id - name = aws_apigatewayv2_domain_name.backend.domain_name - type = "A" - - alias { - name = aws_apigatewayv2_domain_name.backend.domain_name_configuration[0].target_domain_name - zone_id = aws_apigatewayv2_domain_name.backend.domain_name_configuration[0].hosted_zone_id - evaluate_target_health = true - } -} - -resource "aws_acm_certificate_validation" "api" { - certificate_arn = aws_acm_certificate.api.arn - validation_record_fqdns = [for record in aws_route53_record.api : record.fqdn] -} - -resource "aws_route53_zone" "db" { - name = var.db_fqdn -} - -resource "aws_acm_certificate" "db" { - domain_name = var.db_fqdn - - validation_method = "DNS" - - lifecycle { - create_before_destroy = true - } -} - -resource "aws_route53_record" "db" { - for_each = { - for dvo in aws_acm_certificate.db.domain_validation_options : dvo.domain_name => { - name = dvo.resource_record_name - record = dvo.resource_record_value - type = dvo.resource_record_type - zone_id = aws_route53_zone.db.zone_id - } - } - - allow_overwrite = true - name = each.value.name - records = [each.value.record] - ttl = 60 - type = each.value.type - zone_id = each.value.zone_id -} - -resource "aws_route53_record" "db_alias" { - zone_id = aws_route53_zone.db.zone_id - name = "" - type = "A" - - alias { - name = aws_lb.db.dns_name - zone_id = aws_lb.db.zone_id - evaluate_target_health = true - } -} - -resource "aws_acm_certificate_validation" "db" { - certificate_arn = aws_acm_certificate.db.arn - validation_record_fqdns = [for record in aws_route53_record.db : record.fqdn] -} diff --git a/terraform/modules/shuttle/load-balancing.tf b/terraform/modules/shuttle/load-balancing.tf deleted file mode 100644 index 87809ab94..000000000 --- a/terraform/modules/shuttle/load-balancing.tf +++ /dev/null @@ -1,197 +0,0 @@ -resource "aws_lb" "api" { - name = "shuttle" - - internal = true - - load_balancer_type = "application" - - security_groups = [aws_default_security_group.default.id] - subnets = [aws_subnet.backend_a.id, aws_subnet.backend_b.id] - - access_logs { - bucket = aws_s3_bucket.logs.bucket - prefix = "shuttle-lb" - enabled = true - } -} - -resource "aws_lb" "db" { - name = "db" - - internal = false - - load_balancer_type = "network" - - //security_groups = [aws_default_security_group.default.id] - subnets = [aws_subnet.backend_a.id, aws_subnet.backend_b.id] - - access_logs { - bucket = aws_s3_bucket.logs.bucket - prefix = "db-lb" - enabled = true - } -} - -resource "aws_lb_target_group" "api" { - name = "shuttle-lb-tg-http" - - health_check { - enabled = true - path = "/status" - port = var.api_container_port - } - - port = var.api_container_port - - protocol = "HTTP" - - vpc_id = aws_vpc.backend.id - - target_type = "instance" -} - -resource "aws_lb_listener" "api" { - load_balancer_arn = aws_lb.api.arn - - port = "80" - - protocol = "HTTP" - - default_action { - type = "forward" - target_group_arn = aws_lb_target_group.api.arn - } -} - -resource "aws_lb_listener" "postgres" { - load_balancer_arn = aws_lb.db.arn - - port = "5432" - - protocol = "TCP" - - default_action { - type = "forward" - target_group_arn = aws_lb_target_group.postgres.arn - } -} - -resource "aws_lb_listener" "mongodb" { - load_balancer_arn = aws_lb.db.arn - - port = "27017" - - protocol = "TCP" - - default_action { - type = "forward" - target_group_arn = aws_lb_target_group.mongodb.arn - } -} - -resource "aws_lb" "user" { - name = "shuttleapp" - - internal = false - - load_balancer_type = "application" - - security_groups = [aws_default_security_group.default.id] - subnets = [aws_subnet.backend_a.id, aws_subnet.backend_b.id] - - access_logs { - bucket = aws_s3_bucket.logs.bucket - prefix = "shuttle-user-lb" - enabled = true - } -} - -resource "aws_lb_listener" "user" { - load_balancer_arn = aws_lb.user.arn - - port = "80" - - protocol = "HTTP" - - default_action { - type = "redirect" - - redirect { - status_code = "HTTP_301" - port = "443" - protocol = "HTTPS" - } - } -} - -resource "aws_lb_listener" "user_tls" { - load_balancer_arn = aws_lb.user.arn - - port = "443" - - protocol = "HTTPS" - - ssl_policy = "ELBSecurityPolicy-2016-08" - certificate_arn = aws_acm_certificate.user.arn - - default_action { - type = "forward" - target_group_arn = aws_lb_target_group.user.arn - } -} - -resource "aws_lb_target_group" "user" { - name = "shuttle-user-lb-tg-http" - - health_check { - enabled = true - path = "/status" - port = var.api_container_port - } - - port = var.proxy_container_port - - protocol = "HTTP" - - vpc_id = aws_vpc.backend.id - - target_type = "instance" -} - -resource "aws_lb_target_group" "postgres" { - name = "shuttle-postgres-lb-tg-tcp" - - // TODO: change me - health_check { - enabled = true - path = "/status" - port = var.api_container_port - } - - port = var.postgres_container_port - - protocol = "TCP" - - vpc_id = aws_vpc.backend.id - - target_type = "instance" -} - -resource "aws_lb_target_group" "mongodb" { - name = "shuttle-mongodb-lb-tg-tcp" - - // TODO: change me - health_check { - enabled = true - path = "/status" - port = var.api_container_port - } - - port = var.mongodb_container_port - - protocol = "TCP" - - vpc_id = aws_vpc.backend.id - - target_type = "instance" -} diff --git a/terraform/modules/shuttle/locals.tf b/terraform/modules/shuttle/locals.tf deleted file mode 100644 index 2240a88e5..000000000 --- a/terraform/modules/shuttle/locals.tf +++ /dev/null @@ -1,8 +0,0 @@ -data "aws_caller_identity" "current" {} - -locals { - account_id = data.aws_caller_identity.current.account_id - data_dir = "/opt/shuttle" - docker_backend_image = "public.ecr.aws/shuttle/api" - docker_provisioner_image = "public.ecr.aws/shuttle/provisioner" -} diff --git a/terraform/modules/shuttle/main.tf b/terraform/modules/shuttle/main.tf deleted file mode 100644 index f80aab2be..000000000 --- a/terraform/modules/shuttle/main.tf +++ /dev/null @@ -1,16 +0,0 @@ -terraform { - required_providers { - aws = { - source = "hashicorp/aws" - version = ">= 4.0" - } - cloudinit = { - source = "hashicorp/cloudinit" - version = ">= 2.0" - } - random = { - source = "hashicorp/random" - version = ">= 3.0" - } - } -} diff --git a/terraform/modules/shuttle/misc/cloud-config.yaml b/terraform/modules/shuttle/misc/cloud-config.yaml deleted file mode 100644 index c0d8b5d29..000000000 --- a/terraform/modules/shuttle/misc/cloud-config.yaml +++ /dev/null @@ -1,85 +0,0 @@ -#cloud-config - -# Install needed packages -packages: - - docker.io - - nfs-common - -# Create the docker group -groups: - - docker - -# Add default auto-created user to docker group -system_info: - default_user: - groups: [docker] - -# Make sure files are written every time -cloud_final_modules: - - package-update-upgrade-install - - [runcmd, always] - - [write-files, always] - - fan - - landscape - - lxd - - ubuntu-drivers - - write-files-deferred - - puppet - - chef - - mcollective - - salt-minion - - reset_rmc - - refresh_rmc_and_interface - - rightscale_userdata - - scripts-vendor - - scripts-per-once - - scripts-per-boot - - scripts-per-instance - - [scripts-user, always] - - ssh-authkey-fingerprints - - keys-to-console - - install-hotplug - - phone-home - - final-message - - power-state-change - -# Create our systemd files -write_files: - - encoding: b64 - content: ${opt_shuttle_content} - path: /lib/systemd/system/opt-shuttle.mount - owner: root:root - permissions: "0644" - - encoding: b64 - content: ${shuttle_backend_content} - path: /lib/systemd/system/shuttle-backend.service - owner: root:root - permissions: "0644" - - encoding: b64 - content: ${shuttle_provisioner_content} - path: /lib/systemd/system/shuttle-provisioner.service - owner: root:root - permissions: "0644" - - encoding: b64 - content: ${shuttle_pg_content} - path: /lib/systemd/system/shuttle-pg.service - owner: root:root - permissions: "0644" - - encoding: b64 - content: ${shuttle_mongodb_content} - path: /lib/systemd/system/shuttle-mongodb.service - owner: root:root - permissions: "0644" - -power_state: - mode: reboot - -# Up services on every boot -runcmd: - - docker network inspect shuttle-net || docker network create --driver bridge shuttle-net - - [systemctl, daemon-reload] - - [systemctl, enable, "opt-shuttle.mount"] - - [systemctl, enable, "shuttle-pg.service"] - - [systemctl, enable, "shuttle-mongodb.service"] - - [systemctl, enable, "shuttle-provisioner.service"] - - [systemctl, enable, "shuttle-backend.service"] diff --git a/terraform/modules/shuttle/networking.tf b/terraform/modules/shuttle/networking.tf deleted file mode 100644 index b03b1bc4a..000000000 --- a/terraform/modules/shuttle/networking.tf +++ /dev/null @@ -1,72 +0,0 @@ -resource "aws_vpc" "backend" { - cidr_block = "10.0.0.0/16" - - enable_dns_hostnames = true -} - -resource "aws_internet_gateway" "public" { - vpc_id = aws_vpc.backend.id -} - -resource "aws_network_acl_rule" "postgres" { - network_acl_id = aws_vpc.backend.default_network_acl_id - rule_number = 10 - egress = false - protocol = "tcp" - rule_action = "allow" - cidr_block = "0.0.0.0/0" - from_port = 5432 - to_port = 5432 -} - -resource "aws_network_acl_rule" "mysql" { - network_acl_id = aws_vpc.backend.default_network_acl_id - rule_number = 11 - egress = false - protocol = "tcp" - rule_action = "allow" - cidr_block = "0.0.0.0/0" - from_port = 3306 - to_port = 3306 -} - -resource "aws_default_security_group" "default" { - vpc_id = aws_vpc.backend.id - - ingress { - from_port = 0 - to_port = 0 - protocol = "-1" - cidr_blocks = ["0.0.0.0/0"] - } - - egress { - from_port = 0 - to_port = 0 - protocol = "-1" - cidr_blocks = ["0.0.0.0/0"] - } -} - -resource "aws_default_route_table" "backend" { - default_route_table_id = aws_vpc.backend.default_route_table_id - - route { - cidr_block = "0.0.0.0/0" - gateway_id = aws_internet_gateway.public.id - } -} - -resource "aws_subnet" "backend_a" { - vpc_id = aws_vpc.backend.id - - availability_zone = "eu-west-2a" - cidr_block = "10.0.10.0/24" -} - -resource "aws_subnet" "backend_b" { - vpc_id = aws_vpc.backend.id - - availability_zone = "eu-west-2b" - cidr_block = "10.0.20.0/24" -} diff --git a/terraform/modules/shuttle/output.tf b/terraform/modules/shuttle/output.tf deleted file mode 100644 index 5fd6db4eb..000000000 --- a/terraform/modules/shuttle/output.tf +++ /dev/null @@ -1,29 +0,0 @@ -output "api_url" { - value = aws_apigatewayv2_domain_name.backend.id - description = "URL to connect to the api" -} - -output "api_name_servers" { - value = aws_route53_zone.api.name_servers - description = "Name servers (NS) for api zone" -} - -output "db_name_servers" { - value = aws_route53_zone.db.name_servers - description = "Name servers (NS) for pg zone" -} - -output "user_name_servers" { - value = aws_route53_zone.user.name_servers - description = "Name servers (NS) for proxy zone" -} - -output "api_content_host" { - value = aws_lb.api.dns_name - description = "URL for api load balancer" -} - -output "user_content_host" { - value = aws_lb.user.dns_name - description = "URL for user proxy load balancer" -} diff --git a/terraform/modules/shuttle/rds.tf b/terraform/modules/shuttle/rds.tf deleted file mode 100644 index 7c5ffd1e3..000000000 --- a/terraform/modules/shuttle/rds.tf +++ /dev/null @@ -1,5 +0,0 @@ -resource "aws_db_subnet_group" "managed" { - name = "shuttle_rds" - description = "Subnet for RDS instances managed by shuttle" - subnet_ids = [aws_subnet.backend_a.id, aws_subnet.backend_b.id] -} diff --git a/terraform/modules/shuttle/service.tf b/terraform/modules/shuttle/service.tf deleted file mode 100644 index a8d88db67..000000000 --- a/terraform/modules/shuttle/service.tf +++ /dev/null @@ -1,170 +0,0 @@ -resource "aws_network_interface" "backend" { - subnet_id = aws_subnet.backend_b.id -} - -resource "aws_eip" "backend" { - vpc = true - network_interface = aws_network_interface.backend.id -} - -resource "aws_iam_instance_profile" "backend" { - name = "backend-profile" - role = aws_iam_role.backend.name -} - -resource "aws_iam_role" "backend" { - name = "BackendAPIRole" - path = "/" - description = "Allows EC2 instances to call AWS services on your behalf." - - assume_role_policy = < &'static str { - "Hello, world!" -} - -#[shuttle_service::main] -async fn init() -> Result, shuttle_service::Error> { - let rocket = rocket::build().mount("/", routes![hello]); - - Ok(rocket) -} -``` - -My IDE violently lights up with red syntax highlighting as I realise I haven't imported anything. The realities of software engineering hit me as I eye the bottle of whiskey next to me. 18 year old scotch. It turns out I'm grossly overpaid for the value I offer society. I grab a coffee mug and pour myself a small shot - liquid courage. - -Next I import all of the dependencies to get shuttle to work with Rocket - pretty simple. I open up `Cargo.toml` add a couple of lines: - -```toml -[package] -name = "url-shortener" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -rocket = { version = "0.5.0-rc.1", features = ["json"] } -shuttle-service = { version = "0.2", features = ["sqlx-postgres", "web-rocket"] } -``` - -My IDE quietens down as dependencies are resolved and a wave of relief washes over me. Let's deploy this thing. - -```bash -$ cargo shuttle deploy - Packaging url-shortener v0.1.0 (/private/shuttle/examples/url-shortener) - Archiving Cargo.toml - Archiving Cargo.toml.orig - Archiving src/lib.rs - Compiling tracing-attributes v0.1.20 - Compiling tokio-util v0.6.9 - Compiling multer v2.0.2 - Compiling hyper v0.14.18 - Compiling rocket_http v0.5.0-rc.1 - Compiling rocket_codegen v0.5.0-rc.1 - Compiling rocket v0.5.0-rc.1 - Compiling shuttle-service v0.2.5 - Compiling url-shortener v0.1.0 (/opt/shuttle/crates/url-shortener) - Finished dev [unoptimized + debuginfo] target(s) in 1m 01s - - Project: url-shortener - Deployment Id: 3d08ac34-ad63-41c1-836b-99afdc90af9f - Deployment Status: DEPLOYED - Host: url-shortener.shuttleapp.rs - Created At: 2022-04-13 03:07:34.412602556 UTC -``` - -Ok... this seemed a little too easy, let's see if it works. - -``` -$ curl -X https://url-shortener.shuttleapp.rs/hello -Hello, world! -``` - -Hm, not bad. I pour myself another shot... - -## Adding Postgres - 07:03 minutes remaining - -This is the part of my journey where I usually get a little flustered. I've set up databases before but it's always a pain. You need to provision a VM, make sure storage isn't ephemeral, install and spin up the database, create an account with the correct privileges and secure password, store the password in some sort of secrets manager in CI, add your IP address and your VM's IP address to the list of acceptable hosts etc etc etc. Oof that sounds like a lot of work. - -`shuttle` does a lot of this stuff for you - I just didn't remember how. I quickly head over to the [shuttle / sqlx](https://docs.rs/shuttle-service/0.2.5/shuttle_service/#using-sqlx) section in the docs. I added the `sqlx` dependency to `Cargo.toml` and change _one line_ in `lib.rs`: - -```rust -#[shuttle_service::main] -async fn rocket(pool: PgPool) -> Result, shuttle_service::Error> { -``` - -By adding a parameter to the main `rocket` function, `shuttle` will automatically provision a Postgres database for you, create an account and hand you back an authenticated connection pool which is usable from your application code. - -Let's deploy it and see what happens: - -```bash -$ cargo shuttle deploy -... - Finished dev [unoptimized + debuginfo] target(s) in 19.50s - - Project: url-shortener - Deployment Id: 538e41cf-44a9-4158-94f1-3760b42619a3 - Deployment Status: DEPLOYED - Host: url-shortener.shuttleapp.rs - Created At: 2022-04-13 03:08:30.412602556 UTC - Database URI: postgres://***:***@pg.shuttle.rs/db-url-shortener -``` - -I have a database! I couldn't help but chuckle a little bit. So far so good. - -## Setting up the Schema - 06:30 minutes remaining - -The database provisioned by `shuttle` is completely empty - I'm going to need to either connect to Postgres and create the schema myself, or write some sort of code to automatically perform the migration. As I start to ponder this seemingly existential question I decide not to overthink it. I'm just going to go with whatever is easiest. - -I connect to the database provisioned by shuttle using [pgAdmin](https://www.pgadmin.org/) using the provided database URI and run the following script: - -```sql -CREATE TABLE urls ( - id VARCHAR(6) PRIMARY KEY, - url VARCHAR NOT NULL -); -``` - -As I was ready to Google 'how to create index postgres' I realised that since the `id` used for the url lookup is a primary key, which is implicitly a 'unique' constraint, Postgres would create the index for me. Cool. - -## Writing the Endpoints - 05:17 remaining - -The app's going to need two endpoints - one to `shorten` URLs and one to retrieve URLs and `redirect` the user. - -I quickly created two stubs for the endpoints while I thought about the actual implementation: - -```rust -#[get("/")] -async fn redirect(id: String, pool: &State) -> Result { - unimplemented!() -} - -#[post("/", data = "")] -async fn shorten(url: String, pool: &State) -> Result { - unimplemented!() -} -``` - -I decided to start with the shorten method. The simplest implementation I could think of is to generate a unique id on the fly using the [`nanoid`](https://crates.io/crates/nanoid) crate and then running an `INSERT` statement. Hm - what about duplicates? I decided not to overthink it -🤷. - -```rust -#[post("/", data = "")] -async fn shorten(url: String, pool: &State) -> Result { - let id = &nanoid::nanoid!(6); - let p_url = Url::parse(&url).map_err(|_| Status::UnprocessableEntity)?; - sqlx::query("INSERT INTO urls(id, url) VALUES ($1, $2)") - .bind(id) - .bind(p_url.as_str()) - .execute(&**pool) - .await - .map_err(|_| Status::InternalServerError)?; - Ok(format!("https://url-shortener.shuttleapp.rs/{id}")) -} -``` - -Next I implemented the `redirect` method in a similar spirit. At this point I started to panic as it was really getting close to the 10 minute mark. I'll do a `SELECT *` and pull the first url that matches with the query id. If the id does not exist, you get back a `404`: - -```rust -#[get("/")] -async fn redirect(id: String, pool: &State) -> Result { - let url: (String,) = sqlx::query_as("SELECT url FROM urls WHERE id = $1") - .bind(id) - .fetch_one(&**pool) - .await - .map_err(|e| match e { - Error::RowNotFound => Status::NotFound, - _ => Status::InternalServerError - })?; - Ok(Redirect::to(url.0)) -} -``` - -Whoops there's a typo in the SQL query. - -After I fixed my typo and sorted out the various unresolved dependencies by letting my IDE do the heavy lifting for me, I deployed to shuttle for the last time. - -## Moment of truth - 00:25 minutes remaining - -Feeling like an off-brand Tom Cruise in mission impossible I stared intently at the clock counting down as shuttle deployed my url-shortener. 19.3 seconds and we're live. As soon as the `DEPLOYED` dialog came up, I instantly tested it out: - -```bash -$ curl -X POST -d "https://google.com" https://url-shortener.shuttleapp.rs -https://s.shuttleapp.rs/XDlrTB⏎ -``` - -I then copy/pasted the shortened URL to my browser and, lo an behold, was redirected to Google. - -I did it. - -## Retrospective - 00:00 minutes remaining - -With a sigh of relief I pushed myself back from my desk. I refilled my mug, picked it up and headed to my derelict balcony. As I slid open the the windows and the cold air flowed into my apartment, I took two steps forward to rest my elbows and mug on the railing. - -I sat there for a while reflecting on what had just happened. I _had_ succeeded. I'd successfully built a somewhat trivial app quickly without needing to worry about provisioning databases or networking or any of that jazz. - -But how would this measure up in the real world? Real software engineering is complex, involving collaboration across different teams with different skill-sets. The entire world of software is barely keeping it together. Is it really feasible to replace our existing, tried and tested cloud paradigms with a new paradigm of not having to deal with infrastructure at all? What I knew for sure is I wasn't going to get to the bottom of this one tonight. - -As I went back to my bedroom and laid once more in bed, I noticed I was grinning. There's a chance we really can do better. Maybe we're not exactly there yet, but my experience tonight had given me a certain optimism that we aren't as far as I once thought. With the promise of a brighter tomorrow, I turned on my side and fell asleep. diff --git a/www/_blog/2022-04-22-dev-log-0.mdx b/www/_blog/2022-04-22-dev-log-0.mdx deleted file mode 100644 index ee72e944c..000000000 --- a/www/_blog/2022-04-22-dev-log-0.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "DevLog[0]: Building a serverless platform for Rust in 4 weeks" -description: DevLog[0] is the first in a series of posts about how we built the shuttle MVP -author: christoshadjiaslanis -tags: [rust, startup, devlog] -thumb: shuttle-logo-square-rocket.png -cover: shuttle-logo-rectangle.png -coverAspectRatio: 2624/832 -date: "2022-04-22T15:00:00" ---- - -Put yourself in this situation. Your startup company has come across a pretty obvious gap in the market. It's ambitious, maybe even a little crazy. You're going to toe-to-toe with AWS, Heroku, Google etc. You have 4 weeks to prove the concept. Go. - -In January we spent countless hours interviewing software engineers. A striking pattern emerged - no one liked dealing with the cloud. It is of course, much better than having physical servers in your basement or driving 45 minutes to your local datacenter to patch a service. But since AWS came along c. 2007, there was a longing for things to be done better. Most engineers (myself included) don't want to deal with infrastructure, we just want to write code that scales and focus on product. Infrastructure is a pre-requisite but not sufficient to build a great product. The folks at Heroku had this insight and essentially developed PaaS along with the beginnings of containerisation tech. Then Hashicorp built declarative abstractions to make the business of managing your infrastructure less of a headache. Then the serverless movement promised to be the final chapter of this saga; devs could wrap their business logic in neat functions which would scale for you. Yet here we are again, in the winter of our discontent. - -At shuttle we think there is a better paradigm for building applications. We call it Infrastructure From Code (IFC). - -IFC uses application code as the source of truth for provisioning infrastructure. No longer are your applications and servers decoupled, the two go hand in hand. Our plan was to achieve this by doing static analysis of user code and generating the corresponding infrastructure in real time. A bit like this: - -```rust -#[get("/hello")] -fn index() -> &'static str { - "Hello, world!" -} - -#[shuttle_service::main] -async fn rocket( - pool: PgPool, // This will spin up a Postgres database, create an account and hand you an authenticated connection pool - redis: redis::Client // This will spin up a Redis instance and hand you back a client -) -> Result<...> { - // Application Code -} - -``` - -This isn't going to be everyone's cup of tea and this paradigm is probably not sufficient for every use-case. However we believe there exists a large class of products and teams which will benefit substantially from IFC. - -We have 4 weeks to prove the concept, let's get started. - -## Developer Experience - -Our primary focus with the MVP was to provide the best possible developer experience. We wanted the end user experience to be as simple as possible. - -1. A single annotation can transform your web app into a shuttle app: `#[shuttle_service::main]` -2. You can get started with a single cargo command: `$ cargo shuttle deploy` -3. Your shuttle app is automatically provisioned a subdomain `my-app.shuttleapp.rs` - -## Engineering Design - -Our primary focus was simplicity - we didn't want anything too complicated to start with. For example, we decided to ditch Kubernetes for our API and deployment servers. We simply didn't need that scale until we proved the concept and the complexity overhead would have been detrimental to development velocity. - -The deployment process is the core piece of engineering we spent the most time on. It looks something like this: - -1. `$ cargo shuttle deploy` runs a `cargo package` under the hood, zipping up the current cargo project into a tarball and shipping it to our API under the `/deploy` endpoint with a bearer token for authentication -2. The API receives the tarball and holds it in memory. The build is added to a job processor which acts as a build queue. -3. The job processor unpacks the tarball and writes it to disk, say under `/projects/my-app`. The build system is triggered to compile the unpacked cargo project -4. The output of the build process is a shared object file ('.so') which is then dynamically loaded by the API with its own runtime. The newly born web-server is assigned a free port which is not exposed to the outside world. -5. We update the routing table of our reverse proxy such that requests coming in with the host `my-app.shuttleapp.rs` are forwarded to the aforementioned port. - -And that's it! It turns out there are more than a few devils in the details here - but that was our plan in all it's glory. - -## $ cargo shuttle deploy - -The cargo subcommand [`cargo shuttle`](https://github.com/getsynth/shuttle/tree/main/cargo-shuttle) seemed like the obvious place to start. - -To create a third-party cargo subcommand, the binary needs to be named `cargo-${command}` and it needs to be stored in `~./.cargo/bin`. The easiest way to do this is to create a binary called `cargo-shuttle` and publish it to `crates.io`. Then, `cargo install cargo-shuttle` will place it in `~./.cargo/bin`. Pretty simple. - -`cargo-shuttle` also needs an HTTP client to make requests against the API, as well as some config logic to hold API keys. Finally, `cargo-shuttle` needs to use the `cargo` crate to programmatically run cargo commands like `cargo package`. - -We had underestimated how easy this would be - it turns out even though the `cargo` binary has world-class documentation, the same is not true for the crate. - -After a day of grappling and digging into the `cargo` source code, `cargo-shuttle` was happily packaging up cargo projects and serializing them nicely into the body of a POST request. - -We had built the bare bones of our client, next up was build system. - -## Next Steps - -In the next devlog we'll be exploring how we hacked together a build system to compile `cdylib`s for them to be dynamically linked to the API runtime. In the meantime, if you want to try out shuttle head over to the [getting started](https://docs.rs/shuttle-service/0.2.6/shuttle_service/) section! It's completely free while shuttle is still in Alpha. diff --git a/www/_blog/2022-04-27-dev-log-1.mdx b/www/_blog/2022-04-27-dev-log-1.mdx deleted file mode 100644 index b294fdce5..000000000 --- a/www/_blog/2022-04-27-dev-log-1.mdx +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: "DevLog[1]: Building a serverless platform for Rust in 4 weeks - part deux" -description: Designing and building a deployment system as a state machine -author: christoshadjiaslanis -tags: [rust, startup, devlog] -thumb: shuttle-logo-square-rocket.png -cover: shuttle-logo-rectangle.png -coverAspectRatio: 2624/832 -date: "2022-04-27T15:00:00" ---- - -`shuttle` is a serverless platform built for Rust. The goal of shuttle is to create the best possible developer experience for deploying Rust apps. Also, shuttle introduces a new paradigm for developing on the cloud called Infrastructure From Code (IFC). - -IFC uses application code as the source of truth for provisioning infrastructure. No longer are your applications and servers decoupled, the two go hand in hand. shuttle does this by doing static analysis of user code and generating the corresponding infrastructure in real time. A bit like this: - -

    - -

    - -In the [previous DevLog](https://www.shuttle.rs/blog/2022/04/22/dev-log-0) we started the journey of building the shuttle MVP. We went over the design and implementation of the `cargo` subcommand which deploys cargo projects to shuttle. This has been a race against the clock, so corners were cut and tradeoffs were made. A similar theme emerges in this DevLog which covers the **deployment state machine**. We're going to think about compiling and deploying user code, while also covering one of my favourite design patterns in Rust. - -## Deployment State - -shuttle exposes an HTTP endpoint under `POST /deploy`. This endpoint receives a series of bytes, from [`cargo shuttle`](https://crates.io/crates/cargo-shuttle), which correspond to a packaged cargo project (basically a compressed tarball with a bunch of `.rs` files). - -The aim of the game, is to convert that series of bytes into a deployed web service - how do we go about doing that? - -The deployment process is broken into 4 stages: - -1. `Queued` - the cargo project is received and waiting to be compiled -2. `Built` - the cargo project is compiled successfully -3. `Loaded` - the output of the compilation is loaded as a dynamically-linked library -4. `Deployed` - the app inside the DLL is running and listening for connections - -Then life happens so you need a couple more states: - -5. `Error` - there was an issue anywhere in the build process -6. `Deleted` - user-initiated deletion of the deploymentThis endpoint - -Which corresponds to: - -![State Machine](/images/blog/state-machine.jpeg) - -All this can be expressed nicely in an enum since all these states are mutually exclusive: - -```rust -enum DeploymentState { - Queued, - Built, - Loaded, - Deployed, - Error, - Deleted -} -``` - -Even though we have a nice representation of our states - these states don't actually hold any data yet and the state transitions are not defined. We would like the `DeploymentState` to own all the data that corresponds to the specific stage in it's deployment. We'll create some structs to hold the data required for each stage. - -First, the `QueuedState` just has a vector of bytes from the packaged cargo project that was received from `cargo-shuttle`: - -```rust -struct QueuedState { - crate_bytes: Vec, -} -``` - -When a deployment is queued, the shuttle build system writes the `crate_bytes` (just a tarball of a cargo project) to the file system. It then extracts the tarball and starts the compilation process by running `cargo::ops::compile`. - -The output of the build process is an `.so` file which is held in the next stage - the `BuildState`: - -```rust -struct BuiltState { - so_path: PathBuf, -} -``` - -So far so good. At this point we have a pointer to a compiled shared object file - next we need to load it into memory. - -`shuttle` uses the [`libloading`](https://crates.io/crates/libloading) crate to dynamically load from a `.so` file a value of a type implementing the [`Service`](https://docs.rs/shuttle-service/0.2.6/shuttle_service/trait.Service.html) trait. The `Service` trait is code-generated for the user via the `#[shuttle_service::main]` annotation and it's how shuttle interfaces with client apps. - -```rust -pub struct LoadedState { - service: Box, - so: Library, -} -``` - -We keep the `Library` struct around since `Box` is just a pointer to data loaded and managed by `Library`. Library going out of scope deallocates that data; meaning service will be pointing to deallocated memory hence we get a `segfault`. So it's important to keep `Library` around for the lifetime of the deployment. - -Finally we find a free port, spin up a new tokio runtime (we keep the handle so that we can kill it in the future) and bind the service to the port. We'll be covering this stuff in depth on a future DevLog but if you're insatiably curious you can check out the [source](https://github.com/shuttle-hq/shuttle/tree/main/service). - -All of this is put into the `DeployedState` and we're done! - -```rust -struct DeployedState { - so: Library, // remember if we drop this, weird undefined behaviour - port: Port, - handle: ServeHandle, -} -``` - -To tie it all together, we modify our initial `DeploymentState` own the various states corresponding to the stages of the deployment process: - -```rust -enum DeploymentState { - Queued(QueuedState), - Built(BuiltState), - Loaded(LoadedState), - Deployed(DeployedState), - Error(anyhow::Error), - Deleted // doesn't have any state -} -``` - -We also wrote a really light `impl` to define the state transitions: - -```rust -impl DeploymentState { - fn queued(crate_bytes: Vec) -> Self { - Self::Queued(QueuedState { crate_bytes }) - } - - fn built(build: Build) -> Self { - Self::Built(BuiltState { build }) - } - - fn loaded(loader: Loader) -> Self { - Self::Loaded(loader) - } - - fn deployed( - so: Library, - port: Port, - handle: ServeHandle - ) -> Self { - Self::Deployed(DeployedState { - so, - port, - handle, - }) - } -} -``` - -You'll also notice that there is no mutation happening here. We found it cleaner to simply drop the old state and construct a new one (although we did try). - -## Conclusion - -In the case of shuttle, using enum variants and structs to represent states in a state machine seemed like the natural thing to do. The states were distinct and clear, and for the most part the transitions are clean and self-contained. - -So what do you think about enum variants as states in a state machine? What would you have done differently? - -## Next Steps - -In the next DevLog we'll be looking at the implementation of our reverse proxy and routing table - how we keep a ledger of deployed services and route network calls appropriately. - -In the meantime, if you want to try out shuttle head over to the [getting started](https://docs.rs/shuttle-service/0.2.6/shuttle_service/) section! It's completely free while shuttle is still in Alpha. diff --git a/www/_blog/2022-05-09-ifc.mdx b/www/_blog/2022-05-09-ifc.mdx deleted file mode 100644 index 1b00db9ec..000000000 --- a/www/_blog/2022-05-09-ifc.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Infrastructure From Code -description: A new paradigm for building on the cloud -author: nodar -tags: [infra-from-code, rust, startup] -thumb: infrastructure-from-code-trans.png -cover: infrastructure-from-code-trans.png -date: "2022-05-09T15:00:00" ---- - -In the early days of Facebook (back when it was still called `thefacebook.com`), Mark Zuckerberg hosted it on Harvard’s university servers. Back then companies used to buy or rent physical servers to run their software on. The advent of the cloud in the mid-2000s changed the game. The elasticity that this enabled has in big part enabled the rapid progress that we’ve all enjoyed since then. What we demand from software has increased tremendously, and correspondingly its architecture has become much more elaborate. The power of flexibility came at a price though - the complexity of wiring code with infrastructure. That price is even higher today. - -### The Container Hero - -Heroku became part of the cloud-native lore as the first incredibly successful attempt at tackling this complexity. They led the first crusade to rid software developers of the infrastructure complexity dragon. People loved it. Heroku pioneered the wildly popular container-based approach to deployment that abstracted away the burden of managing virtual machines. By being opinionated with the use of containers, Heroku was able to appeal to a broad set of customers looking to quickly build apps. Containers are mutually isolated processes, wired together by third-party configuration which does not belong in the application’s code base - this design choice results in a lack of elasticity and granular control of your system. This results in a conservative outlook of dealing with infrastructure, constantly over-provisioning and hence overpaying to account for potential future load. - -Furthermore, infrastructure is still treated separately from code - the two worlds live separately and don’t really know much about each other. There is much less wiring to do than with AWS for example, but what is left to do - and there’s a lot of it - you still have to do yourself. Heroku trades off AWS’s elasticity for ready-made building block components that are statically wired up together through a combination of CLI commands and dashboard operations. Of course, Heroku is limited by its founding principle: static containers as building blocks of applications. With Heroku, it is true you do not have to think about infrastructure - but only in the beginning. Once your application scales, your bills stack up and you’re left without a choice: go back to AWS. - -### The Serverless Conundrum - -We need to talk about serverless. Serverless (think AWS Lambda) was a new cloud computing execution model where machine allocation happens on-demand and the user is primarily abstracted away from the underlying servers. With it came a familiar promise - developers not needing to think about infrastructure at all. Despite its somewhat counterintuitive name (because, of course, there are always servers running somewhere), serverless sounds like a great ideal to strive towards. This is simple, developers want to spend as much time as possible on delivering business value by writing code, while companies would like to avoid spending fortunes on DevOps. This seems to be the holy grail, but there’s a catch. You might ask, “if you say serverless is so great, why have we all not switched yet”? - -Well, serverless forces you to write application business logic as functions, rather than the more traditional idiom of stateful processes. To reap the benefits of serverless, you have to build your application as a multitude of stateless request or event handlers, often requiring a bottoms-up redesign of your system. For some use-cases the serverless paradigm works, but in many cases breaking things into discrete, decoupled functions may not be optimal or even feasible. The next question is, can we have our cake and eat it too? Can we maintain the paradigm of stateful processes and abstract away the underlying infrastructure and orchestration? - -### Infrastructure from Code - -At shuttle we want to empower engineers by creating the best possible developer experience. - -We've already developed an annotation based system that enables Rust apps to be deployed with a one-liner, as well as dependencies like databases being provisioned through static analysis in real-time. - -```rust -#[shuttle_service::main] -async fn rocket( - pool: PgPool, // automatic db provisioning + hands you back an authenticated connection pool -) -> Result<...> { - // application code -} -``` - -Building on the phenomenal engineering done before us, we see a better future. One where developers don’t need to do any “wiring” whatsoever when it comes to code and infrastructure. - -In this future, infrastructure can be defined directly from code. Not in the “Infrastructure as Code” kind of way though, but in the way that the code that developers write implicitly defines infrastructure. What your code actually needs in terms of infrastructure should be inferred as you build your application, instead of you having to think upfront about what infrastructure piece is needed and how to wire it up. - -This setup should also break the boundaries that keep containers isolated from each other (and thus make it difficult to orchestrate them), without necessarily getting rid of the paradigm of containers. It should not force you into any specific way of writing applications, but just be an extension of your workflow. - -### Having your cake and eating it too - -When looking back at Heroku’s success, it becomes apparent that focusing on one language, Ruby, which was becoming quite popular at the time - was a remarkable strategy. It enabled their team to focus acutely and produce an unparalleled experience for their users. - -At shuttle we are convinced Rust is the best language to start this journey with. It’s been [the most loved](https://www.cantorsparadise.com/the-most-loved-programming-language-in-the-world-5220475fcc22) language by developers for many years in a row (as well as one of the fastest-growing languages). If you want to create the best developer experience - it makes sense to start with the most loved language. Indeed, Rust is the first language packed with such a powerful set of tools for static analysis and code generation, that are required to create the best developer experience when it comes to _Infrastructure ~~as~~ from Code_. - -Removing the burden of dealing with DevOps from developers, many of whom find it daunting and stressful, not only do we stand to make development more enjoyable and efficient, but also enable far more people to write and ship applications. - -From inception, all of us shared affection for open source software, not only from a philosophical standpoint. We have seen in practice that the best way to build software is together with the end-users. It all goes back to the idea of creating the best developer experience - so for us, this is a no-brainer. - -Our community is just as important to us, as our vision is, so if any of this resonates with you - [join us on discord](https://discord.gg/shuttle). - -Or check out our [jobs board](https://www.workatastartup.com/companies/shuttle). - -Also, if you’re curious to learn more about _how_ we are building this - [check out our GitHub](https://github.com/getsynth/shuttle). diff --git a/www/_blog/2022-06-01-hyper-vs-rocket.mdx b/www/_blog/2022-06-01-hyper-vs-rocket.mdx deleted file mode 100644 index 779c4415b..000000000 --- a/www/_blog/2022-06-01-hyper-vs-rocket.mdx +++ /dev/null @@ -1,251 +0,0 @@ ---- -title: Hyper vs Rocket - Low Level vs Batteries included -description: A comparison of using the low-level HTTP framework 'hyper' vs a batteries included framework like 'Rocket' -author: ben -tags: [rust, rocket, hyper, comparison] -thumb: hyper-vs-rocket.png -cover: hyper-vs-rocket.png -date: "2022-05-09T15:00:00" ---- - -In this post we're going to be comparing two popular Rust libraries used for building web applications. We'll be writing an example in each and compare their ergonomics and how they perform. - -The first library [Hyper](https://github.com/hyperium/hyper) is a low level HTTP library which contains the primitives for building server applications. The second library [Rocket](https://rocket.rs/) comes with more "batteries included" and provides a more declarative approach to building web applications. - -## The Demo - -We're going to build a simple site to showcase how each libraries implements: - -### Routing - -Routing decides what to respond for a given URL. Some paths are fixed, in our example we will have a fixed route `/` which returns `Hello World`. Some paths are dynamic and can have parameters. In the example we will have `/hello/*name*` which will response `Hello *name*` which will have *name* substituted in each response. - -### Shared state - -We want to have a central state for the application. - -In this demo we will have central site visitor counter which counts the number of requests. This number can be viewed as JSON on the `/counter.json` route. In this example we will be storing the counter in application memory. However if you were storing it in a database the shared state would be a database client. - -The are lots of other functionality necessary for a site such as handling HTTP methods, receiving data, rendering templates and error handling. But for the scope of this post and example we will only be comparing these two features. - -### The rules - -The rules for this demonstration is to only use the specific library and any of its re-exported dependencies. So no additional libraries (except in the hyper example we need a `tokio::main`). - -## Hyper - -Hyper's readme describes hyper as a "A fast and correct HTTP implementation for Rust with client and server APIs". For this demo we will be using the server side of the library. It has **9.7k** stars on GitHub and **48M** crates downloads. It is used as a often a dependency and many other libraries such as [reqwest and tonic](https://crates.io/crates/hyper/reverse_dependencies) build on top of it. - -In this example we see how far we can get with just using the library. This demo uses Hyper 0.14[^hyper-deps]. Below is the full code for the site: - -```rust -use hyper::server::conn::AddrStream; -use hyper::service::{make_service_fn, service_fn}; -use hyper::{Body, Request, Response, Server}; -use std::convert::Infallible; -use std::sync::{atomic::AtomicUsize, Arc}; - -#[derive(Clone)] -struct AppContext { - pub counter: Arc, -} - -async fn handle(context: AppContext, req: Request) -> Result, Infallible> { - // Increment the visit count - let new_count = context - .counter - .fetch_add(1, std::sync::atomic::Ordering::SeqCst); - - if req.method().as_str() != "GET" { - return Ok(Response::builder().status(406).body(Body::empty()).unwrap()); - } - - let path = req.uri().path(); - let response = if path == "/" { - Response::new(Body::from("Hello World")) - } else if path == "/counter.json" { - let data = format!("{{\"counter\":{}}}", new_count); - Response::builder() - .header("Content-Type", "application/json") - .body(Body::from(data)) - .unwrap() - } else if let Some(name) = path.strip_prefix("/hello/") { - Response::new(Body::from(format!("Hello, {}!", name))) - } else { - Response::builder().status(404).body(Body::empty()).unwrap() - }; - Ok(response) -} - -#[tokio::main] -async fn main() { - let context = AppContext { - counter: Arc::new(AtomicUsize::new(0)), - }; - - let make_service = make_service_fn(move |_conn: &AddrStream| { - let context = context.clone(); - let service = service_fn(move |req| handle(context.clone(), req)); - async move { Ok::<_, Infallible>(service) } - }); - - let server = Server::bind(&"127.0.0.1:3000".parse().unwrap()) - .serve(make_service) - .await; - - if let Err(e) = server { - eprintln!("server error: {}", e); - } -} -``` - -At the top we define a `handle` function which processes all the requests. - -Routing is done through the chain of ifs and elses in the `handle` function. First the path of the request (e.g `/` for the index) is extracted using `req.uri().path()`. Fixed routes are easy to branch on using string comparison like `path == "/"`. For routes which match multiple paths such as the `/hello/` route it uses [`str::strip_prefix`](https://doc.rust-lang.org/std/primitive.str.html#method.strip_prefix) which returns a `None` if the path doesn't -start with the prefix or `Some` if the path starts with the prefix along with a slice that proceeds the prefix. - -```rust -"/".strip_prefix("/hello/") == None -"/test".strip_prefix("/hello/") == None -"/hello/jack".strip_prefix("/hello/") == Some("jack") -``` - -The function has a early return for requests with a method other than GET because there are no POST routes or others for this example. If the site accepted different requests types and had to add additional guards then we could additional clauses to the if statement. Although you could see how expand on the if chain would get more complex and verbose. - -To return a response, Hyper re-exports [`Response`](https://docs.rs/hyper/0.14.19/hyper/struct.Response.html) (from the [http crate](https://docs.rs/http/latest/http/)). It has a nice simple builder pattern for building the responses. The serialization code is hand written using `format!`. Of course we could import serde but that's against the rules. - -The counter is done by creating a struct in the initializing code and cloning it on every request to send to the handler function. Without going into the details it uses `Arc` instead of a `usize` as the atomic variant has special properties for when multiple handlers are using and mutating it. The code increments the visitor counter before anything else in the handler function so that a visit is recorded for all requests. - -### Hyper Verdict - -In terms of development (on a low end machine we used for profiling[^profile-machine]), a debug build (without any of the build artifacts) takes **79.0s**. After the initial compilation, incremental compilation takes only **1.9s**. For building a `release` build with further optimizations (on top of the debug build artifacts) it takes **32.5s**. - -The initialization code was take from [Hyper's server docs](https://docs.rs/hyper/latest/hyper/server/index.html) and is quite verbose and out of the box for Hyper there are no logs or server information. - -In terms of runtime performance over three 30 second connections Hyper responded to on average **74,563** requests per second on the index route on the above code. Which is incredible quick! - -## Rocket - -Rocket is a "web framework for Rust with a focus on ease-of-use, expressibility, and speed". It has **17.4k** github stars and **1.7M** crates downloads. Rocket internally uses Hyper. - -For this demo we are using the `0.5.0-rc2` version of Rocket[^rocket-deps] which builds on Rust stable. - -```rust -use rocket::{ - fairing::{Fairing, Info, Kind}, - get, launch, routes, - serde::{json::Json, Serialize}, - Config, Data, Request, State, -}; -use std::sync::atomic::AtomicUsize; - -#[derive(Serialize, Default)] -#[serde(crate = "rocket::serde")] -struct AppContext { - pub counter: AtomicUsize, -} - -#[launch] -fn rocket() -> _ { - let config = Config { - port: 3000, - ..Config::debug_default() - }; - - rocket::custom(&config) - .attach(CounterFairing) - .manage(AppContext::default()) - .mount("/", routes![hello1, hello2, counter]) -} - -struct CounterFairing; - -#[rocket::async_trait] -impl Fairing for CounterFairing { - fn info(&self) -> Info { - Info { - name: "Request Counter", - kind: Kind::Request, - } - } - - async fn on_request(&self, request: &mut Request<'_>, _: &mut Data<'_>) { - request - .rocket() - .state::() - .unwrap() - .counter - .fetch_add(1, std::sync::atomic::Ordering::SeqCst); - } -} - -#[get("/")] -fn hello1() -> &'static str { - "Hello World" -} - -#[get("/hello/")] -fn hello2(name: &str) -> String { - format!("Hello, {}!", name) -} - -#[get("/counter.json")] -fn counter(state: &State) -> Json<&AppContext> { - Json(state.inner()) -} -``` - -In Rocket we describe each endpoint using a function. The `get` macro attribute handles path routing and http method constraint. No need to add early returns for methods and dealing with raw string slices. It takes the declarative approach, `#[get("/hello/")]` is more descriptive and less verbose than `if let Some(name) = path.strip_prefix("/hello/")`. The functions are registered using `.mount("/", routes![hello1, hello2, counter])`. - -The application has a state defined here: - -```rust -#[derive(Serialize, Default)] -#[serde(crate = "rocket::serde")] -struct AppContext { - pub counter: AtomicUsize, -} -``` - -And it is created and registered using `.manage(AppContext::default())`. Rocket re-exports the serialization library serde so we can use `#[derive(Serialize)]` to generate serialization logic for the counter state, so no hand writing the serialization code unlike first method. - -In Rocket endpoint functions can just return `String` or `str` slices and Rocket handles it automatically. Rocket also comes with a `Json` return type and reusing the fact that `AppContext` implements `Serialize` we can freely build a `Json` response from it. The `Json` structure handles setting the `Content-Type` header automatically for us. - -Rocket has a middleware implementation which it calls ["fairings"](https://rocket.rs/v0.5-rc/guide/fairings/#fairings). In the example it defines a `CounterFairing` which on every request modifies the counter state. The initialization code is really slim, it sets up a config and a Rocket structure is created using a builder pattern. Annotating the main function with `#[launch]` helps Rocket find the entry point and abstracts how the server is span up. Rocket also has really nice built in logs which are great for development. - -

    - -

    - -### Rocket Verdict - -Since Rocket has more dependencies and requires more macro expansion it takes a bit longer build taking **141.9s** (2m 21.9s) on a cold start to compile. A release builds on top of debug artefact takes **147.0s** (2m 27.0s) to compile. Incremental builds are still fast taking **3.3s** to compile after a small change to the response of a endpoint. - -Using the same benchmark as Hyper, on average Rocket returned **43,899** requests per second in a release build with the logging disabled - roughly **60%** of Hyper's throughput. - -## Conclusion - -Writing both of these examples were fun to build and there weren't any frustrations or problems using them. Both are plenty fast for performance to be a concern. - -Rockets documentation is very good and explanatory. All of Hyper's api is well documented on its [docs.rs page](https://docs.rs/hyper/latest/hyper/). Both libraries are actively developed with many commits and pull requests made in the last month. - -Do you prefer the control and speed of Hyper or prefer the expressiveness of Rocket? - -## [Shuttle](https://www.shuttle.rs/): Stateful Serverless for Rust - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out Shuttle](https://docs.rs/shuttle-service/latest/shuttle_service/). - -
    - -[^profile-machine]: The build and request profile machine is a vm with 2 cores and 7 GB RAM. Take the numbers with a grain of salt - -[^hyper-deps]: The dependencies for building the project `hyper = { version = "0.14", features = ["server", "tcp", "http1"] }` and `tokio = { version = "1.18.2", features = ["rt", "macros", "rt-multi-thread"] }` - -[^rocket-deps]: The dependencies for building the project `rocket = { version = "0.5.0-rc.2", features = ["json"] }` diff --git a/www/_blog/2022-06-09-the-builder-pattern.mdx b/www/_blog/2022-06-09-the-builder-pattern.mdx deleted file mode 100644 index a83b9606e..000000000 --- a/www/_blog/2022-06-09-the-builder-pattern.mdx +++ /dev/null @@ -1,495 +0,0 @@ ---- -title: Builders in Rust -description: In this post we do a deep dive into the builder pattern - an easy way to write cleaner and more readable code. -author: ben -tags: [rust, tutorial] -thumb: crab-builder.png -cover: crab-builder.png -date: "2022-06-09T15:00:00" ---- -This blog post is powered by shuttle! The serverless platform built for Rust. - -In this post, we'll be going over the "builder pattern". The builder pattern is an API design pattern for constructing instances of Rust structures. We'll be going over where it makes sense to use it and some of the benefits of applying it to your structs. - -## Examples - -Here are some examples of the builder pattern in common Rust crates: - -[`Command`](https://doc.rust-lang.org/std/process/struct.Command.html) from the Rust standard library -```rust -Command::new("cmd") - .args(["/C", "echo hello"]) - .output() -``` - -[`Rocket`](https://api.rocket.rs/v0.5-rc/rocket/struct.Rocket.html) in Rocket -```rust -rocket::build() - .mount("/hello", routes![world]) - .launch() -``` - -[`Response`](https://docs.rs/http/latest/http/response/struct.Response.html#method.builder) in the HTTP crate -```rust -Response::builder() - .status(200) - .header("X-Custom-Foo", "Bar") - .header("Set-Cookie", "key=2") - .body(()) - .unwrap(); -``` - -[Cargo uses the pattern internally for tests](https://github.com/rust-lang/cargo/blob/c6745a3d7fcea3a949c3e13e682b8ddcbd213add/tests/testsuite/build.rs#L74-L91) - -Ok - so let's dive into *what* the builder pattern actually is. - -## What is the builder pattern - -Given the following struct representation: -```rust -struct Message { - from: String, - content: String, - attachment: Option -} -``` -Using struct initialization syntax: -```rust -Message { - from: "John Smith".into(), - content: "Hello!".into(), - attachment: None -} -``` -Using a builder pattern: -```rust -Message::builder() - .from("John Smith".into()) - .content("Hello!".into()) - .build() -``` - -The builder pattern consists of: -- A function that generates a *intermediate builder structure* (`Message::builder()`) -- A chain of methods which set values on the builder: (`.from("John Smith".into()).content("Hello!".into())`) -- A final method which builds the final value from the intermediate structure `.build()` - -The structure of the builder pattern follows the functional programming design and has likeness of building iterators. - -The setting methods take a mutable reference to the builder and return the same reference (thus for chaining to work). The handy part about working with mutable references is that it can be shared around between functions and if statements: - -```rust -fn build_message_from_console_input( - builder: &mut MessageBuilder -) -> Result<(), Box> { - let mut buffer = String::new(); - let mut stdin = std::io::stdin(); - stdin.read_line(&mut buffer).unwrap(); - - let split = buffer.rsplit_once("with attachment: "); - if let Some((message, attachment_path)) = split { - let attachment = - std::fs::read_to_string(attachment_path).unwrap(); - builder - .content(message.into()); - .attachment(attachment); - } else { - builder.text_filter(buffer); - } -} -``` - -Next we'll explore some places where the builder pattern can offer a lot of benefits. - -#### Constraints and computed data - -Given the following struct which represents running a certain function at a certain time: - -```rust -struct FutureRequest { - at: chrono::DateTime, - func: T -} -``` - -We don't want the program to be able to create a `FutureRequest` for a time in the past. - -With regular struct initialisation and public fields there isn't a good way to constrain the values being given to the struct[^type_constraints] - -```rust -let fq = FutureRequest { - at: chrono::DateTime::from_utc( - chrono::NaiveDate::from_ymd(-112, 2, 18) - .and_hms(11, 5, 6), - Utc - ), - func: || println!("𓅥𓃶𓀫"), -} -``` - -However with the builder pattern and a method for setting the time we can validate the value before it is assigned - -```rust -#[derive(Debug)] -struct SchedulingInPastError; - -impl ()> FutureRequestBuilder { - fn at( - &mut self, - date_time: chrono::DateTime - ) -> Result<&mut Self, SchedulingInPastError> { - if date_time < Utc::now() { - Err(SchedulingInPastError) - } else { - self.at = date_time; - Ok(self) - } - } -} -``` - -Maybe we don't even want an absolute time - but a relative time at some point in the future. - -```rust -impl ()> FutureRequestBuilder { - fn after(&mut self, duration: std::time::Duration) -> &mut Self { - self.at = Utc::now() + chrono::Duration::from_std(duration).unwrap(); - self - } -} -``` - -#### Encapsulating data - -Sometimes - we want to keep some fields hidden from the user: - -```rust -struct Query { - pub on_database: String, - // ... -} - -fn foo(query: &mut Query) { - // You want mutable access to call mutable methods on the query - // but want to prevent against: - query.on_database.drain(..); -} -``` - -So you could make the fields private and create a function which constructs the value (known as a constructor): - -```rust -impl Query { - fn new( - fields: Vec, - text_filter: String, - database: String, - table: String, - fixed_amount: Option, - descending: bool, - ) -> Self { - unimplemented!() - } -} - -let query = Query::new( - vec!["title".into()], - "Morbius 2".into(), - "imdb".into(), - "films".into(), - None, - false -); -``` -But this causes confusion at the call site. Its not clear whether "imdb" is the database, the table or the text_filter? [^vscode-inlay-hints]. - -The builder pattern makes it much easier to read and understand what's happening during initialisation: - -```rust -let query = Query::builder() - .fields(vec!["title".into()]), - .text_filter("Morbius 2".into()), - .database("imdb".into()), - .table("films".into()), - .fixed_amount(None), - .descending(false) - .build(); -``` - -#### Enums and nested data - -So far we've just discussed structs - let's talk about enums: - -```rust -enum HTMLNode { - Text(String), - Comment(String), - Element(HTMLElement) -} - -struct HTMLElement { - tag_name: String, - attributes: HashMap>, - children: Vec -} -``` - -Here there is builder associated with each variant: - -```rust -HTMLNode::text_builder() - .text("Some text".into()) - .build() - -// vs - -HTMLNode::Text("Some text".into()) - -// -- - -HTMLNode::element_builder() - .tag_name("p".into()) - .attribute("class".into(), "big quote".into()) - .attribute("tabindex".into(), "5".into()) - .content("Some text") - -// vs - -HTMLNode::Element(HTMLElement { - tag_name: "p".into(), - attributes: [ - ("class".into(), "big quote".into()), - ("tabindex".into(), "5".into()) - ].into_iter(), - children: vec![HTMLNode::Text("Some text".into())] -}) -``` - -## Building our own builder pattern - -Now let's build our own builders (no pun intended). In this example we have some users: - -```rust -#[derive(Debug)] -struct User { - username: String, - birthday: NaiveDate, -} - -struct UserBuilder { - username: Option, - birthday: Option, -} - -#[derive(Debug)] -struct InvalidUsername; - -#[derive(Debug)] -enum IncompleteUserBuild { - NoUsername, - NoCreatedOn, -} - -impl UserBuilder { - fn new() -> Self { - Self { - username: None, - birthday: None, - } - } - - fn set_username(&mut self, username: String) -> Result<&mut Self, InvalidUsername> { - // true if every character is number of lowercase letter in English alphabet - let valid = username - .chars() - .all(|chr| matches!(chr, 'a'..='z' | '0'..='9')); - - if valid { - self.username = Some(username); - Ok(self) - } else { - Err(InvalidUsername) - } - } - - fn set_birthday(&mut self, date: NaiveDate) -> &mut Self { - self.birthday = Some(date); - self - } - - fn build(&self) -> Result { - if let Some(username) = self.username.clone() { - if let Some(birthday) = self.birthday.clone() { - Ok(User { username, birthday }) - } else { - Err(IncompleteUserBuild::NoCreatedOn) - } - } else { - Err(IncompleteUserBuild::NoUsername) - } - } -} -``` - -Some things to look out for: -- Every set method must take a mutable reference in order to add the data to the backer -- The method must then return the mutable reference it has to allow for them to be chained. - -There are clones in the `build` method but if that method is only called once then it is optimized out by Rust. - -## Automatic approaches - -Similar to how Clone and Debug work, crates can create there own derive macros. [There are a lot of crates which can help with generating the builder pattern](https://lib.rs/keywords/builder). Let's take a look at a few: - -### [derive_builder](https://lib.rs/crates/derive_builder) - -```rust -#[derive(Debug, derive_builder::Builder)] -#[builder(build_fn(validate = "Self::validate"))] -struct Query { - fields: Vec, - text_filter: String, - database: String, - table: String, - fixed_amount: Option, - descending: bool, -} - -// Usage same as described patterns: -let query = Query::builder() - .table("...".into()) - // ... - .build() - .unwrap(); -``` - -This derive macro generates a new struct named the same as the original structure but postfixed with `Builder` (in this case `QueryBuilder`). - -Derive builder has the downside of a whole object validation rather than per field. As well as the error variant of construction being a `String`, which makes it harder to match on the error or return error data compared to a error enum: - -```rust -impl Query { - fn validate(&self) -> Result<(), String> { - let valid = self - .database - .as_ref() - .map(|value| value == "pg_roles") - .unwrap_or_default(); - - if valid { - Ok(()) - } else { - Err("Cannot construct Query on 'pg_roles'".into()) - } - } -} -``` - -### [typed-builder](https://lib.rs/crates/typed-builder) - -Typed-builder solves two problems with `derive_builder`: - -With `derive_builder` you can set a field twice (or more) -```rust -Query::builder() - .database("imdb".into()) - // ... - .database("fishbase".into()) -``` - -Which takes the value of the last set field which is likely a mistake. Although Rust can optimize out a write without a read it is very difficult to have a linter error for this mistake. `derive_builder` also delegates the check to whether all the required fields have been set to runtime. - -With `typed-builder` it has a very similar implementation but has a different output which Rust can reason about and check that they are no duplicate sets and the build is well formed (all the required fields have been set). - -The downside here is that it takes longer to expand the macros as there is more to generate. The added complexity also makes it more complicated to pass the builder around. - -### [Buildstructor](https://lib.rs/crates/buildstructor) - -Buildstructor is a annotation for an existing impl block. Rather than using the fields on a structure (as seen in the previous two) to generate code it builds wrappers around existing constructor functions: - -```rust -struct MyStruct { - sum: usize -} - -#[buildstructor::buildstructor] -impl MyStruct { - #[builder] - fn new(a: usize, b: usize) -> MyStruct { - Self { sum: a + b } - } -} - -MyStruct::builder().a(1).b(2).build(); -``` - -Similar to `typed-builder` it generates intermediate staging structs for building which has the benefits of compile time checking that all the fields exist. However that comes again with the drawback of slower compile time and less flexibility when passing it around. - -Typed builder looks to be more compatible with the Rust language which allows it to support async builders! It's definitely the more interesting one of the bunch and I will be looking to play with with it future projects. - -### Alternative patterns - -If you just want to build a struct which has a large amount of default fields, using `..` (base syntax) with the [Default](https://doc.rust-lang.org/std/default/trait.Default.html) trait (whether a custom implementation or the default one with `#[derive(Default)]`) will do: - -```rust -#[derive(Default)] -struct X { - a: u32, - b: i32, - c: bool, -} - -X { a: 10, ..Default::default() } -``` - -If you want computation, constraints, encapsulation and named fields you could create a intermediate struct which can be passed to a constructor: - -```rust -struct Report { - title: String, - on: chrono::DateTime - // ... -} - -struct ReportArguments { - title: String, - on: Option - // ... -} - -impl Report { - fn new_from_arguments(ReportArguments { title, on }: ReportArguments) -> Result { - if title. - .chars() - .all(|chr| matches!(chr, 'a'..='z' | '0'..='9')) - { - Ok(Self { - title, - on: chrono.unwrap_or_else(|| todo!()) - }) - } else { - Err("Invalid report name") - } - } -} -``` - -However both of these don't the use the nice chaining syntax. - -## Conclusion - -The builder pattern can help you write cleaner, more readable APIs, and it turn help the consumers of your APIs write better code. We can apply constraints to make sure that our structs are initialised correctly with a clean API enforcing the contract. - -One thing to remember is that code is read *much* more than it's written - so it's worth going out of our way to make our code just that little bit more pleasant to read. - -## [Shuttle](https://www.shuttle.rs/): Stateful Serverless for Rust - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out Shuttle](https://docs.rs/shuttle-service/latest/shuttle_service/). - -
    - -[^type_constraints]: I partially agree with this, there are ways to design your types to be constrained. Here we could create a `struct FutureEvent(chrono::DateTime)` structure where the constraint is constructing the `FutureEvent` type rather than leaving the constraint to the field. But there are lots of scenarios where that isn't the case. - -[^vscode-inlay-hints]: With vscode and rust analyzer there is a feature called [inlay hints](https://rust-analyzer.github.io/manual.html#inlay-hints) which shows the names of parameters in the editor. While this is great this is a feature specific to vscode at the moment. You won't see the hints on GitHub diffs and in other text editors. diff --git a/www/_blog/2022-06-16-a-short-introduction-to-async-rust.mdx b/www/_blog/2022-06-16-a-short-introduction-to-async-rust.mdx deleted file mode 100644 index c031ad81a..000000000 --- a/www/_blog/2022-06-16-a-short-introduction-to-async-rust.mdx +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: A short introduction to async Rust -description: Async code can be mystifying - this posts goes over the basics and helps us get comfortable with some of the core concepts of asynchronous Rust -author: ben -tags: [rust, tutorial, async] -thumb: introduction-to-async-snippet.png -cover: introduction-to-async-snippet.png -date: "2022-06-16T15:00:00" ---- - -This blog post is powered by shuttle! The serverless platform built for Rust. - -In this post, we'll be going over the state of async code. Before this post the only async Rust I had written had been copied and pasted from Stack Overflow so I wanted to dig deeper into what async code is and how to start writing it. - -## What is asynchronous code? - -To understand what asynchronous code is - let's first talk about synchronous code. - -In synchronous code, statements run in a sequential order: - -```rust -println!("Hello World"); -let cargo_toml_content = std::fs::read_to_string("Cargo.toml").unwrap(); -println!("'Cargo.toml':\n{}", cargo_toml_content); -``` - -The above statements are executed in a well defined order - one after the other, top to bottom. `Hello World` is printed, followed by the contents of `Cargo.toml` being read and then printed. - -This paradigm is perfectly fine under normal operation - but sometimes our code requires the current context to stop while it *waits* for something else - this is generally known as **blocking**. - -```rust -for index in 1..=100 { - let result = sync_http_client.get(format!("www.example.com/items/{}", index)); -} -``` - -In the above example, every loop iteration a request is made to the infamous `example.com`. - -The problem here is that `sync_http_client.get` is blocking. Blocking can occur for lots of reasons: - -- waiting for the file system -- waiting for the network -- waiting for some database transaction -- waiting for some time to occur -- etc. - -When a program is blocked it is doing nothing but waiting for a response to return to continue execution. If we need to work on anything else - we're kinda stuck. In this example the loop cannot run the next iteration / index until the request in the previous one has fully finished. While making and reading a single request is relatively fast, the code in the loop runs 100 times and makes 100 requests so the whole loop takes a while to run. - -**What if there was a way to start additional requests without having to wait for the previous to have finished its request?** - -This is where asynchronous programming comes in. Asynchronous programming is -about *not* blocking. Let's say you've ordered a mountain bike for a ride on -the weekend. You don't need to spend all your time on the doorstep waiting -for the delivery - you can continue living your life doing whatever. An async runtime allows you to continue whatever you are doing and acts as a doorbell, *awaking* you to the door when the delivery arrives. - -We will get more in to how to write async later but the essence is that we can change the loop to the following to start up 100 requests without having requiring the previous request to have finished: - -```rust -let mut handles = Vec::new(); -for index in 1..=100 { - let handle = tokio::spawn( - async_http_client.get(format!("www.example.com/items/{}", index)) - ); - handles.push(handle); -} -for handle in handles { - let result = handle.await; -} -``` - -### Parallelization and concurrency - -Before we go further we should note that async is *not* for processing -expensive operations. It's only beneficial for IO in which data comes from somewhere further away than the RAM and when there is a lot of it. For process expensive operations parallelization is beneficial. - -**Parallelization is running multiple things at the same time. Concurrency is handling multiple things at the same time.** - -Async is designed for concurrency. Tokio's default runtime utilises threads so we also benefit from parallelization. - -### Benchmarking - -Comparing an example written using async vs the same example written -synchronously - for a large numbers of concurrent web requests, the async -version is ~60% faster that synchronous requests and ~20% faster than spinning -up a thread for each request[^benchmarks]. - -| Command | Mean [s] | Min [s] | Max [s] | Relative | -|:---|---:|---:|---:|---:| -| `./sync` | 1.070 ± 0.013 | 1.060 | 1.085 | 1.65 ± 0.09 | -| `./threads` | 0.787 ± 0.007 | 0.782 | 0.795 | 1.22 ± 0.06 | -| `./async` | 0.732 ± 0.016 | 0.721 | 0.750 | 1.13 ± 0.06 | -| `./async_threads` | 0.646 ± 0.033 | 0.612 | 0.677 | 1.00 | - -### Getting started with asynchronous Rust - -Rust does not have a runtime[^rust-runtime] and so doesn't have a standard -executor (at least for now). There are several popular executor runtimes. These are crates like any other library so you can use them by adding them to the `Cargo.toml`. For this demo we will pick [Tokio](https://tokio.rs/) as it the most popular executor. Other runtimes exist and prioritize different things. For example [async-std](https://docs.rs/async-std/latest/async_std/index.html) is focused on an async version of Rust's standard library and [smol](https://docs.rs/smol/1.2.5/smol/) which is focused on being lightweight. Overall Rust is designed to stay out the way, so it lets you pick which executor you run. - -To start we will run `cargo new`. Then add `tokio = { version = "1.19", features = ["full"] }` to `Cargo.toml` (or if you have [cargo-edit](https://github.com/killercup/cargo-edit) installed: `cargo add tokio -F full`) - -```rust -#[tokio::main] -async fn main() { - println!("Hello from an async function"); -} -``` - -### Async functions - -Function which contain *async things* are marked as `async`, this is done by prefixing the function with `async`: - -```rust -async fn do_thing() { - let result = some_async_function().await; - println!("{}", result); -} -``` - -In an async function you can use `.await`. You add it on to the end of a -call of async function and it will now block and return the actual value. - -Async functions (and async blocks) return Futures. A [Future](https://doc.rust-lang.org/std/future/trait.Future.html) is a function which returns a [Poll](https://doc.rust-lang.org/std/task/enum.Poll.html). Poll is a bit like a `Result` or `Option`, it has two variants one is a final value and the other variant is that the value is still pending. Futures are lazy, there are two ways to run a future: `tokio::spawn` to spawn eagerly and get a [JoinHandle](https://docs.rs/tokio/latest/tokio/task/struct.JoinHandle.html) or `.await`. Rust warns against *unawaited* futures. - -### Writing async operations - -All IO and filesystem functions in Rust's standard library are synchronous (and so block). Tokio provides async versions of the synchronous io in Rusts's standard library. - -```rust -let contents = tokio::fs::read("Cargo.toml").await; -``` - -### Writing concurrency - -As discussed earlier the problem with blocking calls is only one thing can run. - -```rust -let weather = client.get("https://api.darksky.net/forecast").await; -let news = client.get("https://api.nytimes.com/svc/topstories").await; -``` - -With `tokio::join!` we can run the requests start both requests and *await* for their results concurrently. - -```rust -let weather = client.get("https://api.darksky.net/forecast"); -let news = client.get("https://api.nytimes.com/svc/topstories"); -let (weather, news) = tokio::join!(weather, news).await; -``` - -Rather than getting weather **then** getting the news. The above code starts both requests and then waits for the response from both, joining them in a resulting tuple. - -
    - -To keep this post short and to the basics we will stop here. If you want to read more about writing async the there is the [official Rust async book](https://rust-lang.github.io/async-book/) and [Tokio has a brilliant tutorial](https://tokio.rs/tokio/tutorial). - -### Conclusion - -Rust async is very much usable. The async side of the Rust language is still in heavy development and can only can get better from here. https://areweasyncyet.rs/ gives a good overview of the status of async language features and other things in the async ecosystem. This post is a introductory look into writing async Rust. Maybe *await* a future post digging deeper into async in Rust! - -## [Shuttle](https://www.shuttle.rs/): Stateful Serverless for Rust - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out Shuttle](https://docs.rs/shuttle-service/latest/shuttle_service/). - -
    - -[^rust-runtime]: Technically there are panic handlers and things which is runtime https://doc.rust-lang.org/reference/runtime.html - -[^benchmarks]: We had a bit of difficult showing beneficial results for async and still unsure whether these results are a good reflection of the benefits of async. You can view the results [here](https://github.com/kaleidawave/sync-vs-threads-vs-async-rust-bench/actions/runs/2517638422) and the full benchmarking code [here](https://github.com/kaleidawave/sync-vs-threads-vs-async-rust-bench). diff --git a/www/_blog/2022-06-23-generative-metatag-images.mdx b/www/_blog/2022-06-23-generative-metatag-images.mdx deleted file mode 100644 index 81d5578f3..000000000 --- a/www/_blog/2022-06-23-generative-metatag-images.mdx +++ /dev/null @@ -1,297 +0,0 @@ ---- -title: Generative metatag images in Rust -description: Creating images in Rust using svgs -author: ben -tags: [rust, tutorial] -thumb: generative-meta-images.png -cover: generative-meta-images.png -date: "2022-06-23T15:00:00" ---- - -This blog post is powered by shuttle! The serverless platform built for Rust. - -### What open graph tags are - -Links are bare and unreadable. They can contain symbols to parse and cannot contain spaces. - -`https://www.shuttle.rs/blog/2022/06/16/a-short-introduction-to-async-rust` - -The above url isn't the most user friendly way of understanding what the post contains. With referrer parameters and such it only gets more unreadable. - -Meta tags are special HTML elements that you can add to HTML responses which show nicer previews: - -![](https://i.imgur.com/RzgMfUs.png) - -You can get this additional preview by setting the following HTML elements inside the `` tag. - -```html - - - - - - - - - - - - - - - - - -``` - -These tags are easily scrapable[^scrapable] by bots which allow them to be added to places where links can be shared, such as messages and tweets. Unfortuantly meta tags don't really have a specification which is why it is best to include both the [open graph protocol](https://ogp.me/) and the [twitter card](https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/getting-started) specific tags. - -When links are shared with these tags in the response, the platform can add the adornments to the message. - -These previews make it easier to see what the content is before following the link. https://metatags.io/ is a great site if you want to preview what the meta tags look like. - -### Creating open graph tags and images - -The specific tag of interest here is: - -```html - - -``` - -Here the `content` is a url to an image. In the case of a blog post, we create specific graphics for it, upload it as an asset then set the URL to the path of the uploaded asset. - -This is fine for static content. However for *dynamic* pages which may be user generated content, manual image creation isn't really possible. You can also use this method if you don't have individual custom meta images for each of your static posts. - -A while back GitHub added custom images for links on pull request, which includes information about the pull request. They even wrote a [blog post about how they did it]( -https://github.blog/2021-06-22-framework-building-open-graph-images/). - -I really like the result, however wondered if there was a alternative to the way they implemented it. GitHub uses a headless browser[^headless-browser] to do this which is less portable and includes spinning up a execessive process to generate a simple image. - -In this post we'll attempt to create similar graphics using lowerlevel libraries and Rust. - -### Image generation in Rust - -To easily create graphics we will be using SVG. It's the most used format for vector graphics and supports embedding text, images and shapes. Since it's a vector graphic, shapes and text remain crisp no matter the size of the output image. It's readable and easily modifiable. - -The problem is that open graph images don't support displaying SVGs in previews due to the fact they are more complex of a format to render. - -So we have to make a step to turn our SVGs into another image format. - -### The scalable vector graphic format - -We will start exploring the format with a simple SVG with three shapes in different colors and a rectangle used to give the graphic a white background. - -```svg - - - - - - -``` - -SVGs renders line by line, so the white box will be at the behind, rendering the shapes in front. - -![](/images/blog/metatag-shapes.png) - -#### Turning SVGS into WEBP images with Rust - -We can draw images in Rust using [resvg](https://docs.rs/resvg/latest/resvg) which handles rendering SVGs. It expects a parsed svg tree from [usvg](https://docs.rs/usvg/latest/usvg) so we'll also be needing that. Internally it uses [tiny_skia](https://docs.rs/tiny-skia/latest/tiny_skia/) which is a "tiny Skia subset ported to Rust". Resvg and tiny skia have all the building blocks we need to do basic image generation. We'll also use Pixmap which holds the pixels that we will be generating and then encode it in webp format[^png-output] to minimize output file size. - -`cargo add resvg tiny-skia usvg webp` - -```rust -use resvg::render; -use std::{error::Error, fs, time::Instant}; -use tiny_skia::{Pixmap, Transform}; -use usvg::{Options, Tree}; -use std::fs; - -const WIDTH: u32 = 1200; -const HEIGHT: u32 = 630; - -fn main() -> Result<(), Box> { - // Read in the svg template we have - let svg = include_str!("shapes.svg"); - - // Create a new pixmap buffer to render to - let mut pixmap = Pixmap::new(WIDTH, HEIGHT) - .ok_or("Pixmap allocation error")?; - - // Use default settings - let mut options = Options::default(); - - // Build our string into a svg tree - let tree = Tree::from_str(svg, &options.to_ref())?; - - // Render our tree to the pixmap buffer, using default fit and transformation settings - render( - &tree, - usvg::FitTo::Original, - Transform::default(), - pixmap.as_mut(), - ); - - // Encode our pixmap buffer into a webp image - let encoded_buffer = - webp::Encoder::new(pixmap.data(), webp::PixelLayout::Rgba, WIDTH, HEIGHT).encode_lossless(); - let result = encoded_buffer.deref(); - - // Write the result - fs::write("image.webp", result)?; - - Ok(()) -} -``` - -The above code generate a `image.webp` with the colorful shape image shown above. - -## Going further - -Lets add some text to the graphic. We could use the default Times New Roman font - but let's get a little more fancy. [Google Fonts](https://fonts.google.com/) is a great resource for free font files. You can download any of the families on there and extract the specific `.ttf` font you want in and include it in the binary using `include_bytes!()`. In this demo I am using [Inter](https://fonts.google.com/specimen/Inter). - -```rust -// ... -let mut options = Options::default(); - -options - .fontdb - .load_font_data(include_bytes!("Inter.ttf").to_vec()); - -// ... -``` - -### Templating - -As our page will be dynamic, we'd like to insert strings defined in our Rust code onto the SVG. - -To do this we'll use the templating engine [liquid](https://crates.io/crates/liquid). (`cargo add liquid`) - -```svg - - - - {{ text }} - - -``` -We can add a new `text` node that is positioned in the center of the graphic. Using `font-family="Inter"` we can specify the font to be Inter. Liquid uses double braces ``{{ ... }}`` for interpolation. - -In our Rust code we'll change the string we use to build the tree to be the output of our of liquid template. The `liquid::object!` macro sets the data we we'll be rendering. - -```rust -let template = liquid::ParserBuilder::with_stdlib() - .build() - .unwrap() - .parse(include_str!("template.svg")) - .unwrap(); - -let globals = liquid::object!({ - "text": "test" -}); - -let svg = template.render(&globals).unwrap(); -// Build our string into a svg tree -let tree = Tree::from_str(&svg, &options.to_ref())?; -``` - -Which will render the following: - -![](/images/blog/metatag-test-text.png) - -### Adding images - -So far we have seen shapes and text. We're gonna step it up a bit by adding an image to the SVG. There are many ways to add a images to an SVG but we will use `` - -```svg - - - - - - - - - - {{ text }} - - -``` - -The pattern includes a `` with a href that points to the one and only ferris. - -However `resvg` looks up images in the filesystem by default so we have to rewrire the handler which turns paths into binary image representation. We can do that using `reqwest` and its blocking client (add `reqwest` using `cargo add reqwest -F blocking`). - -We change the options to a custom function which gets the response, figures out the encoding and pulls out the images bytes: - -```rust -let mut options = Options { - image_href_resolver: ImageHrefResolver { - resolve_string: Box::new(move |path: &str, _| { - let response = reqwest::blocking::get(path).ok()?; - let content_type = response - .headers() - .get("content-type") - .and_then(|hv| hv.to_str().ok())? - .to_owned(); - let image_buffer = response.bytes().ok()?.into_iter().collect::>(); - match content_type.as_str() { - "image/png" => Some(ImageKind::PNG(Arc::new(image_buffer))), - // ... excluding other content types - _ => None, - } - }), - ..Default::default() - }, - ..Default::default() -}; -``` - -And now we have: - -![](/images/blog/metatag-ferris.png) - -## Benchmarking - -Compared to the headless browser technique this process is faster. While doing a lot of the same things that the headless browser process was doing, we have picked out the only part we wanted, the svg renderer. - -With some rough benchmarks the Rust loading, rendering and encoded was two times faster than the nodejs puppeteer equivalent (100ms vs 200ms). - -This time accounts for the startup time in the nodejs version. If you aren't retaining the browser window then the results are even more noticeable. Generating one of images (*cold start*) the Rust version is 7x faster. - -Aside from rendering performance the Rust version is self contained, only the compiled binary is needed to generate the image. No having to worry about whether chromium is in the environment. This is huge benefit if you are doing image generation in a serverless environment. - -Also the headless browser version was harder to work with, importing fonts and setting the output size was considerably more complicated. - -## Conclusion - -Hopefully this was a interesting post and taught some things about generating images in Rust. This technique can be used for other types of image generation not just for meta tag results. - -To complete the result all you need to do is hook up a service for the url in the meta tag. Rather than saving the image to the file system you would then return send the bytes back over the wire. For images that aren't updated you should be caching the images that are generated as to not regenerate them on every request. - -[Full code for the demo is here](https://github.com/kaleidawave/image-generation-rust) - -And if you are looking for a service to host your new procedurally generated meta tag images, why not try shuttle: - -## [Shuttle](https://www.shuttle.rs/): Stateful Serverless for Rust - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out Shuttle](https://docs.rs/shuttle-service/latest/shuttle_service/). - -
    - -[^png-output]: If you just want png output then: `let encoded_buffer = pixels.encode_png().unwrap();` - -[^scrapable]: HTML elements in a response can easily parsed without having to run JavaScript - -[^headless-browser]: A browser which is controlled via code. [puppeteer](https://developer.chrome.com/docs/puppeteer/) and [selenium](https://www.selenium.dev/) are good examples. diff --git a/www/_blog/2022-06-30-error-handling.mdx b/www/_blog/2022-06-30-error-handling.mdx deleted file mode 100644 index 06d45104e..000000000 --- a/www/_blog/2022-06-30-error-handling.mdx +++ /dev/null @@ -1,523 +0,0 @@ ---- -title: More than you've ever wanted to know about errors in Rust -description: A (mostly) complete guide to error handling in Rust -author: ben -tags: [rust, tutorial] -thumb: ferris-error-handling.png -cover: ferris-error-handling.png -date: "2022-06-30T18:00:00" ---- - -This blog post is powered by shuttle! The serverless platform built for Rust. - ---- - -To quote the Rust Book, 'errors are a fact of life in software'. This post goes -over how to handle them. - -Before talking about recoverable errors and the `Result` type, let's first -touch on unrecoverable errors - a.k.a panics. - -## Panics - -[Panics](https://doc.rust-lang.org/std/macro.panic.html) are exceptions a program can throw. It stops all execution in the current thread. When a panic is thrown it returns a short description of what went wrong as well as information about the position of the the panic. - -```rust -fn main() { - panic!("error!"); - println!("Never reached :("); -} -``` - -Running the above causes: - -``` -thread 'main' panicked at 'error!', examples\panics.rs:2:5 -``` - -They are similar to `throw` in JavaScript and other languages, in that they -don't require an annotation on the function to run and they can pass through -function boundaries. However in Rust, panics cannot be recovered from, there is no way to incept a panic in the current thread. - -```rust -fn send_message(s: String) { - if s.is_empty() { - panic!("Cannot send empty message"); - } else { - // ... - } -} -``` - -The `send_message` function is fallible (can go wrong). If this is called -with an empty message then the program stops running. There is no way for the callee to track that an error has occurred. - -For recoverable errors, Rust has a type for error handling in the standard -library called a **`Result`**. It is a generic type, which means the result -and error variant can basically be whatever you want. - -```rust -pub enum Result { - Ok(T), - Err(E), -} -``` - -## Basic error creation and handling - -At the moment our `send_message` function doesn't return anything. This means no information can be received by the callee. We can change the definition to instead return a `Result` and rather than panicking we can early return a `Result::Err`. - -```rust -fn send_message(s: String) -> Result<(), &'static str> { - if s.is_empty() { - // Note the standard prelude includes `Err` so the `Result::Err` and `Err` are equivalent - return Result::Err("message is empty") - } else { - // ... - } - Ok(()) -} -``` - -Now our function actually returns information about what went wrong we can handle it when we call it: - -```rust -if let Err(send_error) = send_message(message) { - show_user_error(send_error); -} -``` - -### Rust knows when a Result is unused. - -In the above example we inspect the value of the item and branch on it. -However, if we didn't inspect and handle the returned Result then the Rust -compiler gives us a helpful warning about it so that you don't forget to -explicitly deal with errors in your program. - -``` -| send_message(); -| ^^^^^^^^^^^^^^^ -= note: `#[warn(unused_must_use)]` on by default -= note: this `Result` may be an `Err` variant, which should be handled -``` - -### Examples of `Result` in the standard library - -`Result` can be found in most libraries. One of my favorite examples is the -return type of the [FromStr::from_str](https://doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str) trait method. With [str::parse](https://doc.rust-lang.org/std/primitive.str.html#method.parse) (which uses the `FromStr` trait) we can do the following: - -```rust -fn main() { - let mut input = String::new(); - std::io::stdin().read_line(&mut input).unwrap(); - - match input.trim_end().parse::() { - Ok(number) => { - dbg!(number); - } - Err(err) => { - dbg!(err); - } - }; -} -``` - -(We'll ignore the `unwrap` for now 😉) - -```js -$ cargo r --example input -q -10 -[examples\input.rs:7] number = 10.0 - -$ cargo r --example input -q -100 -[examples\input.rs:7] number = 100.0 - -$ cargo r --example input -q -bad -[examples\input.rs:10] err = ParseFloatError { - kind: Invalid, -} -``` - -Here we can see when we type in a number we get a `Ok` variant with the number else we get a [ParseFloatError](https://doc.rust-lang.org/std/num/struct.ParseFloatError.html) - -## Files, networks and databases - -**All errors occur when you interact with the outside world or things -outside the Rust runtime**. One of the places where a lot of errors can -occur is interacting with the file system. The `File::open` function -attempts to open a file. This can fail for a variety of reasons. The -filename is invalid, the file doesn't exist or you simply don't have -permission to read the file. Notice the errors are well-defined and known -before-hand. You can even access the error variants with the [`kind`](https://doc.rust-lang.org/std/io/struct.Error.html#method.kind) function -and in order to implement your program logic or return an instructive error -message to the user. - -### Aliasing Results and errors - -When you're working on a project you'll often find yourself repeating -yourself when it comes to return types in function signatures: - -```rust -fn foo() -> Result { -... -} -``` - -To give a concrete example, all functions which operate on the file system have -the same -errors (file not exists, invalid permissions). [io::Result](https://doc.rust-lang.org/std/io/type.Result.html) is a alias over a result but means that every function does not have to specify the error type: - -```rust -pub type Result = Result; -``` - -If you have an API which has a common error type, you may want to -consider this pattern. - -### The question mark operator - -One of the best things about Results is the question mark operator, The -question mark operator can short circuit Result -error values. Let's look at a simple function which uploads text from a file. -This can error in a bunch of different ways: - -```rust -fn upload_file() -> Result<(), &'static str> { - let text = match std::fs::read_to_string("file.txt").map_err(|_| "read file error") { - Ok(value) => value, - Err(err) => { - return err; - } - }; - if let Err(err) = upload_text(text) { - return err - } - Ok(()) -} -``` - -Hang on, we're writing Rust not Go! - -If a `?` is postfixed on to a Result (or anything that implements [`try`](https://doc.rust-lang.org/std/ops/trait.Try.html) so also `Option`) we can -obtain a functionally equivalent outcome with a much more readable and -concise syntax. - -```rust -fn upload_file() -> Result<(), &'static str> { - let text = std::fs::read_to_string("file.txt").map_err(|_| "read file error")?; - upload_text(text)?; - Ok(()) -} -``` - -As long as the calling function also returns a `Result` with the -same `Error` type, `?` saves a ton of explicit code being written. Moreover, -the question-mark implicitly runs [Into::into](https://doc.rust-lang.org/std/convert/trait.Into.html#tymethod.into) -(which is automatically implemented for [From](https://doc.rust-lang.org/std/convert/trait.From.html) implementors) on the error value. So we don't have to worry about converting the error before we use the operator: - -```rust -// This derive an into implementation for `std::io::Error -> MyError` -#[derive(derive_enum_from_into::EnumFrom)] -enum MyError { - IoError(std::io::Error) - // ... -} - -fn do_stuff() -> Result<(), MyError> { - let file = File::open("data.csv")?; - // ... -} -``` - -We will look at more patterns for combining error types later! - -## [The Error trait](https://doc.rust-lang.org/std/error/trait.Error.html) - -The [Error](https://doc.rust-lang.org/std/error/trait.Error.html#) trait is -defined in the standard library. It basically represents the expectations of -error values - values of type `E` in `Result`. -[The Error trait is implemented for many errors](https://doc.rust-lang.org/std/error/trait.Error.html#implementors) -and provides a unified API for information on errors. The Error trait is a bit needy and requires that the error implements both [Debug](https://doc.rust-lang.org/std/fmt/trait.Debug.html) and [Display](https://doc.rust-lang.org/std/fmt/trait.Display.html). While it can be cumbersome to implement we will see some helper libraries for doing so later on. - -In the standard library [VarError](https://doc.rust-lang.org/std/env/enum.VarError.html) (for reading environment variables) and [ParseIntError](https://doc.rust-lang.org/std/num/struct.ParseIntError.html) (for parsing a string slice as a integer) are different errors. When we interact them we need to differentiate between the types because they have different properties and different stack sizes. To build a combination of them we could build a sum type using an enum. Alternatively we can use dynamically dispatched traits which handle varying stack sized items and other type information. - -Using the above mentioned try syntax (`?`) we can convert the above errors to be dynamically dispatched. This makes it easy to handle different errors without building enums to combine errors. - -```rust -fn main() -> Result<(), Box> { - let key = std::env::var("NUMBER_IN_ENV")?; - let number = key.parse::()?; - println!("\"NUMBER_IN_ENV\" is {}", number); - Ok(()) -} -``` - -While this is an easy way to handle errors, it isn't easy to differentiate -between the types and can make handling errors in libraries hard. More information on this later. - -### The Error trait vs Results and enums - -One thing when using an enum is we can use `match` to branch on the enum -error variants. On the other hand, with the `dyn` trait unless you go down -the down casting path it is very hard to get specific information about the -error: - -```rust -match my_enum_error { - FsError(err) => { - report_fs_error(err) - }, - DbError(DbError { err, database }) => { - report_db_error(database, err) - }, -} -``` - -For reusable libraries it is better to use enums to combine errors so that -users of your library can handle the specifics themselves. But for CLIs and -other applications using the trait can be a lot simpler. - -## Methods on Result - -Result and Option contains many useful functions. Here are some functions I -commonly use: - -### [Result::map](https://doc.rust-lang.org/std/result/enum.Result.html#method.map) - -This maps or converts the `Ok` value if it exists. This can be more concise -than using the `?` operator. - -```rust -fn string_to_plus_one(s: &str) -> Result { - s.parse::().map(|num| num + 1) -} -``` - -### [Result::ok](https://doc.rust-lang.org/std/result/enum.Result.html#method.ok) - -Useful for converting Results to Options - -```rust -assert_eq!(Ok(2).ok(), Some(2)); -assert_eq!(Err("err!").ok(), None); -``` - -### [Option::ok_or_else](https://doc.rust-lang.org/std/option/enum.Option.html#method.ok_or_else) - -Useful for going the other way in converting from Options to Results - -```rust -fn get_first(vec: &Vec) -> Result<&i32, NotInVec> { - vec.first().ok_or_else(|| NotInVec) -} -``` - -### Error handling for iteration - -Using results in iterator chains can be a little confusing. Luckily `Result` -implements [collect](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect). -We can use this to short circuit an iterator if an error -occurs. In the following, if all the `parse`s succeed then we get collected vec of numbers result. If one fails then it instead returns a Result with the failing Err. - -```rust -fn main() { - let a = ["1", "2", "not a number"] - .into_iter() - .map(|a| a.parse::()) - .collect::, _>>(); - dbg!(a); -} -``` - -``` -[examples\iteration.rs:6] a = Err( ParseFloatError { kind: Invalid, }, ) -``` - -Removing the `"not a number"` entry - -``` -[examples\iteration.rs:3] a = Ok( [ 1.0, 2.0, ], ) -``` - -Because Rust iterators are *piecewise* and lazy the iterator can short circuit without evaluating parse on any of the later items. - -## More Panic - -### Special panics - -`todo!()`, `unimplemented!()`, `unreachable!()` are all wrappers for `panic! -()` which but are specialized to their situation. Panics have a special [`!`](https://doc.rust-lang.org/reference/types/never.html) -type, called the 'never type', which represents the result of computations -that never complete (also means it can be passed anywhere): - -```rust -fn func_i_havent_written_yet() -> u32 { - todo!() -} -``` - -Sometimes there is Rust code which the compiler cannot properly infer is -valid. For this type of situation, the `unreachable!` panic can be used: - -```rust -fn get_from_vec_else_zero(a: Vec) -> i32 { - if let Some(value) = a.get(2) { - if let Some(prev_value) = a.get(1) { - prev_value - } else { - unreachable!() - } - } else { - 0 - } -} -``` - -### Unwrapping - -`unwrap` is a method on `Result` and `Option`. They return the `Ok` or `Some` -variant or else panic... - -```rust -// result.unwrap() - -let value = if let Ok(value) = result { - value -} else { - panic!("Unwrapped!") -}; -``` - -The uses-cases for this are developer error and situations the compiler can't -quite figure out. -If you are just trying something and don't want to set up a full error handling system then they can be used to ignore compiler warnings. - -Even if the situation calls for `unwrap` you are better off using `expect` -which has an accompanying message - you'll be thanking your past self when the -`expect` error message helps you find the root cause of an issue 2 weeks -down the line. - -### Panics in the standard library - -It is important to note that some of the APIs in the standard library *can* -panic. You should look out for these annotations in the docs. One of them is -[Vec::remove](https://doc.rust-lang.org/std/vec/struct.Vec.html#panics-6). -If you use this you should ensure that the argument is in its indexable range. - -```rust -fn remove_at_idx(a: usize, vec: &mut Vec) -> Option { - if a < idx.len() { - Some(vec.remove(a)) - } else { - None - } -} -``` - -## Handling multiple errors and helper crates: - -Handling errors from multiple libraries and APIs can become challenging as -you have to deal with a bunch of different types. They are different sizes -and contain different information. To unify the types we have to build a sum -type using an enum, in order to ensure they have the same size at compile time. - -```rust -enum Errors { - FileSystemError(..), - StringParseError(..), - NetworkError(..), -} -``` - -Some crates for making creating these unifying enums easier: - -### [thiserror](https://crates.io/crates/thiserror) - -`thiserror` provides a derive implementation which adds the Error trait for us. -As previously mentioned, to implement Error we have to implement display and -thiserrors' `#[error]` attributes provide templating for the displayed errors. - -```rust -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum DataStoreError { - #[error("data store disconnected")] - Disconnect(#[from] io::Error), - #[error("the data for key `{0}` is not available")] - Redaction(String), - #[error("invalid header (expected {expected:?}, found {found:?})")] - InvalidHeader { - expected: String, - found: String, - }, - #[error("unknown data store error")] - Unknown, -} -``` - -### [anyhow](https://crates.io/crates/anyhow) - -`anyhow` provides an ergonomic and idiomatic alternative to explicitly -handling errors. It is similar to the previously mentioned error trait but -has additional features such as adding context to thrown errors. - -This is really, really, useful when you want to convey errors to an -application's users in a context-aware fashion: - -```rust -use anyhow::{bail, Result, Context}; - -fn main() -> Result<()> { - println!("Hello World!"); - func1().context("while calling func1")?; - Ok(()) -} - -fn func1() -> Result<()> { - func2().context("while calling func2") -} - -fn func2() -> Result<()> { - bail!("Hmm something went wrong ") -} -``` - -``` -Error: while calling func1 - -Caused by: - 0: while calling func2 - 1: Hmm something went wrong -``` - - -Similar to the `Error` trait, `anyhow` suffers from the fact you can't match on -`anyhow`'s result error variant. This is why it is suggested in `anyhow`'s -docs to use `anyhow` for applications and `thiserror` for libraries. - -### [eyre](https://crates.io/crates/eyre) - -Finally, `eyre` is a fork of `anyhow` and adds more backtrace information. -It's highly customisable and using [color-eyre](https://lib.rs/crates/color-eyre) we get colors in our panic messages - a little color -always brightens up the dev experience. - -``` -The application panicked (crashed). -Message: test -Location: examples\color_eyre.rs:6 - - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - ⋮ 13 frames hidden ⋮ - 14: core::ops::function::FnOnce::call_once,eyre::Report>, 1, 18446744073709551615, Err> (*)(),tuple$<> > - at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c\library\core\src\ops\function.rs:227 - ⋮ 17 frames hidden ⋮ -``` - -## [Shuttle](https://www.shuttle.rs/): Stateful Serverless for Rust - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out Shuttle](https://docs.rs/shuttle-service/latest/shuttle_service/). diff --git a/www/_blog/2022-07-28-patterns-with-rust-types.mdx b/www/_blog/2022-07-28-patterns-with-rust-types.mdx deleted file mode 100644 index cdfdd10c7..000000000 --- a/www/_blog/2022-07-28-patterns-with-rust-types.mdx +++ /dev/null @@ -1,332 +0,0 @@ ---- -title: Patterns with Rust types -description: Patterns to use types for better safety and design -author: ben -tags: [rust, tutorial] -thumb: rust-type-patterns-banner.png -cover: rust-type-patterns-banner.png -date: "2022-07-28T18:00:00" ---- - -This post introduces some patterns and tricks to better utilise Rust's type system for clean and safe code. -This post is on the advanced side and in general there are no absolutes - these patterns usually need to be evaluated on a case-by-case basis to see if the cost / benefit trade-off is worth it. - -## The new type pattern - -The new type pattern provides encapsulation as well as a guarantee that the right type of value is supplied at compile time. There are several uses and benefits for the new type pattern - let's take a look at some examples. - -### Identifier Separation - -A common representation of an identifier is a number - in this case let's use the unsigned integer type `usize`. - -Let's say we have a function that receives an identifier for a **User** from a database by username. By using a unique username our API retrieves the identifier of the user: - -```rust -fn get_user_id_from_username(username: &str) -> usize -``` - -Let's say we have a similar mechanism for another entity, `Post`. - -If our application is performing operations involving posts **and** users, the logic can get in a mix: - -```rust -let user_id: usize = get_user_id_from_username(username); -let post_id: usize = get_last_post(); - -fn delete_post(post_id: usize) { - // ... -} - -delete_post(user_id); -``` - -Here `get_user_id_from_username` and `get_last_post` both return `usize`s while `delete)_post` also takes a usize. In this code we can accidentally call `delete_post` with a `user_id`, there's nothing in the type system that would stop us from doing that. - -To differentiate between these two identifiers we can use the new type pattern: - -The new type pattern boils down to creating **a new tuple struct with a single item**, in this case `usize` - -```rust -struct UserId(pub usize); -``` - -Now we can change our library definition to return a `UserId` instead of `usize` - -```rust -fn get_user_id_from_username(username: String) -> UserId { - let user_id: usize = ... - UserId(user_id) -} -``` - -Doing similar for the posts system with a `PostId`, when now compiling we get an error on when calling `get_post`. - -```rust - | -14 | get_post(x); - | ^ expected struct `PostId`, found struct `UserId` -``` - -The new-type pattern enforces type-safety at compile time without any performance overhead at runtime. - -### Re-adding functionality to our type - -After creating this new *wrapper* type, we may need to implement some of the behaviour of the type it is encapsulating to appease our compiler. For example consider a set of 'banned' users: - -```rust -let banned_users: HashSet = HashSet::new(); -``` - -The above doesn't compile because our new type `UserId` doesn't implement equality and hashing behaviour whereas `usize` did. To add these traits back we can use the inbuilt derive macro, which generates implementations for our struct based on the single and only field. - -```rust -#[derive(PartialEq, Eq, Hash)] -struct UserId(usize); -``` - -And we're good to go! - -### Contract based programming in Rust / sub-typing - -The new type pattern can also be used to constrain types to only take 'valid' values. - -In the above example we used a wrapper type to enforce *flow* of values, this method also enforces the *content* of the value. In our application we only want usernames to contain **lowercase** alphabetic characters. Wrapping over String we can do this: - -```rust -struct Username(String); -``` - -The only way to create a Username is using the `TryFrom` trait. - -```rust -impl TryFrom for Username { - type Error = String; - - fn try_from(value: String) -> Result { - if value.chars().all(|c| matches!(c, 'a'..='z')) { - Ok(Username(value)) - } else { - Err(value) - } - } -} -``` - -This implementation returns a new `Username` if *all* the characters are lowercase. Else the string is returned and can be reused in logic possibly displaying an error. - -As the string field is private a `Username` cannot be created with `Username(my_string)`. It also cannot be modified by outsiders and invalidate our contract. - -We can now use this structure as an argument to our API. - -```rust -fn create_user(db: &mut DB, username: Username) -> Result<(), CreationError> { - // ... -} -``` - -Since the username is validated to be lowercase ahead of time, the `create_user` function doesn't care about whether the username is valid inside in its own scope. - -This can lead to easier error handling. `CreationError` doesn't have to include a variant for the if the username has invalid characters. - -Although **the only safe way** to construct if through the validator `TryFrom` trait, the `Username` can be created through unsafe transmute (casting the bits of one value to the type of another without checks). This is normally fine though as with unsafe you are introducing undefined behaviour anyway. - -```rust -let string = String::new("muahahaha 👿"); -let bad_username = unsafe { std::mem::transmute::(string) }; -dbg!(bad_username); -``` - -### Wrapping vs canonical type - -Our wrapped type is great from the outside, however we are relying on logic internal to the type to validate our contract. - -If we want to we can be really drill down on the structure of our username. Here we also enforce that the username has to be between four and ten letters. - -```rust -#[rustfmt::skip] -enum Alphabet { - A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z -} - -enum Username { - FourLetters([Alphabet; 4]), - FiveLetters([Alphabet; 5]), - SixLetters([Alphabet; 6]), - SevenLetters([Alphabet; 7]), - EightLetters([Alphabet; 8]), - NineLetters([Alphabet; 9]), - TenLetters([Alphabet; 10]), -} -``` - -Even though there is no way to make an invalid username (except for unsafe) this is a little over the top 😂. In some edge cases it can be beneficial but in the example above this is clearly overkill. - -### Working with foreign traits on foreign types - -Traits are great. They can be defined on structs and enums, but you may run into some issues when implementing a foreign trait on a foreign type. - -This is by design, and here's why: - -![](/images/blog/rust-trait-rules-diagram.png) - -In our crate the compiler doesn't know when calling `MyTrait` methods on `MyStruct` whether to use the implementation defined in `crate 3` or `crate 4`! [Rust has a set of orphan rules](https://github.com/Ixrec/rust-orphan-rules) to prevent this situation from happening. - -In the situation where you'd like to implement a foreign trait on a foreign type - the 'new type' pattern can come to the rescue yet again: - -```rust -// lives in crate X -trait ToTree { - // ... -} - -fn very_useful_function(something: impl ToTree) -> () { - // .. -} - -// Our crate -struct Wrapper(pub crate_y::MyType); - -impl ToTree for Wrapper { - // ... -} - -// Yay -very_useful_function(Wrapper(foreign_value)) -``` - -One of the gotchas with this is that you have to manually implement the trait. You can't use derive macros, e.g. `#[derive(PartialEq)]` and reach through to the declaration of the wrapped type and read its declaration. You also have to make sure that you can properly implement the trait on the item. `crate_y::MyType` might hide information needed for the implementation 😕. - -Ok - enough with the new type pattern. Let's leave it for a minute and look at some other tricks when working with types in Rust. - -## Using either to unify different types - -Sometimes we have a case where we have a complicated data type - -```rust -enum PostUser { - Single { - username: UserId - }, - Group { - usernames: HashSet - } -} -``` - -We'd like a method that returns an iterator, but we're stuck since we either return a single once iterable ([std::iter::Once](https://doc.rust-lang.org/std/iter/struct.Once.html)) or an iterator over a hashset. These iterators are different types and have different properties, so Rust doesn't like when we try to build a function returning both. - -A Rust function / method can only return one type: - -```rust -impl PostUser { - fn iter(&self) -> impl Iterator + '_ { - match self { - PostUser::User { username } => std::iter::once(username), - PostUser::Group { usernames } => usernames.into_iter(), - } - } -} -``` - -The following will fail because the match arms have different types. - -```rust - | -17 | / match self { -18 | | PostUser::User { username } => std::iter::once(username), - | | ------------------------- this is found to be of type `std::iter::Once<&UserId>` -19 | | PostUser::Group { usernames } => usernames.into_iter(), - | | ^^^^^^^^^^^^^^^^^^^^^ expected struct `std::iter::Once`, found struct `std::collections::hash_set::Iter` -20 | | } - | |_________- `match` arms have incompatible types - | - = note: expected struct `std::iter::Once<&UserId>` - found struct `std::collections::hash_set::Iter<'_, UserId>` -``` - -The [`either` crate](https://crates.io/crates/either) offers a general purpose sum type [that implements many traits](https://docs.rs/either/1.7.0/either/enum.Either.html#trait-implementations). Using `either::Left` for the once iterator and `either::Right` we can build two iterators into what Rust considers as a single type. - -```rust -impl PostUser { - fn iter(&self) -> impl Iterator + '_ { - match self { - PostUser::User { username } => either::Left(std::iter::once(username)), - PostUser::Group { usernames } => either::Right(usernames.into_iter()), - } - } -} -``` - -We could have instead boxed the results and returned `Box>`. The benefit of using either is that it uses static dispatch rather than dynamic dispatch. [enum_dispatch has good performance comparison for using static dispatch over dyn](https://docs.rs/enum_dispatch/latest/enum_dispatch/#the-benchmarks) so if you are on a critical hot path, and you know all the returned types it is faster to use enums to unify types rather than dynamic trait dispatching. - -## Extension traits - -When creating a library we may add some functions for working with existing types (whether in the standard library or a different crate). - -Let's say we are writing a library on top of *serenity* which has models for discord servers (discord refers to them as guilds). - -Let's write a helper function that gets the number of channels in a [Guild](https://docs.rs/serenity/0.11.4/serenity/model/guild/struct.Guild.html). - -```rust -async fn get_number_of_channels( - guild: &serenity::model::Guild, - http: impl AsRef -) -> serenity::Result -``` - -When calling the function we **have to** pass the guild as the first argument. - -```rust -let guild: serenity::model::Guild = // ... -get_number_of_channels(&guild, client); -``` - -But from a design perspective we might prefer to use member notation instead: `guild.get_number_of_channels(client)`. - -We can't use add a direct implementation for a type defined outside our current crate. - -```rust -/ impl serenity::model::Guild { -| fn number_of_channels>(&self, http: T) -> serenity::Result { -| todo!() -| } -| } -|_^ impl for type defined outside of crate. -``` - -To define an associated method on a type outside the crate we must instead make an intermediate 'Extension' trait: - -```rust -trait GuildExt { - fn number_of_channels>(&self, http: T) -> serenity::Result; -} - -impl GuildExt for serenity::model::Guild { - fn number_of_channels>(&self, http: T) -> serenity::Result { - // ... - } -} -``` - -Using the intermediate trait the compiler can reason about when the method exists. To use the method syntax and show the compiler that the extension exists we must import the trait into our scope: - -```rust -use crate::GuildExt; -let guild: serenity::model::Guild = // ... -let number_of_channels = guild.get_number_of_channels(client); -``` - -This pattern is used in the futures crate with the [FutureExt trait](https://docs.rs/futures/0.3.21/futures/future/trait.FutureExt.html). -Here using the trait `FutureExt` provides additional methods to the existing [`Future` trait in Rust's standard library](https://doc.rust-lang.org/std/future/trait.Future.html). Aside from syntax aesthetics, it becomes much easier to find object-specific functions when using an IDE. - -You can use the [easy_ext](https://docs.rs/easy-ext/1.0.0/easy_ext/) for doing this pattern on a single type without having to write the trait / trait definition is generated for you. - -## Conclusion - -We saw how we can use various patterns like the new-type pattern and extension pattern to make our Rust code more ergonomic and take advantage of the type system and compiler to write better code. There is a great book out on [Rust design patterns](https://rust-unofficial.github.io/patterns/intro.html) which covers some of these and many more patterns in Rust. What are your favourite design patterns in Rust? Let us know and we'll cover them next time! - -## [Shuttle](https://www.shuttle.rs/): Stateful Serverless for Rust - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out Shuttle](https://docs.rs/shuttle-service/latest/shuttle_service/). diff --git a/www/_blog/2022-08-04-middleware.mdx b/www/_blog/2022-08-04-middleware.mdx deleted file mode 100644 index e764d700a..000000000 --- a/www/_blog/2022-08-04-middleware.mdx +++ /dev/null @@ -1,422 +0,0 @@ ---- -title: What is server middleware -description: A look at middleware and some implementations in Rust server applications -author: ben -tags: [rust, tutorial] -thumb: middleware-banner.png -cover: middleware-banner.png -date: "2022-08-04T15:00:00" ---- - -In this post we will take a general look into what middleware is, the benefits of the pattern and then how to use middleware in a Rust server application. - -## What is middleware? - -A web server generally provides responses to requests. Very often, the protocol of choice is HTTP. A handler (sometimes called a response callback) is a function which takes a request's data and returns a response. - -Most server frameworks have a system called a 'router' which routes requests based on various parameters - usually the URL path. In HTTP routing is typically a combination of the path and the request method (GET, POST, PUT etc.). The benefit of a router is that it allows splitting per path logic up, which makes building large systems with lots of endpoints easier to manage. - -Individual path handlers are great, but sometimes you want logic which applies to a group of paths or indeed all paths. This is where **middleware** comes in. Unlike a handler, middleware is called on **every request and path** that it's registered on. Like handlers, middleware are functions. - -Middleware is very much **implementor dependent**. We will have a look at some concrete examples, but different frameworks have opted for different tradeoffs in their middleware implementation. Some middleware implementations work on an immutable state and act as a transformer on request and responses. Other frameworks treat the inputs as mutable and can freely modify / mutate the request objects. Some frameworks implement middleware that can fail or short circuit. - -### Middleware as a stack - -Middleware tends to be well-ordered. That is, a request or response passes through middleware in a well-defined order, as each layer processes the request or response and passes it onto the next layer: - -``` - requests - | - v -+----- layer_three -----+ -| +---- layer_two ----+ | -| | +-- layer_one --+ | | -| | | | | | -| | | handler | | | -| | | | | | -| | +-- layer_one --+ | | -| +---- layer_two ----+ | -+----- layer_three -----+ - | - v - responses -``` - -### Applications of middleware - -#### Authentication - -Many routes may want user information. The incoming request contain user information via cookies or http authentication. Rather than every path handler having to deal with extracting the information we can abstract this logic to a request middleware and pass it down to subsequent handlers. - -#### Logging - -Information about which paths users are going to and when can be very useful. With logging middleware we can log and store request information for later analysis. - -Similar to logging is [*server response timings*](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Server-Timing). This is a field / http header, which is standardized for holding timing information about requests. Here our middleware can log the start time of an incoming *request* and the end time on the *response*. Then the middleware can modify the outgoing response to include the timing. This header is often highlighted in developer tools, which can be useful while debugging. It can also be used in chunked / streamed responses where the header of a request might have already been sent by using [Trailer](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Trailer)s. - -#### Compression and other response optimizations - -Middleware can also amend outgoing responses and compress the output via algorithms like gzip and brotli. This removes the responsibility out of handlers and provides a convenient default for all responses. - -And it doesn't have to just be compression of responses, another use case is image resizing. Identifying mobile viewports using information on the request, outgoing responses can instead return smaller images rather than huge 4k images, in the end reducing bandwidth. - -### Structuring applications - -As mentioned above the benefits of the middleware system is that while it is possible to do this stuff individually in each handler, abstracting it moves the responsibility away from the handlers. This can make management simpler and fewer lines of code! - -```rust -fn index() { - let index_page = "..."; - return compress(index_page); -} - -fn about() { - let about_page = "..."; - return compress(about_page); -} - -fn search() { - let search_page = "..."; - return compress(search_page); -} - -Application::build() - .routes([index, about, search]) -``` - -vs - -```rust -fn index() { return "..."; } -fn about() { return "..."; } -fn search() { return "..."; } - -Application::build() - .routes([index, about, search]) - .add_middleware(CompressionMiddleware::new()) -``` - -### Separating out code - -The benefit of middleware *just* being functions is that they can be separated out to different modules or even crates. Many 3rd party services may choose to expose their service as a middleware rather than a system of complicated functions, and having to deal with users passing the correct state into them. - -```rust - .add_middleware(hot_new_server_logging_framework_start_up::Middleware::new()) -``` - -## Comparing middleware implementations in libraries - -### [Rocket](https://rocket.rs/) - -Rocket is a server framework. Rocket's middleware implementation is known as [fairings](https://rocket.rs/v0.5-rc/guide/fairings/#fairings) (yes there are many rocket related puns in the crate). - -From Rocket's fairing documentation: - -> Rocket’s fairings are a lot like middleware from other frameworks, but they bear a few key distinctions: -> -> Fairings cannot terminate or respond to an incoming request directly. -> Fairings cannot inject arbitrary, non-request data into a request. -> Fairings can prevent an application from launching. -> Fairings can inspect and modify the application's configuration. - -To make a fairing in Rocket you have to implement the fairing trait: - -```rust -struct MyCounterFaring { - get_requests: AtomicUsize, -} - -#[rocket::async_trait] -impl Fairing for MyCounterFaring { - fn info(&self) -> Info { - Info { - name: "GET Counter", - kind: Kind::Request - } - } - - async fn on_request(&self, request: &mut Request<'_>, _: &mut Data<'_>) { - if let Method::Get = request.method() { - self.get.fetch_add(1, Ordering::Relaxed); - } - } -} -``` - -Using the `.attach` method it's really simple to add a fairing to a application. - -```rust -#[launch] -fn rocket() -> _ { - rocket::build() - .attach(MyCounterFaring { - get_requests: AtomicUsize::new(0), - }) - .attach(other_fairing) -} -``` - -Rocket's fairings have several hooks. Each of them has a default implementation so can be left out (you don't have to explicitly write a method for each hook). - -#### Requests using `on_request` - -This fires when a request is received. This hook has a mutable reference to the request and so **can modify the request**. "It cannot abort or respond directly to the request; these issues are better handled via request guards or via response callbacks.". - -As an aside, Rocket has a different non-middleware implementation that can be better suited for handlers that might short circuit an error rather than running a handler afterwards. We won't go into it here but if your middleware is fallible [request guards](https://rocket.rs/v0.5-rc/guide/requests/#request-guards) might be a better option - -#### Response using `on_response` - -Similar to `on_request` this has mutable access to the response object (it also has immutable access to the request). Using this hook you can **inject headers** or amend **partial responses (aka 404)**. - -#### General server hooks - -Rocket's fairings go beyond request and responses and can act as hooks into application startup and closing: - -- Ignite (`on_ignite`). Runs before starting the server. Can validate config values, set initial state or abort. -- Liftoff (`on_liftoff`). After server has launched (started) "A liftoff callback can be a convenient hook for launching services related to the Rocket application being launched." -- Shutdown (`on_shutdown`). This hook can be used to wind down services and save state before the application closes. Runs concurrently and no requests are returned before. - -All Rocket fairings have a [info field](https://api.rocket.rs/v0.5-rc/rocket/fairing/trait.Fairing.html#tymethod.info). The kind property decides which hooks the fairing can fire. - -#### Ad hoc fairings - -Simpler middleware using functions can be added using [ad-hoc fairings](https://rocket.rs/v0.5-rc/guide/fairings/#ad-hoc-fairings). If the fairing doesn't have state / data with it, you can bypass needing to create a structure and writing a trait implementation for it and instead write a function. - -Using `AdHoc` and any of the names of the above mentioned hooks we can instead creating a function using a function (+ a string info): - -```rust -.attach(AdHoc::on_liftoff("Liftoff Printer", |_| Box::pin(async move { - println!("...annnddd we have liftoff!"); -}))) -``` - -### [Axum](https://docs.rs/axum/latest/axum/index.html) - -Similar to Rocket, Axum is a HTTP framework for web applications. [Axum middleware](https://docs.rs/axum/latest/axum/index.html#middleware) is based of [tower](https://crates.io/crates/tower) which is a separate crate which deals with lower level base for networking in Rust. Axum and tower middleware is refereed to a 'layers'. - -There are several ways to write middleware for Axum. Similar to standard fairings you can create a type that implements the [Layer trait](https://docs.rs/tower/0.4.13/tower/trait.Layer.html). The layer trait decorates / acts apon the [Service trait](https://docs.rs/tower/0.4.13/tower/trait.Service.html). - -This demo was taken from the [Tower docs](https://docs.rs/tower/0.4.13/tower/trait.Layer.html#log) **and before you get scared off we will see a much simpler way to implement middleware shortly**. - -```rust -pub struct LogLayer { - target: &'static str, -} - -impl Layer for LogLayer { - type Service = LogService; - - fn layer(&self, service: S) -> Self::Service { - LogService { - target: self.target, - service - } - } -} - -// This service implements the Log behavior -pub struct LogService { - target: &'static str, - service: S, -} - -impl Service for LogService -where - S: Service, - Request: fmt::Debug, -{ - type Response = S::Response; - type Error = S::Error; - type Future = S::Future; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.service.poll_ready(cx) - } - - fn call(&mut self, request: Request) -> Self::Future { - // Insert log statement here or other functionality - println!("request = {:?}, target = {:?}", request, self.target); - self.service.call(request) - } -} -``` - -We can register our mew layer (middleware) on a to a Axum application using `.layer` (similar to `.attach` in Rocket). - -```rust -use axum::{routing::get, Router}; - -async fn handler() {} - -let app = Router::new() - .route("/", get(handler)) - .layer(LogLayer { target: "our site" }) - // `.route_layer` will only run the middleware if a route is matched - .route_layer(TimeOutLayer) -``` - -There is also [`ServiceBuilder`](https://docs.rs/tower/0.4.13/tower/struct.ServiceBuilder.html) which is the recommended way to chain layers. They are executed in the reverse order to which they are attached (`layer_one` runs first). - -```rust -Router::new() - .route("/", get(handler)) - .layer( - ServiceBuilder::new() - .layer(layer_three) - .layer(layer_two) - .layer(layer_one) - ) -``` - -#### A simpler way - -Similar to Rocket's trait fairings and ad hoc fairings there are two ways to write middleware for Axum using [middleware::from_fn](https://docs.rs/axum/latest/axum/middleware/fn.from_fn.html). - -Using a demo from the [Axum docs](https://docs.rs/axum/latest/axum/middleware/index.html#writing-middleware). - -```rust -async fn auth(req: Request, next: Next) -> Result { - let auth_header = req.headers() - .get(http::header::AUTHORIZATION) - .and_then(|header| header.to_str().ok()); - - match auth_header { - Some(auth_header) if token_is_valid(auth_header) => { - Ok(next.run(req).await) - } - _ => Err(StatusCode::UNAUTHORIZED), - } -} -``` - -```rust -let app = Router::new() - .route("/", get(|| async { /* ... */ })) - .route_layer(middleware::from_fn(auth)); -``` - -#### Existing ready to use layers: - -As Axum is built on `tower` there are some great readily importable middleware that can be added as layers. - -One of those is that [TraceLayer](https://docs.rs/tower-http/0.3.4/tower_http/trace/index.html) that logs requests coming in and responses going out: - -``` -Mar 05 20:50:28.523 DEBUG request{method=GET path="/foo"}: tower_http::trace::on_request: started processing request -Mar 05 20:50:28.524 DEBUG request{method=GET path="/foo"}: tower_http::trace::on_response: finished processing request latency=1 ms status=200 -``` - -There are a [bunch of layers in the tower_http crate](https://docs.rs/tower-http/0.3.4/tower_http/trace/index.html?search=struct%3ALayer) that can be used instead of writing your own. - -## Building authentication using our own middleware - -Let's play around with a realistic example and build a middleware layer for our own application that manages authentication. In our route handlers we might want to know detailed information about the user that made the request. Rather than having to deal with passing around request information we can encapsulate this logic in middleware. - -We'll be using Axum for this demo. The demo is not public at the moment, look out for a future post about authentication for when the full demo will be public! - -### Cookies as user state - -Cookies can be used for maintaining user state. When a user cookie is set on the frontend it's sent with every request. We'll skip over how the cookie got there 😅 and leave it for a future tutorial. - -Either way we want to add middleware which *injects* the following the struct into current request. - -```rust -#[derive(Clone)] -struct AuthState(Option<(SessionId, Arc>)>, Database); -``` - -We have got a bit fancy here. Rather than making a database request on every request we instead save the database pool a mutable store ([OnceCell](https://docs.rs/once_cell/latest/once_cell/sync/struct.OnceCell.html)) and the session id. With all this information it means that getting user state can be lazy or not done at all. - -We will build an `auth` function which builds up this lazy `AuthState` struct with the required information by parsing the headers of a request. - -```rust -async fn auth( - mut req: Request, - next: Next, - database: Database, -) -> axum::response::Response { - // Assuming we only have one cookie - let key_pair_opt = req - .headers() - .get("Cookie") - .and_then(|value| value.to_str().ok()) - .map(|value| - value - .split_once(';') - .map(|(left, _)| left) - .unwrap_or(value) - ) - .and_then(|kv| kv.split_once('=')); - - let auth_state = if let Some((key, value)) = key_pair_opt { - if key != USER_COOKIE_NAME { - None - } else if let Ok(value) = value.parse::() { - Some(value) - } else { - None - } - } else { - None - }; - - req.extensions_mut().insert(AuthState( - auth_state - .map(|v| ( - v, - Arc::new(OnceCell::new()), - database - )), - )); - next.run(req).await -} -``` - -*this is a bit ad hoc parsing, proper parsing should account for multiple cookies etc and could be neater 😆*. - -At the end we do two **important things**. First we *extend* the request with this lazy auth state: `req.extensions_mut().insert(...)`. Secondly we run the rest of the request stack: `next.run(req).await`. - -Unlike Rocket fairings, in Axum we could return our own Response from the middleware and not run the handler by skipping `next.run(req).await`. - -### Attaching the middleware - -We first attach it to out Axum application using: - -```rust -let middleware_database = database_pool.clone(); - -Router::new() - .layer(middleware::from_fn(move |req, next| { - auth(req, next, middleware_database.clone()) - })) -``` - -Because our middleware also needs application state (in this case the database pool) we create a intermediate function which pulls that in. - -### Using the middleware - -We can now use the state injected by the middleware using a [Extension](https://docs.rs/axum/latest/axum/struct.Extension.html) parameter. - -```rust -async fn me( - Extension(current_user): Extension, -) -> Result { - if let Some(user) = current_user.get_user().await { - Ok(show_user(user)) - } else { - Err(error_page("Not logged in")); - } -} -``` - -I was actually surprised when this worked, Axum's handler parameter system is quite magic. - -## Conclusion - -In summary middleware helps you abstract common logic for paths into reusable stateful and stateless objects. Middleware might not be applicative for every scenario but when you need it, it is super useful! - -## [Shuttle](https://www.shuttle.rs/): Stateful Serverless for Rust - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out Shuttle](https://docs.rs/shuttle-service/latest/shuttle_service/). diff --git a/www/_blog/2022-08-11-authentication-tutorial.mdx b/www/_blog/2022-08-11-authentication-tutorial.mdx deleted file mode 100644 index c07dc31a4..000000000 --- a/www/_blog/2022-08-11-authentication-tutorial.mdx +++ /dev/null @@ -1,701 +0,0 @@ ---- -title: Building an authentication system in Rust using session tokens -description: Building authentication into a website with Rust and SQL -author: Ben -tags: [rust, tutorial, axum, sql] -thumb: authentication-banner.png -cover: authentication-banner.png -date: "2022-08-17T15:00:00" ---- - -Most websites have some kind of user system. But implementing authentication can be a bit complex. It requires several things working together. - -Making sure the system is secure is daunting. How do we know others cannot easily log into accounts and make edits on other people's behalf? And building stateful systems is difficult. - -Today we will look at a minimal implementation in Rust. For this demo we won't be using a specific authentication library, instead writing from scratch using our own database and backend API. - -We will be walking through implementing the system including a frontend for interacting with it. We will be using Axum for routing and other handling logic. The [source code for this tutorial can be found here](https://github.com/kaleidawave/axum-shuttle-postgres-authentication-demo). We will then deploy the code on shuttle, which will handle running the server and giving us access to a Postgres server. - -To prevent this post from being an hour long, some things are skipped over (such as error handling) and so might not match up one-to-one with the tutorial. This post also assumes basic knowledge of HTML, web servers, databases and Rust. - -This isn't verified to be secure, use it at your own risk!! - -## Let's get started - -First, we will install shuttle for creating the project (and later for deployment). If you don't already have it you can install it with `cargo install cargo-shuttle`. We will first go to a new directory for our project and create a new Axum app with `cargo shuttle init --axum`. - -You should see the following in `src/lib.rs`: - -```rust -use axum::{routing::get, Router}; -use sync_wrapper::SyncWrapper; - -async fn hello_world() -> &'static str { - "Hello, world!" -} - -#[shuttle_service::main] -async fn axum() -> shuttle_service::ShuttleAxum { - let router = Router::new().route("/hello", get(hello_world)); - let sync_wrapper = SyncWrapper::new(router); - - Ok(sync_wrapper) -} -``` - -### Templates - -For generating HTML we will be using [Tera](https://tera.netlify.app/docs), so we can go ahead and add this with `cargo add tera`. We will store all our templates in a `template` directory in the project root. - -We want a general layout for our site, so we create a base layout. In our base layout, we can add specific tags that will apply to all pages such as a [Google font](https://fonts.google.com/). With this layout all the content will be injected in place of `{% block content %}{% endblock content %}`: - -```html - - - - - - - - Title - - - - - - - {% block content %}{% endblock content %} - - -``` - -And now we can create our first page that will be displayed under the `/` path - -```html - -{% extends "base.html" %} -{% block content %} -

    Hello world

    -{% endblock content %} -``` - -Now we have our template, we need to register it under a Tera instance. Tera has a nice [filesystem-based registration system](https://docs.rs/tera/1.16.0/tera/struct.Tera.html#method.new), but we will use the [`include_str!`](https://doc.rust-lang.org/std/macro.include_str.html) macro so that the content is in the binary. This way we don't have to deal with the complexities of a filesystem at runtime. We register both templates so that the `index` page knows about `base.html`. - -```rust -let mut tera = Tera::default(); -tera.add_raw_templates(vec![ - ("base.html", include_str!("../templates/base.html")), - ("index", include_str!("../templates/index.html")), -]) -.unwrap(); -``` - -We add it via an [Extension](https://docs.rs/axum/latest/axum/struct.Extension.html) (wrapped in `Arc` so that extension cloning does not deep clone all the templates) - -```rust -#[shuttle_service::main] -async fn axum() -> shuttle_service::ShuttleAxum { - let mut tera = Tera::default(); - tera.add_raw_templates(vec![ - ("base.html", include_str!("../templates/base.html")), - ("index", include_str!("../templates/index.html")), - ]) - .unwrap(); - - let router = Router::new() - .route("/hello", get(hello_world)) - .layer(Extension(Arc::new(tera))); - - let sync_wrapper = SyncWrapper::new(router); - Ok(sync_wrapper) -} -``` - -### Rendering views - -Now we have created our Tera instance we want it to be accessible to our get methods. To do this in Axum, we add the extension as a parameter to our function. In Axum, an [Extension](https://docs.rs/axum/latest/axum/struct.Extension.html) is a unit struct. Rather than dealing with `.0` to access fields, we use destructuring in the parameter (if you thought that syntax looks weird). - -```rust -async fn index( - Extension(templates): Extension, -) -> impl IntoResponse { - Html(templates.render("index", &Context::new()).unwrap()) -} -``` - -### Serving assets - -We can create a `public/styles.css` file - -```css -body { - font-family: 'Karla', sans-serif; - font-size: 12pt; -} -``` - -And easily create a new endpoint for it to be served from: - -```rust -async fn styles() -> impl IntoResponse { - Response::builder() - .status(http::StatusCode::OK) - .header("Content-Type", "text/css") - .body(include_str!("../public/styles.css").to_owned()) - .unwrap() -} -``` - -Here we again are using `include_str!` to not have to worry about the filesystem at runtime. [ServeDir](https://docs.rs/tower-http/latest/tower_http/services/struct.ServeDir.html) is an alternative if you have a filesystem at runtime. You can use this method for other static assets like JavaScript and favicons. - -## Running - -We will add our two new routes to the router (and remove the default "hello world" one) to get: - -```rust -let router = Router::new() - .route("/", get(index)) - .route("/styles.css", get(styles)) - .layer(Extension(Arc::new(tera))); -``` - -With our main service we can now test it locally with `cargo shuttle run`. - -![](/images/blog/authentication-demo-screenshot.png) - -Nice! - -## Adding users - -We will start with a user's table in SQL. ([this is defined in schema.sql](https://github.com/kaleidawave/axum-shuttle-postgres-authentication-demo/blob/main/schema.sql)). - -```sql -CREATE TABLE users ( - id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, - username text NOT NULL UNIQUE, - password text NOT NULL -); -``` - -The `id` is generated by the database using a sequence. The `id` is a primary key, which we will use to reference users. It is better to use a fixed value field for identification rather than using something like the `username` field because you may add the ability to change usernames, which can leave things pointing to the wrong places. - -### Registering our database - -Before our app can use the database we have to add sqlx with some features: `cargo add sqlx -F postgres runtime-tokio-native-tls`. We will also add the `shuttle-shared-db` crate with `cargo add shuttle-shared-db -F postgres`. - -Now back in the code we add a parameter with `#[shuttle_shared_db::Postgres] pool: Database`. The `#[shuttle_shared_db::Postgres]` annotation tells shuttle to provision a Postgres database using the [infrastructure from code design](https://www.shuttle.rs/blog/2022/05/09/ifc)! - -```rust -type Database = sqlx::PgPool; - -#[shuttle_service::main] -async fn axum( - #[shuttle_shared_db::Postgres] pool: Database -) -> ShuttleAxum { - // Build tera as before - - let router = Router::new() - .route("/", get(index)) - .route("/styles.css", get(styles)) - .layer(Extension(Arc::new(tera))) - .layer(pool); - - // Wrap and return router as before -} -``` - -### Signup - -For getting users into our database, we will create a post handler. In our handler, we will parse data using multipart. [I wrote a simple parser for multipart that we will use here](https://github.com/kaleidawave/axum-shuttle-postgres-authentication-demo/blob/main/src/utils.rs#L45-L64). The below example contains some error handling that we will ignore for now. - -```rust -async fn post_signup( - Extension(database): Extension, - multipart: Multipart, -) -> impl IntoResponse { - let data = parse_multipart(multipart) - .await - .map_err(|err| error_page(&err))?; - - if let (Some(username), Some(password), Some(confirm_password)) = ( - data.get("username"), - data.get("password"), - data.get("confirm_password"), - ) { - if password != confirm_password { - return Err(error_page(&SignupError::PasswordsDoNotMatch)); - } - - let user_id = create_user(username, password, database); - - Ok(todo!()) - } else { - Err(error_page(&SignupError::MissingDetails)) - } -} -``` - -#### Creating users and storing passwords safety - -When storing passwords in a database, for security reasons we don't want them to be in the exact format as plain text. To transform them away from the plain text format we will use a [cryptographic hash function](https://en.wikipedia.org/wiki/Cryptographic_hash_function) from [pbkdf2](https://crates.io/crates/pbkdf2) (`cargo add pbkdf2`): - -```rust -fn create_user(username: &str, password: &str, database: &Database) -> Result { - let salt = SaltString::generate(&mut OsRng); - // Hash password to PHC string ($pbkdf2-sha256$...) - let hashed_password = Pbkdf2.hash_password(password.as_bytes(), &salt).unwrap().to_string(); - - // ... -} -``` - -With hashing, if someone gets the value in the password field they cannot find out the actual password value. The only thing this value allows is whether a plain text password matches this value. And with [salting](https://en.wikipedia.org/wiki/Salt_(cryptography)) different names are encoded differently. Here all these passwords were registered as *"password"*, but they have different values in the database because of salting. - -```sql -postgres=> select * from users; - id | username | password -----+----------+------------------------------------------------------------------------------------------------ - 1 | user1 | $pbkdf2-sha256$i=10000,l=32$uC5/1ngPBs176UkRjDbrJg$mPZhv4FfC6HAfdCVHW/djgOT9xHVAlbuHJ8Lqu7R0eU - 2 | user2 | $pbkdf2-sha256$i=10000,l=32$4mHGcEhTCT7SD48EouZwhg$A/L3TuK/Osq6l41EumohoZsVCknb/wiaym57Og0Oigs - 3 | user3 | $pbkdf2-sha256$i=10000,l=32$lHJfNN7oJTabvSHfukjVgA$2rlvCjQKjs94ZvANlo9se+1ChzFVu+B22im6f2J0W9w -(3 rows) -``` - -With the following simple database query and our hashed password, we can insert users. - -```rust -fn create_user(username: &str, password: &str, database: &Database) -> Result { - // ... - - const INSERT_QUERY: &str = - "INSERT INTO users (username, password) VALUES ($1, $2) RETURNING id;"; - - let fetch_one = sqlx::query_as(INSERT_QUERY) - .bind(username) - .bind(hashed_password) - .fetch_one(database) - .await; - - // ... -} -``` - -And we can handle the response and get the new user id with the following: - -```rust -fn create_user(username: &str, password: &str, database: &Database) -> Result { - // ... - - match fetch_one { - Ok((user_id,)) => Ok(user_id), - Err(sqlx::Error::Database(database)) - if database.constraint() == Some("users_username_key") => - { - return Err(SignupError::UsernameExists); - } - Err(err) => { - return Err(SignupError::InternalError); - } - } -} -``` - -Great now we have the signup handler written, let's create a way to invoke it in the UI. - -### Using HTML forms - -To invoke the endpoint with multipart we will use an HTML form. - -```html - -{% extends "base.html" %} -{% block content %} -
    - - - - - - - -
    -{% endblock content %} -``` - -Notice the action and method that correspond to the route we just added. Notice also the `enctype` being multipart, which matches what we are parsing in the handler. The above has a few attributes to do some client-side validation, but [in the full demo it is also handled on the server](https://github.com/kaleidawave/axum-shuttle-postgres-authentication-demo/blob/ba71a914055f312636581f5e82172b1078e7b9eb/src/authentication.rs#L124-L133). - -We create a handler for this markup in the same way as done for our index with: - -```rust -async fn get_signup( - Extension(templates): Extension, -) -> impl IntoResponse { - Html(templates.render("signup", &Context::new()).unwrap()) -} -``` - -We can add `signup` to the Tera instance and then add both the get and post handlers to the router by adding it to the chain: - -```rust -.route("/signup", get(get_signup).post(post_signup)) -``` - -### Sessions - -Once signed up, we want to save the logged-in state. We don't want the user to have to send their username and password for every request they make. - -### Cookies and session tokens - -Cookies help store the state between browser requests. When a response is sent down with [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie), then any subsequent requests the browser/client makes will send cookie information. We can then pull this information off of headers on requests on the server. - -Again, these need to be safe. We don't want collisions/duplicates. We want it to be hard to guess. For these reasons, we will represent it as a 128-bit unsigned integer. This has 2^128 options, so a very low chance of a collision. - -We want to generate a "session token". We want the tokens to be cryptographically secure. Given a session id, we don't want users to be able to find the next one. A simple globally incremented u128 wouldn't be secure because if I know I have *session 10* then I can send requests with *session 11* for the user who logged in after. With a cryptographically secure generator, there isn't a distinguishing pattern between subsequently generated tokens. We will use the [ChaCha](https://crates.io/crates/rand_chacha) algorithm/crate (we will add `cargo add rand_core rand_chacha`). [We can see that it does implement the crypto marker-trait confirming it is valid for cryptographic scenarios](https://docs.rs/rand_chacha/0.3.1/rand_chacha/struct.ChaCha8Rng.html#impl-CryptoRng). - -This is unlike [Pseudo-random number generators where you can predict the next *random* number given a start point and the algorithm](https://www.youtube.com/watch?v=-h_rj2-HP2E). This could be a problem if we have our token we can get the session token of the person who logged in after us really easy and thus impersonate them. - -To initialize the random generator we use [SeedableRng::from_seed](https://docs.rs/rand_core/latest/rand_core/trait.SeedableRng.html#tymethod.from_seed). The seed in this case is an initial *state* for the generator. Here we use [OsRng.next_u64()](https://docs.rs/rand_core/latest/rand_core/struct.OsRng.html) which *retrieves randomness from the operating system* rather a seed. We will be doing something similar to the creation of the Tera instance. We must wrap it in an arc and a mutex because generating new identifiers requires mutable access. We now have the following main function: - -```rust -#[shuttle_service::main] -async fn axum( - #[shuttle_shared_db::Postgres] pool: Database -) -> ShuttleAxum { - // Build tera as before - - let random = ChaCha8Rng::seed_from_u64(OsRng.next_u64()) - - let router = Router::new() - .route("/", get(index)) - .route("/styles.css", get(styles)) - .route("/signup", get(get_signup).post(post_signup)) - .layer(Extension(Arc::new(tera))) - .layer(pool) - .layer(Extension(Arc::new(Mutex::new(random)))); - - // Wrap and return router as before -} -``` - -#### Adding sessions to signup - -As well as creating a user on signup, we will create the session token for the newly signed-up user. We post it to the table with our `user_id` - -```rust -type Random = Arc>; - -pub(crate) async fn new_session( - database: &Database, - random: Random, - user_id: i32 -) -> String { - const QUERY: &str = "INSERT INTO sessions (session_token, user_id) VALUES ($1, $2);"; - - let mut u128_pool = [0u8; 16]; - random.lock().unwrap().fill_bytes(&mut u128_pool); - - // endian doesn't matter here - let session_token = u128::from_le_bytes(u128_pool); - - let _result = sqlx::query(QUERY) - .bind(&session_token.to_le_bytes().to_vec()) - .bind(user_id) - .execute(database) - .await - .unwrap(); - - session_token -} -``` - -In the full demo, we use the [new type pattern](https://www.shuttle.rs/blog/2022/07/28/patterns-with-rust-types#the-new-type-pattern) over a u128 to make this easier, but we will stick with a u128 type here. - -Now we have our token, we need to package it into a cookie value. We will do it in the simplest way possible, using `.to_string()`. We will send a response that does two things, sets this new value and returns/redirects us back to the index page. We will create a utility function for doing this: - -```rust -fn set_cookie(session_token: &str) -> impl IntoResponse { - http::Response::builder() - .status(http::StatusCode::SEE_OTHER) - .header("Location", "/") - .header("Set-Cookie", format!("session_token={}; Max-Age=999999", session_token)) - .body(http_body::Empty::new()) - .unwrap() -} -``` - -Now we can complete our signup handler by adding random as a parameter and returning our set cookie response. - -```rust -async fn post_signup( - Extension(database): Extension, - Extension(random): Extension, - multipart: Multipart, -) -> impl IntoResponse { - let data = parse_multipart(multipart) - .await - .map_err(|err| error_page(&err))?; - - if let (Some(username), Some(password), Some(confirm_password)) = ( - data.get("username"), - data.get("password"), - data.get("confirm_password"), - ) { - if password != confirm_password { - return Err(error_page(&SignupError::PasswordsDoNotMatch)); - } - - let user_id = create_user(username, password, &database); - - let session_token = new_session(database, random, user_id); - - Ok(set_cookie(&session_token)) - } else { - Err(error_page(&SignupError::MissingDetails)) - } -} -let session_token = new_session(database, random, user_id); -``` - -### Using the session token - -Great so now we have a token/identifier for a *session*. Now we can use this as a key to get information about users. - -We can pull the cookie value using the following spaghetti of iterators and options: - -```rust -let session_token = req - .headers() - .get_all("Cookie") - .iter() - .filter_map(|cookie| { - cookie - .to_str() - .ok() - .and_then(|cookie| cookie.parse::().ok()) - }) - .find_map(|cookie| { - (cookie.name() == USER_COOKIE_NAME).then(move || cookie.value().to_owned()) - }) - .and_then(|cookie_value| cookie_value.parse::().ok()); -``` - -#### Auth middleware - -[In the last post, we went into detail about middleware. You can read more about it in more detail there](https://www.shuttle.rs/blog/2022/08/04/middleware). - -In our middleware, we will get a little fancy and make the user pulling lazy. This is so that requests that don't need user data don't have to make a database trip. Rather than adding our user straight onto the request, we split things apart. We first create an `AuthState` which contains the session token, the database, and a placeholder for our user `(Option)` - -```rust -#[derive(Clone)] -pub(crate) struct AuthState(Option<(u128, Option, Database)>); - -pub(crate) async fn auth( - mut req: http::Request, - next: axum::middleware::Next, - database: Database, -) -> axum::response::Response { - let session_token = /* cookie logic from above */; - - req.extensions_mut() - .insert(AuthState(session_token.map(|v| (v, None, database)))); - - next.run(req).await -} -``` - -Then we create a method on `AuthState` which makes the database request. - -Now we have the user's token we need to get their information. We can do that using SQL joins - -```rust -impl AuthState { - pub async fn get_user(&mut self) -> Option<&User> { - let (session_token, store, database) = self.0.as_mut()?; - if store.is_none() { - const QUERY: &str = - "SELECT id, username FROM users JOIN sessions ON user_id = id WHERE session_token = $1;"; - - let user: Option<(i32, String)> = sqlx::query_as(QUERY) - .bind(&session_token.to_le_bytes().to_vec()) - .fetch_optional(&*database) - .await - .unwrap(); - - if let Some((_id, username)) = user { - *store = Some(User { username }); - } - } - store.as_ref() - } -} -``` - -Here we cache the user internally using an Option. With the caching in place if another middleware gets the user and then a different handler tries to get the user it results in one database request, not two! - -We can add the middleware to our chain using: - -```rust -#[shuttle_service::main] -async fn axum( - #[shuttle_shared_db::Postgres] pool: Database -) -> ShuttleAxum { - // tera and random creation as before - - let middleware_database = database.clone(); - - let router = Router::new() - .route("/", get(index)) - .route("/styles.css", get(styles)) - .route("/signup", get(get_signup).post(post_signup)) - .layer(axum::middleware::from_fn(move |req, next| { - auth(req, next, middleware_database.clone()) - })) - .layer(Extension(Arc::new(tera))) - .layer(pool) - .layer(Extension(Arc::new(Mutex::new(random)))); - - // Wrap and return router as before -} -``` - -#### Getting middleware and displaying our user info - -Modifying our index Tera template, we can add an "if block" to show a status if the user is logged in. - -```html - -{% extends "base.html" %} -{% block content %} -

    Hello world

    -{% if username %} -

    Logged in: {{ username }}

    -{% endif %} -{% endblock content %} -``` - -Using our middleware in requests is easy in Axum by including a reference to it in the parameters. We then add the username to the context for it to be rendered on the page. - -```rust -async fn index( - Extension(current_user): Extension, - Extension(templates): Extension, -) -> impl IntoResponse { - let mut context = Context::new(); - if let Some(user) = current_user.get_user().await { - context.insert("username", &user.username); - } - Html(templates.render("index", &context).unwrap()) -} -``` - -### Logging in and logging out - -Great we can signup and that now puts us in a session. We may want to log out and drop the session. This is very simple to do by returning a response with the cookie `Max-Age` set to 0. - -```rust -pub(crate) async fn logout_response() -> impl axum::response::IntoResponse { - Response::builder() - .status(http::StatusCode::SEE_OTHER) - .header("Location", "/") - .header("Set-Cookie", "session_token=_; Max-Age=0") - .body(Empty::new()) - .unwrap() -} -``` - -For logging in we have a very similar logic for signup with pulling multipart information of a post request. Unlike signup, we don't want to create a new user. We want to check the row with that username has a password that matches. If the credentials match then we create a new session: - -```rust -async fn post_login( - Extension(database): Extension, - multipart: Multipart, -) -> impl IntoResponse { - let data = parse_multipart(multipart) - .await - .map_err(|err| error_page(&err))?; - - if let (Some(username), Some(password)) = (data.get("username"), data.get("password")) { - const LOGIN_QUERY: &str = "SELECT id, password FROM users WHERE users.username = $1;"; - - let row: Option<(i32, String)> = sqlx::query_as(LOGIN_QUERY) - .bind(username) - .fetch_optional(database) - .await - .unwrap(); - - let (user_id, hashed_password) = if let Some(row) = row { - row - } else { - return Err(LoginError::UserDoesNotExist); - }; - - // Verify password against PHC string - let parsed_hash = PasswordHash::new(&hashed_password).unwrap(); - if let Err(_err) = Pbkdf2.verify_password(password.as_bytes(), &parsed_hash) { - return Err(LoginError::WrongPassword); - } - - let session_token = new_session(database, random, user_id); - - - Ok(set_cookie(&session_token)) - } else { - Err(error_page(&LoginError::NoData)) - } -} -``` - -Then we refer back to the [signup section](#using-html-forms) and replicate the same HTML form and handler that renders the Tera template as seen before but for a login screen. At the end of that we can add two new routes with three handlers completing the demo: - -```rust -#[shuttle_service::main] -async fn axum( - #[shuttle_shared_db::Postgres] pool: Database -) -> ShuttleAxum { - // tera, middleware and random creation as before - - let router = Router::new() - // ... - .route("/logout", post(logout_response)) - .route("/login", get(get_login).post(post_login)) - // ... - - // Wrap and return router as before -} -``` - -## Deployment - -This is great, we now have a site with signup and login functionality. But we have no users, our friends can't log in on our localhost. We want it live on the interwebs. Luckily we are using shuttle, so it is as simple as: - -Create a project, this will start an isolated deployer container for you under the hood: -``` -cargo shuttle project new -``` - -Finally, to deploy your app, all you need to do is: -``` -cargo shuttle deploy -``` - -Because of our `#[shuttle_service::main]` annotation and out-the-box Axum support our deployment doesn't need any prior config, it is instantly live! - -Now you can go ahead with these concepts and add functionality for listing and deleting users. [The full demo implements these if you are looking for clues](https://github.com/kaleidawave/axum-shuttle-postgres-authentication-demo). - -## Thoughts building the tutorial and other ideas on where to take it - -This demo includes the minimum required for authentication. Hopefully, the concepts and snippets are useful for building it into an existing site or for starting a site that needs authentication. If you were to continue, it would be as simple as more fields onto the user object or building relations with the id field on the user's table. I will leave it out with some of my thoughts and opinions while building the site as well as things you could try extending it with. - -For templating Tera is great. I like how I separate the markup into external files rather than bundling it into `src/lib.rs`. Its API is easy to use and is well documented. However, it is quite a simple system. I had a few errors where I would rename or remove templates and because the template picker for rendering uses a map it can panic at runtime if the template does not exist. It would be nice if the system allowed checking that templates exist at compile time. The data sending works on serde serialization, which is a little bit more computation overhead than I would like. It also does not support streaming. With streaming, we could send a chunk of HTML that doesn't depend on database values first, and then we can add more content when the database transaction has gone through. If it supported streaming we could avoid the all-or-nothing pages with white page pauses and start connections to services like Google Fonts earlier. Let me know what your favorite templating engine is for Rust and whether it supports those features! - -For working with the database, sqlx has typed macros. I didn't use them here but for more complex queries you might prefer the type-checking behavior. Maybe 16 bytes for storing session tokens is a bit overkill. You also might want to try sharding that table if you have a lot of sessions or using a key-value store (such as Redis) might be simpler. We also didn't implement cleaning up the sessions table, if you were storing sessions using Redis you could use the [EXPIRE command](https://redis.io/commands/expire/) to automatically remove old keys. - -This blog post is powered by shuttle! The serverless platform built for Rust. - -## [Shuttle](https://www.shuttle.rs/): Stateful Serverless for Rust - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out shuttle](https://docs.rs/shuttle-service/latest/shuttle_service/). - -
    diff --git a/www/_blog/2022-09-14-serentity-discord-bot.mdx b/www/_blog/2022-09-14-serentity-discord-bot.mdx deleted file mode 100644 index 636d3cce2..000000000 --- a/www/_blog/2022-09-14-serentity-discord-bot.mdx +++ /dev/null @@ -1,488 +0,0 @@ ---- -title: Building a Discord bot in Rust -description: A tutorial on building and deploying an interactive bot in Rust with Serenity & shuttle -author: ben -tags: [rust, tutorial] -thumb: discord-bot-thumbnail.png -cover: discord-bot-thumbnail.png -date: "2022-09-14T15:00:00" ---- - -In this post, we will look at a simple way to add custom functionality to a Discord server using a bot written in Rust. We will first register a bot with Discord, then go about how to create a Serenity application that will later run on shuttle. Finally, we will make the bot do something useful, writing some Rust code to get information from an external service. - -The full code can be found in [this repository](https://github.com/kaleidawave/discord-weather-bot). - -### Registering our bot - -Before we start making our bot, we need to register it for Discord. We do that by going to [https://discord.com/developers/applications](https://discord.com/developers/applications) and creating a new application. - -![](/images/blog/discord-bot-screenshots/application-registration.png) - -The application process is also used for adding functionality to Discord but we will be only using the bot offering. Fill in the basic details and you should get to the following screen: - -![](/images/blog/discord-bot-screenshots/application_id.png) - -You want to copy the Application ID and have it handy, because we will use it to add our bot to a test server. - -Next, we want to create a bot. You can set its public username here: - -![](/images/blog/discord-bot-screenshots/bot-name.png) - -You want to click the reset token and copy this value (we will use it in a later step). This value represents the username and password as a single value that Discord uses to authenticate that our server is the one controlling the bot. You want to keep this value secret. - -You also want to tick the `MESSAGE CONTENT INTENT` setting so it can read the commands input. - -To add the bot to the server we will test on, we can use the following URL (replace `*application_id*` in the URL with the ID you copied beforehand): - -```tsx -https://discord.com/oauth2/authorize?client_id=*application_id*&scope=bot&permissions=8 -``` - -Here, we create it with `permissions=8` so that it can do everything on the server. If you are adding to another server, select only the permissions it needs. - -We now have a bot on our server: - -![](/images/blog/discord-bot-screenshots/bot-is-offline.png) - -Oh, they’re offline 😢 - -## Getting a bot online - -At this moment, our bot is not running because there is no code. We will have to write it and run it before we can start interacting with it. - -### [Serenity](https://docs.rs/serenity/latest/serenity/index.html) - -Serenity is a library for writing Discord bots (and communicating with the Discord API). We can create a new Serenity project which is readily deployable on shuttle with: `cargo shuttle init --serenity` - -If you don’t have shuttle yet, you can install it with `cargo install cargo-shuttle`. Afterwards, run the following in an empty directory: - -``` -cargo shuttle init --serenity -``` - -After running it you, should see the following generated in `src/lib.rs`: - -```rust -use anyhow::anyhow; -use serenity::async_trait; -use serenity::model::channel::Message; -use serenity::model::gateway::Ready; -use serenity::prelude::*; -use shuttle_secrets::SecretStore; -use tracing::{error, info}; - -struct Bot; - -#[async_trait] -impl EventHandler for Bot { - async fn message(&self, ctx: Context, msg: Message) { - if msg.content == "!hello" { - if let Err(e) = msg.channel_id.say(&ctx.http, "world!").await { - error!("Error sending message: {:?}", e); - } - } - } - - async fn ready(&self, _: Context, ready: Ready) { - info!("{} is connected!", ready.user.name); - } -} - -#[shuttle_service::main] -async fn serenity( - #[shuttle_secrets::Secrets] secret_store: SecretStore, -) -> shuttle_service::ShuttleSerenity { - // Get the discord token set in `Secrets.toml` - let token = if let Some(token) = secret_store.get("DISCORD_TOKEN") { - token - } else { - return Err(anyhow!("'DISCORD_TOKEN' was not found").into()); - }; - - // Set gateway intents, which decides what events the bot will be notified about - let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; - - let client = Client::builder(&token, intents) - .event_handler(Bot) - .await - .expect("Err creating client"); - - Ok(client) -} -``` - -### Building an interaction for our bot - -We want to call our bot when chatting in a text channel. Discord enables this with [slash commands](https://discord.com/blog/slash-commands-are-here). - -Slash commands can be server-specific (servers are named as `guilds` in Discords API documentation) or application specific (across all servers the bot is in). For testing, we will only enable it on a single guild/server. This is because the application-wide commands can take an hour to fully register whereas the guild/server specific ones are instant, so we can test the new commands immediately. - -You can copy the guild ID by right-clicking here on the server name and click `copy ID` ([you will need developer mode enabled to do this](https://www.howtogeek.com/714348/how-to-enable-or-disable-developer-mode-on-discord/)): - -![](/images/blog/discord-bot-screenshots/guild-id.png) - -Now that we have the information for setup, we can start writing our bot and its commands. - -We will first get rid of the `async fn message` hook as we won’t be using it in this example. In the `ready` hook we will call `set_application_commands` with a `GuildId` to register a command with Discord. Here we register a `hello` command with a description and no parameters (Discord refers to these as options). - -```rust -#[async_trait] -impl EventHandler for Bot { - async fn ready(&self, ctx: Context, ready: Ready) { - info!("{} is connected!", ready.user.name); - - let guild_id = GuildId(*your guild id*); - - let commands = GuildId::set_application_commands(&guild_id, &ctx.http, |commands| { - commands.create_application_command(|command| { command.name("hello").description("Say hello") }) - }).await.unwrap(); - - info!("{:#?}", commands); - } -} -``` - -> Serenity has a bit of a different way of registering commands using a callback. If you are working on a larger command application, [poise](https://docs.rs/poise/latest/poise/) (which builds on Serenity) might be better suited. -> - -With our command registered, we will now add a hook for when these commands are called using `interaction_create`. - -```rust -#[async_trait] -impl EventHandler for Bot { - async fn ready(&self, ctx: Context, ready: Ready) { - // ... - } - - async fn interaction_create(&self, ctx: Context, interaction: Interaction) { - if let Interaction::ApplicationCommand(command) = interaction { - let response_content = match command.data.name.as_str() { - "hello" => "hello".to_owned(), - command => unreachable!("Unknown command: {}", command), - }; - - let create_interaction_response = - command.create_interaction_response(&ctx.http, |response| { - response - .kind(InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|message| message.content(response_content)) - }); - - if let Err(why) = create_interaction_response.await { - eprintln!("Cannot respond to slash command: {}", why); - } - } - } -} -``` - -### Trying it out - -Now with the code written we can test it locally. Before we do that we have to authenticate the bot with Discord. We do this with the value we got from "Reset Token" on the bot screen in one of the previous steps. To register a secret with shuttle we create a `Secrets.toml` file with a key value pair. This pair is read by the `secret_store.get("DISCORD_TOKEN")` call in the `ready` hook: - -``` -# Secrets.toml -DISCORD_TOKEN="*your discord token*" -DISCORD_GUILD_ID="*the guild we are testing on*" -``` - -`cargo shuttle run` - -We should see that our bot now displays as online: - -![](/images/blog/discord-bot-screenshots/bot-is-online.png) - -When typing, we should see our command come up with its description: - -![](/images/blog/discord-bot-screenshots/command-description.png) - -Our bot should respond with "hello" to our command: - -![](/images/blog/discord-bot-screenshots/command-result.png) - -Wow! Let’s make our bot do something a little more useful. - -### Making the bot do something - -[There is plenty of free APIs](https://github.com/public-apis/public-apis) that can be used for getting information on a variety of topics. - -For this demo, we are going to build a bot that gives a forecast for a location. I used the [AccuWeather API](https://developer.accuweather.com/) for this demo. If you are following this tutorial 1:1 you can go and register an application to get an access key. If you are using a different API this is still the sort of process you would follow. - -To get a forecast using the API requires two requests: - -1. Get a location ID for a named location -2. Get the forecast at the location ID - -The API requires making network requests and it returns a JSON response. We can make the requests with `cargo add reqwest -F json` and deserialize the results to structures using serde, with `cargo add serde`. We will then have a function that chains the two requests together and deserializes the forecast to a readable result. - -> You can skip some of the boilerplate by using [direct access on untyped values](https://docs.rs/serde_json/latest/serde_json/#operating-on-untyped-json-values). But we will opt for the better strongly typed structured approach. - -Here we type some of the structures returned by the API and add `#[derive(Deserialize)]` so they can be decoded from JSON. All the keys are in *`PascalCase`* so we use the `#[serde(rename_all = "PascalCase")]` helper attribute to stay aligned with Rust standards. Some are completely different from the Rust field name so we use `#[serde(alias = ...)]` on the field to set its matching JSON representation. - -```rust -// In weather.rs -use serde::Deserialize; - -#[derive(Deserialize, Debug)] -#[serde(rename_all = "PascalCase")] -pub struct Location { - key: String, - localized_name: String, - country: Country, -} - -impl Display for Location { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}, {}", self.localized_name, self.country.id) - } -} - -#[derive(Deserialize, Debug)] -pub struct Country { - #[serde(alias = "ID")] - pub id: String, -} - -#[derive(Deserialize, Debug)] -#[serde(rename_all = "PascalCase")] -pub struct Forecast { - pub headline: Headline, -} - -#[derive(Deserialize, Debug)] -pub struct Headline { - #[serde(alias = "Text")] - pub overview: String, -} -``` - -> The above skips [a lot of the fields returned by the API](https://developer.accuweather.com/accuweather-forecast-api/apis/get/forecasts/v1/daily/1day/%7BlocationKey%7D), only opting for the ones we will use in this demo. If you wanted to type all the fields you could try the new [type from JSON feature in rust-analyzer](https://rust-analyzer.github.io/thisweek/2022/08/15/changelog-142.html#new-features) to avoid having to write as much. - -Our location request call also fails if the search we put in returns no places. We will create an intermediate type that represents this case and implements `std::error::Error`: - -```rust -// Again in weather.rs -use std::fmt::Display; - -#[derive(Debug)] -pub struct CouldNotFindLocation { - place: String, -} - -impl Display for CouldNotFindLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Could not find location '{}'", self.place) - } -} - -impl std::error::Error for CouldNotFindLocation {} -``` - -Now with all the types written, we create a new `async` function that, given a place and a client, will return the forecast along with the location: - -```rust -// Again in weather.rs -pub async fn get_forecast( - place: &str, - api_key: &str, - client: &Client, -) -> Result<(Location, Forecast), Box> { - // Endpoints we will use - const LOCATION_REQUEST: &str = "http://dataservice.accuweather.com/locations/v1/cities/search"; - const DAY_REQUEST: &str = "http://dataservice.accuweather.com/forecasts/v1/daily/1day/"; - - // The URL to call combined with our API_KEY and the place (via the q search parameter) - let url = format!("{}?apikey={}&q={}", LOCATION_REQUEST, api_key, place); - // Make the request we will call - let request = client.get(url).build().unwrap(); - // Execute the request and await a JSON result that will be converted to a - // vector of locations - let resp = client - .execute(request) - .await? - .json::>() - .await?; - - // Get the first location. If empty respond with the above declared - // `CouldNotFindLocation` error type - let first_location = resp - .into_iter() - .next() - .ok_or_else(|| CouldNotFindLocation { - place: place.to_owned(), - })?; - - // Now have the location combine the key/identifier with the URL - let url = format!("{}{}?apikey={}", DAY_REQUEST, first_location.key, api_key); - - let request = client.get(url).build().unwrap(); - let forecast = client - .execute(request) - .await? - .json::() - .await?; - - // Combine the location with the foreact - Ok((first_location, forecast)) -} -``` - -Now we have a function to get the weather, **given a `reqwest` client and a place**, we can wire that into the bots logic. - -### Setting up the reqwest client - -Our `get_forecast` requires a `reqwest` Client and the weather API key. We will add some fields to our bot for holding this data and initialize this in the `shuttle_service::main` function. Using the secrets feature we can get our weather API key: - -```rust -// In lib.rs -struct Bot { - weather_api_key: String, - client: reqwest::Client, - discord_guild_id: GuildId, -} - -#[shuttle_service::main] -async fn serenity(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> shuttle_service::ShuttleSerenity { - // Get the discord token set in `Secrets.toml` - let token = secret_store - .get("DISCORD_TOKEN") - .context("'DISCORD_TOKEN' was not found")?; - - let weather_api_key = secret_store - .get("WEATHER_API_KEY") - .context("'WEATHER_API_KEY' was not found")?; - - let discord_guild_id = secret_store - .get("DISCORD_GUILD_ID") - .context("'DISCORD_GUILD_ID' was not found")?; - - // Set gateway intents, which decides what events the bot will be notified about - let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; - - let client = Client::builder(&token, intents) - .event_handler(Bot { - weather_api_key, - client: reqwest::Client::new(), - discord_guild_id: GuildId(discord_guild_id.parse().unwrap()) - }) - .await - .expect("Err creating client"); - - Ok(client) -} -``` - -### Registering a /weather command - -We will add our new command with a place option/parameter. Back in the `ready` hook, we can add an additional command alongside the existing `hello` command: - -```rust -let commands = GuildId::set_application_commands(&guild_id, &ctx.http, |commands| { - commands - .create_application_command(|command| { command.name("hello").description("Say hello") }) - .create_application_command(|command| { - command - .name("weather") - .description("Display the weather") - .create_option(|option| { - option - .name("place") - .description("City to lookup forecast") - .kind(CommandOptionType::String) - .required(true) - }) - }) -}).await.unwrap(); -``` - -Discord allows us to set the expected type and whether it is required. Here, the place needs to be a string and is required. - -Now in the interaction handler, we can add a new branch to the match tree. We pull out the option/argument corresponding to `place` and extract its value. Because of the restrictions made when setting the option we can assume that it is well-formed (unless Discord sends a bad request) and thus the unwraps here. After we have the arguments of the command we call the `get_forecast` function and format the results into a string to return. - -```rust -"weather" => { - let argument = command - .data - .options - .iter() - .find(|opt| opt.name == "place") - .cloned(); - - let value = argument.unwrap().value.unwrap(); - let place = value.as_str().unwrap(); - let result = weather::get_forecast(place).await; - - match result { - Ok((location, forecast)) => format!( - "Forecast: {} in {}", - forecast.headline.overview, location - ), - Err(err) => { - format!("Err: {}", err) - } - } -} -``` - -### Running - -Now, we have these additional secrets we are using and we will add them to the `Secrets.toml` file: - -```toml -# In Secrets.toml -# Existing secrets: -DISCORD_TOKEN="***" -DISCORD_GUILD_ID="***" -# New secret -WEATHER_API_KEY="***" -``` - -With the secrets added, we can run the server: - -`cargo shuttle run` - -While typing, we should see our command come up with the options/parameters: - -![](/images/blog/discord-bot-screenshots/weather-input.png) - -Entering “Paris” as the place we get a result with a forecast: - -![](/images/blog/discord-bot-screenshots/weather-forecast.png) - -And entering a location that isn’t registered returns an error, thanks to the error handling we added to the `get_forecast` function: - -![](/images/blog/discord-bot-screenshots/weather-error.png) - -### Deploying on shuttle - -With all of that setup, it is really easy to get your bot hosted and running without having to run your PC 24/7. - -Create a project, this will start an isolated deployer container for you under the hood: -```bash -cargo shuttle project new -``` -Finally, to deploy your app, all you need to do is: -```bash -cargo shuttle deploy -``` - -And you are good to go. Easy-pease, right? - -You could now take this idea even further: - -- Use a different API, to create a bot that can return [funny facts](https://asli-fun-fact-api.herokuapp.com/) or return [new spaceflights](https://spaceflightnewsapi.net/) -- Maybe you could use one of shuttle's provided databases to remember certain information about a user -- Expand on the weather forecast idea by adding more advanced options and follow-ups to command options -- Use the [localization information](https://discord.com/developers/docs/interactions/application-commands#localization) to return information in other languages - ---- - -This blog post is powered by shuttle! If you have any questions, or want to provide feedback, join our [Discord server](https://discord.gg/shuttle)! - -## [Shuttle](https://www.shuttle.rs/): The Rust-native, open source, cloud development platform. - -Deploying and managing your Rust web apps can be an expensive, anxious and time consuming process. - -If you want a batteries included and ops-free experience, [try out Shuttle](https://github.com/shuttle-hq/shuttle). - -
    diff --git a/www/app-env.d.ts b/www/app-env.d.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/www/components/AnnouncementBar/index.tsx b/www/components/AnnouncementBar/index.tsx deleted file mode 100644 index 6a4912eb7..000000000 --- a/www/components/AnnouncementBar/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { faTimes } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React, { useState } from "react"; -import { createStateContext } from "react-use"; -import ExternalLink from "../ExternalLink"; -import styles from "./styles.module.css"; - -export const [useAnnouncementBarIsClosed, AnnouncementBarIsClosedProvider] = - createStateContext(false); - -export default function AnnouncementBar() { - const [isClosed, setClosed] = useAnnouncementBarIsClosed(); - - if (isClosed) { - return null; - } - - return ( -
    -

    - ⭐️ If you like Shuttle,  - - give it a star on GitHub - - ! -

    - - -
    - ); -} diff --git a/www/components/AnnouncementBar/styles.module.css b/www/components/AnnouncementBar/styles.module.css deleted file mode 100644 index bad0ed0ba..000000000 --- a/www/components/AnnouncementBar/styles.module.css +++ /dev/null @@ -1,46 +0,0 @@ -.announcement { - position: relative; - width: 100%; - height: 2rem; - background-color: #7777dd; - color: white; -} - -.announcement__close { - position: absolute; - display: flex; - right: 0; - top: 0; - height: 100%; - width: 1rem; - margin: 0 0.5rem; - padding: 0; - justify-content: center; - align-items: center; - border: none; - outline: none; - background: none; - color: inherit; - font-size: 2rem; - cursor: pointer; -} - -.announcement__content { - display: flex; - height: 100%; - width: 100%; - margin: 0; - align-items: center; - justify-content: center; - font-size: 14px; - font-weight: bold; -} - -.announcement__link { - color: inherit; - text-decoration: underline; -} - -.announcement__link:hover { - color: inherit; -} diff --git a/www/components/ApiKeyModal.tsx b/www/components/ApiKeyModal.tsx deleted file mode 100644 index 9bd21a14e..000000000 --- a/www/components/ApiKeyModal.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import { Fragment, useState, createContext, useContext } from "react"; -import { Dialog, Transition } from "@headlessui/react"; -import { XIcon } from "@heroicons/react/outline"; -import { createStateContext } from "react-use"; -import { useUser } from "@auth0/nextjs-auth0"; -import Code from "./Code"; -import { DISCORD_URL } from "../lib/constants"; -import ExternalLink from "./ExternalLink"; - -export const [useApiKeyModalState, ApiKeyModalStateProvider] = - createStateContext(false); - -export default function ApiKeyModal() { - const [open, setOpen] = useApiKeyModalState(); - const { user, error, isLoading } = useUser(); - - const api_key = user?.api_key as string | undefined; - - return ( - - -
    - - - - - {/* This element is to trick the browser into centering the modal contents. */} - - -
    -
    - -
    -
    - {user && ( - <> - {api_key && ( -
    -
    - - Api key - -
    -

    - copy/paste the API key below to the "cargo shuttle - login" dialog: -

    - - -

    - alternatively, you can execute the command below: -

    - -
    -
    -
    - )} - {!api_key && ( -
    -
    - - Api key not found! - -
    -

    - {"This shouldn't happen. Please contact us on "} - - Discord - - {" to resolve the issue"} -

    -
    -
    -
    - )} - - )} -
    - -
    - -
    -
    -
    -
    -
    -
    - ); -} diff --git a/www/components/Code.tsx b/www/components/Code.tsx deleted file mode 100644 index bd7e587ce..000000000 --- a/www/components/Code.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { faClipboard } from "@fortawesome/free-regular-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import ReactTooltip from "react-tooltip"; -import NoSsr from "./NoSsr"; -import { gtagEvent } from "../lib/gtag"; -type CodeProps = { - readonly id: string; - readonly code: string; -}; - -const copyToClipboard = (code: string, id: string) => { - gtagEvent({ - action: "copy_install_script", - category: "Code", - label: "Copied Install Script", - value: id, - }); - - navigator.clipboard.writeText(code); -}; - -export default function Code({ code, id }: CodeProps) { - return ( -
    -
    -        
    -          $ 
    -          {code}
    -        
    -        
    -      
    - - copyToClipboard(code, id)} - > - Copied to clipboard! - - -
    - ); -} diff --git a/www/components/CodeBlock.tsx b/www/components/CodeBlock.tsx deleted file mode 100644 index 569f44b06..000000000 --- a/www/components/CodeBlock.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { PrismLight as SyntaxHighlighter } from "react-syntax-highlighter"; -import rust from "react-syntax-highlighter/dist/cjs/languages/prism/rust"; -import oneDark from "react-syntax-highlighter/dist/cjs/styles/prism/one-dark"; -import { useWindowSize } from "react-use"; -import Copy from "./Copy"; -import HeightMagic from "./HeightMagic"; - -SyntaxHighlighter.registerLanguage("rust", rust); - -cargo.displayName = "cargo"; -cargo.aliases = []; - -function cargo(Prism: any) { - Prism.languages.cargo = { - builtin: /\b(?:Packaging|Archiving|Compiling|Finished)\b/, - }; -} - -SyntaxHighlighter.registerLanguage("cargo", cargo); - -interface Props { - readonly language: string; - readonly code: string; - readonly showLineNumbers?: boolean; - readonly name: string; -} - -export default function CodeBlock({ - code, - language, - showLineNumbers, - name, -}: Props) { - useWindowSize(); - - return ( -
    - - - - - {code} - - -
    - ); -} diff --git a/www/components/CodeSnippets.tsx b/www/components/CodeSnippets.tsx deleted file mode 100644 index 7f948388c..000000000 --- a/www/components/CodeSnippets.tsx +++ /dev/null @@ -1,210 +0,0 @@ -import classnames from "classnames"; -import { useState } from "react"; -import CodeBlock from "./CodeBlock"; - -export default function CodeSnippets() { - const [activeTab, setActiveTab] = useState(1); - - return ( -
    -
    -
    -

    - How it works -

    -

    - Shuttle is built for Rust. -

    - -

    - A simple cargo command packages up your application, ships it to the - shuttle build cluster where it's incrementally compiled and - automatically served on a unique subdomain. -

    - -

    - Shuttle uses simple but powerful annotations to understand your - dependencies. Infrastructure dependencies like databases or - key-value stores are spun up for you and everything is automatically - wired together from the get-go. -

    -

    - It feels a little magical. -

    -
    -
    -
    -
    - - - -
    -
    - -
    -
    - -
    -
    -
    - ); -} - -const CARGO_DEPLOYS = ` -$ cargo shuttle deploy - Packaging url-shortener v0.1.0 (/private/shuttle/examples/url-shortener) - Archiving Cargo.toml - Archiving Cargo.toml.orig - Archiving README.md - Archiving Shuttle.toml - Archiving migrations/20220324143837_urls.sql - Archiving src/lib.rs - Compiling tracing-attributes v0.1.20 - Compiling tokio-util v0.6.9 - Compiling multer v2.0.2 - Compiling hyper v0.14.18 - Compiling rocket_http v0.5.0-rc.1 - Compiling rocket_codegen v0.5.0-rc.1 - Compiling rocket v0.5.0-rc.1 - Compiling shuttle-service v0.2.5 - Compiling url-shortener v0.1.0 (/opt/unveil/crates/s-2) - Finished dev [unoptimized + debuginfo] target(s) in 1m 01s - - Project: url-shortener - Deployment Id: 3d08ac34-ad63-41c1-836b-99afdc90af9f - Deployment Status: DEPLOYED - Host: url-shortener.shuttleapp.rs - Created At: 2022-04-01 08:32:34.412602556 UTC - Database URI: postgres://***:***@pg.shuttle.rs/db-url-shortener - -❯ -`.trim(); - -const USING_SQLX = ` -use rocket::{get, routes, State}; -use sqlx::PgPool; - -struct MyState(PgPool); - -#[get("/hello")] -fn hello(state: &State) -> &'static str { - // Do things with \`state.0\`... - "Hello, Postgres!" -} - -#[shuttle_service::main] -async fn rocket( - #[shared::Postgres] pool: PgPool -) -> shuttle_service::ShuttleRocket { - let state = MyState(pool); - - Ok( - rocket::build() - .manage(state) - .mount("/", routes![hello]) - ) -} - -`.trim(); - -const HELLO_CLOUD = ` -use rocket::{get, routes}; - -#[get("/hello")] -fn hello() -> &'static str { - "Hello, world!" -} - -#[shuttle_service::main] -async fn init() -> shuttle_service::ShuttleRocket { - Ok( - rocket::build() - .mount("/", routes![hello]) - ) -} -`.trim(); - -const USING_AXUM = ` -use axum::{routing::get, Router}; -use sync_wrapper::SyncWrapper; - -async fn hello_world() -> &'static str { - "Hello, world!" -} - -#[shuttle_service::main] -async fn axum() -> shuttle_service::ShuttleAxum { - let router = Router::new() - .route("/hello", get(hello_world)); - let sync_wrapper = SyncWrapper::new(router); - - Ok(sync_wrapper) -} -`.trim(); - -const tabs = [ - { - name: "Cargo Deploys", - code: CARGO_DEPLOYS, - showLineNumbers: false, - language: "cargo", - }, - { - name: "Hello Cloud", - code: HELLO_CLOUD, - showLineNumbers: true, - language: "rust", - }, - { - name: "Using Sqlx", - code: USING_SQLX, - showLineNumbers: true, - language: "rust", - }, - { - name: "Using Axum", - code: USING_AXUM, - showLineNumbers: true, - language: "rust", - }, -]; diff --git a/www/components/Copy.tsx b/www/components/Copy.tsx deleted file mode 100644 index aca68c434..000000000 --- a/www/components/Copy.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { ClipboardCheckIcon, ClipboardIcon } from "@heroicons/react/outline"; -import { useEffect, useState } from "react"; -import { useCopyToClipboard, useWindowSize } from "react-use"; -import { gtagEvent } from "../lib/gtag"; - -interface Props { - readonly code: string; - readonly name?: string; -} - -export default function Copy({ code, name }: Props) { - const [copyToClipboardState, copyToClipboard] = useCopyToClipboard(); - const [copied, setCopied] = useState(false); - - useEffect(() => { - let timeout = setTimeout(() => { - setCopied(false); - }, 1500); - - return () => void clearTimeout(timeout); - }, [copied]); - - return ( - - ); -} diff --git a/www/components/Examples.tsx b/www/components/Examples.tsx deleted file mode 100644 index 575ec570f..000000000 --- a/www/components/Examples.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import ExternalLink from "./ExternalLink"; - -interface Card { - readonly title: string; - readonly description: string; - readonly link: string; - readonly icon: string; -} - -const cards: Card[] = [ - { - title: "Persist with Postgres", - description: - "Build any web service with a fully managed database using Rocket and sqlx", - link: "https://github.com/shuttle-hq/shuttle/tree/main/examples/rocket/postgres", - icon: "/images/icon1.svg", - }, - { - title: "Url Shortener", - description: - "A URL shortener that you can use from your terminal - built with shuttle, rocket and postgres/sqlx.", - link: "https://github.com/shuttle-hq/shuttle/tree/main/examples/rocket/url-shortener", - icon: "/images/icon2.svg", - }, - { - title: "JWT authentication", - description: - "Guard endpoints using self-issued JWT tokens while keeping public endpoint open", - link: "https://github.com/shuttle-hq/shuttle/tree/main/examples/rocket/authentication", - icon: "/images/icon3.svg", - }, -]; - -export default function Examples() { - return ( -
    -
    -
    -

    - From code to cloud in a minute -

    -

    - Take your code to full-featured cloud infrastructure in under a - minute. Don't take our word for it, see it for yourself. -

    -
    -
    - {cards.map((card, index) => ( - -
    - -
    -
    -
    -
    -

    - {card.title} -

    -

    - {card.description} -

    -
    -
    -
    -
    - ))} -
    -
    -
    - ); -} diff --git a/www/components/ExternalLink.tsx b/www/components/ExternalLink.tsx deleted file mode 100644 index bc8c92203..000000000 --- a/www/components/ExternalLink.tsx +++ /dev/null @@ -1,16 +0,0 @@ -export default function ExternalLink({ - ref, - href, - target, - rel, - ...props -}: JSX.IntrinsicElements["a"]): JSX.Element { - return ( -
    - ); -} diff --git a/www/components/Features.tsx b/www/components/Features.tsx deleted file mode 100644 index 7a8b24d67..000000000 --- a/www/components/Features.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { CheckIcon } from "@heroicons/react/outline"; - -const features = [ - { - name: "Infrastructure from Rust", - description: - "Traits and annotations define all your infrastructure from your service code", - }, - { - name: "Serverless", - description: - "All the infrastructure and wiring you need is handled by the deployer runtime. No VMs or containers", - }, - { - name: "Databases", - description: - "Wiring up a service to a persistent database is as easy as deriving a trait", - }, - { - name: "Entirely open-source", - description: - "A completely free and open-source project, with no vendor lock-in or hidden code", - }, - { - name: "Self-hosting friendly", - description: - "Deploy the entire platform under your own AWS account for extra security and isolation", - }, - { - name: "Fast deploy times", - description: - "Deploy new versions as quickly as running an incremental build, all with zero downtime", - }, -]; - -export default function Features() { - return ( -
    -
    -
    -

    - Serverless for Rust -

    -

    - The only serverless platform that lets you control your - infrastructure from Rust code as easily as deriving a trait. -

    -
    -
    - {features.map((feature) => ( -
    -
    -
    -
    - {feature.description} -
    -
    - ))} -
    -
    -
    - ); -} diff --git a/www/components/Footer.tsx b/www/components/Footer.tsx deleted file mode 100644 index aed55c9fb..000000000 --- a/www/components/Footer.tsx +++ /dev/null @@ -1,232 +0,0 @@ -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { - faGithub, - faTwitter, - faDiscord, -} from "@fortawesome/free-brands-svg-icons"; -import { DISCORD_URL, GITHUB_URL, TWITTER_URL } from "../lib/constants"; -import ExternalLink from "./ExternalLink"; -import InternalLink from "./InternalLink"; - -// const navigation = [ -// { name: "Solutions", href: "#" }, -// { name: "Pricing", href: "#" }, -// { name: "Docs", href: "#" }, -// { name: "Company", href: "#" }, -// ]; - -const communities = [ - { - name: "Github", - href: GITHUB_URL, - icon: faGithub, - }, - { - name: "Discord", - href: DISCORD_URL, - icon: faDiscord, - }, - { - name: "Twitter", - href: TWITTER_URL, - icon: faTwitter, - }, -]; - -const navigation = [ - { - title: "Product", - links: [ - { name: "Features", href: "/#features" }, - { name: "Examples", href: "/#examples" }, - { name: "Code Snippets", href: "/#code-snippets" }, - { - name: "Roadmap", - href: "https://github.com/orgs/shuttle-hq/projects/4/views/2", - }, - ], - }, - { - title: "Company", - links: [ - { name: "Blog", href: "/blog" }, - { - name: "Careers", - href: "https://www.workatastartup.com/companies/shuttle", - }, - ], - }, - { - title: "Developers", - links: [ - { - name: "Documentation", - href: "https://docs.rs/shuttle-service/latest/shuttle_service/", - }, - { - name: "Guides", - href: "https://github.com/shuttle-hq/shuttle/tree/main/examples", - }, - { - name: "Contributors", - href: "https://github.com/shuttle-hq/shuttle/graphs/contributors", - }, - ], - }, - { - title: "Community", - links: [ - ...communities.map(({ name, href }) => ({ name, href })), - { - name: "Linkedin", - href: "https://www.linkedin.com/company/shuttle-yc/", - }, - ], - }, -]; - -export default function Footer() { - return ( - <> -
    - {communities.map((community, index) => ( - - - - ))} -
    - -
    -

    - Let's make Rust the next language of cloud-native -

    -

    - We love you Go, but Rust is just better. -

    -
    - {communities.map((community, index) => ( - - - {community.name} - - ))} -
    -
    - - {/*
    -

    - Ready to dive in? - - Start your free trial today. - -

    -
    - - Get Started - - - - Join Discord - -
    -
    */} - -
    -
    - {navigation.map((col, index) => ( -
    -

    - {col.title} -

    -
      - {col.links.map((link, index) => ( -
    • - {link.href.startsWith("/") ? ( - - {link.name} - - ) : ( - - {link.name} - - )} -
    • - ))} -
    -
    - ))} -
    - -
    -

    © 2022 shuttle

    - {/*

    - {navigation.map((link, index) => ( - - {link.name} - - ))} -

    */} -

    - Backed by - - Y - - - - - - Combinator -

    -
    -
    - - ); -} diff --git a/www/components/Header.tsx b/www/components/Header.tsx deleted file mode 100644 index 8f9ff7ac4..000000000 --- a/www/components/Header.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import { useRouter } from "next/router"; -import InternalLink from "./InternalLink"; -import { SHUTTLE_DOCS_URL } from "../lib/constants"; -import ExternalLink from "./ExternalLink"; -import ThemeSwitch from "./ThemeSwitch"; -import NoSsr from "./NoSsr"; -import LoginButton from "./LoginButton"; - -const navigation = [ - { name: "Features", href: "/#features", internal: true }, - { name: "Examples", href: "/#examples", internal: true }, - { name: "Docs", href: SHUTTLE_DOCS_URL, internal: false }, - { name: "Blog", href: "/blog", internal: true }, - { name: "Pricing", href: "/pricing", internal: true }, -]; - -export default function Header() { - const { basePath } = useRouter(); - - return ( -
    - -
    - ); -} diff --git a/www/components/HeightMagic.tsx b/www/components/HeightMagic.tsx deleted file mode 100644 index b4a15dfa5..000000000 --- a/www/components/HeightMagic.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { ReactNode, useState } from "react"; - -interface Props { - readonly children?: ReactNode | undefined; -} - -export default function HeightMagic({ children }: Props) { - const [height, setHeight] = useState(0); - - return ( -
    -
    { - setHeight(el?.getBoundingClientRect().height ?? 0); - }} - > - {children} -
    -
    - ); -} diff --git a/www/components/Hero.tsx b/www/components/Hero.tsx deleted file mode 100644 index 1df39e4d3..000000000 --- a/www/components/Hero.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { useRouter } from "next/router"; -import Code from "./Code"; -import { - DISCORD_URL, - SHUTTLE_DOCS_URL, - SITE_DESCRIPTION, - SITE_TITLE, -} from "../lib/constants"; -import classnames from "classnames"; -import { useAnnouncementBarIsClosed } from "./AnnouncementBar"; -import ExternalLink from "./ExternalLink"; - -export default function Hero() { - const { basePath } = useRouter(); - const [announcementBarIsClosed] = useAnnouncementBarIsClosed(); - - return ( -
    -
    -
    -
    - {/*
    - Shuttle - - ALPHA - -
    */} - -
    -
    - {SITE_TITLE} -
    -
    - {SITE_DESCRIPTION} -
    -
    -
    - -
    - -
    - - Get Started - - - - Join Discord - -
    -
    -
    -
    -
    - ); -} diff --git a/www/components/InternalLink.tsx b/www/components/InternalLink.tsx deleted file mode 100644 index 438aa26e3..000000000 --- a/www/components/InternalLink.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import Link, { LinkProps } from "next/link"; -import { useRouter } from "next/router"; - -export default function InternalLink({ - href, - as, - replace, - scroll, - shallow, - passHref, - prefetch, - locale, - ...props -}: JSX.IntrinsicElements["a"] & LinkProps): JSX.Element { - const router = useRouter(); - - if (!href) { - return ; - } - - return ( - -
    { - if (router.pathname === href) { - e.preventDefault(); - - document.body.scrollIntoView({ - behavior: "smooth", - }); - - setTimeout(() => { - router.replace(href); - }, 350); - } else if (href.startsWith(router.pathname + "#")) { - e.preventDefault(); - - document - .querySelector(href.slice(router.pathname.length)) - .scrollIntoView({ - behavior: "smooth", - }); - - setTimeout(() => { - router.replace(href); - }, 350); - } - }} - /> - - ); -} diff --git a/www/components/LoginButton.tsx b/www/components/LoginButton.tsx deleted file mode 100644 index 251be04ea..000000000 --- a/www/components/LoginButton.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { useApiKeyModalState } from "./ApiKeyModal"; -import { useUser } from "@auth0/nextjs-auth0"; -import { gtagEvent } from "../lib/gtag"; - -export default function LoginButton() { - const { user, error, isLoading } = useUser(); - const [open, setOpen] = useApiKeyModalState(); - - const label = "Log In"; - const className = - "inline-block w-full rounded border border-slate-900 bg-transparent py-1 px-4 text-center text-base font-medium text-slate-900 transition-colors hover:bg-slate-800 hover:text-slate-100 dark:border-white dark:text-white hover:dark:bg-white hover:dark:text-dark-700"; - - if (user) { - return ( - - ); - } - - return ( - { - gtagEvent({ - action: "new_login_click", - category: "Login", - label: "New Session Login", - // todo: track api-key? - // value: api-key, - }); - }} - > - {label} - - ); -} diff --git a/www/components/NoSsr.tsx b/www/components/NoSsr.tsx deleted file mode 100644 index a22b80265..000000000 --- a/www/components/NoSsr.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React, { useEffect, useState } from "react"; - -export default function NoSsr({ children }): JSX.Element { - const [isMounted, setMount] = useState(false); - - useEffect(() => { - setMount(true); - }, []); - - return <>{isMounted ? children : null}; -} diff --git a/www/components/ThemeSwitch.tsx b/www/components/ThemeSwitch.tsx deleted file mode 100644 index 240f47d1a..000000000 --- a/www/components/ThemeSwitch.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { useLocalStorage, useMedia } from "react-use"; -import { useEffect } from "react"; -import { MoonIcon, SunIcon } from "@heroicons/react/solid"; - -type StorageTheme = "dark" | "light" | "system"; - -export default function ThemeSwitch() { - const osTheme = useMedia("(prefers-color-scheme: dark)") ? "dark" : "light"; - const [storageTheme, setStorageTheme] = useLocalStorage( - "app-theme", - "system" - ); - const theme = storageTheme === "system" ? osTheme : storageTheme; - const isDarkTheme = theme === "dark"; - - function updateTheme(theme: "dark" | "light") { - setStorageTheme(theme === osTheme ? "system" : theme); - } - - useEffect(() => { - if (isDarkTheme) { - document.body.classList.add("dark"); - } else { - document.body.classList.remove("dark"); - } - }, [isDarkTheme]); - - return ( - - ); -} diff --git a/www/components/blog/BlogListItem.tsx b/www/components/blog/BlogListItem.tsx deleted file mode 100644 index d7dcee418..000000000 --- a/www/components/blog/BlogListItem.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import authors, { getAuthors } from "../../lib/authors"; -import Image from "next/image"; -import React from "react"; -import { Post } from "../../lib/posts"; -import InternalLink from "../InternalLink"; - -interface Props { - readonly post: Post; -} - -export default function BlogListItem({ post }: Props): JSX.Element { - const author = getAuthors(post.author?.split(",") ?? []); - - return ( -
    - -
    -
    -
    -
    - -
    - -

    - {post.title} -

    - {post.date && ( -

    - {post.date} -

    - )} -

    - {post.description} -

    -
    -
    - {author.map((author, index) => { - return ( - author.author_image_url && ( -
    - -
    - ) - ); - })} -
    -
    -
    -
    -
    - ); -} diff --git a/www/lib/authors.ts b/www/lib/authors.ts deleted file mode 100644 index 2f3fa3296..000000000 --- a/www/lib/authors.ts +++ /dev/null @@ -1,57 +0,0 @@ -export interface Author { - readonly author_id: string; - readonly author: string; - readonly position: string; - readonly author_url: string; - readonly author_image_url: string; -} - -export function getAuthors(ids: readonly string[]): readonly Author[] { - return ids.flatMap((id) => { - const author = authors.find((author) => author.author_id === id); - - if (author == null) return []; - - return [author]; - }); -} - -const authors: readonly Author[] = [ - { - author_id: "christoshadjiaslanis", - author: "Christos Hadjiaslanis", - position: "Founder", - author_url: "https://github.com/christoshadjiaslanis", - author_image_url: "https://github.com/christoshadjiaslanis.png", - }, - { - author_id: "brokad", - author: "Damien Broka", - position: "Founder", - author_url: "https://github.com/brokad", - author_image_url: "https://github.com/brokad.png", - }, - { - author_id: "nodar", - author: "Nodar Daneliya", - position: "Founder", - author_url: "https://github.com/NodarD", - author_image_url: "https://github.com/nodard.png", - }, - { - author_id: "terrencewaters", - author: "Terrence Waters", - position: "Software Engineer", - author_url: "", - author_image_url: "", - }, - { - author_id: "ben", - author: "Ben", - position: "", - author_url: "https://github.com/kaleidawave", - author_image_url: "https://github.com/kaleidawave.png" - } -]; - -export default authors; diff --git a/www/lib/constants.ts b/www/lib/constants.ts deleted file mode 100644 index a8e071ac7..000000000 --- a/www/lib/constants.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const APP_NAME = "shuttle"; - -export const SITE_TITLE = "Stateful Serverless for Rust"; - -export const SITE_DESCRIPTION = - "Shuttle is a web application platform that uses traits and annotations to configure your backend deployment - including databases."; - -export const SITE_URL = "https://shuttle.rs/"; - -export const TWITTER_HANDLE = "@shuttle_dev"; - -export const GA_MEASUREMENT_ID = process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID; - -export const GITHUB_URL = "https://github.com/shuttle-hq/shuttle"; -export const DISCORD_URL = "https://discord.gg/shuttle"; -export const TWITTER_URL = "https://twitter.com/shuttle_dev"; -export const SHUTTLE_DOCS_URL = - "https://docs.shuttle.rs/"; diff --git a/www/lib/gtag.ts b/www/lib/gtag.ts deleted file mode 100644 index cdc5c230f..000000000 --- a/www/lib/gtag.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { NextRouter } from "next/router"; -import { GA_MEASUREMENT_ID } from "./constants"; - -// https://developers.google.com/analytics/devguides/collection/ga4/event-parameters?client_type=gtag#set-up-every-event -export const pageview = (url: string) => { - window.gtag("config", GA_MEASUREMENT_ID, { - page_path: url, - }); -}; - -interface GtagEvent { - action: string; - category: string; - label: string; - value?: string; -} -// https://developers.google.com/analytics/devguides/collection/ga4/events?client_type=gtag -export const gtagEvent = ({ action, category, label, value }: GtagEvent) => { - window.gtag("event", action, { - event_category: category, - event_label: label, - value: value, - }); -}; - -export const setupGoogleAnalytics = (router: NextRouter) => { - const handleRouteChange = (url: string) => { - pageview(url); - }; - router.events.on("routeChangeComplete", handleRouteChange); - router.events.on("hashChangeComplete", handleRouteChange); - return () => { - router.events.off("routeChangeComplete", handleRouteChange); - router.events.off("hashChangeComplete", handleRouteChange); - }; -}; diff --git a/www/lib/helpers.ts b/www/lib/helpers.ts deleted file mode 100644 index 6f5a0103f..000000000 --- a/www/lib/helpers.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function generateReadingTime(text: string): string { - const wordsPerMinute = 200; - const noOfWords = text.split(/\s/g).length; - const minutes = noOfWords / wordsPerMinute; - const readTime = Math.ceil(minutes); - return `${readTime} minute read`; -} - -export function capitalize(word: string): string { - return word[0].toUpperCase() + word.substring(1).toLowerCase(); -} diff --git a/www/lib/make-rss.ts b/www/lib/make-rss.ts deleted file mode 100644 index 5cab34817..000000000 --- a/www/lib/make-rss.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { APP_NAME, SITE_URL } from "./constants"; -import { getSortedPosts, Post } from "./posts"; -import fs from "fs"; - -const postXML = (post: Post): string => ` - - ${SITE_URL}blog/${post.url} - ${post.title} - ${SITE_URL}blog/${post.url} - ${post.description} - ${new Date(post.date).toUTCString()} - -`; - -const rssXML = (posts: readonly Post[]): string => ` - - - Blog - ${APP_NAME} - ${SITE_URL} - Latest news from ${APP_NAME} - en - ${new Date(posts[0].date).toUTCString()} - - ${posts.map(postXML).join("")} - - -`; - -const posts = getSortedPosts(); - -fs.writeFile("./public/rss.xml", rssXML(posts), (err) => { - if (err != null) { - console.error(err); - process.exit(1); - } -}); diff --git a/www/lib/posts.ts b/www/lib/posts.ts deleted file mode 100644 index 92f1dfa9c..000000000 --- a/www/lib/posts.ts +++ /dev/null @@ -1,161 +0,0 @@ -import fs from "fs"; -import path from "path"; -import matter from "gray-matter"; -import { generateReadingTime } from "./helpers"; -import { MDXRemoteSerializeResult } from "next-mdx-remote"; - -// substring amount for file names -// based on YYYY-MM-DD format -const FILENAME_SUBSTRING = 11; - -const POST_DIRECTORY = path.join(process.cwd(), "_blog"); - -export interface Post { - readonly slug?: string; - readonly title: string; - readonly date: string; - readonly cover?: string; - readonly coverAspectRatio?: string; - readonly author?: string; - readonly author_url?: string; - readonly excerpt?: string; - readonly ogImage?: { - readonly url: string; - }; - readonly content?: MDXRemoteSerializeResult>; - readonly toc?: MDXRemoteSerializeResult>; - readonly thumb: string; - readonly image?: string; - readonly readingTime?: string; - readonly description: string; - readonly url: string; - readonly tags?: string[]; - readonly logo?: string; - readonly hideAuthor?: boolean; -} - -export function getSortedPosts( - limit?: number, - tags?: readonly string[] -): readonly Post[] { - //Reads all the files in the post directory - const fileNames = fs.readdirSync(POST_DIRECTORY); - - // categories stored in this array - - let allPostsData: Post[] = fileNames.map((filename) => { - const slug = filename.replace(".mdx", ""); - - const fullPath = path.join(POST_DIRECTORY, filename); - - //Extracts contents of the MDX file - const fileContents = fs.readFileSync(fullPath, "utf8"); - const { data, content } = matter(fileContents); - - const options: Intl.DateTimeFormatOptions = { - month: "long", - day: "numeric", - year: "numeric", - }; - const formattedDate = new Date(data.date).toLocaleDateString( - "en-IN", - options - ); - - const readingTime = generateReadingTime(content); - - // construct url to link to blog posts - // based on datestamp in file name - - const dates = getDatesFromFileName(filename); - let url = `${dates.year}/${dates.month}/${dates.day}/${slug.substring( - FILENAME_SUBSTRING - )}`; - - return { - ...data, - date: formattedDate, - readingTime, - url: url, - slug, - } as Post; - }); - - allPostsData = allPostsData.sort((a, b) => { - if (new Date(a.date) < new Date(b.date)) { - return 1; - } else { - return -1; - } - }); - - if (tags) { - allPostsData = allPostsData.filter((post) => { - const found = tags.some((tag) => post.tags.includes(tag)); - return found; - }); - } - - if (limit) allPostsData = allPostsData.slice(0, limit); - - return allPostsData; -} - -// Get Slugs -export const getAllPostSlugs = () => { - const fileNames = fs.readdirSync(POST_DIRECTORY); - - const files = fileNames.map((filename) => { - const dates = getDatesFromFileName(filename); - - return { - params: { - ...dates, - slug: filename.replace(".mdx", "").substring(FILENAME_SUBSTRING), - }, - }; - }); - - return files; -}; - -// Get Post based on Slug -export const getPostdata = async (slug: string) => { - const fullPath = path.join(POST_DIRECTORY, `${slug}.mdx`); - - const postContent = fs.readFileSync(fullPath, "utf8"); - - return postContent; -}; - -export function getAlltags(): readonly string[] { - const posts = getSortedPosts(); - let tags: string[] = []; - - posts.map((post) => { - post.tags.map((tag: string) => { - if (!tags.includes(tag)) return tags.push(tag); - }); - }); - - return tags; -} - -interface Dates { - readonly year: string; - readonly month: string; - readonly day: string; -} - -function getDatesFromFileName(filename: string): Dates { - // extract YYYY, MM, DD from post name - const year = filename.substring(0, 4); - const month = filename.substring(5, 7); - const day = filename.substring(8, 10); - - return { - year, - month, - day, - }; -} diff --git a/www/lib/shuttle.ts b/www/lib/shuttle.ts deleted file mode 100644 index bb1cf58ff..000000000 --- a/www/lib/shuttle.ts +++ /dev/null @@ -1,75 +0,0 @@ -import axios, {AxiosRequestConfig, AxiosResponse, HttpStatusCode, Method} from "axios"; - -export async function getApiKey(username: string): Promise { - const res = await fetch( - `${process.env.SHUTTLE_API_BASE_URL}/users/${username}`, - { - method: "POST", - headers: { - Authorization: `Bearer ${process.env.SHUTTLE_ADMIN_SECRET}`, - }, - } - ); - - if (res.ok) { - const body = await res.json(); - return body["key"] - } else { - console.log(res); - throw new Error("could not get api key."); - } -} - -export type User = { - name: string - key: string - projects: string[] -} - -export type Error = { - status: HttpStatusCode - error: string -} - -export class Shuttle { - private url(suffix: string): string { - return `${process.env.SHUTTLE_API_BASE_URL}${suffix}` - } - - private request(method: Method, path: string): Promise> { - let req = { - headers: { - Authorization: `Bearer ${process.env.SHUTTLE_ADMIN_SECRET}` - }, - method: method, - url: this.url(path) - }; - return axios.request(req).then((res) => { - return res.data; - }).catch((err) => { - if (err.response) { - return Promise.reject({ - status: err.response.status, - ...err.response.data - }) - } else { - return Promise.reject(err); - } - }) - } - - async get_user(user: string): Promise { - return this.request("GET", `/users/${user}`).then((body) => { - return body as User - }) - } - - async create_user(user: string): Promise { - return this.request("POST", `/users/${user}`).then((body) => { - return body as User - }) - } -} - -export default new Shuttle(); - diff --git a/www/next-env.d.ts b/www/next-env.d.ts deleted file mode 100644 index 4f11a03dc..000000000 --- a/www/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/www/next-sitemap.js b/www/next-sitemap.js deleted file mode 100644 index deca1aa90..000000000 --- a/www/next-sitemap.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - siteUrl: process.env.SITE_URL || "https://shuttle.rs", - generateRobotsTxt: true, -}; diff --git a/www/next.config.js b/www/next.config.js deleted file mode 100644 index 6cd46df7b..000000000 --- a/www/next.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - i18n: { - locales: ["en"], - defaultLocale: "en", - }, - images: { - domains: ["github.com"], - }, - async rewrites() { - return [ - { - source: "/rss.xml", - destination: "/api/rss", - }, - ]; - }, -}; diff --git a/www/package.json b/www/package.json deleted file mode 100644 index 07a5d3433..000000000 --- a/www/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "fmt": "prettier --write *.{yaml,js,json,md} {styles,pages,lib,components,_blog}/**", - "make": "yarn make:sitemap; yarn make:rss", - "make:rss": "ts-node --skipProject --transpileOnly --esm lib/make-rss.ts", - "make:sitemap": "next-sitemap", - "postbuild": "yarn make" - }, - "dependencies": { - "@auth0/nextjs-auth0": "^1.7.0", - "@fortawesome/fontawesome-svg-core": "^6.1.0", - "@fortawesome/free-brands-svg-icons": "^6.1.0", - "@fortawesome/free-regular-svg-icons": "^6.1.0", - "@fortawesome/free-solid-svg-icons": "^6.1.0", - "@fortawesome/react-fontawesome": "^0.1.14", - "@headlessui/react": "^1.5.0", - "@heroicons/react": "^1.0.6", - "@mapbox/rehype-prism": "^0.8.0", - "@tailwindcss/forms": "^0.5.0", - "@tailwindcss/typography": "^0.5.2", - "@types/react-syntax-highlighter": "^13.5.2", - "axios": "^1.0.0", - "classnames": "^2.3.1", - "gray-matter": "^4.0.3", - "markdown-toc": "^1.2.0", - "next": "^12.1.0", - "next-mdx-remote": "^4.0.2", - "next-seo": "^5.1.0", - "node-fetch": "^3.2.3", - "prism-themes": "^1.9.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-markdown": "^8.0.2", - "react-syntax-highlighter": "^15.5.0", - "react-tooltip": "^4.2.21", - "react-use": "^17.3.2", - "rehype-slug": "^5.0.1", - "remark-gfm": "^3.0.1", - "sass": "^1.32.8", - "ts-node": "^10.7.0" - }, - "devDependencies": { - "@types/gtag.js": "^0.0.11", - "@types/node": "^17.0.21", - "@types/react": "^17.0.2", - "autoprefixer": "^10.4.4", - "next-sitemap": "^2.5.10", - "postcss": "^8.4.12", - "prettier": "^2.6.1", - "prettier-plugin-tailwindcss": "^0.1.8", - "tailwindcss": "^3.0.23", - "typescript": "^4.1.5" - } -} diff --git a/www/pages/404.tsx b/www/pages/404.tsx deleted file mode 100644 index 8acfa8c02..000000000 --- a/www/pages/404.tsx +++ /dev/null @@ -1,16 +0,0 @@ -export default function NotFound() { - return ( - <> -
    -
    -
    - Oops! -
    -
    - This page does not seem to exist, sorry. -
    -
    -
    - - ); -} diff --git a/www/pages/_app.tsx b/www/pages/_app.tsx deleted file mode 100644 index 2d5d7cc71..000000000 --- a/www/pages/_app.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import "../styles/index.css"; -import type { AppProps } from "next/app"; -import React, { useEffect } from "react"; -import { useRouter } from "next/router"; -import Head from "next/head"; -import { DefaultSeo } from "next-seo"; -import { - APP_NAME, - SITE_TITLE, - SITE_DESCRIPTION, - SITE_URL, - TWITTER_HANDLE, - GA_MEASUREMENT_ID, -} from "../lib/constants"; -import AnnouncementBar, { - AnnouncementBarIsClosedProvider, -} from "../components/AnnouncementBar"; -import { UserProvider } from "@auth0/nextjs-auth0"; -import ApiKeyModal, { - ApiKeyModalStateProvider, -} from "../components/ApiKeyModal"; -import Footer from "../components/Footer"; -import Header from "../components/Header"; -import { config } from "@fortawesome/fontawesome-svg-core"; -import Script from "next/script"; -import { setupGoogleAnalytics } from "../lib/gtag"; - -config.autoAddCss = false; - -export default function App({ Component, pageProps }: AppProps) { - const router = useRouter(); - useEffect(() => setupGoogleAnalytics(router)); - const { user } = pageProps; - - return ( - - - - - {SITE_TITLE} - - */} - - -
    - - - - ); - } -} diff --git a/www/pages/api/auth/[...auth0].ts b/www/pages/api/auth/[...auth0].ts deleted file mode 100644 index 32fa76a1f..000000000 --- a/www/pages/api/auth/[...auth0].ts +++ /dev/null @@ -1,40 +0,0 @@ -import {handleAuth, handleCallback, handleLogin} from "@auth0/nextjs-auth0"; -import shuttle, {Error} from "../../../lib/shuttle"; - -async function afterCallback(req, res, session, state) { - const shuttlified = session.user.sub.replace("|", "-"); - - const user = await shuttle.get_user(shuttlified).catch((err) => { - if ((err as Error).status === 404) { - console.log(`user ${shuttlified} does not exist, creating`); - return shuttle.create_user(shuttlified); - } else { - return Promise.reject(err); - } - }); - - session.user.api_key = user.key; - - return session; -} - -export default handleAuth({ - async callback(req, res) { - try { - await handleCallback(req, res, { afterCallback }); - } catch (error) { - res.status(error.status || 500).end(error.message); - } - }, - async login(req, res) { - try { - await handleLogin(req, res, { - authorizationParams: { - connection: "github", - }, - }); - } catch (error) { - res.status(error.status || 400).end(error.message); - } - }, -}); diff --git a/www/pages/blog.tsx b/www/pages/blog.tsx deleted file mode 100644 index 750fb1a0f..000000000 --- a/www/pages/blog.tsx +++ /dev/null @@ -1,214 +0,0 @@ -import { useMemo, useState } from "react"; -import { useRouter } from "next/router"; -import Image from "next/image"; -import { NextSeo } from "next-seo"; -import { getAlltags, getSortedPosts, Post } from "../lib/posts"; -import { getAuthors } from "../lib/authors"; -import BlogListItem from "../components/blog/BlogListItem"; -import { SITE_URL } from "../lib/constants"; -import { GetStaticPropsResult } from "next"; -import InternalLink from "../components/InternalLink"; -import classnames from "classnames"; - -export async function getStaticProps(): Promise> { - const allPostsData = getSortedPosts(); - const tags = getAlltags(); - - return { - props: { - blogs: allPostsData, - tags, - }, - }; -} - -interface Props { - readonly blogs: ReturnType; - readonly tags: readonly string[]; -} - -export default function Blog(props: Props): JSX.Element { - const tags = ["all", ...props.tags]; - const [activeTag, setActiveTag] = useState("all"); - const router = useRouter(); - - const [headPost, tailPosts] = useMemo(() => { - const [head, ...tail] = props.blogs; - - return [head, tail]; - }, [props.blogs]); - - const blogs = useMemo(() => { - if (activeTag === "all") return tailPosts; - - return tailPosts.filter((post) => post.tags.includes(activeTag)); - }, [tailPosts, activeTag]); - - const meta_title = "Shuttle Blog"; - const meta_description = "Get all your shuttle News on the shuttle blog."; - - return ( - <> - - -
    -
    -
    - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    - -
    -
    -
    -
    -
    - -
      - {blogs.map((blog, index) => ( -
      - -
      - ))} -
    -
    -
    - - ); -} - -interface FeaturedThumbProps { - readonly post: Post; -} - -function FeaturedThumb({ post }: FeaturedThumbProps) { - const author = getAuthors(post.author?.split(",") ?? []); - - return ( -
    - -
    - -
    -
    -
    -

    {post.date}

    -

    -

    {post.readingTime}

    -
    - -
    -

    {post.title}

    -

    - {post.description} -

    -
    - -
    - {author.map((author, index) => { - return ( -
    - {author.author_image_url && ( -
    - {`${author.author} -
    - )} -
    - - {author.author} - - - {author.position} - -
    -
    - ); - })} -
    -
    -
    -
    - ); -} diff --git a/www/pages/blog/[year]/[month]/[day]/[slug].tsx b/www/pages/blog/[year]/[month]/[day]/[slug].tsx deleted file mode 100644 index 87fe7daf4..000000000 --- a/www/pages/blog/[year]/[month]/[day]/[slug].tsx +++ /dev/null @@ -1,416 +0,0 @@ -import matter from "gray-matter"; -import { getAuthors } from "../../../../../lib/authors"; -import { serialize } from "next-mdx-remote/serialize"; -import { NextSeo } from "next-seo"; -import Image from "next/image"; -import { useRouter } from "next/router"; -import React from "react"; -import { generateReadingTime } from "../../../../../lib/helpers"; -import { - getAllPostSlugs, - getPostdata, - getSortedPosts, - Post, -} from "../../../../../lib/posts"; -import { MDXRemote, MDXRemoteProps } from "next-mdx-remote"; -import gfm from "remark-gfm"; -import slug from "rehype-slug"; -import toc from "markdown-toc"; -import rehypePrism from "@mapbox/rehype-prism"; -import { SITE_URL } from "../../../../../lib/constants"; -import { GetStaticPropsContext, GetStaticPropsResult } from "next"; -import { ParsedUrlQuery } from "querystring"; -import InternalLink from "../../../../../components/InternalLink"; -import ExternalLink from "../../../../../components/ExternalLink"; -import classnames from "classnames"; -import { DocumentTextIcon } from "@heroicons/react/outline"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faLinkedin, faTwitter } from "@fortawesome/free-brands-svg-icons"; -import Copy from "../../../../../components/Copy"; - -export async function getStaticPaths() { - const paths = getAllPostSlugs(); - return { - paths, - fallback: false, - }; -} - -interface Params extends ParsedUrlQuery { - readonly year: string; - readonly month: string; - readonly day: string; - readonly slug: string; -} - -export async function getStaticProps({ - params, -}: GetStaticPropsContext): Promise> { - const filePath = `${params.year}-${params.month}-${params.day}-${params.slug}`; - const postContent = await getPostdata(filePath); - const readingTime = generateReadingTime(postContent); - const { data, content } = matter(postContent); - - const mdxPost = await serialize(content, { - scope: data, - mdxOptions: { - remarkPlugins: [gfm], - rehypePlugins: [slug, rehypePrism], - }, - }); - - const contentTOC = toc(content, { - maxdepth: data.toc_depth ?? 3, - }); - - const mdxTOC = await serialize(contentTOC.content); - - const relatedPosts = getSortedPosts( - 6, - mdxPost.scope.tags as readonly string[] - ) - .filter((p) => p.slug != filePath) - .slice(0, 5); - - const allPosts = getSortedPosts(); - - const currentIndex = allPosts - .map(function (e) { - return e.slug; - }) - .indexOf(filePath); - - const nextPost = allPosts[currentIndex + 1] ?? null; - const prevPost = allPosts[currentIndex - 1] ?? null; - - return { - props: { - prevPost, - nextPost, - relatedPosts, - blog: { - slug: `${params.year}/${params.month}/${params.day}/${params.slug}`, - content: mdxPost, - ...data, - toc: mdxTOC, - readingTime, - } as Post, - }, - }; -} - -const Pre = ({ children, ...props }: any) => { - let line = 1; - - const code = React.useMemo(() => { - return [children.props.children] - .flat() - .flatMap((child) => { - if (typeof child !== "string") { - return child.props.children; - } else { - return child; - } - }) - .join(""); - }, [children]); - - return ( -
    - - -
    -        {{
    -          ...children,
    -          props: {
    -            ...children.props,
    -            className: children.props.className ?? "language-",
    -            children: [
    -              
    -                {line}
    -              ,
    -              ...[children.props.children].flat().flatMap((child) => {
    -                if (typeof child === "string") {
    -                  const [head, ...tail] = child.split("\n");
    -                  return [
    -                    head,
    -                    ...tail.flatMap((child) => {
    -                      line++;
    -
    -                      return [
    -                        "\n",
    -                        
    -                          {line}
    -                        ,
    -                        child,
    -                      ];
    -                    }),
    -                  ];
    -                } else {
    -                  return child;
    -                }
    -              }),
    -            ],
    -          },
    -        }}
    -      
    -
    - ); -}; - -const mdxComponents: MDXRemoteProps["components"] = { - a(props) { - if (props.href.match(/^https?:\/\//)) { - return ; - } - - return ; - }, - pre: (props: any) => { - return
    ;
    -  },
    -};
    -
    -interface Props {
    -  readonly prevPost?: Post;
    -  readonly nextPost?: Post;
    -  readonly relatedPosts: readonly Post[];
    -  readonly blog: Post;
    -}
    -
    -export default function BlogPostPage(props: Props) {
    -  const author = getAuthors(props.blog.author?.split(",") ?? []);
    -
    -  const { basePath } = useRouter();
    -
    -  return (
    -    <>
    -       {
    -              return cat;
    -            }),
    -          },
    -          images: [
    -            {
    -              url: `${SITE_URL}${basePath}/images/blog/${props.blog.thumb}`,
    -            },
    -          ],
    -        }}
    -      />
    -      
    -
    -
    -

    Blog post

    -

    {props.blog.title}

    -
    -

    {props.blog.date}

    -

    -

    {props.blog.readingTime}

    -
    -
    - {author.map((author, index) => { - return ( -
    - -
    - {author.author_image_url && ( -
    - -
    - )} -
    - - {author.author} - - - {author.position} - -
    -
    -
    -
    - ); - })} -
    -
    -
    -
    - {/* Content */} -
    - {(props.blog.thumb ?? props.blog.cover) && ( -
    - -
    - )} -
    - -
    -
    -
    - Share this article -
    -
    - - - - - - - -
    -
    -
    -
    - {props.prevPost && ( - - )} -
    -
    - {props.nextPost && ( - - )} -
    -
    -
    - {/* Sidebar */} -
    -
    -
    -
    -
    - {props.blog.tags.map((tag: string) => { - return ( - - {tag} - - ); - })} -
    - -
    On this page
    - -
    - -
    -
    -
    - {props.relatedPosts.length > 0 ? ( -
    -
    - Related articles -
    - -
    - {props.relatedPosts.map((post, index) => ( - - - - {post.title} - - ))} -
    - - View all posts - -
    -
    -
    - ) : null} -
    -
    -
    -
    - - ); -} - -interface NextCardProps { - readonly post: Post; - readonly label: string; - readonly className?: string; -} - -function NextCard({ post, label, className }: NextCardProps) { - return ( - -
    {label}
    - -
    - {post.title} -
    -
    - {post.date} -
    -
    - ); -} diff --git a/www/pages/blog/tags/[tag].tsx b/www/pages/blog/tags/[tag].tsx deleted file mode 100644 index 4bee33e7f..000000000 --- a/www/pages/blog/tags/[tag].tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { NextSeo } from "next-seo"; -import { getAlltags, getSortedPosts, Post } from "../../../lib/posts"; -import BlogListItem from "../../../components/blog/BlogListItem"; -import { ParsedUrlQuery } from "querystring"; -import { GetStaticPropsContext, GetStaticPropsResult } from "next"; -import InternalLink from "../../../components/InternalLink"; - -interface Params extends ParsedUrlQuery { - readonly tag: string; -} - -export async function getStaticProps({ - params, -}: GetStaticPropsContext): Promise> { - const posts = getSortedPosts(0, [params.tag]); - - return { - props: { - tag: params.tag, - blogs: posts, - }, - }; -} - -export async function getStaticPaths() { - const tags = getAlltags(); - return { - paths: tags.map((tag) => ({ params: { tag } })), - fallback: false, - }; -} - -interface Props { - readonly tag: string; - readonly blogs: readonly Post[]; -} - -export default function TagBlogsPage(props: Props) { - const { blogs, tag } = props; - return ( - <> - - -
    -
    -

    - Blog -

    -

    /

    -

    {`${tag}`}

    -
    -
      - {blogs.map((blog, idx) => ( -
      - -
      - ))} -
    -
    - - ); -} diff --git a/www/pages/index.tsx b/www/pages/index.tsx deleted file mode 100644 index 3635a3e48..000000000 --- a/www/pages/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import Examples from "../components/Examples"; -import CodeSnippets from "../components/CodeSnippets"; -import Features from "../components/Features"; -import Hero from "../components/Hero"; - -export default function Home() { - return ( - <> - - - - - - ); -} diff --git a/www/pages/login.tsx b/www/pages/login.tsx deleted file mode 100644 index 489c99b02..000000000 --- a/www/pages/login.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { withPageAuthRequired } from "@auth0/nextjs-auth0"; -import React from "react"; -import { useMount } from "react-use"; -import Home from "."; -import { useApiKeyModalState } from "../components/ApiKeyModal"; - -export default function Login() { - const [open, setOpen] = useApiKeyModalState(); - - useMount(() => { - setOpen(true); - }); - - return ; -} - -export const getServerSideProps = withPageAuthRequired(); diff --git a/www/pages/pricing.tsx b/www/pages/pricing.tsx deleted file mode 100644 index 69a343f6e..000000000 --- a/www/pages/pricing.tsx +++ /dev/null @@ -1,280 +0,0 @@ -import React from "react"; -import { Fragment } from "react"; -import classnames from "classnames"; -import { DISCORD_URL } from "../lib/constants"; -import ExternalLink from "../components/ExternalLink"; -import LoginButton from "../components/LoginButton"; - -const tiers = [ - { - name: "Hobby", - BuyButton: LoginButton, - price: ( - <> - $0{" "} - /mo - - ), - description: - "The perfect confluence of features to run your hobby-projects for free - forever.", - }, - { - name: "Pro", - BuyButton() { - const label = "Contact Us"; - - return ( - - {label} - - ); - }, - price: ( - - Let's Talk - - ), - description: - "Build on production quality infrastructure which scales to your needs.", - }, -]; - -const sections = [ - { - name: "Features", - features: [ - { - name: "Team Size", - tiers: { Hobby: 1, Pro: "Get in touch" }, - }, - { - name: "Deployments", - tiers: { Hobby: "Unlimited", Pro: "Unlimited" }, - }, - { - name: "Number of Projects", - tiers: { Hobby: 5, Pro: "Get in touch" }, - }, - { - name: "Requests", - tiers: { Hobby: "150K/mo", Pro: "Get in touch" }, - }, - { - name: "Workers", - tiers: { Hobby: 1, Pro: "Get in touch" }, - }, - { - name: "Database Storage", - tiers: { Hobby: "500 MB", Pro: "Get in touch" }, - }, - { - name: "Subdomains", - tiers: { Hobby: "1 Per Project", Pro: "1 Per Project" }, - }, - { - name: "Custom Domains", - tiers: { Hobby: "N/A", Pro: "1 Per Project" }, - }, - ], - }, - { - name: "Support", - features: [ - { - name: "Community", - tiers: { - Hobby: ( - - Discord - - ), - Pro: ( - - Discord - - ), - }, - }, - { - name: "Request Turnaround", - tiers: { Hobby: "N/A", Pro: "24 hr" }, - }, - ], - }, -]; - -export default function Pricing() { - return ( -
    -
    - {/* xs to lg */} -
    - {tiers.map((tier, tierIdx) => ( -
    -
    -

    - {tier.name} -

    -

    {tier.price}

    -

    - {tier.description} -

    - -
    - - {sections.map((section) => ( - - - - - - - - - - {section.features.map((feature) => ( - - - - - ))} - -
    - {section.name} -
    - Feature - - Included -
    - {feature.name} - - - {feature.tiers[tier.name]} - -
    - ))} - -
    - -
    -
    - ))} -
    - - {/* lg+ */} -
    - - - - - - {tiers.map((tier) => ( - - ))} - - - - - - {tiers.map((tier) => ( - - ))} - - {sections.map((section) => ( - - - - - {section.features.map((feature) => ( - - - {tiers.map((tier) => ( - - ))} - - ))} - - ))} - - - - - {tiers.map((tier) => ( - - ))} - - -
    Pricing plan comparison
    - Feature by - Plans - - {tier.name} -
    - Pricing - -
    -

    {tier.price}

    -

    - {tier.description} -

    - -
    -
    - {section.name} -
    - {feature.name} - - - {feature.tiers[tier.name]} - -
    - Choose your plan - - -
    -
    -
    -
    - ); -} diff --git a/www/postcss.config.js b/www/postcss.config.js deleted file mode 100644 index 12a703d90..000000000 --- a/www/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/www/public/favicon.ico b/www/public/favicon.ico deleted file mode 100644 index 8305257ece2fd8851f6d393bad066d9b845b11e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 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

    >>*b3UZsc78IhN_F5y-Y0~> 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�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

    e#ff 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 Z)3LQElL-XP$m2MnuB`pAT+uxE{{Z6M#9jaZ diff --git a/www/public/images/blog/discord-bot-screenshots/application-registration.png b/www/public/images/blog/discord-bot-screenshots/application-registration.png deleted file mode 100644 index 6207a0b8ac44d2172b7bdfb2a016ceada755cb55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226072 zcmb@tRa9I-^DmkN8{AZb5?+JV0;@&IAqa1ozeXvR zzKp?_f!8kYWhGwy7$Mtzc|f!fR~CQusyYt+!362$8P!qlgUhQ|#JK-{uLtSR#a_L7 zE|ixN*Yq?zctr6fl>NCAGwQSA<8l3b)P6tz?0tD_18~MN!&) z5fnHJIF|iTMZ9%SdUf6#s;@aUJxnu{JmYxMn0^*JMv3?+4LG8FikdVFWUIMoH*r_7 z^b(dZ8HI_MgEGImm^i(?gKx$2AYT#V6?F+6xBs5a@%&DVeN6OS+_v9goJ%)UXK?f# zPX~o~TTpW(VyG2l@UA0I&H6Nhq1$nH6EUO|gYkn9No`zP*wIq(DeWUV)}+bS+>z&D zq0VUlnIG=Au||QXN0}cqh}Ur_<`_iRUx@m+-l|HdLeVrw$Sjv0aS}u+Sa`MWe@}xx zKs~RTiE)T?f-XsUU7%_u6c0!~VhLpcF?v!*geSYK@vc-8W?ENomML%iBpHS&J$!5n zH+ahEP)<0>KHAMs1&+gfzCW#2KO0^Tk_7WuceuXxY0QAy*OO-$92+%G`d?-KBsvvM zCk+oSS5AT!3wGhHUL!qv_pg02O0@jAayV)0Kc>2ja(e zqzg3+dO|KdJ>gqTzz{d$)Yr`L0g}iM*7(`k$#IHFu^to+kQ1{lYNb5Mrr)8G3#o$? zENVa{S_JpkcN}-x{UpHxH5fV_k8i@3+atw@bT(q*eo(X36Tpcd5RB9-cv zoX&cbhhZo7u~?LGVYT$FF92$Zbbrp~7cd0$FDgt)3M7$K1^szFdm7?~cs2WkJIV9u zPy0a3+TRwPQ(7iPsbk^nxCQxMHMQ_eDUYZPL>imtccS^TjOnDXOvp_HV<4n8BuU~A zZHyYP9!RM;$tClkJd+EV<-|?!k*9PjVTB7n?2=33V?J*vaF?-R& zv^RcF?gxt5y;)xQ?2(-v$FgEa<(5j&!qW}(f9?A$Yb760v4O~DWsmq2)$xJMD4


    W7)ZuwLvOd(c;`<2NF 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%0A2?Z<0;)y>fv8ePdd{MUr3CmAW zx))&!Q6h*OsNaXVQTgr#yuW`rY~hLck^YT-su%w7lo9Vxy_K6R_sj!4A{+*R zKp=R$>Cj-4^xhU#K?B%Q!9&2}UP|p?ZQCwhZrg??2RVEmas=|Ai=P06dk|FNgQ1Pe zgE1~2mZXWWXUv8pZ6+}d?(`Xm>^&Qv%$Z0YxD+{~wjib7447>Z(3|Y?$GDH&Gl!vP zkOHs1`kFNQr@xywZ({g}d_2`X7m$kqDQZ= zHhKFThLht4AxK4GDjohUXEv^0`x5{WmZ( zEf`DxbOE3497zM|Fmeu#13�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

    2ZAW&p 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 diff --git a/www/public/images/blog/discord-bot-screenshots/bot-name.png b/www/public/images/blog/discord-bot-screenshots/bot-name.png deleted file mode 100644 index 879018ed3d2a5ca9d5da5241473e66667958ae74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104132 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

    E$!*_VbTL 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 Rz7qZNt?Re1mFwGv{1+zt<|qIF diff --git a/www/public/images/blog/discord-bot-screenshots/command-result.png b/www/public/images/blog/discord-bot-screenshots/command-result.png deleted file mode 100644 index de305ebf104b6c53f1536b7168c39295a4b81a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25035 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%0AT88|o@+Vu!I}B~ zQV@5zk5yO22~a&FwCqi2z9d8B3}087i+H%2-dBxzVc&GAG6&U||F_TW)t@>P&{u5B z%~^_P4$lTEnIAX4v1^{A1^Hy>)y;>HTkU+2z-;tgt83JQ>$t;}RI7!cK7yGMw>^%z z2f51?Q-{OyJlC__tL@6bVcjjE``X9b(G#V?=D$^R--J39{14zp{&Ac9s%l}c6EZXs zUdY5MFeYgBl3pJ=P^hkclggpTI58${wT#@AO(r^h>n$d&5YbF0-SF?7iKt-wy|Z^m3S7@_@p6?A|2~TmgM_1WKu(Iee@)v9nUb%JM8H;8 zu4ia&xt%(0{~Aku4%5dAMVornjAyd%3&D);DqJ8Ii2&|{WFyegzf}2;(Wvh|0s&bS zkGKgb#Zm5dM)@{kAvSR|!La$K+bbXR1|;E9Kr0hq_&~I5+E>^Y&H6_4_9OLvsG-0DKQP}`pCICYby#A-!dV+< ztt&5XD%ypTcK>q*uoK4gv4#m%Twx@bJH-Fltq@fgP)9m*;K}CJe`*&jvEh&~OBw#= zth&Kl?y123(Y@)wO_`OzzS&Fq*Jp|;%d~SN6-gVo_|LOcvbO|hHKhL6KTB&9&ih~K z*T}Wcf2aSqwpw<2W#H@YF#QVE=n0M|p=Ej#^rwLD^6d$-(#87Q;!okU*ySRXKwbVXu*3(f~ zluRQy<`VxgOP(=!@!_s#Xq-c5^$%8FG8c}ghefC@8T)Z^v%n7VzmNruV$jJwXPA_}AAiw9NFMEoC`L6SludN`51E;=LUnoe8)J5GO6>jhLBX z+j8Jtc65vB%Kc<84Ex(S3+~ZjFE9_5xX)B=GI{rb@VicDMYihOL&0D}aRqN@292g3 z%d?A%0=K6JJL3E^!}`1ce`iwIwVB-Ix}Mwq3f)~0`i;8%?mVrY;9~r{AzvbVR{Q== zTScWbRysuv=!V}=X0(%vN#=(;(kim{5(~w z$`G$8h_TD0=_?bb9i~Jdt0%52IJ%e55@NxySr`}Eg!{Jd1;$Cabu0h(!8CeEJGM#3 zgKI~%YqR!wP;}SsKD5Vr0R?o8v2xPKwK5t`5(8xT%=Y3J@J0R#p}6zU*$VgL6@S&Y z3ui?ZXtHS~0=H66k@%p&0sJH;{|Pgt$-;t&g`rRO{4H>VwaSjD`7+<0^qEe!Wdh>XKCYFoecX=L|IiL0<(A_tP76we zo1Ac1!uN82!IBxC^MN5vja)>&n?2sb3$AV}5@n>p%En%@7|3w#D(L(AlzEA?cw2i zK`7tccYoFi!R->j?KXG<>gnzM_UD}{i|4}hB&N*3fU|?SCkD!N$h*Cfu9`e^-yZ$% z%7covH=hR;gcJfA51hqPSO0{Qls#I$$KcC9hRIp(vQPt0PBz1-{rs^XbVDYmd8M&( zy~lXjo_8YZ_}9_tR-Y#W%wuOqVP5Me@B>eZuO?H|+j|n^6To^ZSSWQR{}QvCp-@as zm(wY17Mo*$=g{O>% zWSHpufp4<^lR={E@Z6kl@B@3*@HRU->gr7mrY?Vk4R#f;4QlI~MJFUuLkyN&TD-(T zYWvf|$AUlhYy&Qs1Iz?7qd%}hqrE_z6~NHhKHa=-VF8;q4;o}P|~=aQw?cWoY7 z%Trw&2%ntfG;FTU)=JpnPnD*zii(f!?{(uQ+6aP0gHFT6ebrf~QU%A3)`@ZE?j9m?yvV4e2y~ajh97>0 z4LFnP@AcQ?t5%qBR_NU;a_+W|bxhpJ5Ya;7uf3cQd}v z5{-Ui9qc*2!zqJ6Gf2u4w%T>EYCv-P`;ijMRDZwi2us2T=ezHhDdw7^*)vCi`mE}& z#Wg|e)a#ot$PIq>?6K+}!ssEe<}1^k`jIF`T!Vf0c=w@$hk?VGk{234H?3_>f$@{2 zLx4gWM|o7Sa?G#TJPqHTC5YXotOJILr6oCMQ(xDbpza~$mg(ju6G;qOQSoY>lv=$F z1;j(KX|UKC_3$>=u|a^$p7-aphFsP(-6uEkfS_B-FTFmZdutYEVql9){+=-o_g5y5 zKeW(9F)Xnzot2C>#@IXYBk`>^4R0gAPXD9ho|#``b%^M|`2Bx%c9vmLbz$2Ukx*Kc zZlp`PXOxykP!NFu>F$nEhLBF_ZlsiEC=~>T#sTRD8FFCgp}xWAdA?uopZA@gd-k#S zKGt4)t$SVfd0&f*n!bm;eEqv#>sF)&1j^9&?dE&+eE*bhkX zz7!}Q5u^^#XE5hPHL$*wRZk9~^#qCOCj{y$@wkQbevPK!y3vtEZwzhyej>b)SHMED zmmw>$;H13y<6V*0EAx?q#;Jz%482EuoT2Tj5`bz~*3yEzzGYqCAw+`q=|o(TX*$Ue zy+U*-QS+$Z7L{fbQ8nL0#xEU-I#OE-NfkqtZ`%s`YO;2;Qp*u%jf7Iw5*dpV;f*Em zGJDqou#fzKWm5?=&*X|V+h;6C1IS{qxFm(Old~i1N_RIEy?TqQ}UkjUD9Crw9<4R(2nlDI-&YN7f?e;E#)b!S&fEB z7%=*6>R`zsGoX&*mQ| zpOFrvl7!Wel4c@>6yz-WZjjH!CI!@*1vseGDJD0B!4v$v_>4_R0UjtB z--X8*#CbiI#n6_u)p^0@JlZ|eo0IVXPU`(hsuh}CE>sf2^;j|;wqHMy-(Ew4rAzS( z?%^WdX#UL<$?fQerTWX$1`wzkqQrOvYhf|)9UbEgPKIiwNm>(gN5b=wjz2cH?8s=O zm*K@f5>h!>bfpbhl()nsv;j5vVTZBts;|XQW_- zOPrQ8_NC)`usj{lQeSDPvIZF}CQP0I4V(gBMjNuH zGEmhCEtOBlKse+r6YA*G;N8|{M_utcA#IO<&`jE~(Yb1)ilLma!DxdGmKtwBf9=q| zx7d<81buCjn2?YiQ#sBgW!P1CW^YEiXjbLpe*8iS(H4lB>Z2HhJQlT@EZzSdw$;Zl7Zb7|Y@hetQKs9w6qv(~hmw1Mo>&lD2gERim@-r4zC z7cX$VfVkh;OGDtmC04|7G0FnCysn_?I=x-;;l@KoVVzB-?;_~#IM*t~0l+I34MHp( zdU^&QcXqU!77bXJ!*gk~1z6%F$MMl_B_HxjxMdiX=Hu8{S&dt&eNte}Jry<0diRm? z38E;swaeI8V#}WQ>jSCg2P;428}G&oEA(Mqt|j{lTMu^^r<#0@t_ISzYle$ABDI@( zwARWl?o%F3Rv8OhP&qp|^|+68K02g)R%8%2P~6t$(3gqN-$Zb`5^&NGs=&sv#XV{i z@`1r=HWmpt#zQq{@tL;@@pfCm((fKL z9$mgH+Rku2G9{Y9)al96+c?^hGWXvHt$8>;&&78+mT)hj-ZhrZ5B&KHJ{AoqY%4bl zX)12$e7z`!U3XZ805mXiyq(|2ySvh6jBv6K7ht0;M|5I>FA12kh$Jf zo1Xm08m^i5weEDMLF|<6dxBZ`{L-WKD?Cw&enF1ed)8OXbW-zzOIMquu2MX*^js`@ z;ZB_Qmi8#Hpj~lmb0TT2cCKa6=jV!#Kz*qzGCc}`;5N&M> zJ=bCEL(|sO*E)Dly2hV6jhgi!w}gh%Wm>G|jUHOeD#-6lLOwKLGk^$PC`di&vtFWx zCpr|zp1GQunri+%7$;5C{`VK%d;PR`LPJB-fZ&eWDF@a#aSjl8yHR|i>L6(!zO50O zzc;G>V7<8g3f^!m$^}8asjbB&>9-z!7RKojnMdukLYJ}k{XL?Z={1>4Rff}e&elg8 zCB_vy2L+DkK93{u?}>-y1Ef^KL{To|S_Cnup@?>8({CM#lsO%U+W0+&>9!{#RAy}k*>b7m-0QNO!II~<{O)Oj}lXx-gH|bJ7Z#4^<{obpAX=&an2B>*5nTymJq^YYs zJorT&*!HCEO#NMSHzRB|nl*eRPkig>ihiQ(ap#TaW&)hWF#eMxj!cY1vDi)A+Gk*_ z@CroCI^vlW3^W#Tah)aY?EaWI%O=$Nn;ABOA|G`9Rzlji`03W)Y2@b#n&R6Ed|pA^^*RfSAC-hZD2-1g zp7IU^O>uFps7+7C>>&bJas0-3+=_?o9{YzK9UnzLOO5;?so3|0M)2rV;JwMYg}j)m z)p}RX_#&e;zaf3}Z@nVxKTJT@7koP#r@g9?%u-eAE;AoCQW9B)Y3%xFEA@?1Kl)R> z`#d&a?sYOPrul&H7o(<9^E#Yq2zZwlvDj%}cH=GCI?DR5S}_SoNw4Es z%Dc^N2wZ&CFK`=uS=Od?klu$JX*s-TLxBdFOlmH_jc;gUrUIP(PT8MC`RNJc*eYT9R-F_bSF zP2<FlQ8T&h2b3ECrF8g0l?2NqV4MqGOwaK_Pw0 zlz>tQ4p=33(3;tGBAbDbP5HB&0Hb?Z`>9N$Ix(MToX#|;IWuHI)GF_SeDm=g!=8g4 z>B~Qk6>n9zeq;vTllzL48%$4UmAfGYaY<4czP|s5*C2%L-Qszjnjq^WR;#azFqM9d z1RfccFy5>0wA~kGH~}mH{c5kd;Pdx4i@#Ru^0IlYAB=@a*1ajRJLn+(JgW6@-DxBZ z&%yl|MlQbMfP8eo47=Q;vwC?w>W&+RahCeJm;YZ80`5tQVz5?an?G2-^C&B2kv9}UT0btrLNQ7KAIQ8`v?&B? zs<6GY(_I(`h#blk=K7I6B9YtG8!?f>)3UoL9J?m$yXimO*er%f5m~hpGZH5Pg$dxqLiefNfux=Ch^v_ z(e4;!3NRFz%mT~`7@BFySL5?`RQuKE%07Ge>+qN9Ugh_W&+vZZo-{Rk5}6M!G1jCD z3t~D8!PNj@JuaDCl~|Fb5(z#B&eEQplDxUJUjP<@h{C|JT*Z5h2|gbFn^+%=jboYD zCdv7Qb{SdL3(H87Fn$}3RysgCMM-$eLNhaex{hDX%erLJ_YHe7z2RvUIm;8AP0*Dg z@P!4{PtYmrcH4M`CG!^7c$V&$cU&j%jw+e6>PkS{e2YKlv zkBIx_YJ)uMD(H__+8O#{s;MRypIpEy{6h%6qa&`bLoSxgm#i7hngM8Z&L1oYQ_kb< zb{dSe0VaxgmjsFBE6XZ%`l(F)=rtZ|G=7gsb=;|yZ!Z3IeFnIQI7D<=yIV1=R)a0$|&TZ#W)8GRN#|sKe~vXp|$RGNg7JbA&{QYW_(PH zN8HbW_l+ma7#=(W#dIUWtN14CqRK_I7=B99J=-%`GdC0nS4|^Z# zr|{HX4ubC}>vl)VU+QH;woN3%2Yv*ELuM%h|B8Xk2oCR-Z0*`8Q1pWtt+7k$c>4e~ zBMA=9g0IA}l1(WdAN?$>jurE%eAB0@rs(HITnpFDJ8j56nQ|RhCelX0OFx<$EN@C+ zW|T^MLcXrhfETQ#{t!%QI>WsfD;tan9>R-z$X`zF4)h7@rK}?&88QSDN+p+_->Vzy zQ+|N{Qy)NPGSAW$h8HEwtWjiKh(D|GHMoMw*}|f9Ynb>qm5`B2+~j_58Ui^|gma}6 zbeo6dY}E1_O-=rA)^BBoQL|OwSCK9Uouk;Md|l0KOt!<` z_={|-r- z_=C7{m?hcGsAc%2lSe3aYlS{_{RroEobZW%g<_<^r4I@9^6fxc(Qtx>aQhVUyLe zx}{DUSs?`IL^_z8kjBaO&oz|7xM7&@*xVe~wWvkGmnkf@!RKf9L=np1H2SJ4)y1`7 z7HM3MMH1m6CZPB@*jOknT0Vf;BVXqvFi3P9qu74#YE~*#XIaw6RgB7;AOv`gZeDD+b3~Ud7?@B%VKm+XJ6eiKr9SCO8 z`18!i^>0W2$m!(9TVDg-9q1SN;Fhpm%d2xNl`Y|QSp=QX8V&?{?->>Mw158m;N}=~ z6PkN{RI0jel9olG75haXwT}zE25WuOy>d z-&P>u7sMD;CX1rKPl-l-IPvnpUB^d2FvzT0h#hrabU(tD3~HwX-wWrjy7#yrah5Mo z%*=%|9a^U&*-1DJt8IZ=yl=MwQ0NUS<0%r`nygMrUvUMXA-PPig z((gv0EyWFmwM9xv%b#-?4mW1*g$X4DSKTRY;dmzu+?w~OZsXOvN@Wu*s!RZt*O!j`fD@l|5jO#lN6VM)jN%2{D~a^uoe-cathmC&T9EWH;I0a~CAv)EB&*cJRJ?AxSwjvKcR6tP0 zZv$>$;XufEmdBG8X`MxeX@JRzhSPJ(#Q2n)4}+Bsmd`#qDC0W3!19>PR(R#uYB)ec ziu5OCkD|Awrgq7i7bk+@3K&+z6_l`Et_1m9Nf|iU_Nk00l+0=IzDf5=gBX_qgYFUy zyDaW9p%s2jmRNig2w<;W>v)s?B{RTA+VfE_4fYr7x684JQpe$Rh_51-OSWW47sqg3 zbw0*Ymmc8-T^2X^*Y$mG3{AcE9$fU4AhJnv#UwI;^Js`c|9RNOuP1`R#$ci&MkM=Ts zrL(9>mEN>6WL*C|f!0f!U)}znmg5&0quhjfM7+MA9gi`>|B*Dz7_Z7jF`-214-2Eh zarml&N%f__r)d*`p>`rlZK z{^(!>E8aWEmy z>n8R%hu|EWwYfub$ImtXLe+xm#Q0}1HG$OZ@Nbch)IZigqDN#731xD|G(PiPtb^Q# zL{;kor=g;W4lnjAKsN%z;}aEZt0U91z_L_SlTU#kszys|>RSM+8FiLRhgH1T)+Q|K zmKHhXT@+8Tv*=x9Z26IH^VkzcLA9*tjU>%icWeD*yApiOyftCj9DSG-Cd9d>R)~N8 z^2|@!leiFYdbW6z|IAHG6?FinHMhrlJEGf5O!&E zf7%16F1DPi5vZzW_2ZFwchA>E&=SWrdN5f8yI>gyTdBxuCc$c=ptMf>UF->I6*JB> zo1zQVg|_}Y{>GWLe1_85t;skI(9NMD3-cXVgrJ}Ht{P?R>A#}yQuYU6ni&+)#}u(r zMUTvLdMH;wM+UB+=jj=kb?%hj6wZfn?X8LUy$=cl?3o`X@4V}yFVh4bFOPUQ?QzqFk2XW8H3dw+T-Ttl8bzQPbFLKS zBQy!Jx$eU#$UUTpL|C$MmP0ElD2Kl`>6BvZvi}A$oMMCBSd^cs zTO}W18X}cOL!J2Ca1`oI-w;g6N=b@0<;l8hX&nh)m1CK+&Fx*Z{Y!{t+uQej!qRtb zg9ZPCa5PvGo&)nY#{R)hSqjGf7ykAUtOycmPT)V!PNq@*p#?(?G2;J!Zzs0Th&cx3 zQIazITNMxUOSUO+zvz3uh}50@%P8CyS1N3rU`ldEHsqi7{rRi*Va|(C`U@NV6r{?< zzc8tR{^P-fInMIhB#sB+-_CF{@$UnxG6|Iqv@!5i=Lz`E@gIQ1mjC@D!|%ChDG7!5 zXsY*vIsUN!to+L#>!HrI`H-s^GIJ3bUQrV_boMW+RPugsRVZ~J0FaES^5*i;=4fLe zQC|J;a`%M519bd{XDXkNg~VvH+AeTzo&F{{Q#gvGofPtKBaF2Wa7(`Z9QVJ2_|0DeLAAA0>sZcFv8vOqNikl`I diff --git a/www/public/images/blog/discord-bot-screenshots/guild-id.png b/www/public/images/blog/discord-bot-screenshots/guild-id.png deleted file mode 100644 index 0ea1691a876dda0dc429ef9eeadb622ae2a8a292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38025 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

    I9Jcu#%3-xP`v!qgMpRUNMc`}bn6>?ML%Lrh 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 S1Xs!c00005fB)GdXxLeS{9YWAS2N>Y; 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 P`;L~Ho@$MXRoH(3@Bt(i diff --git a/www/public/images/blog/discord-bot-screenshots/weather-forecast.png b/www/public/images/blog/discord-bot-screenshots/weather-forecast.png deleted file mode 100644 index d5197e1a76076c5c2cffe4ba6de1b72a7a932273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51256 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�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%0A&T>^dhTVIv!lB{TAU z@LEVgBFW4LV`kHbGLJUbYL||Capz0cQyOmVUVZKGZK+XLW435bvu(FuK21lkan)QP z-e8dDom1J8q1qZ6QT@*xJxWnl4AY79?K_h`JXlu=y#_Nf5)W{DTkdz{0+NWX$um_$ zi}wdRz&hzwI=`PErhOt~i54g>j{~H+KX!cs$hiE+?(fgV0UhQ&@hgVbYAw;(IRR2k zV~@ZFfW$PB>PFXe>5WX6>A)(8gV$WIs80CCsJx`3i+J9R^XcVL!(`ZrU}GQRE}56gxzu|PG|0lVarf3e z-!#;jsJvGhCo|i2-NhU&5>K7>g>=>{YJ-gVF+Wo=CzH8~_ zou0N=4X(z;)z)5fjYuZQnzzBG_sh-S_?g7&@-qfZT)UMN04QhfBTG*BY5uqZ3>wo` zyQVcov*cu@aBPI+`8iC}9w5vX$Xl(^NM8Qt`5)r;*gQs?QAhQT%)@uu`(BWuiir>+#DCz>9V%~927g4L=S)NJ!r8(?@n z%>gZ5E=h`MqZKX#=HNCaAWdoHC-}gh6lI(X2v?!VoJ)H?{;l)cG4~*9stY>$1J-Z5^1d(v zC-nL@gBhBQOndXKuA-=UFTYt?gqnD=A3xVSXl^0Ol{Qa|_$R1|u^hYQ(jhm?k5Riz z5`qJv^IEUuSQ6fhD-tLno;6?Sh*Hg=T^?CW0xp3IfXL&vVfCx5>UUwrRW#F?oBz~s z=8}#L#{a)H6D9D!-xqs6nj5Jd7LkjZN43RC@{<9VTv#nt$B*d?F>Ka&1weqaE^M(O zHO~-#(H;fH0_?OANV-{!=b|a-xbH<;bNdQJ*A=kInj|b(X1VU{GJ0eMiCx zsv4yaRfngIY=;Qc>ByO!2r5{PC`zsUpa-3y_T8YJYZ8yajOXzW_!4U5P=b@1hxx<;cL=szj-u*+FZ}S zo7Klxjd?TM8?6~dakY~=DAFC}Md|P*#AmafBlX9D`+RIr!6My7L zRkI%3vj~ib@PFEUS%i%bHeFx( z0E0`N6%CW#Y-7;&(6`As+1W+i^qcdh0XM_CCP3D&wd>K_{KdewJ%Ffg=GodX*qMVm zC1VYH;PnnmP~biDGfH}VI?F<5jVwR<+2d(i)Ml|Rix?&@8ptEIUlJ6EGeB>Nho=8h zm=I=i?D~ljx8~MqKnH^~ZA!p;rryvG^~YvEupnR!G_lA~^VGblD`nWZz=aQsl2u;A zo9xS@Rew8mNzPkZ>E5L4@3nHt3zpzqUuW-3Nf+cGbcWWX`uFUrFo~aovOZaM@$q> zyvEY$a9$3Zx!|;fBPQ+TN2E27Xp7NUU zr8vNE%oOJ!vZ^z(h(dYXj7CSYev}$y=T=e!TrnzaOn~%o1$l2NLzK4=svDQPyvlH;F1|y0VcT zYc=eu^e+XM(5%Og%Ed7qnX|W3g9X?Fe>O-AL~mY4RFG_@_^Ej5v;I-hrz-=i=XC8B z>&zzZbQTp|Zhm({rn+|FwrI7Qu33K)|GzRdxVmM6Ko-$N{3no&xGLXUj?mp06sQPO zVxF#gGnE9^vW%odB)3aH7X-UY4qpsC617@gK&hj?XyE>k!QD;n@bqst<9n*=sRahY z=a2YJv|P!H#9oysi6RS+H5Umh;}G5eD~&2no?fuajjAaKP~XU<++-y4As3qAG_w0} z4>BXY+Gfp}EQ^-G;{Qb?hZ>6`q!1}y&zw^>KDgrh9N=Qg*2MbSdzwG)VR<)MNR+m% z0q7Ha9#Lu2eXv6P4S+9{7o){_cPMo`>Q47?7=KrOXtCSRzU*BxZH)W`v&^>Qj?kpp z-z{Q4w3T3zME6ju#G950BJk$HF;WvGDgtpTU#e;RjOp2mO z`2V)>Qmx5HpNsnx;~E7H#K~%aOd<&P3oLUu&ZWK9qj8{;CfF)5tdOgXpuz3XAUErD zju&mfWe{ip`KV6E!{%t02J>RhO2O)STf3Z=s2UH~<=?2Tri6J~p;0UjRX^DiaA{ndT;L>2Kp~+H*xpHBWt6MzwzZ6$DVM?CXYa$5n}j}8e!O&!cey;1s0IXmE@%M?X<(5@knCLgo6RyYAWA1{|QJ zK$MS4@1IH~K@sqqH`|+;f9!Cai8jjh_imK48UW9r9sj(bJx)}E)CEr&=pMS;>6+<+ z$Y`kx2N=P}#j}{WAflhw_ z#ub_AQ5Ax@5~jW2tk*tp&#-NeEtoBr4d;k>$`3?PQ+)ovprln0&Q>Y zX>_a}G+qtSb7N1@7PE4c`2+az(wH4-8sTSn1z5LLRn~RR&(g-4&l;CrQrl>NwthIJ zN!4`EsJpwG%;t=T^ICDR>(Ifow|JiF3ltr68b}IX0cRxZD(T3h@qM7#+l>S5RZq48 z14V2Kr4j(jMZzgNd9K@=8&0gteCb3gU@v@jRBhLX$uZ9z5C?m|=qyZm4N~ywm!JeVR87G&&NoPOE6u&<`>rG?7r_rFxC9xGNb=|}qG)${0mH+W}UPZF&Ei zLtZyuO<$~bT-F8KH=bts3;G*S7lF+QgbaqFRMR&%fN-iQRImg;WKp1p$eriudu{WL zD%HCkvjj4p;Wb+1>v?Ca6wMOf%r~0y(6KyD6Y`*WTImY)j)`A4Q_Mu~MrRHmY-hI? z|KdW;YeoK~Y~}#jmRA}~)pI-y%ThLl=y~fQ*HpCNfhd~m20MGO&v%T3Kepfl-(vXo&ef<&NuCyy7Iu# zb$|8MW4oxm5~1NQFwT*AEiB<1(+FR5ayGcyc9*-vpoS78WM4Z4uc&xmT6HaY(@{6^ zE*)fq;KiYtAms4k7_|bcu;#oC3^r7s&RiUYhiUVKRn1gP9&oCegZ9f%XbtT{yM%iX z33o|0@nhJmp&)9qIt!M4(E8sS2?8tqjl>&e(ePBU4_@jE7OSGlZYP4MgQkXWX|_!lyC_y) z^Ro-#@|4brxxQ{UjC-^2*FsUwQ0Q5PM<8?xyf@AHs3b2(K!0Cc-5qpV?Kem7l^hSK zop$o{=u z)hw#)woNZnu=QNug<5k(3tw!n;#k6!R4i;OK`GQ}2I(FStPN)mZeaXa9MgE6woY(2 z5)c7q2pmVwzbRoqiZ5VB<;v*dW56a*}($)7eE53LMh?Pe@~2M(_W9MIm5j&ol+>m1qIP{QsLb2bVzgrH|T(Ma!sR} zhgEY+z#UZt_4R76CzD-!MZLyN&gN1pvt$!G_3pJk6!2fhCx!ti5xcW;lU!c6Sk493{#rpE92oX5GaLLCz&>5wDGsN3NwWz_$4GLN9%} zWlgk5gXadto>K-WqU4zA2{K)*f;f48)fR+ZT*El&Rdwy-EP*4IK;x-?4ppYN4xyc( z3yu>0yp!kS(y0rI@+<>pHF*96GU8I?P5l=jbE9Wc7c-LO`p1-jSLu|<#!kJb zCt?jM!2ZFL$2=G(HrDjMk{S=U19ArKatrJB1Ec!`;L>MH;!y2qm{(+n7IS^Hf z7eYBqT)-!Qv_P$7Bp~gWqL*)>Xo^w;1(C@uI%r?Xd_p(;1IJCnd=6%0!bwlrYTVek=OxWF( zQY*&#XXjv(y`8XT*S62HEiT@M1G5WYlOC@&!K)^-0Cl|AGl@1=X|i~KE2WLAQ>4TC z+(QcGR(W=^bwRgE@x!8_;%k-3h_QZgM&-F=9_{kz3*dIS4nG$|suO@fIsTnN@dmAS zn!2=^bemKOsHY@97+)V^#`d~qYXGF^^%KFj(Z4HXPMJdQXx1Ybi9o?EHgybKgf@nq zQ8Hx-k1Nj&((l4}jQ=x`RcBlHRV#ALN%$LbML>ytM=QV;9ea)_{^DqvBJ^`&GSb?p zA%<(>qtqjQr{Y7jaFLkP7tPBef4KZTVzwOhUeMRDN_im1jvYAQE{r8jQDH9UscY}tje9D05~_ihVFMH=bI)&F_h-NlFP>ma z^R2mJeUhgL{lFnOBj8};JKhvDB~+M0>`N_FJv2zT0+oA3?yG;WhlwL(zHl|VNFICh z>~#7)t4s5){p!P7up0U4p}`;p#a(L-;FR>X&ruM|lJDUcui41+=8NqjY}GwEF4 zmkWOmSt3y@ek42utgwswmdD$XZrQ`NNot&i++e{dEz#cnQ8h;)(=q4Lv!+Yv3;ljR zp6LbqY`w`@7Gu=;x})ByYk`6_clw(s?mWz$yop2#g?RR| z7Ri-%pQ7+Z1%Dd9~@w;+ZK#-0FPgYnnuyP>c?^=6sn==6o!*@@Nal zY;?FZ*^tCObYvuOHESNf{g}HEs4d|?9v9d=(RbDyH~9Ht;)03dQr>wUtBzVjsIg|J_=N|Oh#iGvmz(n=UM!d-wAA)l%U{B+fsbPGnL;W!Lj|1`A`ZV z1nB+JKNSMEF&WiFH@M_(ZBijRS0Bp>`eY}QPcJm2tL;1Vs4y1g=gJtsF1vf(i9b=o z(Lp<)Bk7DK@AK$fZGl~9(WF&G9E#^cPbJm1K* zqt(2M*uJMT>Sld^2%ym{EZ^htkH)LC zog%}(xz&mRd@rat8O&yI_sRadJ=Oe+t>C%I5Bc<@Mu;DYdvU=(4(?trsxJkCRILag z4?6PM7hs3G3}NoO021Q&0$%?6JcMc#=K)m5<90UdaK4Kyhyc#xJ==u3ClIqVujkIl zJs)c7o`0zVW`s|TNSto_{I&}9zln|^=Kkn0Y&3b}3=}e>ISam+hkzAFk}nbe$oX+W z-bF#g01nojn(O&Pf5?ZEF$kNQdnR#|d6!y3?UC`|fD2dCoX>PkkSIUCn{IZI{g*8* zK^6ksB@Y>{jge{kQ)|#!cn~GIF$a-h*)eR(`l|0DuKYk6>zgy2|3d@$ zUp137wW(Qpd4D1|wNgJgC7c~k;vNwN7VLL`B(?JNscB8$((9Z3!CCXUuvrm=VPz7ap0uKRsh4+}9k}`P1BvrM@}^;dodR7tGyajo?(GrMa!lt8}W3`F{D=mQbyudlZ7j}wuQw`=LBAOrziaK z%p7_PUxUiE%^Zts>b{o~h+AfQ^o&I0xr~^#4sGUpn~CxN=)>8Z7ymHMTunK^%RaZb zfkJgZ0{!lAfPuiukZ>2R?vn^WP*o-xV@`FDz#A*+d<4k-1GHuC|7-K>bcv3^-K2-3J0L zx0$*7h-9(L-8#SDR|qWIvYV{sa!Bv)3Wk~0$34o^^g%|<*?F&`ct?%wlbI{z!hwqv zpG^O$NN+ORiNR5$ELOscAO7QN`aBp9+}x`gBCiz$c8m_!O?JM#}5 zHHFW>p3>109Tp&{uZok)(7lgIUS8_`*mBmH9O=TY#puw%PrO8qH_ZLEW?w*1)0*Y{oEUn`_FIEq@>uJwth$0GGnbqwM)~-ks{Y zJo(i8rDL<`+a_ZQ{i8Zp;UB+0SGo_x7LZb#Bz=3yC{jQA699m^OPKd%7XWPF8qs8g zn{$Bk`E)k_+Cb;qZhf(k2e~bWXMYG<5SpAlI|)`fZcRP9b<#7S8GML3Z#qcfSv`1J z#bE-kJ{Wib)Pv9kx(&qB9beS=NDR1SI%IVRucw#Z)Sh5`)10Rxu!?39U`=zom)pT= z`I2q&o7AJq^qbzO$dTb<)pPRe#?msket#@oL(OF@tmj1-wvP7Ee;%{%Q@+tQt+Yus z&)3vdtvl#$_4Z{WMx%FuJk@hM>)`RM-iVMUtAvE(^+zi{Su1`J2PRpcIKDnn?^8;$ z0DI5;kEQr~U!Ik&>OE(df>J(CD)(-)#;lu5HFNXB>Tjw3-Hn78vQ72}!C=d1`}V7E z0*=@HSk!#UY1g?pKb)^_J93=_Ke?&!GNwZI;;*uG!|x2nE^z_rq=jy zkbZ$!f!AMsffe(OD)eE4qp`yJPv74}(r1Q5yAS1}Ig!6qZa52?^~hk?{TbU$GL6)F zuF@tcOxXS5&VIaw;5y|~l`4rON;H1ibQsV>8?jK11_w@7G1C)vf*rgCP7f{wj%4WN z57wF$gwGb4dN4GgD8p=I$~E)e{m5YDO3Z}RS2bRIg6s4BV?;Yq?%CWl(edxMmVeKq zgv(Rbby;Ri*3&|#sDj=$k~(t%<138SEI#{VcOL8-wBPtZ)tCI;QgD!gzjcIWu9e7_ zu6x>@_?l)7Uvh3#%5JJ*pTDo2n9%u`@It+L6iSuGZm`~Z9lXY1=_jnhGwO$@VIQ?t z7twr>EQ^!7rJJY}BU2VeAO|(c@8JiRE+i*%cDdA+H3rK(F~-dw*8M@28s=cnBdzse z0saRkh1Fv_4mI9RaNmGVK=QJu1j}RK$)b07j6Xw0kp#7OmM=B;Iy)OIw?N?FX3*0? zU!Kv6;}%03eycHIOz>&-xE}*Z{|gTj3~LVD_)1~+B+OZN|M06tr8Qss@VpW~p>f0B zlAQaBbU82Bvo6oVGyD3Q-)uqs7*)QOU{~*O+3uBSg?_zl_X^KjRn&i7~engSCu@j#w?Mqs-WWiNj*S ze)!}CVf><~@Xr8wYo7y-BZ7uo!38|hP*7hVJ}s-zUx)qSt^F3FaC?Tcr@ig1=;ugD zh8vE8#fJ}mnIm5%_{)6OQxx+Xht=gb`>7@U9B`i`LO~H*Kv}rcAG_y`)l+Yb{rDS( z#6Yx#;svU{h=kw4Xd7{C25J&7;KwPHN<^1zj~nmqOl}=2Ju+~M(^tSCu8PnWV%uaOInLc zv6COvy=v@t#ZR{%wM#5BPkod{K_8M+y?$3q=8yInK=mzHi2U@xpSrr%;M8>Lb=iEn zo^f_X$jG8Q56hACjDWs}xpWMpbQvkjp?0w>mrrCFN*}Ii-!$|tL51U5o3<#3Y54pj zWKgz>IAow}F?44-NSX(^xBp~oc4Sk!lbWLV!hQOsx%aPbP}--Z0C9s%kHnFenJEP+ z?^OcJ7hS(CjBoEpntiYwr64mQp?TEdyp$na2kW@I{``RNJlpq-w1(?a=)qLuO@Fl? zrTFrp{QT>I^smNi@EeoW+D}=gJ!Q=w#;zaCj~-aAWcysTP{R|*NQYAlbtXNPp(XuY ztP@^KJN7!>-a8ot1g#@KUKd@!WeJWlwT7B=qAbuGlL3xk zG-58XkfNuz+SmopPOue!ih(!C6$TF2DN4j%-B}gV(W>EywuLFaKI3SybUrW}mBq(x ztNmO#gk|Fodh5AYtANgOM24oB>R>?Gp%4^FXp~73`i4dJD{FCyrd;gUPNkF!!-Ebv z2}Kw!$)O0+5IEa^(*o=Jt-8l_#Z z$lhI!rw0Wi`1_`bg$>&)OhZyN1!opDchc#UOSPP5e{?R7J(0z-IJ01Poj8{L!0AnpPsOBvbhR}dE#evVOZayEw8QuG=wwY`Zk zBbnV*dqB+lH0bpf3R|#O0}qflkR?!-NeQ$t6p199q-^v@+=@K_KRFZ@eak@8qAEH| zT>G;k7UZ!O-+*@kOZtO8a~l*GF??nnED|$7jCkW1vP=5cKA|gZf-<=KX9JcV7ex=D zGvIj+m8`VUAd#=6wB?$Bs*Kc&D$8d}zN@mNsK$`b(Yvh13x^S|G-dN4nhy&b8Y;N5 zht+ge>(R%7hAL!>iyN9H?NXtmRRkHHAzrY=bT@r?xk)BRgPl0iiDSJ!NObWp%I4#h z6h4f@-Efe|5GhUhL|xwOm1__O8xCLg4)ae+XGgL|w#vng1T2W%6yBYEC!K@neU8KJ zW(vOKAn#aO{9qcsKqJ+_&1#OJO8<>C#BIgST7jV*Rh5Tr*4?w|O@OlGB%FGPa{G)u zi{|TA43>6gmOLp3^5Bj}X)F6e;Ap_W06DReHX;XpZMC1f5W9P3W~@Nsw6oJw;@xf< zYCJ>CU`W;&{1*su%#0mcD;~WM15KN(N4#Jh79r#fo;5BZy6I_2MI%_P`<61!_je|F z65+894qvs6tiYx`qvYk%%!v`B@ro9+i_JC7hr&J&LLa?(Gq~sF%Ji z?14*6Ebfn=mcpZ)INq5lrnnP(3%FM2i9c;$-DwF!=O`C5K&f`6B%+SkpP1)eO0GB1 zd6SfsC$4Hb9*^3KKl3!5to%F?O^FUMJp4*mrJ57jiscuZ4dypp3HxweWkpqTWffQP zAbG~qbqjN?{5^=ql$5$W#Z#xbCg;7oL)*{)k=U;jA5V3Nwwrx6@p=+I*-T)N{u;u) zPFV$G5R0xg=PU5OU}+wR9ukeZ)h`m4DJdN0Z^vR+YC70Upy!y12hr3}@pZ)7W__zK zWs{0ei&EAEUTWNs@or6TpsS+fULvd5Np;bNb3w_4_h0=7!2={3T$#fY%;9rZ!*+$G zym%U_@wAoIjZWQ1EJ`?!V(B-F%Yjx`UaN;h%9CBU#(L;nh$I+0*ic!n#c>#!E3!h) z_g<|9{0l98%sc(^9t%f(hq($U;N-7uaRYn1g$ww{wO`_o7>g=xus{36yxV+Twou(! zS5na2r4;V+q@wG>i3}n!9f1gAHh!b7)BEWqZAi4@<09qRi)@F(0x>34ME+)RhBH@v z2Zsmf>&f2;>WslC0-~irL!h>>0j6O*_JZr{`HYx^_i6K!x?G5^ON|PjlK}pYg2;U` zld%sv!xF-{D@XL#h29yrHFj}na%yLvef#2YV>5mXfpAzd{L$pHLX{8V``gactCt@4 z*9i{~l@>udUo%@G+9Qn}5U{~PO0JtzuO?tGAENqibyWsuw=dQWx9$-DdPG zx76jEoXGVT4t{&Y0~*|DXZnfj{Z_5*HUcc*;+rGPY%sn>c;LAgi1TDyb*-jY{j?q! zKFqEk1;5ju=OXG|HRr$KzJ@Y5QMjK9_sC+aX!gK?4qNla_*f$h~U_4LVHRn;*$ti?tA1!tov?qs>?4B_YqF| z{#8gST`8xvPixhU>NQ8Zawgl{i+2VT6M-l`W8;vc6m1tqPGAh+; zXUM=x;Tni?_M{u38v)@d(#r5V%qWb26g*gGkALpUDj{S(Zxp^QY)V-sDV3m7Yzd`e zlXr$69_jeKu&TlYh{M%_&R^NMttdXurKw({2kEb#Ey|VbVF}!vVqpF-5m&<~-&wnW zc+M~P`-V1zr*aqqav~XQcB?YWGT~7MqYZLJbaV%2*D8u-sj{;MW!-leD!eVAwFgpc z*Fb|ykC|ZP<#AH4hmeK=f1rt#NnurTMX^6=>y^j?;-^LOH$T-T!~X>&%NSZ(y~;AS zX7RVn^ufiji#gV&)P!v;b&~)?_6&3?bq%A(Pda&a1T*uwyz$Uf!z;o;Za)ILjS|D; z^g^9jJ_Y>A(2Ri0_*umqn0w>K_{PE_t)j;Sog%k|KT?)4(CDcY=fY&)rC;~v94#w} zaPnu=#0E$d1#a2(IUR1@J55Zj+V2snwzxVs)6i}7_hauq;Ptp!5n$;AGXr809F{3) zV`|rO04J*_{l=4b)ET^u)T-wC8!whk{aj-9TQvqh;RMhsV7xZVhLZ1+O-<=RBRg^Vz}TP!9T z5z#1<_htq(rEHARBQII(nhwGp#k>tYaP}5~Z}f+xq&0<0@nNdNn+?jQJRyJ1=8b(( zS#heg`SNyMwD&m!-&4;3E^{r9{v5Y1?tOpJzXV(+U*k%<{WvYcvJ@{VCtQ{o!+|nE z;Ndr(=l&N1cC_x#U}z6FJ4asXG{7n`n+;z!10hx1&4u*$YAXQ*Gtn(*;68Yj`*{Qe z1_wiZ*Jb(?jx*LGAXeoY;YTDh*fswWDmnSN18%3Jw(}=8PsvO)v`Y)_;th??BTQBT z>|BMr_OU?Fa`l=aAU&bsr1TqNmSuwa%H!BTr`-g>qsJr+iftkiY8CR-Pxdo36L5J^ z1ah8x>J+}&mJ~IUYehq)cq=29P%5-?Wj*{^)qoWleo`(VDUQ^eWTpe%JCmk z{Co%9e~|=KQMq??CT(BS+LWxPWHR8s{TutR(4I3uXQUhU^`G1oVT#iLK62cx8Ng_i z8GGo2S+oCaY3tbQt$QrYkK-uOxH4T15ExJu&kGjBR`VBUi;Pt*BJ-5&a?Hxzz1;T+x>0^@)ZBi}@_EY5 z1Fyq5Ig*YeAU6zU=Vm8AM?s9Cg&0SU4i~_Dyx@#9Y5mzgXju}$f{&vexdIsuoQo|4 z=ne#)p!BLg$V>kgS0?SUA88BO>1G;`se){J-iRkjSdzf$`l6I1Zf|e3R?|6Re}z47g@_V3r57plYL)(cJYK{Ut@$&$IUtN5 zVo&Nk;N@SD1R{T@v4u;oO9&PTk20N)+IbO5zM}B0qgUjUpNYBC?1ze2f{gumIAkPn zyU-XIMS9bHe5$eIy}f^TH6{+{BKm{f+K$Y%LG)hP#xVQ*R?TJ!cVEvcDojORe?;Hb z&cNr3SB8HcG_I}9B?*3iL@J67qu?>lh0xnP-?dh!a~k*@BT)tMSqcHe6|9;uPQpUz#h;LigRaM*QXu`Oh$2F%ars$91sxMbM^=LIe$R6MdWzWH34 zl0!m+RV+e-MgD%^WpKd&&iEnI?z;oc9LezZOMrCH6BgQGVl8*86yVuLI$ zF_#6+;?b3s%?H_|PU(ISKRmqk`2enT9D-Q0 z4|Sf8*x3p-GMN=ZH}g^OD0iR!*Nly(*#Sb^C86Pa=R1ZMGc7TExV>!|-CrRLE>AMo zKDv#WLI!Wov!EZZSda(5o)UqpY`%`V>KPdM=eKgqaF2`;#6RF?90~UNvk9DG(_eoV z_L+9PA%3Rhvqp3yx^jyPzkJet^!SSM&SXC7Vq*wO(9#l0Ywf-_#YoI0Zxhi7=x>Jh zJoPn7ZrB#q_s5(hDg&l4H#yqGAz(?;JH~YVTZw%0fVw$`<|_aSQcm;wEyjnAslz}8}T82pAAEF5?gz0Mvd7CCT+D|$uCqPVyXhp5~b2Xr;k=VI4ImOp-jOES-9^l5iS9AGsQLy39G(XCy%jYNd&TL?1j;Ucmgal zSGWU`U^ZDP!@P>9mT+l;FQ<`c)XgR*U+93@?4q#kib?3fRDkeui*Acoq?na+%tY)V z8l>c3T~Xm_QC1!Jg>Lke7JezQS37%G`SLwa+K}Gxc?i zB8ybRzgo9EAmt%Dsz^->p2oJ#*nO9Pa;Bi#K@kxNp8-3XI{UE^7mceVtc{6-3?i5^ zDAk?x-pqPOrQMmYcteN5HWX7FHfZqjIyl2h zoen*+m9YA0$|dz3*&cB0t_H(oOR{)u_hRUJWhtq$FZucx$fzG!i|G_;o<7?8ooEw% z0gM5c9BCp_XMZ@k*=7N_IDo3?=N3gU+LGKk>3kvPr0IZ)_oRA8l$nkI`-nGEh+-{2%SxWW}iTJ|1(rDbAzgUbK zU%@ev@Xib5y=WQlCWarD#V6dF2eyo)KC?B}Q>U-)JO~uvx56&ZWdBr4e`5y^1Zxc3 z?}LI2{nAs`_<<+C;sxh6H|vI6TL*Abh5%k*x>v@?<1CGll~k0BUyWzfqqKkpKYPtm zV(Ye6-xf7;B&Fax5d2amvMMST^1t+JQxe6#w{9jqgcMkgKo&n?8J-dJKY5_}%wrER*9cAa|nvb?b6- zQGLwGUWWru3$7lWniu@Nle1#pL2rDTJb%nw@@WzTYxq9e~D6gs1?f zN0FAYPGDpr4dA_O z3B-bE(*Hh$Hi9l}c)&UHcSEjd9(!{qniSHHrY&rf_OTVN$aIppm=_4^Rq}}`zjqrVwkog$_K}ZR>o}$wC99A;v0Ly{x)-Do`Hn5 ztes4y_;qQ)4SWI{`=~_hTly<%qePY-GN|ih%?8FI|N0%~2;(vJl5K$vji+YUUvZgz zml<(8J4`euGih1TmhAXKO*3=U`NBcom$zYJ-#6b?rKDMK_+MMsL2@cpQGDz#>V`Nz zu>oA?5d%Yh!~_Kd$T>9xz54!uRMe7qE!h=2IWSju>eum>Q43m^ff0JHUrNOB2AYo7PVldZ;( zLHP;#n)=z={>FH|DS&4xEROxsOC9b6h935tn$ccy*ZLOdCXVNO6%_z9eV0mH#qp992k>gCcO99pe`9l?Q>ziHlj=Etooy(e(@_J# zFzX6<6$P*z(p`Gv|5?S_5P;7JA^DG57W%9=AS&v+k+1jSZKNTPmwvOWZfLQw)Rj~+ z+8m~BA|n=*&4}4duG*ePKodj$Lv^dl@3N7jN@!{lR>>SP7=yPpD{JGZpC+)gROJ~5 z^B;WNSrfVS94wHQk+N4?ty0)XAoBRqfk%!I%C_82_k7~Z2;BP7AR2b%u#E^qtJZ)_ zAj&W30ESIt3FJrm{GSIR7QY+U-v8FPS&Wn`-k5E+QshdEm^k&XzG7>M^tYQfR9LY} zN*jt}=4~O3O16wqV_|JP_#o&cs9I>)OpM|hD0&!wSE6#m4{(to?5arC<^ORSB9~6J zzjdJnL8ZTnF_Qpo|EfsVkT`sazedZBubFwySAez+QV+4JdP9Zb>#2sI_%^-U1H{16 z5s;P+7Mo)Qu{IGj3ovp%Q%zH(lg`_rs?17q-wjjOyK7pxO~ad73v+H>z7K0`W@u{# zI>H8=cL~Dxwy50}BGaBE_+YZX(*vuJ>_G?g`6=5CiTa>dPj5Hr#B|Q@n;h-m3Nj|S zZry4Cq=kPrkWT$Y`DDgDij`}i=j{V#jB#A>ATmwS<@Y}3%1polo!VLvx@n?xh&Emu z2s;aP{&p)cMwo1Cn+r4oc7QU`s+0YRI$t3s(F0g^>>fH;J|mm+DhD$~ac*(FMle5X zcSph+lj||pDT8(Em873J`@&-3A)XQ)+p^Ap6R)yiQ|7*ktLPV+;aQiivtO64206@} zH~kA-4MWEQ?2hC6wvXkIE;+(U%_M!}n36LP{k&P}%UbzTh2W`!r*7J^DtQNDEEmy(bT( zM}AOJu$VjrIFrJ==~kQO_ylqdB*$}H-i~fZqS*T*1dxhXy*c&h%Pum-3|Lg~ABN^w zfMRR01c<~T$A(n=y7*cM1kl{|WO!lejswcjOp%`3X_sKSyLht{PbyK>dHb8#E&-Y{ zuFB_uWAzn68h*6E1A*II=GQxKv?11|9H*)wwEu?S?s7JPnB?vW=3rxZgIWc5AX$CY+7;Qvxb~+ zwXjE$z;KFQ>hVF2Y1Sipb>aeLt^Vx{m56izD{8J;*8x45At3H^8jPrIQt2Lfl`A|uZRS4wV=7DayJ z1S4HU%o6?Roa^0dWMIzgI1JV4OrqS z=^K^VD6y~imSDV7IV#N(Gy=PeLw15eJBdH`e zl!8$duz}1sbFLFM%|6gPwv;fm@yq3R3f&f-UN4Qz=g(wphJa&Lu`D51_IlU0cJu%v zoWp2IB7}GvqxMqLE#%U`9dQ%_Wca>ewgs0j6AilK{T(^6Rkat4xAUXWsV@9NpmlgQ z2;Tpift(D03L52smr$X=vlLHp7~)(!46T+2w;5Cm7x5aPWB>(mI%^zVfTGIP zL$Cm?SRY$<*(ZPzck9m<8nWQ}SP*Tmu}vnb>W{zJbH2(rXgg7vAsbLnVnJ_Vj3itl zN!t-&9$^gXD$@!X0oZ~$fAgnld& z@ia;vuhNW?_QDR$;Xi)*owT0Hm0W-pcIrSyB13ZQbuhNX`=p{ROt^|Xe)HrycJ3C^ zE=z~QH%%3cJ%vB2=$-+|xt{Wo1QxKmoxMFki5s*{NQI6dz+yo&Bz#utAuK&VyMV+3 zlOz=YS{?lDhDg;C8!Y%tUOS} zgUnV@MoGiD|EOQ8gph+ms>Qzy2xqblG`-~;8M9;fTET)OPk#!B4leF*lw5GuRR0`s z;bYQQ+iylt6@ow-6hLnvZ|?6mO;z&NfW$gO#K3t|e8lH95a=)xL<0&jXRxI!5n(dB zG}RywXr8Bq6lBTu;Jg2epWi36_$J6nK%hh*#sGn?mf4I2sM*s4S3r?4WR-FQH}HGp zGeD{qhIO~qSnagSML@60TT2QQ+Kd1u9whnYa%R1rjeqN1(<}r#GnfHSv%H*6P)zH8 ztBpKeQiP8VEOGA>2k8FOM%IzAAN~M zf0eQ_ZYBEf|4#HW&r<_3w)cP^wCIwVfI!+YCH=y^WKi-G2MAOOWsG0JkGLHL0zHH1 z0V@FtQSoLttHG%wRN)h`+qlhlzK{isc^8Gu4<{WW!V1#T+eVz diff --git a/www/public/images/blog/generative-meta-images.png b/www/public/images/blog/generative-meta-images.png deleted file mode 100644 index e4b9e8d6f4dda79d562efff18e58471a8565e267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130574 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 bJK<1_V(o}S`twk*)v;uyl&)r7*7yD&WT&Fc diff --git a/www/public/images/blog/hyper-vs-rocket.png b/www/public/images/blog/hyper-vs-rocket.png deleted file mode 100644 index 583641f794fa48de302e7f9f6d7d47a7add36b23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77478 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%0Ai;7wtjphW~`!zLtxQQ|M_2^&ccq?mgASAkXN*Q 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[|LJQdU!UgsFuZw40F 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 diff --git a/www/public/images/blog/infrastructure-from-code-trans.png b/www/public/images/blog/infrastructure-from-code-trans.png deleted file mode 100644 index 325dca383c470e070bef8aedcf11bd0770fc3e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208044 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

    hg+q!o>PA8%la7MD>kSzqw-Rb;^aj= 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 diff --git a/www/public/images/blog/infrastructure-from-code.png b/www/public/images/blog/infrastructure-from-code.png deleted file mode 100644 index e03b232591876bfeaf80d3e7b1bd78ea0a6e7e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1429040 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%0An})#5 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

    0A#48K@aN2;h)gehSBY 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 ?HODoAId+?X{kg)Cm+ zgfw1!X}=Hj4R$-FedhFs+zci+dAx}uh>f982JvUT-3lfNs{?0QZ)*h0-@(Gc3pb3@w9uiI$T(YAvVbrED+5eIa2j&}w;QNPP>Sh)WZaWapU;t~jl5h9dhfZyXs0 zE*!&jk@(#Zz$#Jl(eZ>rfnI4-6#R6+5LN2s>j)6ucrl-B68$72>tLYHX2){$UvB zk;13PEgUjYB(|M7kBnGe2azz3_$^x8J~J3r_?0j2-Ur>l@0 z-+5P6&wlHFw;lfQZ|sDt|H6gPaBkzOU%U`5xnK=|ogz+5w!ZA$Ti}Yz&R;6mVfbMK*` zA$b%T%ATo>Ffa+%(<%H5F z^{MqKnA5jqy4b0qxlnycozNJ9a$+1i9e!?G*Qi57Lqi>?d2#OgqF$0wbH_$S&b*fU z5|(;NL^)K?f#UaAdCJlHOk+LPgBYYaBeKn%1=VJUXSP{3ggM4T$i^0kynFYqsN-)A zVyCgIw*2jneH5l*&z?Q@`rbq1Yq;tYyL8`}f+HC(&Z?7~Ih3wBR~J;+v)9#C>dfkN zXYO=83$ea1r^9=hQzYE|k_a6{13^>eJ%Tx~q#z9KVk5xhlVL`|CdssA*4e#*D!jM* z-UH))qLB4&^9g2P*IJ? z9xgaCJVrzxXKnIm47F!wR#+B&b>Jg7K+LqpCz0udiIelT_UKq=%q8C!Rf7)(&q~X~ zRN;vVRB4usg%>A|7>WhzIz9i|>+tGZ3oFoaWyA>9mtU|2c5Xcn8qQ5@TU&#__ug&r zpZ(0X?pm(*W&_Uiodc=dYJo}hEA!P6GKvih@-%(#Bk#EozIw%_XN?o|r~myO@L&Ix zpMq`YFF8i$vqeKinb`PKu$vZv0Zk!Ej+|nzelLIL7Wk(hz6^f-@{8bXz;AtE8~o#s zUJjRUV@};nh<2ZLa!P)8t>4~8CT1a^5JH_I@2%d;`<*+^hd=xqyWrEmdMPxVyZDt~ zxDfd6VAoF&?S`D{LErr2*Rt};k|8iFD66cra)jO{SG=Tr$;Yk&Ji7wo3!{fK;N{QE z2D9=<2vbga?x`XD;V`gf5sBwCIV!SGP z*2D2`P8}K=8tOrf`Riw_;pzpM*b5aK1?Cj!7}T0jQvW;dxMQ*t^w=D1V7>rxCb3@Y zK@1qVo&wcoRb|Z>LFD~-*P|-3#+;WNl|1-i`y%HMN}f|r&{JeW?#Qh2xn~t$Zee=H z7Y-kW6C+>C2tEJOkw@UpnNHB^1ZYl@Y_7YO`QLZX{Q46wgd?NFmyZdyzbU5sw~ z3W>R=@NRLRA9{912?}_upeW1O#@CQp9f`A$bR6((k$n7HL%My2wgO%5=-06?10}J` zcx&J6fH>cPO)?1{W@2jUIqg8v8yQG}K2!&% zm&*0?uf5?ulM;y2odW&t_LlLvh;3^KU*5F?KC(@aF)7Q=HPT6ru>}Qh9 zprfG}(dVrjRjiF&LSc1KpDzCR$3F)5&M^?nu0zAeGKwS0KXtFdQ;xlJ9H14H!|KfyPWwL7 zP<&8M&~xiDm!AsC!R_j+ua44jJmL5=r9D*tx#pT{M$@Qxibtz%>l%HkMmsb#oa<0y zP|ZapPQA*}QaQ(}F)Uxo*@#G;P(8(&Svk~}&R>d#oH>}sKhtyMnfeL^7c*;#&^6Ya zR}4QhiII8=W>jX5jQ_!?tI~k;S!7y;Hr>Ry^jP($FB$ z*=IG7_kAWZ2ko<&9SjF|T>ctLq2BaFFrkbHr2Ggld5lmpFi?(GDm%fmWl z1RnhL_wInd`}6PV7BS-pt$54S9r(uSH{fH>{Qw%y9jMcumGkraFWA!eKGb8(YG%vO zHSIW$+M%d>hV~%Q?oMBOFK{Az2rgfjj=DEfZJ%8J_v+gOA6@pr=YI4iY&Iz8=im7Y z+lKWwd^O|E>VBr)f^RmC;jxWuJ@KKkhLe%vW$-~Rou zZ{L2eTvcghP_`#WCzvqoac-hLc<>=2iy#M;|=~$BrF^r=EN&nxo0D zf0;0R3iq9NeqN-7Wu8yKlTSUF-FOEM90;EJrcO5tIVq@9pcU`b@18w-gP$H(PD$!S z>nE4>Q}qme5}V_;+ivrW{syZ2>E3psG5(i|!{ zl~Co;kD)zq<&{?so~yd_{q{sxA9b(hxY`bXiU!3~MTZ(gs-GwayPTH_R2|e@7i$ZZ z$J9Qi+WOjSueEf^Pua`1R`;s^$J#muRex2FoOV$CLG>xM#%u=1%Z7$kpmfd3g&N~( ztx|H69E)na9oI66DkpdRO<6B%L(%Z?!w(O_6|dC#I5+Ru9IWOl!>>8*qRLS7vEpN> zUDUj&+Q$5#zopRwkI#AO^wqx34(-Un_x&^bg)UUNE?lW&fUAA;($2M^w~)F<{0WOfB3x1TtE zLhDPijJ`&F9{W4GRsV>|g(|O;FP!Xj8zUE<>Uf&wipuwf12-(oxV9SusvoGd2NI`U z8|sv9_3`ESRJvwJ&*J*)iQ~PzD(gAcUaIcDy(~lNW1%vXPOHl3WtdmsTg&=CdhAi> z0L?o_j=faSHne7idRu6}Ar+GQFhxr_O454lid8!!k4TOprnX@~Rz|sxrpLz#X}tKU z6wG!b6m={pXl{SVwRcwOZ=;zwW?*vvE}t5lL%1l};1fT$)F0n>X=iJbFw}kH)z{&p z-)?q@hB&_amw!%QIXkViM_N0szV2f)-xFjbLdWgDd?|ds*fo!9?VVo!`kLF9tqHGB z$L%UMUoX8bqq9Xz8Zb3xk^S%N2Lr>zGD(rH@Nfy~CFV10pA z6Rai59?(VJWF*@MBRtV5T~bc7jIW^PBqG+nVEJ#&B4~4k{fe3dv(J{=2ubESkRNDr-hTdNktP(CPGhSV z(mkes&339ycv@+G;#qn4S%GDcv6}}C&a!{VJnCY!J!|DP1ta#~a1^e?@#|1ZOr+uH z!|{@fFQRPs%1}8KP$R2s^ltbs z{==W@Z;Y~z;4AlM{X0xDb(J^iP)r&ZDo}7zP%QX=gZ&U`~QBwIYFO8_|V>q z;o;wTuY2FD}(b>Pd#a)V=BKINVI=mnY1*PzYDhS*xp^M6T`-x zB>eWGgfcw1kLlf&86>lQ-|pQuOx3TN<4d6H4#H#`>1*Y*pe|q0^u+qg3fOa2KskBj zI`n+yD_`lHlO$?5c%3UyPCJI@o6)(}(66wWPwU?7?aO|m@uUCxWY?*`4B!(K0yGK|JR=MVQx_&AGK)mw6#-h%wM*osUZ@2vyJ4fA99xq}o z5m5j{n#uNvP}UipBF6Xa+jnSv5VSt{N>TASFlCJ8KcI02i^^hBBs^jJiM2sAr*c$D zn;1jGG%@W{_HPAO@j;e}GDpXM0$FLWAnqV(sQ&SWEiGeKdveBQGH_~nh-0}@Ff<)^ zoEn_dIU>n^X=$JR$5-xjJBK(N+o#@c_SuFszWbMcw!g5pLbNtAZl~>?ZTo=E7hnyU zL$2NdXK{F*)<$OSX>5i?<4>Rtwp!@t?vSe{eaX<`jep)Aj70=4+;@Uzwg=vHy#6X+jX9Eo zAQay- z^i^zGxVetdiNpIj6TnI^LeO*`y7VYRJb@UaDN6g*lzuq1egh%cD?F9!T#ov9{N+cs3>U%Fnj**5HbZwsa>!H=O;<%qPptm}8e+ANuAWzm}Dk6hCuOUH&6>;k}km;Fnfj@?2VHrzi0JxhKHq zL_qFzyOR)a)q2j)aw!Quj7A8fjx-rTNIxBA1&IXxZ)eE2Mrg@vsaFxp&Hsd+e+sl9 zhS=g8cw7szsSLimDrcKepGfZy*lTs_S!yO&F{?H`9((LDc=5#-;pow$_Ebj+b&{bv z5i#Watgv1uY@Q8Jj!&D};dZmrZ*aEMqoHB5V>3DNs{ zz_AA+!|A+}sUkT|C}2i+PR@l@5!w#I7$JUWy5Ee~-s}TUMTmy)EbX(eE^S?xoQJ)g zf|yN1$KSSmcEv^KFYU9hLqkIt+P}xx!Bmj3k+HF2?6|1^BR1iw!+*?)&-Q^GW7>wc zpy6DpZH|3Bb=^BbJ9`^D^*6eF^>Mj>5(gRobJ_TcR?h0IWmj5pRXnlS@; znS=cN_|^g3@YUwW=L=RCfpb3BRX65^t`%)NEu8#i?Z4pKgMXcL&|dwGX#-0JkuA?S zeOvp#<)x71xr3?Y5SS*jwA%-!9eJDCPGg*(8UKvK`AQd#hO+^keHH-R)H1aH|BHVu z?6Z7%Pk^G*pUePZFwc<1121*`j{k5-7ytH@pMcJ6g)Y`P^b+j<`S?aST?|HTWZ zVIyPbg1I{mV;ddgYa2td-OS;Q7^qipGTk@_PQ!M{9*nj=; z%i!wY`(NPnPud9#XFIO?#S8sY2fQxWcg{chmw6|B2IZ+3Dk!^2Li`H|Pg1qYSqD^< zM~6JeVT7QZ=0~c<&5%gyDZTtb0V=Z0&op(w(7y?xPT^CZx>tYdQ|JcVAx*`RpBk4qbm$N?G&D3cG@Q-2{r20v zwQ>w?ZQS^f^5J@_gEcS^mt(@OR8u63>Qb2jQml7(lzE@h|NVIWVM!^y48r=-SW$`S z8yRzTXt_O{juk2q16PUU3Dl^|?8LEZPRZd?d+!OUu2QAWyJY_Xf4(S5KLu<)nhS)$p^ZFq+diCMUPP9(-n=GT$y4$%!fcXg=g1;9;TYaxkre zrZObk3CGh;ZD-2Lj8DoH`;}ZER|$kbC+_Rz>QhDp#R6D1-+blAU}gb%Ql3fhk@s8( z4QD_8-p_0Uqpe8Am4w4-r^M-wY2N6xPSWcCg@5`mN?E|fvnNcG9=PNSD#V8c!r%DW zi{YwEw!%inr+;xf?7ZN-?%LawB>vlvH#g?cDTd&rcbl5r4A*T6m`yMhn~=4a<2f0J zbIyOA&(%MDA^grSZHJAF&-}`z-3ibg-JKISIz?RFE=3qOZJPfSn4%3jy5eTB^~Z0+H~;vD z*?DHI=7IgRs-g%Ho0t8GcaDNK5H$*fvRYzS4L*r|x&X#1h5oWv0i)_)p>mb3Um>^v zo}rX+T`&$Dxu+3gOezdsCyDDLi+a^n2I}UPSs?F}u?|Xp5;+z^Z8z3Z=Nk6z-5U&7 zCs~@mG3RG>y5(j%!Ly;Ep`oE+3ij;TlO0#BjkQmIZm5HqW}?+%f??W<%IK@jL3M;8 zVJoOS3eCnZ6f*B6fg#1fxDj9^eW4*pk`u@lBT?s|W?osD7w&t6qsKVm^-TL4RsTbJ z`3e{^Crgsm8Q&mCP$9Kbzn@ZW(!k?fBu51wS{eH#u?#TCB#IMcw!jPdTG|X=uN>iN zbrkS2zS}wMGpmH8;a{Bo32UT&;X!^nZJvvhs_1fGqJz_(j+hg&o!QFpBrcA1u&EZ zac}`XzlK6R1yamKP(>>2<73HZVWj(nITT8SfmB?18dIp;{Td9E!AO;*#S_@QL?+i( z(Fw8<;~_)l)HYgxQ>^%8V&aT!5fYps24x~NH%6jOtp>(&;Zjv#_?MQKwMkKurUaq! z&K_3p0_6U_dHTn2`mKd8c-rGFdq=PBTh`#JZ5!L^v|%3p*1Il-%eI^c?oCy&zxIuD zPmv;f?UZP;>S&(;{66i!W(-zIT@aIyxN-(wxke`Y&)&BUHY$GevWwxjE_0`7cl=qf ziJXshqX;gv5@`6~Z4j``$#0J??!s+UAh2h)jJ^=Fp<$Fw75ck--v!&=u?8Cv%JKO> zz3NiG|Co(|u1c~mfmL)kuaWo?kD5>Dcq87tc8>Z8d;@^@OHPx@>(_tjopAO0+9u@L zj1T?t#o%qIkw2!@`1DCJcWz8O&MFSj1GAY=d;uA~(VkP~HrG56*rG2*FyXs>Q+jmq~+t0&h zpKXZ4$S33u05Z18&VnWStFg1%6=h(z1!fEL?I4SV6Nb7E{4!_WuK$vrSUo3ZU^Y^5 z$~nuAxFaqY3B=UJuY(Qje$YBo6LGms*WZ-O*3N*YSAYNfW&l5ptQRrbdA&UcLQ~HWuL)S2`gJfSCVqI8 zDa#$62Fx}~f)8|N1(Jphj}Ps+nDt5iRcsRi@X!B$KXM6>4cl3LE3()J=Z(DF)&n&5 zkk4rzrcv0jS?YU*SxqS!-Bdjrob(}hg=9s2c`cpKbl_+}KC042c~Km>D1PNN1yYlU zM-cA2X3g&$piw-=ICb(m)`1Im7iuxOD4)#8(}%iYPKrSVgjB>zIyUA-n_n0&P!5ve z@F~qbh>_W9YTZT`AXeA#=dDI_8OJh9<^25IYj5<Q%J6COc2Q-|WxNOTB z{OxyNG*D!W4vE0snz{BRmI1BEA$Q;fVs8*Tg-1sKt08sw$P_XdD0(KJ4_vebKJrr+ z!A8WVe_^|&9SwghGZipAY^6fV1b1I)2YU*!<4>=plKur?Y3&tw;VRztcdTvLQ=rx9 z&t|i4;M8p|*gC-ZM{X0x>e~z70lWtWrc)d$@c?#gc+Tg{`Tx_u`W|RFd+}>~-U)8Q z%?Z%}=5s0tfAs7rSP8^@Q6k?^G(MYmZLT;-I|ao4Y}Nop8OEgNoWi{!J+%^kmKlX| z*)-1e8W_!eLY*fxQ5pn+ju0<9zub`A&;Lx}G7Xnr^cN?RN;R;>8?x##1*_{N8HI4h zPabe9Var*AYp=Z)rsC+)qj3H8*TXBXyaEjk4Gj$qXES17Ops8{&uVRKUq;y2kYe+? z$h$Sc2o_s(-m^iyq@7G`S0&Yz36RB217Dc2AKrUL};`s=jZRd_PVfJ^gCDxZYQhRXB(0T2`$?GujtwXJ`OOmsVv9kMHXFutasecyMCTVCwowv0gi+R}`w&mQH^&|czS6!Zp zuwe99hiOB*y3(gP8=I}8LGXed!epI;1%2Fh>!ml>IugmZB?w@cQBR{8|J;`D^OfHl z2~Ff_>ZqPz|I1JJwocGIU*fh<@FyW+GWhE$F9ZANtiPr}fvaSE`!(+}tXDV3EGmYw_Tivk&%>yV-?`yV z)B!TMrs1RV3>|ZN;etPt*N_gUkt79}(=5@n3Hs)C1M+f;jU-CkRUm+mFY#z9f_(8l zKfo_Al5z%jS$DP)BhZbuJ|&nDcEN({@NuM_)3(g_~_u+oKL-S>Ai6aE{;>G z$)=SGwp1W(KI}Pqc>(;5pV@d0(7*ZKi{bJMx48On=PC1RyqU@W^TbMG?;@M%mY)EF zlcD82A)2D&AGvnmpI`c$zqEbBodT^+fBvX;%=ynS9*@-JI+X_41eZC%x`ad*dQul#nz&HQ+huL{% zt=thgxA(3f5hlIcpl>a$*q%v$ye+Ec%5r?;Cy))s3`>9#*DI%c6XSsg z9)L$4c?6z)_SvlX%Gp`PzwWy0;A0>ASaW`EXlQ6?I47X=^we6Z*2BB+z8kK&=9=dG zya|x7eQgd1!mYWDs}C{LgtWrPFjIh@p1dUGPzR%^;t<)m;E&~XK*7KS1#__~EnRM7 z&ry(Q^l3;d>kAw$HbdtFnB6s}Bc__q-5l};Z6d0S9wDbH5WN0UUItG=i7=QoxTZD% z+eXjER6Y;3G)D)6ybF!5JZh}Tppa3qA^AW3*^j)kjX!}gfhc>?RhKmTY(oUZrZOUT z(k^>$F64Hnv3GH2X8Xlo0M9wvj1gr24%Tv$KeGq->yHOGZwCZX4*>5JXT}ik)+Qpel}xq`x(J;^wacfsTM`Vtn)`o@ zJv8j}49*5hj9L|c;p*Uhu^F9R*d6KP$aegc?QF`kMEesMne_aty1-}y5Jqfo@L z2u+F&4I0Ki>+JvN`AC@AJfvH>tLip23FN?%+e8{1)~WdKoP-ECYNE{{_D#nJa6^y z78w9A!bn-p1V|OMcHiVx%>w6@FbdCep6D|%Z&u-;=7w5Hu_#nL9&M))%t@csM~5$Ye}@e~aD>0rEKEM_)xQ~h^;dKy0e7cK<=bK0@(XA5QjDM7+QEx5O3&8s=%9 zFLA|1=Px&Xw!$}FeH}Ime)F=6d%kJwh*CO{ow9)FRR-k5-pB3dHX_b-=WxjlFMT^; zUylBs1BvMZ*}cCO_4#Z&zdr@~_m2NLY!rOvuUy*Gsq|`7N29EB=zixu4`qTFlT0`A z_~7Shp7q_$y=`qi#pOQ9#a1)zGfpi3|I^j)f@i+_V`w(;ZtlgRXH$}w&)lXgmI9Xr z-g?W;!AB=go|I8-8MC{b6w^ndmLVqplPK7%o}scRkRL#B;33ZML>mdR6J?H3scFSD zv9pL%RdDRsvF=Y{$BrGaXU`tkzI{9F-o3l~RXBC(ROi@r;=~C!e*8EzG&D3cG@NTt zUp-KNX06<{YgZSp)=0HJHmB#!g-tIH1{5N_jVS^GX+tXE3gEIY)!u02K2=go1Ca4W zct}N-N!|8jD7Xq@MX#iQ2?Y(4gxWT~-_YmL=YpZkL)Vx?M;WH3kEX+Pn(^6sYx6;Q8Vd|O9q$lWIu$4A`0u~}D%|<= zm-gZ8BpiEc>+B#&bDbw#o9%iSvv)_3KPcef4p_mX{eXK3j)P4b-P1P`rz_;~z zU-h+tmLYvQW?w|hSN<(;a`X~s0n3koC;s2q`xj`>j_N)T-gUe6Y<1rjvJFP9ZpO~b z!rhAPu_Fly=bL4030j%t1B{^Ml@*dfAdwF+SOSqXv6Bx87=yv17Kqr`6Vw=tARbGA zz>isx1QHM@OA->sKti`#Sm=50ZMFJ&|26+Q=Tz0Ms$F%e>eTt)dt3GEb^CuFReSGx zp1o`DQ>XpG^#rnt+`3c&q0ABu)oBwLE!)47Mb^Laf66+Lb*}!y!PbDQ)f5gG;ID~0 zvH}1{wWC+=nMt#vg24I0KP$%v*JD{i9DVIO&%h(nKWp^QewZ7WQqO-x3{6>SLDr=c z4j`fC8}8&B!X8h@sf3dGn$0l?c554O7~lfhg+hdcF%(ft5k`$#x52!uwShj919iPD0mJY%B^QVLS42rZB z@Ra?_XPyclfAkd(tl#Qno4mwq)nG+lez|HBj8=A_nLf;iK4Ne4= zo+;zXd4i%#BLAy?^t4qI0KMhZ^>F@~r?e;B415+)4ijvMScS6sQ_Q57u8VR zDZ^4dpHUjIFwnh$+Zwl>9E>B|oxugqKNVIJE#wsmOVr;KEmj?`NGJ(| zL$0df0#StvNWwf>h-;Yx4k!XfyD z`R)so$j^aER{v~;7nVZSxd8!)O@)+S*P2RNH-T1un9)%=^51f>eVb}6l}rDxyD?xp zUOC#ph+gkC{c-j{V@6iBD>OG{H*`2?<(2`!+*$+10nB(OWa&0xsP2>u3_4jY8YmFh zcq{>!bqTocJBj9)n~b^H4OyfdqHL;7+&0HS$qhG#+XA%zdQNjQ+6p(B^9bUIPkX?O zI_lcr>WhphV?~7x>7P||7J>}m|Fip+x(krppY#y*8GO3aTl@{Ba3eQ=l4(B+=gG!Bm5!Ov;}? zD03Vd`8B#aBZHqgkv^A?1y2Er@WNfe=>~e>4i8JRfU587i-%46orW&|-LrTUmX>Q^ z--!kh0NwPj$wWVsjc$NG0n{1C4JNITtBoemX=FFy*zjSBUQ4ID)um-vvrtx}l!v=Y z-}L-f&Rji#yB9pK4SqJ?oCWo{q4p-|I+WM(TeWz2tNP(850{3pMNhu9+bk}~X|bWt zXw69G>n4B;f9y0kXTwRb8gRkcr@@wuLKeHc-29b)^0^4Qui^fsK7D1O33isoJbeRq zWoxu-jE-%ylXRTy7#*7(+t!Ya4m-AO+qP}nw)1kwyXVf|u+}%KYSyd*TrP3Q4aq?Y zg3rmFSAMD$Y5#j8eST5(K7}vlsJX5Xi|qX@ifo{&)pgRAl-2wRI^7{>pO_LQ9u*Yg z6bBv8e8%F81@9qE4DhVye$eq&vVm867KT!wL~il@<| zQQIuC(qTU9Ct*KZn)WN>wf|`;xP5>b^R4{?v9?7;TxP@E(Xg56$tdBPB!4JgxXVd8S9h3A}y72Ob{p!F5K4 z&(h*DYOtIvSgz+*TWVbEIzyer^mDLZ=P{>Q71@G6jY>6LCYdX3i?day-DT(Aa9F(b zpneqs^iM0z`Eg_e-mSI%5r3G4Wu6}S?w`$qV1IIXkPh-$&IZp!5J9C?pN{7GU9{-t}D8?>hww((a_F0D2vLktO1#0=4?}@{!?_ zs6KUIrB^29@|x4rDCi90J_%vE`VZtbi}Twr9hXOiS9tttjY*Ii{CbrEvLG#ZW}n~8^$fi z#4II%^ft-)kE%BeTi>xj5Z13z_xKB%&xsn&ji{JSVi&*9aUV_pFf{0{n-L=Ru3aUm zs`o&diL1mqSw%SStyLdvLN^+3#NJe5*r?w#X;X2TO8pTRDP9Koc6HCphR+d5XE%_~ zOza@(t;AFYX>Qqpiffb5iC%STiH=Y_Z_ecUnBo+=gb>+S6m-iBP|vYQX7Zx=QwAZ_ zqK|jzUtsoCN9<=)Itu?gH~4-v_#u%?%=5ExT1CH~#+|6LBkW2QgGTqXeu5J60Q`-+ z84zGcJ^R$f0MbK-d(-u0e*^Chn{Y33|+|Zr)ZZPqc~O&qf~wa)$Q>BlIdCmvv8ae^7|&SNswU`4j$xIQcb;#~Y+_ z)uHgwN#H1pSN@|817&-*VfnRp89#ZBL@07#vMT4dSsN>U#|K3h&Dy%?X!LwU>fR)S z`7@|=EEkB&>`ZE$zrvIPV*ZwYig|cd1A9{pi$K`u`nZJ=gAFf3Rntb{{nnb7p^Q6$lGmlM?1nK<2cYm=YoQ_{52TRlBp*gQKvbB6T`8`~6LK&#Monx_709BOhfh5U!}`6>{&G4QA^r_z@;bev7?y6rDUY6#8Ofkh=;EEn64;W%(O zkEDKo0)xDJW0=?JL2l?%+hNbedfo@qwvXrJORcFcaszdWla&m&{joBjFsLXmKQ40) zJ@~4bwgKMf4O&genZF;FvH8OF z4VPt9Vk!T13R2MyY^doL#_j?!3)7XvAX^)yip8+&H0|x)>aD-TSV!q7X{KC545OsR zc{#z4LXGhiDd5pUj;{v>&3m_h?__Ng(d|r9CqW#<&LY3-o&Lk{d5e_A^;xQr$ydhEkP&`6B<-Kb^egs%ise;)HE%9mWd! zVZ5ROWf-*M3pQhXFr0l;DSLR|o)6X#K~R)(8!-Cyr<-HWc*xsIyJ+027>G_e8a}A( za6FbFr@Njqylra&C7#O_Q}V=s9}pIXto3#Ne*dKWyxt*K#_EnQ6wkLE^nse8EK6rk zJ{MDg*7~jIZhXV#N0<282jbe4Vb7Hm!;rEp!6)G>{&~s|P_u^78^_~J=o0-d3nZ~Q(sqyNv zY-vuL5PWsatu*+d(-tR6fN#LxU|cp>2pr}Jcx_BlLhYLVmhc*8F4ULD)rrl!J>43c zhan_fe=ZiZmm2AU;dH9Gz+8M@%azv5kr_aWY4$V_%)?J7x3Le57N7}9I)i_Rq3mG%L&~w(|Ti#f1jpJDm|DO&$03E5At7~|DW@F;ZKU$4#{eQQI zZ=hSrkn4iHNMqj~T03B1PeD_w_!J8J9-_K|bwK|5iP)HeUQL=Z44-BzV$@%IPdr{1 zg`ALf3Lzdv(y~G@m@D<8}a~@+%G*^h-_EkdJ2p6MAHbhaN(ODEw zlLz!($AJrt z3-LDB(Y;|vyhk0Yq#HlT^1M@UHK;|Tp;4^GXgB#QK zyn$bP>5i|fOcTPsg)SS4ezXQN6y;D5@;h4s@snOvaY=D%zNE zy{^}iS-@9(H5pAH#HFs?5(37?V|)~9XF&(eCL1x8oj{mZMOt>|RJQ-hts-?6pAEB-Nkr;OeHvgHx`gB zWNDxvooDgh#oGk5`}*V&&EFA88$2Gs+*_bLKG)b3_>0}tT0@&37`p~??xv8~Wk0iC z=Y>#}Y3ks#d(PJdKmrlg_}8L{2hKYYjVT&30rM60IemS?9Z&$Vk`|bRp3~BQSoqXqHm>-39BvgyEpK~G`4HcR~3oN_P zYiM7bi)w@_0ZV47mnS2?@Mrf;>)ss@*5JwXCAM(20td(S6|@S0*ZMr=N6rTnovbPL z@*soi(}89-{)X))a>H!d-R1N8oGPE**Ls9Ca${meTaJ~*eWSf;dMS!^7gL$-@ftqY z9%^`r0B$h59HJif0lbV>tcYr0>1I=U<1L(Jnruoy1l5^0<=3kF#i(z+dE}Yoi+?%ZtM5Xk_L@!Xs+ zO2=?Xp1j3AAYq!3n#|@L_1bBAwRcudi}VXE*L-5@-Qn?Shg4@V$Ldy z3bwC~p5AsNXw#)(*my3Iu*NP9a~UYN)b@?sF`YoVVuPt>O&uQWe=G;148u~ADt!K7 z#E8%E2dD8+zZIRrgkaTXQ1_nA+C$$*i&To?BC3l*v=nXV2XQ*Ork?Wv$|Ie~`X|B2 zF~qk_uuB)VOaZ@cgdY5X1kXs1!{f@m)mllqHB=u>dfSbq}u zXNoU^$n~4ZfE9kM>s^pm7+F^3btLK`HUvC^p0&pGY*_Q|7HJK+_8JSeN@+brP+s+y z>k1K8pQhv`i8LSjdBA43_H#k&bR6kzWF6Of-36Pc!T(XNPww^$7<#~mGG{bJkmNk` z#xZ)q13K-Ix?=_5ds=L|KwCzp%Phbnvp0F~ug4|;aQ^OCY#ep}Yr-kqq%45K?n- z!YSxG0-NJ^V?d1PdZxHxTu%2%C7A?S=^TtE879*oAU3#R)bS)X5JCJN+HA`+y(60fz^BWz7#Lkde}y4-6B;r_DlO=ocwXh{Tb`UzO| zrQJ*I;lxvM23)+v@d_^Ek0%Yajkz-Q(J>T%l8=Rh4_NnU9a>|mEBl;P+V`9LV=3C{ z@vFXwZ2n3+qko;kVBGvANu}1+!3AE#FaVtPbj?D>*ERELD2XoGC>{cx8qF+{Q@40P z&eQC*O_reKz|dALv0j9>I*pMYhR{ckiSdXmxkIckj-TiU=k$6q`oXIU6f3E=*33Sj zpHA{j28H7nf~o|0n{Nch)|5$Oky)*awtR1ioL`BGwc29SzuZf|iqr&G{37;$(z z_u16N;Gr{QvP%_QJtfs?I~xgYyxoWW0G*9{Ji@CXS_L}Ok-P#A9@DX8==*HxHK7#_c#QOt zR%WjF8%Aj2B2_qprz4L?UN{VllH|D06`N^_W^>+7{`d2wq7Bz!d5FCJ8}iW^ZuMxs zyFaS^ndgDw&dLaPIoR)uF)oZ{1&T3SoT;Xk#pQBFp(}b`-kbdsY*^Sa6I3N-+O~^zzXu`XG#M-XNHM<_9hlPE(snctc}m;Z3|&oqlrhQ zBqb&zMHs}DVbCPrnB1=z6DSeUR}iE6!k8samQ2j%o&$~qe7JD@GA=y&IE(M^tvYlE z#N>@$b(G*}csg)WPuOqv8I6-e07DrO@mWUchAQ0f#iWuwUtq=z2p*~bXOOOOA5fu* z06GmX12JAa#_2iPf~tE7Q4wLU?$g>G&hjB@<03~Vz-kNc5>#(RX?34=VIuQ0B+7G8 z%1s4Vlik^`&sFiDb*fm5m>vt7jmqJVP34I%iiz!{+v65QxCnl`00>&8S;?ai1K2jJ z0o7U95!5pIM_^9&q`VzAlmrg2lSz>JV`~GF0&%=i29>G!NAry3C-Q{<3<&WK08e$xZF&}=sH`|+_g=tcc;(tP6`8oX$^EPjG+KEPt zg(M&^8}w|Vt!c0H540|#8(IS}?Y~*X9W!iL@Yl$Q=C%N0v~mgtr1>paFq}I1JNg*S zvYY_6Cma6`f;7=&(0JdfyObxw(HOzf60SgIpw)GK-^j~;N zJ0^r=9Qg7Att8Dbj7t}b&jH4I9CLhOkA#kGV!(QEw#0-oE*IZRK*dx(k}|Aiean5Q zvp+GHRzd`j(YY6DJ(zBj^akte5JXvdU(bg5D__c(0Ioz}(9j{p;4NE2GC40@t zT~<5%KJLI1!_~|yKM}>0dIr2usWTGmOUw5yDCd?}A6;~W19 z|83&T)LgnGrbNc(bz@$G<5nv%2tguyDIlegn+eVkT&Az{(n@Bz)NS`RIcb4d$iwyy zP~F@ag_&vN{l_6!Lawpx>wGHG#;=)m7!wq~NcK>kySSC#Gt$i(iLJ;}XwF`NXN_K% zhoMD)n}wo?#8tn>@?(BM)Ff>U9?bSk_rq{pt-G5x4}Kyz6)D>kup4mJun+DEva07k zcWl!$PYSBS^kCqpliuCNTh{trB>-xn-d{|{_(0TxoWF$(ZFI~?#+Z?yibt!$of_EK z3pbk>7Qhe%tvOWv2Gq)8cXWGGKn*2vuNV&@#0l6L7CKG)P)xGu(&4(9FrLO!K2p~7 z*zX1cvh%%nJAqKjT@MEbI`sX%b%A>|w*!5YZ3c1(55$4l7bZ#b^5(ueHpTyqtBs#s zN%ZSi7^x8Qfsde6{wrnf8H?Bt6_7te2R#`;n`Vb^m;dMyOOm|`v3G@4!9{+}sSI0} zHX9CPNL)-n7c-gJ!*HYGUP2)KJxs!!uIq8Gc1NASZ?`#(lA)pGW|JgMigg!1vBIeX zGL)I%nfFDnt;#6(Wdi*1ED2B_7n0?(RTn%fdTH2k$pV7)@> zCG-dkeDOxf~TyXXrBo24h2dxTVV z+#KPYb;^W+GseaMtKmT~XajQiN7s0Bcl2k8aT4eX4T!qRuS%dqn?xVT5;n)D&u_}; zo;7@JQ&FySH0#-2jg!l<*Pf4@pK>mn^2x)sEZ^o}4d1XZWyX`NfsF=!)hB+IBQzKe z;~B|>)vYDdNwX(HJ}(^I&hj>`103& zD>BOig9vlnI^0ib~GyK@}-66i%4 zSm^{#F=TKh&od73SPzJkY9uRd7^4^q&#r!1!37v7;4*Y0BPBKfbTgqff$G|-l!K(F z@ZSul5Y>SjesetHaBH?%;kZ6CCqkw@WDD}pe0%B7EqlfW0%?99{&SB#;I0ix?v*Hn#}RC9A-u? z3Zb~Z$bl;K`Ss6?IToDTRhmy0e?)7Y;_%(s6c&LkU$^Ew&29KX>~QJ&{?8p!whO|v zH=mJ!Flzap6V`DUYrEl>;#zP*7m}Bk>gC{?lQ9rT@sP!38;k%hz&8YiCiAx~Ql@uI zkFN|H6D*pJn&F5*7lgph8u|cL2;=RvUMiKOE4LNgqR9#|50~f^leIQzHh1}@bG2vMH%lVTaNVZ@s*zfI+N&CMh)WyXmI`#03u9z#GJCkF= zN^vh32sk%6%%iz2t-sJduGrr+oGBOp+`pj-^jvMb!{AUQBl;lZLjl0#cu~#~+r9Ot zr?G@B9U4U+kjX(IWtzkp?TfsXPPH=eMj7YN#=Bnk(g+MQ4Fg|mDg?$bNkhsk!bFIV;zqVouWMJC|%6A^A&si6QGM^*ZD+?E0%xDyhEUJOaHhzFRkTv)L5`2W5-Eq7XE7TYb|jkQ^BN(OIOk%9xENP|f%@z0LgI$7~Ue(#v6alQGI@948H zl(8{;9IfrlOd9!PaqA5KfJ`||k|U(%ZiV?h)U&~85dZdu$bN1U_6^ssOMxGWKyC}q zqCmB(ZV-Vt!*j;{07X1R?l1pOzoGdSaQf}dJ&X^D(KTA)g>>zjc`|j1hJ< z>Vk>>c6Q@@CDNtk-`Q8Z(5BsobtBs@Kce7If2AxL*4SPphymj?E)V`*y@~gI8jfA> z3}u?TY+G}oBI@ah>dv=4J7blLn6|G(LwZmPGmomIZs~(sxXO;E&{UME5R&S`Pg^2ICucRPv`a`azR{?c>hQpuXYX?Ui($? zd{cT(z2jdHljA>ai4P*FjRM4?i%?PL6j-~m5qdzRKSYm)S6)_JRg6e~(xPsdT42Qq z^3uMNTWS9AsRKdzjufyb5OIO@Ql*AYGywBKbjzlGtQT-};va`2xd9 z3VV@_KT>G-MD4}2`IMSEVY377d0)RYD?lAerCAxH4CyV3p=nU!35rq3Fm&Z3>NIGX zIMr9*h-o(3Sg%8+ES!GvK#8tRE1elrp*1+F{M}&sQ%Di2FoBGi@8{oBF+Jv;L%n@#EPwX~q~ylyINg;}I|m}V z);Gs4;^2FX8;x*8aUI4vVyAv<2Ai^=e4ld|#arZs)HWO0P!bMPyp@{|y&`ajvFBYW zw94*`?q=?Ja+~`i^Dw|NOLQER{2%(b1bKt2J#SqAld=oKuW*(Q%^QCkkM2!iYI|kt zsF;;O>>hcO*tVCDToE^Xl4|Khc(m;WLy&8=jA|AaRz8j9l8YY%dD0GV9P#?B`@2Ay zrs{{7JbyIJ?98Lq&-rvG)eSR7HtlboHpP>oCl$G=F?Hv>7o!@raos2@fd4<#Pk^ z!c>zE#reJ7at$Cq$xH0Cx$dve$*8SxU|&!993>WV%6kDSvOnzNpRIyIssQ(17Oijp zj#3|3-+@~&c+LcBf8lpugO=%f^!@s0w1!!Hqda~mct9yz%b|U%d=*o~IJ5m~!6qS^> z((a+9o5>v!aP|Vy-pn)ZVz0M_BN9v%etvI*vNu+M4Wx?VNd;0EY4g{@GT#TFW4@nq zQwSl2n|cZgtI}LejYGp0Q7N%R_nIW@$vZWDV;zcxVmIC%#Dmq9S<-^rW2rc?6$l-M zn{|4`Jgt|8q#)C}A#BzpY7gu&SvSbUDrn47Icx7^bNaQ6F~UdS`9 z5RK{W+9mN0s0YmisCzb%V9q6w)&Yc|HGdpK(5R?jEY(hWTG2sr-e)%$#h2tdD&Mx- zASxosuO^h79Xo5%;X7sWG?d}k-Nk~O?zwU)PTAR6cl{`*=>F)w?84i-qQCpBwwDR; zX!XDq_=y%mkS@j(+7#Xwv{@X3_@!%mwv_@psM2KgJ%OQELye`%&dHMc|C1i4aGvKs zqbWNn1)c+qQgA!4(?~>rU#HFF!P&{tGShum_QKJ>D_K&sZf|PNIdwxlxDI{W0kI;)&8G)UD;P2XU|Ccy&ym+4^~LHYn^B<97B zst>zLMREXWEFY7{06qty2mUxhm`0F;5PdX#L#Xtuw%)Sb3?lJ4QKsRz0Ysv$%3INb z+*6T@&7rt&;uJp1T?v<&(LCQ>AruEVw`X1lw69m#GIV8?<{a{n)9|?akUFPq6#$Fn zJ-(TbLpJYh_2#LJe_Sq$r3Bic@-?IvU2T?p!mpTaxPhrrz}KMCtKfgqZ>_84QcXc7ETe^9*Lq4?dT9SQo*n}uLgga z3Gv+c`54Ud28|SbsjXs!H4)H1tOe^ST}q8TwW#Se-p0YPf@GU3;Rx007-DqhtJ$W+ z{AVp{3+-(w*in{YOAZZdCT%Y3y)%&TxDB=jmoKc079!TY$)hC~Q zL;5$%!U;%SH+0=b)pYEnpgaXoW?NR5nRx9V-o8xW+hXEr;=gc1bglk2vXI+iA)Nmd z8R^yk>RDjg?0V_fZzalhj|&UG8FX9Ps$ZCB^`7(M`j>aVsAZ~Sn2iOcQMfERZI}zk zp5)bm$Bo42j-H6Plq4o=74pft>$=l3M{UMkJQs6qx+c!6^W?<4_8f1()nw44AMKE8 zNflV%!>Tx$uP5jb+m+bENNQzsY5*mw$uh0tgKm4+vF1Y1)Vu<9NDx^G_N&Uvil6oe zclxLzoUesZ>1c7J@j>Xx0Sm3F$p6kjDfnG_l?1^Ib7%@dK<|m;X>zL$GT*-jeC{rp z@tIY>5zgt|&R0%9;w6NIRPo~`X!8X_&4ocpdCy0bSBn}G*<${TziwB;3>uJ${fc9W zS{?2!oP6Nhv4NC7rwqEo2Mc;AYp)_GQ-#zP38`$3B=n#4P=|+&sBZoT$_&ji2QPVl znLj_rL4$UG^j1EmIN?y*Tmgb8hwylqFpf)q_u{T*hN6CvW)VC#u_>o`C$jUSeFW;K z=nmeRdyhxU*@i*rl^1}C~9h<#+2VmGw?{WD`}SNmjZ zTKOMptxSxLQ`uVl*V20Y`O%3H6sl7_H4ui#=Y>D9|71;GHa~LtYY)xyy77+NO8x(wYw&dokyv<94$m>OM5zVMDrE=> zeI>aKqHWdBR+9za@d7*gZ11n!w#5#+3zrQq>;W);tJn=jtcVQE_P~nFc0UfcAv>O) zU`dgl27{n)VrwdRLA+42|%4yO}BMII8LUcG*pB5&m}ad;O6- zSl^MyVrNrf>*%JuvGR`?0x0O>PgHx6bvlL?XX?>W_GaU^-9uCv>0XYFWL2B~U{?R< z-po51QAwuejTg>tM46s5xzS1VW7tYU-EF>roKaVMc}l?UNH6V8Ufrs?GYuA=(`er1 z2MXaNRCM2#to52amrNTAWM|lsv$TK8{(hUldkKgb)8&@$p_wjL6o>f1_yaQ_Guu1kMN4;$_+Drkyj5-I$>mBoC7^-wPqxWER_6nDNCqMcn_)9 zS6~Ziceat$V{Tc*+w!xjhJ|Ai&P+Yy`fKdB=fjTaP7>eEN9!GMfS7S}(j0$Q|L{g# z`Eots_BnEv0j^sm4_98dd2q0t&8{Smdec))q5OmlUP_KmEwDaw`F%9CpxuDWMM9mL ziHrReKt5US+lGcbB&>KBCTAzQUKH7q0PREjdn>I^juV(95yq7L+pfz#R{dmOZ$cOq zA+3bx$fh=D)~@z1{t7TPZG`fgr0v2?C^(IWVuOTr#}FPa|$SuTq;toH|1(g6te1!vhq z(4YO$uNi9hjPe;(i6F;SpWE`ZwBQda%#Lt$7bs*$G@cPV!DN@36KsYJIc-&JVkPuH z4Rsz|Z0>p2T$4OITc6awU8Oyg8&vzNEaHNZqtU5D^EK0+meRPlSYH^^G%|;Eqg=|T z-tHZQRIlFpzamUdG>cCBG9RG2Z=g@4D%aMjWWRQzRI4h3 z6XM|PmG%8}>iY79o)nm;Dg>#kZ+8mHkPV_I)*FjC?Kj$Eg~Nj53Q3!MZl?!~IE5bh zuN3dCnEnR)FANMFi^XzWdEY^`@ZLGZHBZn5EJfGix!Dup>;HyxzRDcwo=8%)2#|#e zjcXOC`o<0Gt#&Z&`p0(;Bdo7JfpjMWKO7Qg4Mg_|tJ3^ul(Ern+U+!21H|p*Tm_~FK_En3&Q-x{$dHwfrQIjAsMq*14I*K z92*9^`Cw^ewbozHQCttqi;AHkG7ZlQY$!KVP&9egrpnj_lR6f7a7>>a(zZTrjEX24 z=+xf|>3!X~8@$G^BNL^^;vF6i1{UhpE-Rw=;JRMo($>(FgKPcsQ6^h!*@Lp#kg3or z!F}2Y0t@^~(IpGP?YYxdT>qXdWj`2Z>dpN; zizk`HR!lJZI=w96gC2jDMEj9sGnxG1DgRN`7IF$Dk1F92$s~khVpXY*Z-&N_>}c(D zwJ9WT4<=OKV)gV0h8_@%9>7Z9*r+!ywvG)VaPrjwroe+UE5TAmu3jeS&RusLZ<$c( zy}v(O$@7~i=@We=b{YVcU7X&Yl{B`b$;{la<(=E$($E(?w?%=o;#YkO_X?_6kFgOO zIim`167MC9P|)&k|Pwy{GQt!bOb5g0dn|$wtU{roR!7Y;5Wv9CBj#y z!ONX?fzt$;NJqQArW?1t86G%-@i8sw?XcJyY!WLmry}P1oG>YOpZJF@H|f;VWIeGF z`N=($;tbI9b#Ze%6TLWKCAs9&bj`<@{VpP8kXxtLE1AAr}dC4#jF@ekLLUo{{YmPlJ%&iI&AXv=@W zcn%QzB7U(_WkJt!po(HFO+hd4PaJ`&4jSXtTUnxW%**1sE2=Yww@XNsT|||yl&eC) z__*D`lw;BnWU;mh=vKd=_Yv<;6pc=^EHGMtp3E0d&XD>ln9edLL^}-%e0xaFQe4=J z_Mt_AKc#KoKV2~O*>?DOszGeOT8^BYj1sVZF;hD}6abhsM*UT!%kE~B#Y~m9 z%|WTwVf!K5o+3Zd)YU6mtj#bC$Y9SgB!O(8p6fr@jFSs3uP8uyHG%?2F^O$-Oi=#X zbG_ki+}={?yh|0ZtVn78b}pT*Fq4d`ihw%gOgw@euL-4MDn0){25yO|_J&xJUj~K} zMql#eQ0D1%D5alYhiwCD&=!W^1cGV;NLZiL05fF!rxCmV0^cWbF*%wGgi1kC=S>n5 z5l)(hO}TQ=V3~OmXQu-88+rgTt?<<;YC~f$Ic~#hqP3XCYVQybCb@<&Ttw8 zaW-Zd6(a4&Qad4&VR%;fSzydAwrTrbHt3j}78j4<%HKnmf<8{KPH7gCyar&Zu z?bo1$yAsbV_Gy_Zw3*+Q&puAG-ra~ruxZfNVM1KP4^bOhVMx!s7p={~w8m2&kb9f_ zUsT;ahXl69Q7q`L8_{L~m0kD4b=9fYLtC8F5CVX#9I$=mo-ppS(*#YyyW{qYwsF_Q zx=QAowN>~tI_->NKn+zY#E=plbO)Z(Q~C?iR`Nx!ln7`0LsAwr*8Bd6UC$OL0ipLP zwde6vroTs*2h1aX1o*1k3&=4HB+DOD(g!-S-zk#DPB#1$sipu51jTD+efnDjF-?mx z+}&41ZI?aF^+p)8zILL!G(g{bp_`hTmT$qp0JGwn`?n_uS^QXC?@`QmVvac-ILW@; zWXnKDPw%_tax)A5G%frDlL0lYiY;j<;y%;8Blp0sNucGIqx;`ULQRbXAniIN*9J^UFmx;LhjvyMp3v=lhC)aF)Mq9UozVttZ=n^EZ5? z`Su7v%Uscw(=C15RHJ9+1yyQT445X8Bi-h4D$6VnY@PbC;A}raY*t$kM!kA)`YSNx zaKs&EaFwX>m+9&Lqo|q%^f9}+Sprn|SbO!Nf&&RzXrgtOTG2~JfJfv3=N(Mha|Qw*2^cq?1UL(ZWk(qe?l5C|LhTdVFL*N@;Q>-d({r=-v1472<&*ASvr z9vk$_orcg>8?6Y9wp*JVN082)?~2Xeb;8*&sBn_%T#luUm%2@7KbHMQt1D>x#zb%~ zTgN1~CeHM{UBkGoO}7e>43ItjTP5nCG;P;CA_5PG*)R=>(xERzcJeN zAeS$@TxXjHu50A#0KYg|3JX<(YS2041V}AjK;P8|i+h>g@&waL7sUq)!*gN|uMj%Q zsq30R&Tq1QV7BU`MLbT}U$tCL5$5u4xYf5*kVS6In2d}UKkyHsfV%q;m>`8!6&Z+? z*RJtb}U2p86!3 z<>!8w_(4>$lSNQoCC^0^kl<}j9L${(yaI63>Vz@LJMAFMq}IyAmUu5CK60&+(L0?N z%rb;ZH>r~_t^FxLD(%}m*w<9i_Kd}107|l|`&QP4f3kDtBs9{`E>SAAB8uAl>P0Fk zN9)XX-A3T+RL)j3rg^M7dPfAu7n&`!YfARcry)uqiq)UndEDvzO4I(v$R;;Fp+$P}j zo+5Oe$RZ0)%y(djmm*sJ>v}T#)SY_sM|~UhR#3vpL3TV;?&an)$xyjla|h+^6@M#y z6JG~cfDAt?0XWgKhiNJCwR5v{{)+iHjztsty$Yd{kThR{Q%13&x~fWa<*E}dLnK!! zwAjPsb^ubvq+DLd1^*Xvr}N9d@{Fn;#`QIV@{LferHsoYy$U7qz+sKH?TbH#WY&>w zh47w>+|qE~M9m(JSX8S9Z*oQ%%Q-V0N<{;FT^JUs9B3a%%%UQ!1m z3qRq%5tDrBr@yKEt1QPuHb5nqTC>Dck4I;5d|KOR1S}qXimApm9UI_vZ*tY4&iW@n zpzD~$Q-ruz4BR+7!Qt@ai)3uQRR2_E2e)q@f!#3M@PA6AWWF{l=>Pdf{A1{BhJ9TA z<*)9V3_%r1``;Q|mIsF5Mk(u6Igd&*Bnj2!ave5F%ONy|J>Phb73J`1+-_mPHi)*e zxwpgbJ5ifNXV~-WZ3~Iq^T%xnWYb0Hefp!lC*O%Rlgs#k-aQ3kWJv@}Y;|3QGlzo- zX19!N0|puPjHCMsi$(})jS{Ez(S%Yza)V{Qb@uk5L?&pGQe*i~L3%H&3n7~v*Q2r- zh(Q83Nw6&;vS;S_diBjRB0q(O@wjNn8i#}gK*$C ztfWp%7E-K42`!O`eT<-+;{|R7a(%_=`0Se^&N^9>r_c>R7>K?nl@RYl$NAx8f_>j2$my})wE z-g<0*mA7tWQ4o3`a(JGn!HI6MjP^Ncmx>`AnYb-*0?sfviBsE8Ri{iHhJaAb83GGL zn=x-uT`dqk@7<`%P&l)?BT z2j}T}d{xrmP{iukcl{`%Ksdt5aEtn}yN#m5on2}p^tcJ`L(|GQ$M}CC*L^FDS7her zOtXf4@Q~m>P8ecTUC-$NMDIalznQzVBSBcIp6;5@k{rI$_y40REJOcOR!#P-{u@H{ zUl%gg^{*uNx+tnYWW&KRYOCuB;p9+e);t(I)P8N(Ig7J6 zo&1FGh-CcO?S?(N1cZ!JY==8xiU`HCSNJ@v4^xwVud7r?u2ac}tA(6URX(3k#l>oC zW?eyJ2}CWLdk3px0FO|sL1~$Bhq`=q@F~#R&gK*l8k$A0&DUC%1vM!_BdUt6@*xQP;`yo;><#_P>i4WK!l7c)4+vLF%E6E7uT`3j~c7gFj)5 zWIelRLC;XIV@E1Tvc#Agp4Q-CYN^^ppYYXk?e3Apn~EkN%+%2k+{5POjY?z!8-8hXf_m8xlPLbh-?O=)Fp=rw=;PkEyAw z+qUu*7SZOAIz+wCyWn35zfA$lEeYW>Q@{ytyDL23a{^V4f%Wct77xPY$xMS}!TsGY{J-k4t!T8W((9C72mm%vTggWvW zaf4!xc#p=_h#m_hh?o8!Pv00G=hn6zyRprN4cpkZ8?$j^+ji2J6Qi+h+qTV#`OV(@ zdB6OhBS$jpzSnh~1bn?zL$_l~w2Ik|h`2oqLZ4abwi8ss#sg+HxhITjOi%rUP+I5* zG0ln1N)WGtb?9%mulAR$VlSgf9}!2*kyu&~w-5^B>dJ7~@}nc+V|qVwsl5rS%iob` zWWZpHK2~fQh-RTUCzmHC<^W3qpLZaJP-Bgh{cjwVJFcYua}WprmS+AJ z1PKCvbBUT7cNMXL-yzpiHe5i;Zhcga^JtrM-%CpcA!Kvs!G)AkOfl5lCCs$BC|s^m z96Nns16r!{KMrTSSTieD0u=OR$@r^j%1f!#N%Z#`HSXe(SgdN1pr&MhKHfBrI+RA? zbu-QkVP=Y#;&+at2g;QK;z*o$=2YbeR|tfL1LkE!<>U)t4lUx;p2Suo#NPGrKlI+F z_uoX9-|LtaLejqbOA}Gtr+rOukHJNoDlB<3>2_L4ZFv*(4WVUFx25}q^a*$cz;HR2 z_=E?d37tdm!FD+umMYe;-ID$3pqa1ekm zetCp9#8eDpU6@4szN|ZLSfqF>r@Y6_q`^gLMs>3+Qq)t=5E&VHbAsm`u7$t9WA(px zGBvKt#p;3=-!3TD4R_sfitl=uBDPxug%1-8Q=5fR6t&eH@YwbFetn|g+iH-Xpd4SogTCF*WD*#a7M zyP)oiIogbR2%!2IpN9Mrkd&ak)I%1yM4~~G)Cp9CtzSIldvjP+|1)PMo4sTF&>y57 zaiWdZhKxxh!x(s#@_RRsvt{|9vXfz&dR zfL8!X`ub|#mJ8L*y*OJ;KTzWx&lX&#gn5jL?$nj{>xYO}mbzdRSqp8_-3iU-`P|U< zVwJ#8LB8!fuA4Un)g`G@qkVhPAM+aJf!pYI0rL1}C*ms9M!oinZ7HFDT-hN-=$J2{ z1H0Y1IN8PIB}6qN16c{eC{<&DeV1j8-oJ{$r_q$=EyFLm?pc-SQC)CVAeO}p4p01` z5z8kNPy03Ny|C%&Z9Sh4&f?b_i*u|xzJzpy4Xm$;`D1atwh2Ib{+x$G(|8-+IZB^* zfVlj=%(%O;;S5fiY#C#vugyLG_MR_S{MRGRNEv>HXRPzKd~Tafffo_W665o;&}`=| zK|TP$4Sx}FD*KrQK?fmuP}v*hteco?)&A-P?;0i4kO4M_P=T1{*SC9j)!+#Tc^^tP z{IhgjaA{e7&apl6klj-VKKm;f*9&w&Z3 zd6Km5PcmeOU;a0(`+70Hb_`4bdOV-Tn58%z$Ytp1kY?8< zT~~h!Qg1pbZVJP7t^e^B8edTTr?AQ}$l*FvU)Oy<-#2p}Ks&D>gB3^e)yH4a0EbC0 zcXMDH&Fo0A2GRP6*~=GeOBmiGRMk!cpIXmPD<|q!{eZrc-4`%bI;sE6FvLJGaTv$ zUy8aNwlRM$4MOM7tl{VBA-Xu7bFlYl$k6R0j%@ghP91COZo~DU> z*N8>%buMDKT(!Gssl$t}_d0OI15_xHJ?0e4Ie&W(+$D&Cwahr^n60$t-XP&B7bZdx z8-=QP5Xxh66UY472$@w&P?F7ACKg=abGDhp%RF9kWF_N3R~bZs^!Ov#j!TJWXk;|( zmlyT-&>?rQD23vfNBptCgKmz?(PYG*&w3Dj|CkABIMCB|T69v|Xx}q|LiR@%1ePUEmFI8x2PUS#%~ef$KZhYRa6ALb z$HOFw4A(V@vdcMIJqI&$oA&x?eACl8A&lz7od@G@&;l}VZCBsANj|SNf9#ZMX6H*3 zuIAz{&|6-OHqaNImwkTUCuAT(Ek_I(6!PShyb0XW^P4)?es423dfN;{y!P+%_zT*V zC#VZo$yt6L9)`^zgmLLR-%qVU7S4?lIOO`JleTrzntNN(O~H1)P^y;eez(PO-3ZxP z+H12ReVth9EE|%Esp-yRLJkEmJknH~Z-yZGK#!tLq_p7;GIOl@W-T$ z40I;wuG1c|lO@MzgqtB|kvfD4`pf3usE?YW(Zv&g| zY1f~0c^Q_(`(JnjB89BQu|%NRSpTaus7nZBxgbMj%oDnk0xfIRITmbGN`4rUr@aFflemcO4X$@2o3n}vj7M!GU0weUjPI)(8k0B} ze4istxBO2Wh}S&6Z09OP^uZ`^O~vW6U3*8_OLD=rF`Vho(|xFX%3OAL(}w1MPhSe- zJ1sF@@n#99e!vU7Z$rGTeID7DXtbf);&k1baR@&~_;84g-1Mn-J)d)A2fQl~iE+(+ zLndw=#sJ=58$N_*H-l&5By-wl_BfH|wRo!TDxcyk_AbQF*R{Cg*x~0vLH`X-j74?g z>_D%cNCBII$io<)&_9jV4=vkCJ2dBXGBSx0r!1h=CxPPr>bl{LqvN&%eI22G9%Q}N z_@jp&uwGXTAK(H7?52J^Hu*oAx+E1ZDBJC_<){}+T?d@U<=p&E>}CLUuZ%1{?AocE zcv<=zcBjOS31^3O9#|^72bo=DJ(-M>-I01#kJ4FkJaV^U7AyA{E^fYpc*W0ZJ0I_H zPje+AYq07Xbw3?Oyu&fGwwHkZ(g6hG<|zh;8|B9cVbV6e^M-R`;%&-3@Y5G{n1ulZ zu7WmB2jxiQ;3a50F(jZV%X4XK6rcuk%myz)Z1|d5fzYpPa+4Rdz@9ulbCp!-jao-+ zdOV0Xzg3+begnM-FH#k^0GE{@{ayv0zubGk1+IvQ3bg#B9x)Y8{n^$jVqbRzUmHE$ zV9@nc=jjnUZIkSrCr=>4)d#~{U99YToqIk~SNn=0l*p1&4MVWE=L7EkhjCz!2;`<} z!5>#2@!@y#zZHv=CcSUDir$7=1tLV<=S+;_X3BWi$B`%BBjz|GuQW za*y4;cw{QcLygOw7@AYTN7r>ja(w?DiZ8eFJ*?GvR{|z4qqk?nel0osmzG}O$hUM3 zeZTE#XMt702K)&PcuC}=Se&4_ph(6`Fb#UJ2YZib@d^}8_~c~jYhS)rxKEGY#$&In zcFuW;RxOBkBX(E*`Ty(!!}S%e{55bSe2y5IzPBFCE@W!3ve3L|x}gV0F0Eh|^>j-v zc&1)-B18Dj3Zz9>|G<{&9~ZmnUwo2Lg{EIozV)r?)hqGIK&eLGG8)L>&L&9l#I$~| zMYz$Jk3iJ=eRkUQoOXt^QE81GYyUJ6njJF5+urEn(|FVK`Jk%eYWumub|F2_^F$XJ zzVhO|)}(k*s;!p6yi%NDl-7Px(&c@HaqaJUy1Sz_q^<9Qjn8)x?@{AtVRYT6|6-T| zDR92G^YdXOvd6j}{ONwb(wHAKf~K2)f8N2d1wR&Z zyp0k_9&EtqF(k@vl)>%S0$DGMr#!DDAfPI%qCW6eA!*XEiLW6`IJ6VGpHeF~jB|WMI6;88KqT94_se59)AG-;qD|q3seA)e z_!866seJ=sHAg~6_3CXUGDNUz*j;PSX0#U^P)kOkgp}eCA&f`CuspF=4CNAb$R{S` z{*X8aps?y>pfEQFVP67Ob^%6)KWf*$s%h(6;w+RYFZ_br@}q{22bINFb>iq9Z=^rm zRywTOh>sQ2c2hry&hiJ?AoG^yb`@om!J)G~2}i-jvT}ZbrD?2y3RO7@a>xBJRDL37 zqC)9YqUZIR`*_Q&~d)fZzE#;)@q*sQx_%LjpOk#RLE2WRKgb@1dLwEki@pq_Q$ zBD4!3*pxK4#|-92r?WEJ*}T_-aMAh>$jTEoVx*MshX7c-7D zoVJ?2=>VU)S73s~y!+(dX4yHg6AHT9iq_mz^SotfF#Pd*bX$;{I!_4aZs4vgVev%-;um}cd(E?SQ8B~#oiFl4Wt5?KD& zwNuvp?&$~+r8NF#__1h%wc&G ztetk@m;s&~)Y5CgA?2VyYJuqZ&cjcSxS9Kcn&XFaGr$}2wN=L_{JKIL6GDnRJ*AS# z6z=p)!Tx^n#hsM5z4)mg1!reTuiD}ikflN-R2gO=0N1Tu{IN1t=G*uyTIe}vz*I>Y zsF4e1#E^K)1EJwR?cy~!F6xjiq~rZ#Ne8E@L_-e59sn=GJ*-@+)Lobe!W`RQ9pB&* zrcA+NCUtdV^80p-f?wr%3&#F(&@K0j1#2F42s(~MfS+_yosKHe*IcEn5i^(1RiFxg z9W8g0`M_K0y~Z2NY(`n+OB1dX9d26|{O#grs^);aj*H3;jEf_7C#R<#Qj9Xp5}hLk zUlbicL~%1o?JrWRb;egKVJe5Y8&08Tms8VnJ?{B&79o`NtylndZZC)br+9=6;gH@6 zXO`W~QvrOy$C4Q!{H5xh6uQ}9kM{oC9tKp`>v-LDi%95B!qgg+S(W~hUj27&JkeD@ zXN81Ar&*}`TAN_`GCzXMOuwN`Pmy{d%_}GNJ=GoE=Dm232jKAJakl6m& zbQRhJ;x4bte0}HY%Uiw1XETiXr1GT}buG7!2jET6@uW?7rhJ?~$=uFTNP(j61)4yfKT{t~&Z>D>jo!*{1mu;5;1e>0a=aERq zZUd89)s9Cd)!wfzpr^A;WUh#bKkI#yz~&k%s^Iq|tHLXNY=3d9>qYA?y1AIIlEN@8 zil{2*$}m8XBp{piO5w$KzgX&+g0Y`8UO73 zIsN^>oJ-qognpoU`!1GT4kk3(8`+0V^A6wK%SN%SY?_Yq{esAs_L}oRAM$9!l*w@ah&5(y?*ejT%yW#^Ht|7ezql_WXV5) zGrKL|Hw^C$`mYU#?n}k_aA9Vd%fTF`)SI#1=SFm#I24JWF+7)~RapWl@t!@NuR!{~6#L>=n1u;y3SAX4d0VI~MQ>u4IR5Pv z^HE|4AScg?L$tYE1n9pF=x3g4;FN;7kw_n_1$0(rLDQ^=rER@mx+a_$ttty9S})b} z1?wGIs(@?yx^B1^D-9COHLgA@d`R7DtYEAlQ|k0FGZLI7$F}lbwO(!*rv-1^tS;#h z7c^M^R`A}>C!x67uzUARclg8V786P~$ZnKuOA4{rnq`FQE~&Kmq?lO0Vcp7b5<=o3 z=Z6vG1*OSvq+mw(^QaW=Hk!Gp&tWYvEB8+IsJiW`GF8EI6$WP0q9ttz#eEqhMs`)gy0=efPMI(Cj zul`AeMn)W)!X8DIzC5T@$f zCLmJ?vkzmE)s@}Af1yKrZ=;qqv^}DNPIk(rg>vr5r zbiryHcq24I;tY^b#`U#8uu?+GxtieZ%Z}LyY#@SR6`bZ{7=n@bikF+JlfbUS?LP5W3o7PUSQ)~qj$7zqYfz$}@4X|F@XvA#^9_JP^qG;}a}yv4 z6!lugdx7aThF5$dX#ToFnZJw6-m2l4B|=a#%3X+kgw-bZ*|Q7Eu!Ir<9J?(b%GF%-e;Bp##;11+7psPN7;)}yQ?{g?WPZpouHL_t{}%r4U{fmGQ~GQ|%YK-l|IhIFhFqmANgm+}(aZx3;G_+hvF&Szi-<3xjXw zTdy5~*Q*;_WETB&*X#U-^U-1L@Z0utqT9vmK@*Zb%<@N*=$4@ z#4Y<}{_pAzfb)6R7zF<0J=(ku;eZM>An`aRW0h2ennHLF?ClAJ9XSg~fn$%6+Y0?c z!0vVxo@1;;y$jul3&(d+lwtEbp#C+EzG|E74i{~is4SzuKHje?OBj{OJ)9jWiL1$0 z>77E9em)tUDQj^>!nTvEG&4p1o|AB$-nf~|vAq3elp~c1QVX><-s46!wDWe9euOuV z#A^mavhybD%b*?u=qcuIp2QIR*u?=5c+IG`_tWmnOk^Ae=9I^2jJ3)Q5%Ms^)P-j9 z%a3b8K+0?vYJQEcir|$W%bqoUmU?CSLWYw>{nwipevi-i@JGuj@xfEwpTcA|T0Zm? zEIhW{0cmfhA8;Otjg1&c<*u^I#0l`^C!mM5gDaB<9Gs&vBhb^g(R;FypGs9|!jNE? zGyw3=2=LAD>X`{D=8))wElK2qc&3=d4W#T0WfEdaL;qNP4~^-A_I-v-rMg^km)|4! zage^Kg~3Z_tQ7+Mq`ZP2jfkireXrA=ocC6Ly@%FfI#>eD7E2p<8w{T$)KhR>G_EQ| zpoTQ)uhfU(a<*`%^d#M=TUC?^@nc`n0C9>^j%)oxz3r&8V{UQsv}rV}`@u*dfd`1C z)$4NjwKTJMuO-d|;(10Shs;80;m)6-X|Oi-GUD1~aK;lXsxRiICe_i1coGAnF2Auc z$@9pgix9pnVnIM2U&yCT>qfV5q>ue!aRp^0-fxh?#m)eV-LoYAR`|;hZR%)bD-$9U)98v$Ps~ADzs3KHqL8 zU3EcnqG1WoxdR^uEhw0xRBJSrq2_f!8I;wJ zqYWkc-tUuJOu}n7!B}F6!FEQ>aVwD*I}ybUvu3_!xDO$0S(&E)4)n|&YXy}4NY&Xt zltai2>q7E-!#Zrq8Wj1We$VjA6e^VAm_|?i@bhq_=X@OAYZiFj35A{<=>?~NE$uf% zi$d*)qn7GS$dtfsh@1fP3+GtCUD(#Ed!`b18K4SE*s}a`A!Fj9$|11~P~W~uMmUc> z7#1jdZ>WZddo$syVJEbLJ}b@3L#cXMk&{DpdOblheKAwg{|MwEQFothtF54Bd&Flk zcXWccePMAHp)v=^NmzQ<2`lTOCry#*cjX)BZj?qTmWwp{OI1-eI|^<@6|ktn$?E{K z0!#na(!k6+Biod*1*oqvo{G_)RYu*XLK>|EVY{h2cMU5fIXO5IV^ zv1c9$R$FRzUuomf#V?6V&D-|r6rqM|pI_87Slo{-Zt#Noa>ZiG4R?n~NNNFlyJF$l z{Q{Na6o~v;%2Hk9@JoOl_guh%ki8-!FaiUG9QDOnfw5PHMB8u6?FH`%2uh%iKVWpj z<16c@_TvONg^-3q&H+79h=Ng=coC~SoxneKHmNiAj-axX zYYKg4#NOD%ymsYmIrmS4i0Z!zz7b_~2SyI1=Nv70?XfgpS9S$&y_^;AY!=6KJEDPp zeZ}W9%ME)RItYg7;bYd-hpn+J{xR&}h5!|n= zIk$*hj@vHa{iQCaS2t$!(*Oe!Jt!Tc24@9yK%wE&!W{Fe8i> zv&Ig(Rr&!L4jC1kQ(gDnG?u|c>$$aZo$U8+C!CM`7h*KY-xzDC49jU^iYod!G0XQ# zP|~6NpZ^8A+vgdC#gID%G@ybJAflCUi^8J5%%=)XbD??|>l1i`WN4u}VXRe$q)+SY z@jX)-Ks_A|Kb^1|hx_T8Keb>6EtZ$9z)I648w4EvH)XgU9H*_v0E)&Bpx;I^yNMSG zzIwhz`17qe>0FQY=mW7)mc%6tF#}9Yys>xqsxv}m3}K95+g+N-Hw$=w4FtT_H|EpZ z;9|yiYeSxUt9;zBGpInUFpoX{o0nVvm9laD%-(Z}!mg0@(99MqQ}4Pa#`BfbBh;G3 zvUiTp{cy;fMVGY8vD7{aiR6EG(_GJ8=MUqPz0@03;~e-o@> zekhzd5wbq`9`+qXrPs9xh>UQNtO-?CEiA6ktO@Gl89Z~tSwyxVMch^8M6Uw)h%iOg zVAzJ7A4g*|ilqh(JGkJwr7uxZ;d&Q=6o#P|+j}~RIfjYFuNR%9Y`8YMa~O$A=&uAv zgBBj)7i3uo*a?29^vqRaeN=0@hM5M8p3NU!xYC$|0osgbU$2l;6;e5k((kFNC8ZYi z^|_(+Gd}*Ii(Mk%)g!%LV;TEGKOXR!??>=O-SR}B_#zF=Z>Xy+VtSHK@)P1Nyqc4n`PN|+pW&=VK#o18bJT_q>jBkhC&pi{=WXT zfuP>ahsD^=_em!96hlUa{ugf)yvTu2FaoGM4v72G81e&32%qmkH2l6X*n2R+DeH|^u9j?ch zcF+@)XmA)WI&I6eEKoD1wM3#F3xX&A&V>!gH>xI|*S>fSv`meATwHqjr- zqHw}f&A>^Xtc^f*bZ_hZR}X2~S43S&D2=WozAOI)n31j` z&gF{yO{rEvn_gqz0E+tFJ*eQ5c|^1=jHj1M|8$TW>O2M9RckNa=~^I0t$Nc25FKd8 zI3Xn8ou*=&Xu4TApg0Z<9R+ZisY1VKil^9%E@|5MRB=A+h99sy1J|;qbiM88FwTVK z@^+FEwHHj@=9;bU!1f*3(C92A`G*wcUPH{0`%Q&_780!DBDrqLf?DZJ=Hzw4tO#z_SOk~Z<w;4#zA!}0sWOU#)O-+ymp0rdA@cR zFUzf@K593VAbceuiNlO3?*-Kn2v%SpDZK`_C*N*rf&&JuzV!K=lE@CxUw+z~xFg^6 z!xTy*@wvl$lKoK*sMAQdb2G2y1=+PC4Bd{?j1*Z2QTU(N*Rk3HLfrbEM0`Ie*I(3S z+|6&0h>Q?v0?#9S7iNi%7nYglYpzzIt{p(`<Hmd^-6dkWc$le`BYl{_Y+gLoV>}`B1$nRMx7oy

    +o)7D@P;y~l7qG-nhj&k};xUm-t+@QRGZ`Z}2xLbwL`QOG$MT{AIwyJj zw#^@Wa#;vrq;a}!m43SFIzmM_Z4_O=Rm&)JN#qOUnYH$Io0fxQQyk8gxw<&@>$Mgj ztF2-*P9yv(BwG1R2uFJ^Z87KO`W=Ai`s1++V5M&_2j!vYFO`Svb%1H@deN}N{)|11 z>_@I~ilC77U)Vr7bl6cd(k14U!|MRm%{u1P&zg+tFV8we0=TSSgtI|*2PSTBNm$gW zcMx-}m!#zNO?W<(sRORHWB-o~DRjVxb<@UTec*I%5HH!gFq9^udjWr4zQiNiqqopX z-h}Jb=El5wK97PkUHMsmh(&Y8bDE-R%QnLJgQ z>W}racWLa8O%P4+WCI{`fV2JJMM)eS_OY$Mc5dWC=qS0R^viSM_aEn6<--rt=xUCX zjMn{RmKV{N3YQI>(ntVQP1~2Ax$98h&!L~`tt>wWv|tlzP=5bT5}KawC#^2G=TiK7 zLxLYCjkBA^6o3_&4c2nAuGeC46A{4=_j!H=VgLarZ*^UaZ*?0b9{VTx*DJRBuVyVT zB+*jOvjKh>cj+h;uKSp%hKEQ&rJtdlWP4)Z;0cmYPAfb214!)LsKng@QnT+y<(k=d z7iJ*87ZR*lW0e^C;)n*R*m1hC=~}Z})L7zTo?MDk$Cw~8f^3B5`1&2Tz^w}j3`5!- zc^YvxMfn*OHMQ#w1nIaxc$!z?T^X{_L!>up($0l~Hj9j#=cB7rF0*>A~o z6t+js7!t${C=UO21{c4N7ymxH2U_Z$P~wUZ=YN7*23En4gRq6Bt6o~7%^%I++m`__ zv)Ex?yePW|%!i$c8yiqIX(2ellybpyLy%TN&_r+LRh*&m;<^@`7pEO*Asihi(RPm; zMSbu7u$Q52SFHq>AEW9cg2-sYubTvwuC8=O(@@qr_eJy_w_#xW88)jMgk6u`SB{sF zU?(m(_0W=4Qrb(lYpR6$kpYpk>pv<2Q*_+Gd7q}6hFNWGAuuk#n}?E~g2S?gfkl6H zbJb$hzYg3cgXCw1Rodd$@i?I}?heXHz}ntX%k_*Rh0tIoLA&(U$4R^qQ`nAV8Ww@_ zc(pqzOhMinY5g}H`xlll)K&;-b{cukW47ld86?kuqjLka;O7b8!vZL*!{F63xVvI| z2DYn_s1CKP44$`}eq};WA}Uxn-;+4WzF^;fIf}XYG{}L^8s1LcaV3MD3uYewm~Q#z z@pqfz6%GqZ4tg+@6moPZsN{26#=2Rq@bvk;a#PHp9)-o|pcj$RFSJwa448|9;2D3s zT?d3;DPfw0YyWj*k_~p8qP(Ah!(+6gIT$;Bz*Btr8#yr0C(4f~Op9Td{s@%I_-@u_ z5We;mjgEx^w*|SS#3TPLrd)ko?@x>MVn$W5N}LCirSHN|d{MvbY% z)>9L;ASRPvU>LdE4g>A=i}!_NqFp@~nc@3{HS!jenSi;@iP7jBNH+TJnR`7I(S20> z7X)5d2j-LYxZ&uHx88g5pYh2SDjM)2xVct%Gl@bGOno5MjbkHQAJz&ts4B%noddkj znD|ii-W`G0J4{V&0w`xaQJf9;2Zn@h$HIPIbn3Pqv#?hBvg>c7GCV|5lwnV7<+NXd z^FsGv2*A^*seY#Hb?+EQg2hq7s6{8B?czu=1G=W3<(_?XUj`9ZH?)-||e#K9@;k6nEg z6KeyN$`^AX-rJMl&UJ*cNq#bsm2KT&iR%+MV8sHI{|cpFFh2Nu2je z3Z2847o!9wKNoFqxI3ONcW$&`BaosAk+Qw^^F+2$$#@^BGU|7;VwF%-K7+vd0vLgR zU1+>1WKNhhA}ql|LRn>CJg%2Wr`-HR+oSYVP$Z0P=d8F988)|PRyev&@s3}vOsyz> zNT&5(ZuoR~HQf78U#_?awoN$=|8T_j{=fi`UQsm#PT6mmAvn3z)*yEW%gc<3Ei5%! zYj^MnPF)7WV!L;I%V}(ZNiX&O>T3KzhTD@c>-We4U+z2&?>xaXDecVQYwgKd7ZgOz z;~b3?A|o_KY^ypB_sis@QH6bjjFgmF z$5*pVB=uo7F#i@n(6xK%!Qoye{e%TS50R-vIH9ckPDSddb@L*WW<4X=NYtt3aXs@s z!f^~?P%fE;1^bxEwpYwRG5P+Oll34`N?TTi8Y(iJli`5mkO<~$Lltf0WR2SQnYK5^ z+~kAz)r#mphhe!G@9jPrh12XJfpU`Trlu*ZVm#)k(ai+T;2ZAq{{0?(AZcA;)y6#Q3Ti~v1Jx%>~XG5LdOJfOf3)$w@?%}1Uj(iIdbn%#zil)+YuBwg(c5OYUUhbCOwKW~+iuEUBmCt3 z2J8%h?Rd>7q0jgWhj2?~^4LUaAj0KP2|?ZhH(3PXP-1E7*Al+rp9S_GDkc9t?5N;f z2U9;ejt3K9ehux8@T4b;5y$i6)y1C}L1?SEF3lr1B#yeEZ9ov_J3%W@6`3sdNgEOT zDz{sg@XgBdGBF9i_tX*+-aa=LPdkP(&Lz!t08~4Z9cuOo*lk{u}eL7`3Ff#^?3?ef_ zL0fxxrJ<+HgWCmUXK}SKrj2{5*Iv+)C8W z#Gr2Gb1K=`syBE)<4AzQTvwpV=Xq-jJVPB9$TD+g&aRR?SC;v^CCUekbnlONibWo= zUprP&8~BEbJ9PJbY`W0=pr4{r&Ea)mF>E-~PExlazScOAl6eyT!VJncbIl zi@>TSQF{auqf?x9pB?QPX+g<9I>s{;T3=A!(0PQ;P7!}*E|}aHck4L*O;yq)@8Vl6 z2a;K5eXY|3aCzn9gocf2BH{{3b!#0=qtwlFAmX^QYwAPh{QJEwk{3-) zjM!hhJ19rPB=IYOOCIcXUwf}CqFc9%5%k=)2oyC)Tmy6czDX+fX0t5KV5piR_OW+- zxt^XdMD4*QH)w*#Y~22$ku_TFyvDu^Vj-?ub=%VSRL5-x{lC&e1Di$;pC_s<>0+Py z?_!A7+H{LT{mi!Xb*^E3*1X+^Vt|tPuFx(T$PxYIv&MH6f0Mj=@Kjescy6;w!1e#r z@1T>LKTO#Auvu+&ZV>2r=Iyov-&*BKF57|ftjmq6ao4@V<6|DC9thsIa2;CpzUCa~ z4FS_J^LZW2Rtxj&mNX5{OIYgPdA?Q+YlJVvn;0NNzMJT7K3M2acUCLe0k%$726zvk zCHsEPXK)Xd)OXZ!GJIb+6AFV6bp4|r_(*xGp%GKzEa)pxwnz$flrtU9oWBbf~FO2WP&4d+|+o1(7+n+;P9TT4il0{OUuNDGS=w0 zG~(_WrB2fJnlHPZ-SB4}2OYA)mTLF69q=-D5|16G7eaKZ7>YK{Hb$YycgV1JQRLsS z!2vA@ZT>}KRCw6@fK&1LCjm96+TZdb243@?dh>qo+v&J)Vyjh%g~W z@<3q5@ON@%KD-+CFl!HS(n1$6ArZ_!f$jf8+fhYPkBSA}PkxZxal?3V(+q9~rBtZV zZ+?C}_ARLEf1ySY78*gxNm;d;i>a+nRPXua0KcXp?7mQ|dI+kTWvf>?W zvza|W={;+riLsmJee+ak1U8bqRQh*27{AQ>B7QYca>>fQ7hcR#)ty?o{qVNgk5`Av zqn}uhES63Rvf_MjW~^(lhEPFrZa`iQ&2T!p*=n2F7c<9@CZAR}r@Tri2*YmF&zJ|Dd}ot(^1D@A;a%*8uAKPmd}a7M#q zGMl6q=N+wa#{Wgij*$B+yIj}pCBFDPbT?%%qXww`lEBf1rrQT#)%ED4U$Q?o(F4T6yNrs^9!&Q#07^OTO9P#yEH?;R=@|J>3 zMHt|RzzV!i{wxEv?N#+0h}wazAlDS?YI4OJd@X)73d)bC2sI5cF@)7B;NhUcj-sRp z%4PVrocAjC2}V@tdM%zoCnl#|GV_4okB&#Z5NvJN`QA^*#Y!y+fE{ zKlzJWI#RAP?4jHg*bqNC!fdGRk28-5)GL^9;h#r-55*S=lP?bGAWt{$R4S=+IhQoak22b$c3k({vM-y3|QTBp?4#eDR zDo6_b3CC1j$(i0a@tbtd+TeG5P;w^h)#0e=PafaD zfV}rj4`K^T zP#>zW?W0Z{?_HEOm|``6Ubj@!y~N8l^Spv%aryrGD*Z zG!@epVx+*y(hK7~EFLDyOI?s!;Ll~YwvE3=|DrWva9nV}H!$nK5q-7Z8KcNwfh{9m zQtDW^%LFQ=XE9adYi{dL0I?=4D*0U;WxmU8vU~pTUBX+UB9z62H@Zg295d|MZ8zQH z=$e;xGo(kPff4}%{FzaIbztfpQ4y|zM`sPc|+m+H;OTYiSxX!zaB74i-MF6l^ z&t5S0BfV2E8W712_(`-RB0rn;E;Ve&M@XP$l#C>6j#4q$PkIOKXuk|s57CMTJDDS_ zHC>TbU9B}OacypYeM0) zza6A>Cx0_jFtPY#w^;|{xY+z+61Vi?QVC1!<|lh(nbI?S+#E$3AE6lcXL+FQUyNi| zG+_B;0cYL=6cp4)m7)V-2JmitS*tdL)N!2nQN60T3rz(;Mg_j%w3(}DATr5^gP9|c z$3600xuaxyUbe`!jp@&zsCgf+W@8z6wT@lcy$PbMsTWkz>v6=o*^T5>W z6Eizm;<)IHAE$VM+Js*nylC2jDK*I6`+f~(Vp`DW4?6d!k(*ik%Lm#FZ zC6}fOP%0u}EyHRzj~xD9Y?qwOczD*P7mU>MLyV7-8GWfqf_d*M1WMp%^PaH?~kZP!MvK)|wg`|CrE59Q-BK+{yZz4dE{pUQIPCOdoR9TEm#< z6$lFCm}I);JRLC0-tv6Em)~GueDGf6{VC(panQL9j>bzK0Px4XM2zg?Zz2|s+3a$? zdK@_;M>Vd`il(k7f{U#>Zin0s5CPyv5gwXvb%gR2l8)u!~DN%;0BN2)G3p7Yz zd{Wvy^QR3Skyx0dCcYN23hq}S>1m0=(#?qne|i~wC%@ghs_mv+dtA!u2Y*yYM!h-H zjl_LqR*EhRM_%npB?Cfk&8-8dyg>(70TAnd-ZUu@#BC&a+_5`#*+sr3Vf%q=MYSq< z{*jrFICts=5BcYosL|=d8#Td-bkmV(d$GI8;hd4gi=LipdisDk0+9FUy zZDouK12%P*L&3oFy|R-5t93!ORI3Xscy{(cihoiKcK%%ju_tvQ$({5roEXd15xdS; zIqDcA?zav;@`S6+2!D*D#ovEsZ^UFNIqF!9V9jA%7S0Z$#=q{Ml9P;wB%}!5bpuT< z+kOgasEfZ!mq0u>Q&6KbPzm+Gd|gX%{bX?`hxPl;k?_c&fFqq}Y*v(7vcMmL4X}db zj?q$!&M_NlmGT~I{^xZ4at@RO{LI;8Jlv+MfHX)rOMsr;!Tlb+I}S%SFPDi=RA^74 z%+?r5L$@PIs=aE?R&OAT&-OA(O3()>Q3yIrz5fhez)jC>A4juabi+a*OWxMzTTvuF zz#*gN72x#gaCJHLTm3*s;pf+Jr6YyF9mH+4dvB1KCS*5G7`a|sxo&vMUj@~l>2cjr z0fUnKH4Sdl{jqK9;)~bce=ScM6W1qluMZdW*vF@@5&b5hqhdsHaP}qF;DDoRrRofh zXuBOaDO1#%K4G1T~yHK1{0=y|9vxsM2z=`i60OP-U~ zJDJ5Za_0FkePV=K`|;{HDBM)QPKEnIQal26mXb4#5F_Hsz)T{7oiIKAizLm}-FDJ= z8Id~~z?EWb^HJiJSb&gM+>dXzuD;j{8<_splKJf;Oaxx_otA!2rKoEJH2qoJ}C0Ar|(0Q zdQRKgcm^U7XMH-NrGWoO)H?;%*>zpRv2EM7oiw&>G>seEYHVl6X&T$M)3C8^JNb9- zKJWKm2m53nTv&6>H8IARI&G?L6z5@E1hD(Jw-1kLDrfStlZ8`e$D(yF)$A61#Gdiu zp#`$VZo7QEe&B=_S%vsocy13D)3BT-k2%qj^koHBk-Y*-efNOSreEn!Sc-N=rbBjS zD3lmpUppTakJ5Yd2E&Dv;gQrk4>(O5vY!iua*69Top}rsWw1%gB$b1A2b){>Up!O( z3!4|YCyP_KPiIPx`LOR#AT5gw;R z)ARPrx;ur$ZsB-v)uElyOUkNt)%D1R*0<*#U-R@`Nc2U>ql^s`MljK0qRu|1w~FDq z%VPxu)<_OyfMster9!h%-=Q4QXT~mBb_t&l=KPp-qL_ti9(xNNkE`okzW~AL;5s?% z1>m`(=J@v>t`<;8bvN#_DV7p z?ZyFUgq2-K0g$>QiK(+^^YQQ!Ukpdh*3#TVtC#1;a3MG|!@cS6y)jI0>_z{rWK#Vxk4- zaGFxMtM7Ox%udH>c@4Xk!C&4Zie$0fyk3V&vF{UJg&uUst)F}};7F@&u7D!$CcDTq zUL#>YA0IO|;6hXje`mff)1zft^H0DHVg^DuY8{YKX><(zEp}&$64x~`og1{IcJDS* zB{f+n3W^$exE~=MhjYm8%VcTUG87JT^_)xs$XC7SQ2U{6U@Q68G)L5Cjj(yx^Z%-@0g`ZH)2K!~PXp9K+Y4rp6cQuy*Es_u> z3Kv39(cNF=RY2ISOJrjWc*7C+e3X6xk;E!8tVhb7Z(BVK1NM@`X^>;+1;G-;Np~p4JrWx&4`!Ta=YCc~-kOxl> zn1}#76(urbT>vDg)a==5mYeO#2FGzPC@4&q_Ztp55*$^9SzB*2w}Yd%vRDS@jG5O_eZsHq4&rcNn&3A(WMejK z8U!50&%k_r>;>hA01N+ga1vRlfi2;SXc~sWb9r5K)e=mZ!8zs8{qxTHYr%Gl4BxL50F0r0fkfQ?>ddQOebQ|Yr z6AYD^rmRbAJMW)&Kx(}I@gTS)>y#8TES92nK`fy-IuJmxJy0HO0|#lVj%MfuS+NW( zy0tw=h5ku+O5#b^H0(ZiV*}BJp!V4-%TB7rq>toT#;(s}9a zj}GCx`M$*Q{@k?ckY(sioMCuI#PETIjTH?7^%>h&k2A^vgOuW}!xBSLKDwL8H--F39AZ2#m{UBW}8!$*kt zU%Nls7_!?*VSvOS3<2BWh+0ao0dZl8mlr1O!mDjw9a;gNG@-U;XTD#Tu+znvSNcH= zwIuUUVCM@_jEt;d7Q?E4gFwNUdb|5@E*K)$ZJT55Y9=y|iVJZ%xO4?LI-5Bp$dCG(-0WC%d#k(0t9_e z00uvS6`sGBEyu?)04TvKym<-8IqgzqnRq3;XF48-53aMU(@s^AwK~z5GMF|`?p~UW zs+CMolTyKhg+FZmGA_A<&0{siIXPL`jI%7+-y=4hLZONz!@}yx=YPQ4MB8qyYbcQI z^MlvXm`f-QYi3LcWmXa-T?KkvR7+vPka#QzLAJIO_d;g;jcpVo50+qF) z64xoDAmk3Ve%72!*HA7y8(La8I5zUS1idYHgqatcdp~3EYZ<8EzkvA^`=;&#gn z$RqpsjZ59zosPHsuOra9iEedim5d)22$RZZE5N^;l@I*Yo)D$Fgu;THt?IO(ZDFfL8Fkit)c z%Z}8J$5Ew=>oh~zgtW3ss$L-H!?S;sV}On zY(sh@h-q*ti@==5MZv$V>%SDN0Qm+UnbejkuTbCnype@!ZwX(O)a|K}H22fD&74?* za9(Z=JGM8>YOfTp2O9AMLk)zhT!;hTn;wDThB81kK9DW)M0$X>eFEtJ3_tr%; z%uEgKBH=Ywx(~kKuML&u!>7k1Pg;i}1iQ`$tkkyD&OtC3MKV+G%d#tbX6fq!10z}s zf;NIKC`?os=#d#Jx^c`d(w+Nz3S;aeF_YjBPM4=AS#!(ZUykzpa#-HZes2O+gv4y3 z69&R!^^`c9jc52B5JJ<0s~$x=&cXf+`(>CXx~hFvJQdD7S$%Hk#P~nFu`5~!{c9%C zeZS7?6MjVoE=tF{e^B$g|J%p1>*RsDC-R76;C5#X%(r3J!DOICZ}MqS5f8CeBblo+>Gy3IcGJev*n zNFR@kSzEWCTT)wZF{LgPIB(-XFRQ1h1O3ko%TS>1m$Q_{32V%pHwAQki0Cv}*OJFa82s(y*2cTwHC zx}!cN-~*8=xRmfc{W>@aKGG-+e>$&$idS}HjBeEfDD7|Sz<_jeD#-Ue|6gICaVOKJ z3fDjiH84lq{q{WA!?H9rcqK)5rUi&Dt2>o|5RNlgOhf@~EI^Kq%znUbM@@qZ!t&i6 z!ha18p*<7v-CMzpPT_tyBj|G26gphFz;}NfbKUf{-{RoH8(gvx3;bNdZmNcA*=Kn2 zQGLLZ0Cg~w-bz@4tATl^r}uQp@C7ArdntO1N9|(aHki0S`o0oH!occJvHVBC0{y^o zScOi4BGNZIg4Dop2(lQ(WTSk-*~!&}YG zlm9wvU*MW-g<$=BzZtJmU8FwWUj_OIol1Ltd%?W)+dD#) z4gHRzCTURe%r}367!dAp^U+~(FLA)@Zbx>K9;2fIau`xm>nEjuN6|U~Si5OkNa8~}2xg2B` z!oEg9@HV05nTPV@Pt|5eVT z5w9yU2eps~ZrP}%b;Ja0#HTf$@53-&xM;*0lLBMW=|bnUdjT~AUj$ZszC1$CA6 zfg~C!OXtR)!>B?vv0?MpQ{ONR6uPd7RW5K{;TGMU&3Qc#Hbp++qe>68_zXdM?8#S! z+q>Yoyo+z9?HyYpdX6?Xbb<7jzn3)-VGOw_iD3_9ED1f0VfPS@2)BPcp^kicwJmf( z!g%DwLQDQ7>SV^lep;A|)40;_Exo3zzVSO#8rtT&;<4n-bW_|_qmzl8aYX1B*&gFj zUrRCx{kVx-Xnoca`zZ3SF%$z&R`}eu5jB=hD3s)v&GQu$Zv7T_#fb*hU%9C)SxP?e zWmmKUSw*6h3`jWYS1EO4P5OmtiQ#jxc4F`px)A3zl%1`-CbapifSCPYwfwT|*_A@M z$(4_REXZ09I301#I&(K6DDIC=;_$Rdz>h8gW5m3wq%N~dvbC2z(tnvJaKzR3kA({b z)B7`%R47j0p^kTU_@aD2 zxThxoeNjnf2rk#L zw@OcaP8YFz2eFMf_MLUajUb+WfCNPuem6;*t<1BV`wrjgruZrGLdZX{4s8(-_v8&! z;K$F9U}=sY$402NS;DMw&BCX+>EWpE74~muw~J^Xi(B7--f@j1X?S`5TZM+G@}s7l zx5<@#wD7n8!@12-6KMKt2Q$HP%gzt_Og5PH2|pn@uN`_Mz~|ecw>8}QE>Jk#zRTQX z4$Tvi5!EB}hBM-{sy()&%W9gajtJ8Kgpv&~MKyMDq&0Ivw1(Y5e`DyjY$5CLa6DD# zJAlomE67*n>qv~ww(>4_veUfomZjDtiJW~<7+>HJ`QfyjJoP{;NC(q(Jg3Hck$r=0 zM`nxWO{lwv{_f>7cR$S#%?^K{U=v;BIq#)He}!x4@sINKlq^r6AV-o9 zd1ON{HX085A;Y{qPk8HM!udG<)+Jm5WA4&i9`A<8!SO3AQV)io_zTHxF2&xd!u|v8 zA|FK(%eU^xp92~9dR#2sNl_=^4=Ss4#4qj4K+%VFg?mtwfGMlh+1Hp(xvLCnK;VDwQTRVhtvJ-%{j#( z*26#SiOV1u8J$~>vf`Bdsg?g0^i@#%%Ka^Y{z?ged_#$M|JIz#{0iU$OZ(h-%rwGo z2u&y&a33=LrIBn#gX7kjX7y(ob281_LtIERu~~eBL{^6&TZZD?OyDJxcIqP?);aK^r7`F2Z%9rHig;R+NX|;Iuvz zrl9rtAZygS+H=w-5v<^U>b9EPMOC{C&OosopO>nyYMx3Ew8OuC*}yh!%2c_JNBze& zzF5C>yNNVD2l!pLDz~Z9*lW#kNK-6(%2&QTo zV%(;l97F*atCK0!sy&Bg!Fz9J@Y1$~%Lu5=;j>|#>#4(GyiF8F;>?G|a$`BqnW}!v zrjE&)@7QSlBbN6W5X_-%UhYE!Lb`j>HT+bMvgrN)* zUw)}j_}C1ZHSX0{=)CT#A0y}mHq2NE`5Iu6?^&Kz#p4pLaQ=GNLM5s1wHL`rN-qkT zfd&YcIm`Mphc1cRAdX*K`9)UIq7&1Om<#c<0`Q`b zouO>k>Q;`S8>BvWQYXi!FgHmP+gX0cJ`xImbvq7O13~Jiu4o6c-^U1SK0a<$Kde~( zTNXv12qpUWDPdnBTRvZdLp4WEwK6RKBW8b?&u0gufb#Se-S0#^_z&_*3e)?6eEGS@ z+WzzV6Kt~i5{#5r6zPZyh<02^PK#D;&sqYq(>h1S0}kD61{mO32_d$^*X~bOCRc1wc{y_+F4&LekL$PQF=2nKuigD0-M8n} zlRh$jgBpsUz`V{_4)AWkm0x#Jbb0gFq@Ck;47(+v8GGdg^NB?i*F!oV7K@MzR}u-)xxJj1O^~ z*+qrA^=mfZQ9Yyi^QV3^rH^GFIgjHnxJL@H)OX?Y?hiWecDC-PyoUO_?OI>;B`uX# zE&I_K`eW*3=ZyW&yb6ecIUC@eX9B>tWSEx?+2K3n^TbRP$`9nDXIn7>Y6}ym2T(J| z=I(;GWu-C$+w$0>@-LvsyXw7|lZBh_|Ir8(VA}IV4tiNkl$EES1;u2J(C_DoN^{;) zNN^07j-V?n${9m{qS{d0RYEI7z*))P>QWIj%QctPjyoZ`2OZ=Bejc2dEFKfz_#hPXhea7KAyD z)^0DIUu=v9j!VGl@)#!keSF#d>E|&Tirqj>t~JC{q<|lDkbwFg5ra&eanT_Y8!Kmw z<(pIthl28R(`c_;otP219;S8Z@$~ujOQQ~n37tdO$C5~W)*9%_uWEwstu3$G^G}!{ zCxJ;g3-E}^ic1t<LuEwo@C(4c5-7PANz131rzN8qwf=Xi6$nUZ{U=4oQ9^9=SHJ*s*;>=JO1#z63jElZj+On^I26C^60@V5ZTkY! znc7Q87BGbq()Y#7yfH~~UV3?q{TPWz*|$m3D3b=OrOrI`C6~-4v>r%x88v?Rp?-H@ zw#Zued>90c>pV|vf%0WqjV~&V+Np{XvCHc?ApjMVAc+||7y7U{R}jws>By9y*NG%} zuq`ciySdpeOyTt4U;n#r2$GqvlC$dk5a#;Lb8@%~-twwG1%*^fcrW*GS(`;2hN^n2 zeMsTZJ>Z2E$FOsXOH`ob%a&Ur0$g<4n7}Ywjvf2*BYb~p7o|Bf)F&T&28U636YkTR z@>4nQcV>`9C9Yl~#z;(4n?C#W_}b84iF#>dbrNR4mg7|8WEMBK==2RU#C7WxkirGj zYWu&_2;0^H3L;iZU5Y81kl&4>*#CS#Eejh?Q*xy3zEtt|i2-~d{Udu*0GcmaGHB4G zQ;8}=x3g9K`pFkT2V-si#9MRBk9RPel0a+t)(;doBHgVKBb z=XEV*04zsNe3C&L_xMqFr(M^J)qf2LX^sz_4qgptdwQO^!%>^he)m=Hc=$e^BvTc+u3|4F3**4mbdl(E~cMzNz zFD)oXnfm>6_66^!1I$40*z49+9mE){R}OHxYXU-&Uc%J(uvpq4vq#D%D9vLz@_a^X zj{`g_=U&^JCw7y0dC|sS@UbU;5&GgMbm`nP({c^|9@o%>?2;R}_`6qiuaI7ek;Twv zZiu)e2Rd~Xx$@i}Th<1u<4)U?Srl0QO+OyHpKA;2H=K z_V%_Dbjr8oVZ|nke}uUL7dRwq)lhwF-(ddYL_Hxa@eq`_qhkTo+1DHkp0L z8{yju+n;Y^@+!;Y5Ah7~`GGTX6LZ&7wj9VM9H1n*$}1Nm@@`Y*b;ZId8sAoApU3dgQp&dyqTM$e#6HEh(|yYCv1L5eySgQZ zqy71l+-CcOz6Z`qbg%~Y8>Oz{8jVizd1k2<-wvKe%Qjh-GES;OZ38Jhcf*l05N%RD z^E#qGxMqD6rkTwq5TlfxC8Bs0BE;8Z#fs`PJ?$y^rsUik$nMUr=L~k$tL02b+H4=b zlL$de<6^E`w%a)>N^VQ(Ip!HJETMEcdA6%BKE%wcfHgi1r~_~j+<&7QIZ#2`GuJMQ zwY<~6dVWoDvi1bKd?SwIeott9Xco$#@_3KSMLGmHvHhcJNWZ-Z3&A(#dM5fY?87|Ah&u^PmiSc%k8t?DL+>XV`p#+pSl_r3_z*`>BF}7lo28c z=1SS(x4KS@3OutkuxrJPmuTs)GX$mc^+)lPphKUYs_gfR4<1s}!KhA#V(Lrek4^S+ z!oq;ko(6rXITJs*@W3HEdJY0|%vSB&5&zG7&}mZBbpF=l)hew_jH^7%Mo&?M5C%$p zuQtk!rKdvCE^)zD!YeaEMK19kVQa8=%4H0xAAf{Y&LnQlLrStJILgnlnI6;9FPsJV z@ez4o5r)m{)FJR9MBE3s^VL8@5MI z&WWhWB{}5QY<+;106KNy~U>-#M+Yud+PE#p7Tu6ysN=CUi6A^n_+dAP#&XXFhlzxyZ6I37Kr-q6IGk+37qhtIZ7a8tdWr~Ah$^NPMO zkRu1YevA0%9vkKOmv~vSSTYwm-%F$SPRoU-{(iriZk1dxAYGS*-O^@!N^29>T@a~i z!VXzVy@`^a#eu7KTVIu`F$reW3>HC6E>uSmw3N}wup`7=YVVltK{_~OEdtSRbeF(4 zhnV&3u@MSkPObQUiWaa8Mwv?Zc)kj~r0<9DZku1zU2lnU#*Z=WlUd2Lf+&A}xL!V`J1eyb!GqxI zH+{00A_mbpjz9oVz2vuh8-nH0$IhBZX~ddh5Qlt;Y<@pfpdyqt|Gr_HX5PEy0A~Ul z{=;1?aE~*(6rfaC1c@NN++Bn5ADX#LG=RKDb3m1zg;39`KGz;Did$V`Z zD9RB-?*3h_bhkY|T^Rf~hqB7>zRe@UfXhleL;ZE4vunjLe4g0;nUD>I`>;8KugiV| zd5RLwq<^a!y{)eBQqgWpC!_cKBe6Hu$NLB6fAOHlg;@z@4h#9#YVX_ zC>CgKl`}TncDW8y#4Vqof7%_08B|}+qUk6A4d+R4u&d96$(0QKBrl6BG<=@9FSWlM zC%VRbuUy`0G?U@`5!Gyrv8O&jX`ag{GPX)#}JGUwEe2-8Z+ujA5PIvjgg8m^# zvj4-x{W|7(q4iYyL(=*SP^xwF$@UbWaE*yMV`7~fExCPFGcXCN+8_mHdtxhol;8CEH=Dx(B(g#biUbRq6$O?7Pu%4UUUyrl_ zRRx-kOcpwpK=Pz_yc2M~8Bb&i$yLi{fu#>^lb9mylS1Z3)`p{{(z@DiR8_T~|Jbh@ zEc0PRwZ-)pwkDW!rw!uYa==u0!2;Eg;rlM#gcC&5(D{|KL{Y>zpR| zS1dZD5_;iw*RKYXNGs$e1lu}Sw?=9x%p{$8(FL#6*NpCGF>{~WA#Jd&8we| zSz8i$6b*`%)*|EyynI^?3RYZ#bT3%JWu9WSCyR5W1GWO@hzM(0gxkY5 z*R5TLr!^rg!)rzc1qW}~*f~VY0khnrR3*{5KP!DNzLKVTKn|4;0zXYTV0_2+azlAn z?q_IU14cC^=87un2~+S=7f^~6HeWBOCu#AcTi)?x+#2f!kmCx~VRZsXp~zJDC6U<5 zZ;#6FZ(`13oqWK z9SP(IXfJU>XJ8pi#l0}gzMb^|=$rZt+Jf4@E zSBN(xg&N$Gw=EqwP{0UbljlS3m{x>^VLL>t;|~+&j!M8>f;%0TNTM}LU<|`kLK1|s z#PG*L_l{p#a%_9b#8q94w!|N@<@jDf9ct)$6;r%}Gt)b#OAP%(+D6kTKgQ%y_J+J) zHrl=ILkXyCUd>GSZFY-rzLoS*U5D>G0Z`-nzXICz+Th2a83_PB26W=yS)AZX#``9} z+oyrEDy!(v7A*P6a@dG5z5wQOoF5x`z2Et+h$cViJ$%1wfnonwhA*4LL(1j634K*^ zD{ZFaF!o0}>}rza0h1CN0F2KtRJHJlmtDn+y)Mo|A?n}!P(xwW1-645@-8=uAgw9vm7cqz2%kwqWYv$a;(CrD9)4s)%FE3#5WC)FsiWqsL zSk?LTf=-{eX0=FJI9B@`YXasQL4o}+w&UT7zt;`!6HwMb66rnfEB40V@dx>Mjf+o8 zqu$@5%b@)47c0F@+uNT$oH&F1 z#G{RU8pqx6C@tl}EJ~X2ipkvdTJ|h(emyVh?oJ)?7*|ufKrL79eOy~vq+mazIgGyrX`lfuP zSYYLtBUo(Rsf(V%Au3+;&RMpwkLS9m?~&)T0(204Tmm-0vJMXPq2`>gJ&TbAU*r)3 z{`0oV0G*XO&(5}?`4fg7tB=#9tB2_e$VNh!IML{Yf|lECd6`)h&sGfvE7#nDis~=d zdpgZG(kna2`6(bo0=1BI9qDMGu{vg!8HAAY&d=aaq_s}WmvizFh zUfTPyueMf%#)j)?LJ^z#d8&_Zv3mr(f#Xa^N`tk>Q`<}1_ zgJZ}=LT0!p-FF^F0O7r4=CpJ568?uNzBJA-ZHBG-25IE&O56GQlR!KNl?KExm?v6T zo``PNk!O!L|BpTpfQ`JLHy-^WHQLQ1Oy(+e|E=dK;Qg%Cs=vh5*)ox7d6@YBTC-S{ z{%-Ku?C+Q}O6iN9&&!_=7#+Lyuk(T@v>0OT^&Iu4fH@k&Qu|K~}H_!Weia@`G(e>w;gMpD7O$d@VWreu}f{SF4}TG-7JS5iM>t?FW`^`us%w3KE^mA3P$2+Ja@jtPnQkXR200`wd%c-21B zf=z^f!q@Pj{MK|^v*T0oW~H|U?7Uc&1x@A|YE?Wt5}Ph^dY>GjCqAbxtFE;E-zMK_ zMH=fX5UW$5v`GgY=sbvEksKX&X@jd1@jnNn$=-6fV7z5J_o*a34 zrn!fok`*KGN8vt<{tp`}y>GvKL;T%Zucr-x^9fBe|1V7_yq{*`h>M3ebn$Xl7*Y|e zbF6^%Gvw<)c&s3V5C`48mwmNTVjN zQuUj%g{f4T4(A^hpF4CD;We2YWkHx7=WqRB@C+kgo-v1g2HV?_w_A)UVuJA!*>hE# zx?T;{dHdNL30`hWOIbs;a@!RwwNz!r8spvd z$>4LmI^84uF^b6If6{i4aieGSN4V23Ub#o?Fyn|Qh4-|Zmn-&#C3H+)u=%A9{_GzpJcpC2hL5R#cL$F9OVo3&pueR|4d%D44Te|B;O zz@-dn0sNcG6oz_pEauPh2g{4vMCgj2TkrpG*TW%<`Sl#E=q}LvE_yjo0eID67)Dfc ziz}%A#LDp@+Lc=9BBL%3HOLL+*)5U5Q_8mxZGQHlvFy-Dhe_)ebg5diOxJRwI_2(f z26s(XWFws8j8+t_wQ&v!6MZB=%)O+@WUB;S`SleK8Qf(v1e_G@Jt-vu=ZXGYdn6X% zyPwWQ5Oz8loqSG9Lju;F;Qwa@qC2^l#F;Nv$bG^e{H4G@&aojr-m!@Ty+4Q9J+Yg)qbC&YrR!x+bHd9MkTVZRk!^iDvrcf+3|B zQbRPLK0c%x*c(cyO91R|YdhoiahFMPN4EaJ0Kgh?^iDAFtRGmfMNlVX|6!*ZpiceR z74{%qd$~h>dfJ8lUjl}lRWfv6{kdCj{9%sdfDO=8oyJ=|y0*D4g9=7~*?TX7zU|B4 z@dVeS@v|vTtFAOG*^3dG&FUSngX-UR+{p+(gALVaC%@Rr4?pq;4lk!~3=Mh+l^aciB= zUL&lf&<}SKT**d6+Bb;AN}FO)tKHdMNGJvozu)HqB`9CaI6g(1k4sVcr|$1#fFU~Z z+x!3X?Oz){mWcx=sg*LTZ)GW-5tLa7A75PU2>Z!EY2P?JV|Sia6Lztko|VUxv>l>v zd_j3Mu(Xoi&DA`peoH4n4mKb24c<$_nmy9;Es?ZVpi^#&Kv7zR;NIVJoXmTqas6x} z^5_$31k1|^$E{R-#Eb1Z>tJ>kURFJ-rQBiLb@t4_Pm4(6;HnBV-QW~WlVH>ydGBM# zQiS3#@af9HPdAbKes{AYU=|0DnSuOkM82{Q>`#&$YnOy1|7FNz@AZAD*uRF40FSMq zKSC-Ju@qK$*Ajp~VfAx-0}!B>O1K~Rb)b{mK`|wR)B4w#m^KV9;>-w+a%4Vh@YjrR z#u^AWd`DrOg6>Pub%Ce{Z@~MNmVp0z?yEP{IKXIi{g3gP{pugOi5cVI^og0D6l=yI z8WEz2#bb13R2mwV8kz@_-j^rN56k_!wPcGO)2-a}AHTA!E;%IzVmZH5Xj=hfr6|j5 z_9KP`37Bkc4<(SoGAs5NaA=(rkZQ%_ZcBrjkeR>QER#^pQW2;zY4)8sw8gloH9>VY z-P(bg`-yhxXF~@SmDfUHJ&!n$q(VT95M)?s&|tuYisdU4cyb_M6Vf_fpnVS&gSwyi z@pU-t#W``#gxF(`fJ26i)Uf|~oP8+ipeXGNKe-QjY+$jzS%_vx*^CQkI-?}^v6QDz z={h&XF&R1=aN=Vy<4_$=cPz@(0{nRk4jo>;dQ^pwpt#Xg0lM{`i_RNYdX22`fL%+I zFWP_imktkH#kyXmk9x9I(eIg&K0qVw4x&V54)6;_^OOVpeu==oQ+}EyPBaKMj^@^; z$<%-XPaQNM0jTgcrld!C$!>wTb+^pfXRSBRl(Y!2n|Mn-DLX^6y z*O8nqsS<(mt!<{{K;H5}9vSAyGk4}JYF9VY1tZVvEs<`|T;&ZWy4 z!=d=e){H>4%~1<0)pDG=F}E1mVg3W<32|cv+YIqPLNfpjRp1x=!sqz;;_~DPJIrPu z(JP@HMQVNxA?=}-Y>Tfr?i=*T+g~54kKWNpb#R*)!`fAE&13HdwQjpTHU&Xv^+l^H zao!$84>3sI^8=$)P4Tf`5ULD91H;Y2>WdgR0K4f`IxxXIOr2q)>-Yb^U^3E{CFbwM z?#j2T-b{Es;|=3-q@e_-J%WtBEenCl-O;`d{$NSa_9H=aI*HEO;SkL&jO>xTX#fa& zwE;VNZaWPo!3znY)(*s;A`F-_?Bb}dZxnN^W>2H>V?fnj;*O=!D$A@Z2p zSZ2&wVPzFcB9EE_V6)k2l<>nbt4aM#Lha5!uXX;KP?6c|mY4gJXC&FJONGQVjVI)Z z31cSX;x&ceMlmc#Nt4G=eWAQ7*Pr20G}BHE?V(RbqyENvZXA$?fOp~DEC7D3BFp$L z1la?HR%kmCIQTK?r~eCq8j%mC#; z=~(5K&)pL{;tddiZ%HA*7odryaBQ_q2e;WKh;NF;sLpUM^v||$r<`ehd>%^*li)E+EBiAI@vCt$ZB?Hr#x!2a)FF3Xi!{`c|?f z7q;oO9aY*J)@|uvDDb*`mE)^xQ^nug{k8nx;&mr>15KZC^_`T9zQRDNlA-hl9&ZS}@4Ya&qk$GYJZs1AH6;}a^DNPZp zVn0i^8~2JH{#xTIAX)zRvACiunS{Lm7+_aMj{hl5FwMSB;fk^c&q%tsv$VA~*5;7&k*@+`Dv!wV;b0pSl^BVxdN`4Bx5s(MPczR9H zqMv}YE=lVybw`@nklD7MKe%eI!3I`ir8_1NOt8jgx_`&WezD!2e5%HUmB#0xJGR`&<_-$LdqcaRv9J+3KoV57CrioRcQKGT7pvhbG`pS^15lx3fin~MAr@ssCH z*Xd$i?28SvMax!L7M6-%O>x+yFftNq{tZ!2xKX3Bkp9sXc0JpVPse#ezaH#(04@_? z+UfY(ux6|DYvzJBuS5ys9-7@3!OMpAqtMQ3=f3}o_$^-|0XQ{sRq(%8Prm?h(OEba zz|xc;NR-tHQ-o*dEWbceie-^# zqmm#66>81M)Pdxx$l2RFK8fHpxPJ^Z;ymFkK8!l{rEdb9li7f7$y~5mMjw`oZ zv#n+BNkRP=%|Rl4hrv*S)%AR?zg~ofhhZ`D{j{9>wIHiYjE6(5!4DJf$Dj>`)0n|w zjO=AQ+2~YvUW6_`1f?IYYu2h*s_%t!;nGK^4C0FgNIiRB`k-xzghI;^n$vZenVjA_ z61B?9P#JD2gojdR*{=IQPZ>H%LmU=!KL)3xbGgd@_8}{?Ew}iM*g2HJeEI}=Zu z&>0+O%J@fgy^Ir#N(HxXjH?H{3+T@(v|!Krr{NH{(|6DnA=BQoNmxCT>^ssa$nGJD zmC`{XwMjqu@0}%tVf@LWRmXmV**R{K=|u!paim6+D#(p<=E*UzrOmcgNA>9*4>d07 zH1{*VY}%gA?2rF_fDVuvpN#GMk6*@&XUOFWhxsV89pZFf;FujJsxn>M2Z&;&ep$o5 z3>Hb`$CnDgqxrJdnA0AZp|hqc8GjXh8K6P2cKDX{K`hPNYGd~a6r zCu2(5*FW`voL|{rSJCwR5-~V)Zm1t{li(lIKryQH@^qxEfT)>P z9~et*B6l=LT>H^boo;kYhq~?QeI#QO8hZdmmOj@ObEFpMrPXnOE*o^--;Dq{xY+w0 z{bAL`W)>GVMFH12`)(Yo^xTZT3LR!3a z+VEHIgvJ1AZKY?;lPm5RFnNDTZ(?i2U^BH{dvm7qv|<-Sd+h*%Cd68`|HUjFH8ZnV zdwnUxn9I{5N?ucY#tlw_c64s#&x|~8F7;7j7y2FywH|U4xP|gJ&h_q@ zLq41HQE}5-ydgi*pAl>X*u_lK0UdZy@545oP`gB5;(6a4v$@2QT8)_qErx<+VB<18 zmlFCeea^V-T?W|Uo9-)ZPb7M6R@QNc|5VL++ILN~VSl}caK#Q>Ohbn9`A#qk;4H3T zH@hMn0V%TjiIOCSET;ZFKbq>d9Sh1Lxx#Db|pjW0gq55Cyq0QiM~r$dgd~kJ$jNt2x$G@8yc^iQPFtfe92I0om<;4gRJl8;C3D4tyAmA~ zJfAYKFZvVO^s=7+MVd4iKeF&Cfs9I9?pS;2&v+TX@qixDc1>x=d$cl;7H>=fi%9gt z9ti=tF({H{Q2TSNseQ}L`3b5nCOdK5ax_UQbXb+e3$=y_SgF_cQQ26u3^$f&h8UAy zE2Lxc^G8||=0dVI*i{(5>>W-~-`lQfDo`b#LSDLLbSNw`9e=xcKDBy3Zb8{ja?Q~K zS8#{N)CLz|@P;^|OX+p^m1phio4mA6Z-D@=e?Heih5_m55k_>+$I9KKr9AbQ_hP-G zTzEY^=HM4oumYzY0u%Wtv+E?o+I-06NUPK0d?($tu=z&uZ9eu7>R@k2jGs4trMMsL zn!$1J2=#pTsmvj;Y|u(~J#ku2c)zaHTiLgyFu(GLK0wUx?ID)-$aAj|ML;Ibp9ony zfjPQbo>1Fn0msd(hp?1nJ6{ip_kv?z>$?2ef3|wWozwHmDnNW{*x(nGjIXj>f65EyQKpB*L#!?V}hhRMco?)13Y+!Tk- z9=3j`*@;jLkqlQ<*w=B0>h%?EAQ{!hgD(tK06O4!ckUogWcEWpc~xbf*8vic2Ag5Uk-;r;7@HZfD(C&E@_mhg<5uH^i+wRaBh1{} zG0C*Y(=y=UOGz~Qv#UUGh-YU=hYTZY!{JTg&ij2a=Q*no{fmRHi3`j0AixNwd4kl| zif7rO#RB{9cXJYOoUWv9>*lEF!r0CB=88^0DNY1+5vo(!-7-n8dp}C@;~O^4Xa>u!Fh^~oC8MejcOYsVZS4?u{Dw@818#p3=vI~+ls8{V$#T1w zwt{^|^5L+Do1)xbTmR2Y(B29)hc}xzYCDt#90i$vj&u>t>xq#1yZ)?7@7@!3$h(~w zWIJiIK*DR*3pMS5(zn7x4<(rZDG0pBgUL=hUBsYU*3=%gc`kfEezfAX&WMjE3#4!8{r{bv8IfUHx0#R)PJa`~I9 zh8nRm9EE@?l9l|jZEfN=v*6-|!7iz03f82s^r%J5-|$dT;fZxBoJu6#Ix$5b-*!UZ zk3mD>9>!|gE_dpq{+yXm2)%Z?1M~*0m|d=yjTWB%CO-t${~u4+z+PFjEMwcYZEIpD zlZkCR6Wh+jwr$(CZQI7n%)R&hf_=WTdUaP-SNEdXtK;tond+)(PG|vY3UB zQmc0Qn&R1WQ(>l~1UhWFwa|=Ss+Lkq_*~LOSc$aSd7Dj&s16S6KnR68$JDd_hkI}Q z03T4Ih-2HGDXo=}1-=(nxE03q$y-v#?c2&YCc278(x_w<$~WZQd4)2boQn1mZ+%>=Nhn+&P6CO z?yUPE2Ax>#UCq(L|G>AtppipyDM-3m!B^`y>H1up+rT@|;wbwkC2*WRzj=B*3gTyJ zOZUzgVFk-=|25>Qh3LA2qW^vd?&dR|**p{yAYPiCao0fcv+cT`K%Dj3_g2nOmT-;19#uZt$$5POQGTK z;j^+M;J~CT2&fJ|9R zXr_oBm*BHct4V0tU1A}nMKG6w&lTyrp^~+ssj(0t3sAepzG_s@Jm-GD4yUpf{(RoE z$Yy)9vh;YPc5LA>;Q9|s5Bwa^d70(j{woA7KqIOIXI^@~U^d&vhEJu6c(C17eD?k* z)k|o)vR588rSVe(Uqb34__JNPqIn-u13WY}Ts4zw$QZWW0L7GoNWe1fUWKF~h%q&RH z;6H0LRQ};&4kni)^i8m<*I90{t8SRBW;M-rgP5mHXAiP&MvciBuw*InT6`;~@4J1Oy0$wcwpsSo}~Klld4gi_wmMlpN>DWr^$r*PaJt#Fe-pg`wTEcF=;Km!A$KJ z4n~7w`WXsfbXdv6Nuzq-eUwO(5y?T(e*d%(JF5wCDOI(fsnhBuu>qw#v*` z#4E~iCm#jE?jbw!;XBf)$dVJ+avE#gJIt>02D={Uzb~bst0uZ#26fI)L9==DAQW*~ zXcZQ0%&p&N-P_P$6;eZNKODP$>WluskTJxW?sqVmV)#Rg>v1oo#NIDp>af78E|V#d zeW4vcn~ggtyXQ2vdojF~KdcZ$!|U+V`HLy7E1gO_D5tfd9r+YhnWiLYvaIq>O!$JM z_XZyyT%+w;%XtIp>q5%<=GCvpI`Jv#5pG-V>od;wMWD;9{JV&x4R&PNVR@a?dx?ID zVBg9t+Cj2iPak+bk3I3j;Cnq|s&)ddVvH54xgJLQ6Ls~?b6d1vAI7CgG4Z?!*FGsf zk#+mC66zhA$Pj3cZRH)g9Aj)#Q3S-N0+Y!_5a5oy(u0Yixa{WSdWA0YUhI8>i9R|^ zEcgJWnQt@+=U>BH9XYZZw!kh!h6M#)aGBxnn(g3Q7-%Ia`;Yc z(GRsR-6mFDsRdrSM0@Qo9r)YEA^kO*Zk8r<2KtE=M?t1J{f#MMfrmiO?^jkCK36U) zpwE{{=?{QIv1JJq-F?s=K1k4Q96M8^3TGsBJrI!&M!9IskA!7NvC2U@$h z-H%D#U!Xmqle%=+=}Re)@oMleM)=Nc!Vq@-T>Tzug~jXhnp1~d`59=X2ERnRLLik> zVEuVhmk-wb-IZx5hzk&r2%ii$<|6)ES9YI!8$Vm7N9-DC%>qPuhQ&U5Sov(Zmn3eX z&Wker();wd<7DQDjJ)kLhK7}nxD;f>*2VpYzHFpDaELh3>iB=?-0 z70y<&Bmzs!3CQg)3%_so30{c&RC%MI#j8~~pG|%M8F1Lz-ht!J2K0dBn;2`dRcWHQ z0(XWNaeXuQ*LV*L@de#(osPZnkVV7g#O&VS*QvpG{^(IL^-%sRc1IHOapSmR?bQHG z?i`WQX)k}nk)$KrLi#GKQHReQOB_zSFg6?L4 z5mV!*`+#WPGBVH>!B#5*OlN65k#@*ZO=1n&`YsYAxV5RBI!F)lNJi1G^3!J+Q+$FE z<;lc}e)g<6eAX13*g(7?0;@V-;py1QqikiQtatQMX?L`H_GAvOp2%F`c(`F74SIAk z39Gd&i1`{DVTFY81O`2Q&`ej|KhFH^y2SNXRm{} zYoRM|k9+IFmd!>RlDt*~lFDC_tYw+c5QJC4hubl`^JF26&?Lds^7W8wm#};DoQ(+r zSZfk@Gpp;^6I3JT<=JcVJOxa~ig!Ogkk)i|@U*SbmloK($TEl)LB{TJu1pO2H+~%@ zr-_<^$Gm3jv>l}?mHs!CxcCyF@M}(Gx@g#vH6aJ*=yA}c*NKi7>716A^QnLfY#;@} z=86t0G%?mE^rDyra=w|$Bd>!AbQ8i_EWi~52!VhC5@p{mgM(*l+pr3ewQNW$+Xv*0 ztptz(X#C(HUC1`BVqS(X1F3VyUJqtNa9IJKE8>_@CvdNF9u%Q=Z5fXCr#HV^d3kf$ zdYBpd#vz{6UOdCW#63HKWI7(odv)J8tw!RT#dO)ir*m_5fG)w9WS-Mk-XFzmeo$xm z;eRt2NWU>C6UitwO~V}h8WtEGKXq)z;U#Ufl=G7)X61dQq>j8x6n}MhF&0cHNOUD) z>!IUI%&68Y3E8Yc;^lFgx?%M8c#aeiM26^0@%hGQ4~#;Rp?(On!90_5l^NtUJ4L!g z&L3;!&dyg3anavz&>rXt)Hcwm*c|kai!AYZ_}VEI&fIgMM!T1)%8r!P-;kSsx3)P~ z3EHr~8QQqUWDV9h-%W({hM!kDH8+qVudRZTf+^<=1_oJrZDeKY3*g8*+xDye?pt6{ zRWJLdE1smnasc0ASx&vcv#$l68;y zEN#u9Kqqv%M@2cf7`pArq)?zOlTJFn~Yb}0YxiY7`US1I9f*K(57r1g@}3i zV9|(c_369x-o4+3^U8Afewd+5wR${BS^GA19mD*E1NxpWPg!1=nmkPgoOESh$~GsC z-uE}Nb4$EOt1g4}kzXL_Zb?~0TDW!OpcQuBabBx-lFSj;&*ctyn020 z#qzp_AY5AwsvC1E|C>*mOAu>0{}8w9SQfw!1X~og8yJ~N0SfFT-0=1Yk}KLD1x5*Z zHYuNGSX}`y?HSkGqZP@Y2X7Tgu8Kf%MAAOyny)c%Hqst1U5^N!vH(hdtxCgChHKaQ z+IJ)@hTpR0NAJ|RigQzm7XLYM$DOveM4LHDo9=Aj*B}U0J|qZjS}M&*?3#Yl`er;X z@!l|ta{Ol2RlZvvvl`o9ueo)9J0@WdI~z7$YESm1dZDa~*xyzM(9MGdp>Gf@=aF7u zkdM97J%5i4w-*NRh!xw)kdQI5PA?4;D4KmL;|4z1_xEX``P!o70`wFC7LdH`)H=PG2d&Qv%T_cbVBdB_nui zRuoKW!np_WE((f1KfsWZC~nnC^$H6SoR#53Ks+y?T`2uxj!)jkcfx&lBj#(CrO>l% zov;tZHU+fF>Lyqew;UU6tYF#ezI$ch3h{c|L+J4m$V?rT6Im~^siMgN`4`3Z96kLj zLU+4wowozm6IE>h8X6jlf(#x%jqC%Gn(xQ)Jm&a6`UZ|7y>{6?!Jaftg}Gd{{-DKM zHQM6#8i;510h3y$2VkaAp$@LmW>1O%MV@2naW$e$PDEV%3WQlHUOPp`lKctHakV4% zp_eT{(ZzTiH$ItoiMo0+>uB^9)-aEVarqCm{%u3R%zJZHvXOg6Wl#AC4zT8?YlU4` zn&@?zS-WVMGI~=+U@E=xP-T{_#2%BuCI7~>BE8+DcROGfKUxZlp(;&6%@g7*i|=wb z@m6oWw5d_Bf$Ymo7uB7W-Lp_he8muAQKg{dhF1FsbT#!NSs-p*NLP%e4icp6C3a{3 z?)W8T^6!0Ga>_cqJ~Q8hPkp_=kBCUC{3mC?d2Fe4LUg`3(3e|-Ip}lTTUH2;)gSB} z*?j7J7KhKRLJWT8+6A|wR{f4FhYS{8QivOsQ;3)AC%Ki_(*PI&X_!MQMHhm}KD5pA zWhT)!fr<>VWCjHYADImc{RkpD|07S9E_lwLQVaVwP*^U2G$PCZo^5rS0TC^T>i{L+ zmGU}GkWU(0B@)Qj_j_)QHxe(6Xaa#^l%W@C>ZM4?b?TbbOvZw=1VPByp@L@q3 z%B6^L$GZB5|LunrWM$v;oYBKznEZ=#W*gj*bK~}%4d;Q!So7Cbf@#c0kcQKaO67Ua z-dpg$Tj2UFhqM59-oZL^m_5E_+G%Q3w|y3RzlvSQkXJb;UZK3kE+!5tr|QwyNl42j zsnBPJkC2M#wyR&X(kv!fx)*xk(m=jWJS>nNy}%wU!8c+WBb2Ou6=rZ4G#}hWA`S(# zg3LEbld1rkLr!h>HBS&k#iu-|3Pf2^rA#9@QJ*Awk|=dhzm*EBUnYs2>u&rs~*%kn3ax zjWQ;FKuLgfxmpvP7;k``UT^8Wv=&r`lU|4zqAb&!s5#dy%qwC*ra20tO7M$pPfz`c z{cS`;?>*7L8JHOsN!Gs7LH2^{z1$ZPH4Ag4^%8&1Yv7$H91B-(kefuQ&v_$UA*G#~ z^iI|~YYI;Hk0dgNp5*Hlz8jL)PRWrjhd4V5o|pcJm&4<2^?jGi!G*1zGxlFLIfEy4 z^r~gk?jXrfCRCC!p{IOUUgJf4*qPM^0?+sQ?(%1kABEG&Ous}FS}`$BpSD0Rj$xn$ zqPu^9!t*_3iXSy>zRF(&kW>Rb<#u= z$P;D@P(4B{+3DyvwNdN6(&;)@nCInPP2kfd(XH5TDagYA8%v;gh_W~)clDf+lz_#W zuz-IhK}&G3E%hoi_Vri37sJeO;N0V%XxffZMA;ExHe>auhx0@|wEDzbc{DOb3cKp% zHyi3}E2eE5tyh-!*}18Qw~t>^m_pBVeDszU|Cr06FnZQUEO!QQ&<2Ue_q*m!j-oI- zolmVdD|GNcV}VV_1S4#^P!-H}xX{ZwPKZ7pl{2g@C6Pa@u>0Aer=_N z|D0N`4tbeKp}_e=bZAQ}vj@oN3oRza>%XR#+&N$dWiqycM;p}XuKYU#g2R)s018!p z)&zRU6;yf35}(bvT}dq06&@)CqUP(!+YJY=-ED)aId{PvT_ImhcDEKbza`@01*o9g^`?-b{>pFu#Wm))L z7&O=wGzZsRk;?{^{2ZSp!zCQPs>YE)aSRq8CacVicE-5f3aaENx^vDx z@h`9ZS{=dxsYuna^afPhL6jFr8Gn_asp%^kf4j9H-!;n!gf!s#l3zcZL3JliT z)Z}EAZg_82h_li4u~pP_8&LLzqZ#vr0)}ML(WMK1Lx#)EBQipVjKWWeqELSK{u)Xg z-HJn?R(6IVm!X?1E-dO5hU7E8$d42L6^bNHk{_A&hBc&RGuJ^Evl8STSgq1;`Djxa zN=4a`=Fb%_v&x5uVJtbLM#(rPtBXtMm|adUuFt0$Q{68a7n$(tt?J`a8W2hFFdlpO zypaDRAEtl2pK8iBj*>hEQ>-twWY;u4^f@~_92q&kror+2zpm(cnPiXW(zMFF0a&Ae z+<8Fs69b@;7+u6I%-jeJFP7uu*6&ybTlH}3mOt{F6RCc)Aw`q1Wpjfw4T`4X#1kCZ z&D`>!_CX3<>;@TV_}#Nu0GdP%1!Pmn3DaT!x4#yciwY&PObkxW!x4bo?6MO?aB)4= zH}H{uNtHkl$Udm&Iv-VBj$@5K*m=`s03gAFlybv|UiuMj+5Ni1MzE|VuhKA+%=hZiwRM~Jt zo3wiBa9h4(pUY`8frHz@{*wO(9T?F+H-<9(57yrY-M<;^=QK0=_d-RJuV5Xo{<14| z${bAKZd%q$MFKQ_he){m#H!`w-d$K`YZ$?LkrAlm?3q~?efYO| z_aY}gH?WhDv`#YX7Q}}LwD94?YM^iF6xJX#S(QB2;3$-bdC(i$a0-826gqALY2;26 zwL=NN!`>F4>;B%MOlVqTj$Rm!@jkfi`TQ4F*0<9;Eaj#%xYB8`Cy56Bhcj|hgE}pr z*X2`Ikn_hq`EqNJ_HtqPuTfapX1k4dR9H^5(1+AuzpxMmp@72*f>l_HFcZ#MB@DcU zT_hkgsv!Zci(pvy!BYsKU)&X;hK=F!2wx6g2azRHH|pS&0uPr3~|JBT>B&XB8WmQA7tEZ)CtK!)R*) z1}6OV;)oUO2WhH*q6!+Wg+*r+x_Z?NRY!V|)$sg2yX%&=<+hx@-zu<*{J5Qs1b)85 ze_`?1e+B%cyc{vP&%*#G&(&Nxv8(y)1h=x-ts2ozy()ug7eaGRAUw5n4nxlXRnc+IR z`IUq9#dvaXw7W`IuaB!-Ve#7wzhvRV_+Zl*feUJ2^H z>-MOA*B5)0ra$|i?{?bG(YO7A{y&oEV$dbRJ``mAk^sKazrK-`auY$dF6D+I_(2UleAIHPk+1zyT)XlNwc%xptPPgoy zB~i0Sf{m(ql|1}1QKoqvxO__A?u?VF>=H`g^dFS|r{;wmD6%A74C;13OC8XS891fJM* zUfS$OR~Z(v#mVxyVvo>`4O{zA0*y(rc#uz=#Z16vO#j2ReSUf$u_ zB!@O^R?t4wX7LF++f}%Z6zvq@TfH zvKc{R!Fzo1L?=diJ6z zW0Miqtty-3$mzxb3q~2#yu=jzPmxMNSkvO0d?W|E6#2!!&o)sU!8Kd6xXVVjzUP2i zCB3s^CmS&h;85&XStywseuBEIUi8W9+&xf8+MdErChXs6I^(Z?(nPhH!~~dKR;^do zK*FZJrovbtkga#?6b!IVjE!-W}GiLMD?F$ zyC~zJi4Fe@u2<*%c&5rA=eyc?=AX^JByf zrPR~TWN(t>H4WCe84FS0YzFYM>bA=mfIx3|78}KD8xW@kj{+iWxx+0j6J(2_TW><2 z$?J^bEdZ$&k*myb4kFFTq(EF|ODKFf%V*~T14Lv|9l6sEwzxdH}d58N` zfuY8G;nXDGU?nfeViQW#k(gAVULrwN2ks@~(@~whj!VE{;2A=O9#u%tILMbLswUq* z#F`_VH;A=Z^V`{jY2DQnnxB*U|C7gKCNH7?~P! zXnEiYRHh-!kp-it**`%m$SnK4k!pi!{>)Z<7;N^&@{|525kTel=9%ffX`@=F^z-LS zm|~(e`NCI3>@@J{QZpKSoDo$fI#<4Hd=YN|E)oJ6Xc65aVw#=WbP_yD-MnfGd&PZY zGcgZ76TW&Gij3}R&9iCF03z30`C|i4)T5R4YEtBQzlSMpr79nRm`?NzkPJS3XVcKs z@q!U~h~rP)GY}lhEP#JU2=uXIGURfx1Z%)O`s?NQDCT60gyg6oqz*F8@Cp`UY&(C3 zaudQ}+i-c3*4Qme@Rm?u$yKu#f=N$sI(^bF3!G3Jh$4hxf>b*HeP>%3A(TLw@Mr=h z$x$)KwtOaW33>z~HuIo+)>6g)KeE93JGzwqA<#`c9>=d1xv-S@Zda2#hZ={%?V=A- z*NFa_ShXObRD&5#2Jj7%)YvV23T^U%{PEIfjMlXvn3vz`^50ETTMevadG-_&HDYTb zz7%OhLYGMBjSTU z7MP*;)sh4U(dVZ7rFL&>caZFE791EGim^_M z>$?+b1Wy@Sum>;?@sUY^d3xsxrC9+0g1w0kL-k zV%ER>YR(TajXL%1afe;zYXxMnE&7 zq?wo*sbTe9XR#*hUcC}G14{nxY96BUbw1-+)tAJrX6!MycY3O=Vt$otg&`bb-^GvR z*)I(a8pRsy>n^l>90h@jFkAcCK>}X>zT2|&_mh8frwFt-W9OcwyZYAN1#+_7TFo{J z07DwmVwuj8UeC>SE@3CwQL(W#U%-a+kWSXwgth|#^J>yQcF>+4WrIgxQoHBG^1i|V zLfE2p0;rn3JJK;a<&I5qSty{;44l5opr}Q#FX$XdDiBGM_PO+M?4$Q`!?i8 z?5M8Gjz2}cr5aA)4p-Ekf-LA)r-U*@-{2=rKTed-d{gSQ4MFuf`Ed!@+aK;0!OCMn z^!uzX2d?Ld0kv@+5BOj1);yl zsK#2=#tRP(8tEo&^Ha0YD^(uMq!LQRK8D09_JV{HR+IGiuelGXU^hz9aB$2|i&(vV z3veJ9A3LnHI@h^oVwUKsSd0B;%sU1cE1|Hr(przYq_WeJ!0MnH-P`Xczkqm6x z)}!(&^t#yoN-*LH(!jzkEP#YM;1yV}Awc!`_^CSAU(VCb5l4{lW9To)?D z>x?wS&a6MV<9aeD!wvtmB+d0I-k)aOqhr*#m?>YM^DAyop;JSHG;OSkQ`dF+fHV6I z+`VhFkvq>5TD-x1Zs@}lFchxWT>e?eb^L3OjgtuH*pV`9=qvTm!^R?IO^zyiY^Q&x z6VFfin-(?r@xPx76PWQ3#&vcL7cPNRC$i2c0qdV@FoYv2yTy#=8;aBVX;=wp&V~Z5VAmZNmrG^ZM}OSXGxKqrZe!leRyD~*Co7SI=L2+)sH`x3!gzn+n3nJPKXIRO;? zG5)=Ep@Zkq{}Y!NpqZvBeOICydhcnz|~n$Lqf)ltvbj{~R@(^QZH-7|x7A03)Ma|nBljsf;|mw2mF zpd+5qvciK?=CHoFIt++q{v+{-K-4XDY%q^up~_O( z>0ro65DqVc`9J<7#3dY?F02AfhNn_RhVGt@3-#k`K|N2P?6H12TC9~de;G%_*nh5D zhwqOtjS{u7{i4DJZ}jEn@Qj3WeiY{bkP+*|H3G{%WMrDG^w>tzeK&^$;;;eB-)Gd4 z^l?r1C5t8+mEoodG~zRF{^0GxKa|H{X4GT;TGB_zBn#yM}5-*cUEuML>AYs znbZfag=H`?rOv}Jo@|ICxE0SN)PKih`rp-LL+v9Y@~UFi0eWksBbP42w0yxBtWf@yYRQin-^GZMt1o7 zkFLfbVeGEadF|A>ZV>9?9$eWUhZMMKS;aciPz<^5(7WBBOYjPrdF;%|vO8=0Dajl^Ybjbz&LPcF2nbBP zxuUi5n2aE>ER7{az`RF3n#$&5EZXab>W}z~LvBMAUhC_g6eWVCD}ParZbUq|Oe;aj zJMlG1e(8kK5x7^r5vFBbXd2zQX-7=Q)%~gDyM)n`w4cE`cYnQ6Yo{xLf7`tiS4`|J ze>IJqNJWA6vxS&6$N}}sFa+ZPIa^uUnN7*-LDR1NSj%l~sP=LK`h~St=WoPvhR&OF zW2Lp;-FbX>@)ZVrjo`Lu@f=$;GYK%1?Mj=zTXvB@vOzRGpQ@_(gU2_@rWR_SJ*i<;_ zWe|zg2G&(0rhXe5D?TQMo&@J!h;eJ zVzP4egBM90l0Ix@-ZxGv>VzzZf^xPu$dNwVO{S{Ur-g+B-{8K|*T$a$AQ8abyGeDKOj?*hQRu-@y^5M+Oj~ z!qKeHZ!Kil<u%bT}m+Eq`%ctTPMZVAw z0yc{!CFngJ)Y*~ZF`Lr#DP7~OnI1&GUbSH>%_T2sqmlBK2eXD=kt@gh`{~^Gn^sL( zzB(dG#+BH5=fA4{b?9)J zK1h&WnwyeEE7)14oyHg$<;FwOYDtOsIae+?)HD9`=PeJ?x4`zJ?Bp4XO&#SqEG`^%k z6iJ2(0MQt(g{PIxhQ2QP5NPdt9spr(x322jp10-pX7-oFhM~hq?$+(@n3!i70%eTW zZV)Qs2)P%8pIY)sApYE1+#XY1s@Vk!G;XvodQ%w)fVg^QwgVK%H1$>A)15495`08p z$lq;!;bx7=0qJ(G^cob9vP1#FWEW1h4_xMJX>-@XVl}MXm|Bo3CwJC&BwvWEuAXDU zV~P2N2;?P?t5x}DeimlEuloRB8@nPW;{2O?-F*E4x`CTVK zdaEs71YsCm@=3z8$9cz;|~J zRK6Qp^PxxWU_(E-bNm=5ZmLUHR=N|+P`HZ3P zO@y;xiBH6C34RX~?zF>f1q-u9kuHQ%QbyAT3VVwQMt%Gy01{qEq>5zB0LKe4U~on90G9R@r`DV;6s zJGJ4sKkvjHzli_wN6DUp$wN=KxlxeWP5DcpvPv-)j-T6)XHAw>g)}H|0S!YpBRH$f z^ueI`QRB_brnT;O*kyhM>bR5z5&OIGp_wx+j+2t;=Q@$_AGPL=CZ(^?k}PhJkFT~P zp!cJubPz5T*rcb;+OofF;CtTBeKPA9j^DdyO!kk{y7@@fVRu2?$MgaAb)X{x6#W|~Ih6gXETgUyD_&^_nSei-Ht{bkS{htym4gaWW`p5q_`Ta7LXxc%x0$%4v{#i`SC4_!&7 zh?cp0b*0!$7I>-)>Uuv`&frxaKUk-p z3cz*;r4_KR^XBmXX@i&Ju1h3hheDTShq2b1-jl9|%xJz%PgC0GP$oW@esAoPmmF4w z?kCNe0|&wEYF3llV$al^dYU2C$F&M5YPXxt!bOT$wc z6t`~0XI`sN2oq(R|9T(pIr;^1A!3Vjl5g5dEEVZ62Y8U<7;!>d^5s$i>-mp*U{ zNx`Yz$pvVD#^F|EE;a6nZUt-g|NV<>6cuPmiHkv61r@>?f76GaGxGY8dy2~==^@zZ zccUa4rj7Ru=5q?a7rEy82G}<-;W$q&}$IKjSxAFe4 z`q(+@qwu`9?DZHUFvU`$j}L4w$*|dfWwHcD=q5W|U=|%tMsJ9+cXjL=)gRwJ9z=U$ zr7kt$T+*}KN*FKKoJJUIy>&0#zs4eyL83xowWH6tnp1ilN!(6#x3b2GmYbBZ=@tmAn+J;Z;uMK1OS^s;=5MT9d*yg zA%j;7?q;hcKwA{QZS7xLtF2P;rL4v|p_fH{6n81St7@c_%ulIbCuW*&`5Eh|V z&_^$!G%)LX`GupwQx$ZhZIf(5wr^1s5%(wBO<4Zo7szLyF=y=CvzxHbscY7D1sI)X zCMqY;?a%#a?I(-Bt~X68`wslUsAK+WHIP^D?`zxMZg*qb`;&wII4wV^qh8aOqbHLQc6 z08OF)Klz*qjE}R&*bgB-jztB@%^ZcUd@&P~sPmD&rFv7;zl))uBE=3f)JwdC@NvU= zCU7dQ%NFrmK`Fvml zUupKUcK#bQ*~QQgnaW%poFP9}rV>U1PwPayojy1#dp>tW$|5}~uwW2zZt)Rr-aTGJ z>D3M@>kceFm&<_y%cx}$+zV%fzL$SH&--MvJaeRCsCk3|1>iIoU-S%&zqj;Fq1?Br z37KV+4iq*0lAcA*@y5Zb;M!Zu8tIF)X|cK6cDX!Hi7+|D@4xi%KVvws&r9R#1h53h zcfw-ujx}8-UlejzZ99JhBM}juQLpSZvV+O5)ThPiC3B>94DZ45`eh>Cx8fp{s_1bi zdZq#>ofKS)_H_H zMT2u;@z)kChP(B2K=0@LY0~7lG>LP>F@HJ!_KjqExxL;Epvm3g6?VACTp30}S42)< z9HhL8wXqxlsyllmCqg5@sTX`>JSLFTpOmla{f=1h)Z8V1q!#1<4QDDZKFdpBoB#`JptsL%;A6<)EHDg8J3*u@bKb;dW= zlqA_{GV%dK!Vzl}cWrg|y>SZ_G~A7@eeyHC)Uw3dC*KRW=vzNbitvY9-#yDWJ2alQ z-hHl~!8`<9M6(4)7s%o)vJ|3*UsnR#Lt_4k*`nV_MTS0<_u5TgbHg$D{x(~>108gw zN`lM7N!;}x{!hND#eScaaSP$ zqDp5CA{4i%1q%~`Xciqla<96{${0)*r`QtnwGuVqyi!9!$ug$EkkNnSu?xU^&mDsF z{?(=MW{xKsT$r#9Wz*qL?n`1=kUpTxv%>+seJQe zN3)=DQ{ok`RIZl5YZGh!jT_hPmHR&5zl{vpbp965ulFhKfF_T}7PG{JbK3O(uSHJ{YIW?8jA z^4~FdjzxQ668qQ)hM`(c-O~;FKq8*i z%szhMy_eZk8D8|h-^EK(9OD!UDW@2YDGBb{L^3)|Eb2zW?rN79@U`N_p)W+*S=C0u zD=181!^fQj4H5o7fyx0RJG@y#irSfDj>C_vE=XQ+HJXvZBm`6d)po3E=P;6JZQISRq-kCk@OnPfJ>XTqK9vXDe`| z6j^DaVm`&_o7G7w(%}=*Ud_ttm_#iO#yI8AyYs*3y0-lBkcrX`M6tp0dx^>xhc~Rfx1yuoF)#N zy)59I3s*U!i!*)w99a%HnsEB>Z29z<&I>O1z5wuDTz7YPb0BJKj9#RVz9)HK*u5eW ze7A4z)IAof0%xQU4YLdGh@Yf&EHXeEG#hKeX(II=VB#l_x;Ev%ef{*8@Dd5ve!p@F5NM)Jh zV~m(*rRVHdvXp*W(Cn@JRcp}H=lXb`^oVtx^r$l7SL#N&z@RDGhTRybk**5`==}3g zb7_FwY(59ppi(#)!(V?h_jn=@JELw zS@giv{VFMkSLXWs{+N7|O6kUCgKRK4?*qVi8iQY@VY;a3MmNd}Te6=KFsvRp;`HvB zjn-LV%WnN<;%8=8Nv#pnl4Hnep{=pD*pf~N?V)w(3ap0tsMN8az@Ses+S9%|8(3%g zB{Y!9d&H-Y>tHROl|u$+M6$685;_Ga^j`A2W?+qZTb9-ownnre6{&*YuUV+3f{ll{ z(;(5}*uVfv`{fV2O(sD^{r&?J3+h4rBe@+2zEyOYi6yWZl~U0>s2~fpQg$=6r8?C+ zHz@~8tyiDjPrEJZ!9H z@Qa3IP)uq=PAB(NVPdL)eYi!)H{42X7R4dDTJR*%|8TG*3=Ya(dmK3uDe4(N>{mb^ zx0K77Srqc{+ed&`Xt#G?(w^$*{VqRs#mW&1;A$&2Bb$z5*18s8GJL2QAfTUD#Li5F zS(=V|b{+>0DxHTy`9AMGaq9vRxKE;V#un41!7^K|iqh*wHud%p-F7uoF3JcL_cg;tuBMxTpkCb{)OKQ9BsBwBqik=ND*{z6L{NMD02F*e|f? zgDNXWQivZ=kEdUa&1!`)Vh^u)tuSX9OS$;hvfVjRx^0=lYODZ3e4<70;*wRL?xYsR zH=wBzh2!jCpuGMY?O{rQr9bO-#&_yxdzh1nN!TJlLR-E1M49ad7c34ISG7Pzv8d2c zO-(OsA2yxsiaC{Ll3>8KD4aIgs)N-JfZvy@8CsZ_*+NjYI0f@}BfNDOU+o3Zz`z+VMLY0Wk@%*#+CoB^Vjm z9IC$?EwT$(3A}!Ledh5_n<|W^xr=@#QshDOL^3E|NhRt=#|IIt5bn26As)mJ^ooyi z>7(l@WJGqH(1vB$W+*-?G`>&en-`ydN_RbhOws=8dp^@Gv&^`;!B(}}0&G`NK2H={ z8eGdD3}BCGe>^In)#(kVdws*otY-QUynVAfdJp-uKmw$Bn+wU3r?!&It=L%5HL#m6 zho|Dr`y<$Zg{UCLL9J%>OH=jA8H0XhgW5KGDeYUk!%g`{J3crWD_I>vxt`=cSsPB! zDQ52)_;G!Ym2mE7{SGR-I7fx=b1DV?OD9bDPMsPcO~5~*K0FV`;>DrSJ;3@SO0Ry% zJ{;jeAF>M3vVGPOUTB7ZtiSVj?jO##@#`2ecgFPiC7Pqz_`1i@1L64hFt~G?-M|h= zSxNib$e4phYF8}iR>NYLiaQbk2aFDyVI?o%*XaSMBa-7XC?r?RSr)~&8yTPDy}NFVK{H{( z20&;3)f;=4tmb@rzF__=d=@wXTver+=1<%T;*f`I;!?HY536xOP;#(5Eh=ov$n9Wk zlOINW@qnaS&K4LO>vD}8r#2f^&u$=oVb(vEF(3fYy%WZ{=z{74_We{;HJ88iXu!8cY3{+A}38* zZjCJrU3@^>sML4aZ-Qk5%-$Nf%KR&tIp1Fx>DJzB=W3WUigacW31AC_F)ho8AA(e`z&ZU< zgTW$w)<>R*``DalDJj`cn3d;%l8kU;3YPg)Tnn*=)||yL?YgYMa*8z*Xn~)rlR00$2qc2bIvyxIOS!KT`RM3%InZeB zoEIzBwcv+Uf%4Q21$oA^;fGg?X>O49sy-70!o(Ry!rPy+!}!7wZZG*$+p5P09C24`mIyqe zhj0~PGnvJD{(Q;yXl=>>0!ed=OP%XSlTH+Y$aE^IuXQL4yq zWe=;ph&X%!CVdWuZ9*v4amvss(a;FO%S4{dVd6&U5zD|BBVr9|HtOFA0V1iAK_Tl} zdbK4AO{8|Q5Z5g+B}RuqS`EQ)m*aq*0f8lsz2G+=`A7tt|Wm~QX zr#;sEf>k%m(@~7`{jG%fr{$K;j~pS{lrUjVbW|(YyA+b--y6Ar$@%%V1}4tYN(6SS zI!XmD1K}*C<?rw7>oU{3{3?1|O5-bKn7*+tE#wP2zjbrguBWF`7cBzCkQAO#bX(SSMeIL(5$+QG=^y)WlUNbYjB7e*gUf^s&m#W^ zEw6k1!}6)cV}4^b7pML~Vf(`8`y$Cmqy*yxOMVt~2p@omQ}2+HbmQhtb*~EU31t5U zwX;!~cWJ%Gv`ZX^MzePC=kq$k)}zfEe+VM38L>o#*o3#*L|*xc!@Hn9MnM(Fo71ln zc}=z;+DWH~0asY?w@=PbY&JFn2BL=(_;xcU%Hf!4jx_GAh}hD7Az59>KF27;ej$$! zZKI$^miiA`)(C_AuPF*H*UOY2)1YRB5A>*3{Mvp(Th*fDE^vgp8@(Avy?#G!P2SFe z7v}n)A0RsS+?{t>XyV3E0`J3#u-N=ar}Ux`%u008KtC=Z=X4bAd;6;m z>D{tIUX(KvcZ{-=(+6w08x_H}EVJY%UU{^P_rXWmCCH}l%>A*-Kh;K4t~<8blEa!) z--DN<8dl>2rIxw5;eXkF>hk0_RMoQ|AObp?!*_!@H@xr#9v>K=B)aao{`6M6Izh18 zmVg{p2n z8sIlkvxgf5*UufE=Pi)lp(rlC%@-5m-$zoC;x|0Q{QNJ6N6{_x93HZtKPC?u{n=sW z9OBHekj9Lv-Ws74+B?hWDM%eGExJF}f_=yqOB70HCowdTB=trT-G5{E4`xzq#IEG= zHMX2s0JA0rcdZ$-As#(1I8{CrJx8Pz=X62+W)1d-**gJE+?0u<{H#>{XFEN2=5S2dS~~%Gf;R$bm5G#i>vjEjM#Z zoqF|(0C8*mcuVEwd0JJq8&59S#knz)nxi);v%ES~8DCL>IV_vcYHygqdn7X7hTV8m zF%xU_53=R)!eFyylAkaj#W|@0`9@aZl?^GDo8!OB)Wu2ZIInnP=JOZS#0{5VQ?dn% z9B`%Sa1+Hv5!ssUBmC^(-qZd$MN7pX?RH*#!(hETV!FV{StucDD@evW&I7?B*GeX4RyU)tv=)YF7iaHfjrmc|KmN7 z6f|(}q<#r3T=iG1>5^x zvM|t0FCaDMA(vV92UWkeh-^3&OX0Sj2yG4at+a}^IQztommg+Lt~my$HAudbh-Y5z z$^G=HJH>-*z{n|;dyu;jQxbPkosE8*orKfN2yyrw^!5f5|9zqM0e%_Ap4iACns6!O z4X^i9Cvtd|O5tXBUw^6)8#n~@?hOzWSknA9g~SYFoV5^Q2osf*qr4*vgkhSRv#>0z z`Pm)EH2nO0%jY02Cj~d6ra8~9^sEvuLDo1E9+dy>fH2qzCY7AL172vU<_IER2_2ER4Lj7pSSq2mYzMjs|#9Ny-tmN`&zV%1x{7S9zwcUuV2hlvcfvz z@ce&x9;7(`#{UVwuxQ@~+YMk6h&V!`23f3m(D<#`*+3Zo!SUX0FpTMCPWT%9q>U<6 z|FpqJ?^Vw_A^-;cbRlLCc}&gWIv$$UABqhC*FevvN3v3Zi!tEwH6GW!98XX%uPK~j zUHy+fnR5NT+A^u;y=lBgH|CtN z12o=x6#6&v;>r5KToSj3E7N(vyfkSJt8=&qbE z1y_OIrxd0fZkE$$qMhxlnEK{IO_fI=H(w~r*v`60K&T*a*$sc9T$`{oIdR^3{kwC0 zNPmowA#&a_TfPz0rJOABtc9Et07OQ%O+DT@Wo_mZS;nn{VmCbpttSZ}8^Wxa3Gc>* zCTiEenyHG93d~uoCI`f))qWJ^luQV4bILo&+^B~>OQ#sUF%s!1q49Oe5e|zF9~v>Q z<3LTXrZ8X3)q;B@!2Dh`IJZxOsQ+ZftvL);`{&R9VKk6dKd}8^JN^Qlpm5C|GOl{m zY!HP-K7x*Lq?6)-$-#P9quwZoCusrk6?WSd@s zd)3wV4)*C#k#`#H^FFki`l3mI2aJr-F zP38W%LmZnQaRB&t+*-#{uP-YjP9=Q=n>zvR=!EvX-k?yjVC;}NPPD50G~@!1J0c8C z09qp<+-y1PyL9pI90TE({31QVgsQlK259C2p&kgHqH%`zyGkDH&Ews=kbg^_ril*~ zKxD70%7AGT`fgo=$AgWhoCZ(|)g-tNFu*2RUUslm^`8G>AUDgRT`BtWxm@z-=a)gT zTBtWbwapJ~ySp2?YAc99Z@wg=_<70$Oi?3>C=cJ}E|~6yyj99j9L~4g%au&$-iM2e zu-BFA`lh_6b}Xisd?N#-C}JKIQ}OJ>DMx}NzKo${#bHENC9kMyhdm@~Cq&~>}PK^d(%@TzPvN=eNtkp7oq^EXpA#K+Z-oqKEy(Kgx} z3YYVn@3op+fHiOU4X15PExwj@?&TyDjbu>q$(T!Z^VQdE*Fs6)xBmrE^Zq+`96a=*JH;iNTO3OgrOw zR+T6~5hmp>T_Z>-*r3QK)6cyL#Sd#PD-ZRN!de=_%aUZ%WKSg-q;ft((V3t@Q{ACN zH53jPF53*EHMEG8y`+DL-HHsoLHW|kqNhx-C+JCow+3Yh*-jP&&k(sApEx~p9N9D+ zA%81UKG~^jVg&vEod;J(J9W08(?QS>Ez3*F+tbA~6!4|6z_H1yFRklM<>@_I$56U5 zhQs5!uGZrT4^9ko_=-^G@a<$OfzoE8$}?HdA~&(1S(&W#ZtBz27brCfga$l@WHT|^ zju{CVeao5=Hp+1IU)jGzw(G!V7V$lM)8Cn#O)ASj{n2~6rX&Ic3Cvi{QNDZc{w-W~~`3jK4c6DhhLuE2pdl{mBVbLdEmx2ae? zG6fbfnJsuERp6=0(r08e2@?4Ou*$mUeU0d`r9!{}D7b2IlKmj zPV0%F@2}c_QRg-{_Tff~c!Ss1)#paN88{07vA}NnhR+L!u3kOoSHA%r^Uw3Xz^6TD zx7qis&;{L(e01Us-NaT;%ffBv;2{DT#kes#LsmwP6@&74fo3Y>5Pk+D10`MmCB=#@a) z%eRnUBF5cA;i?R?2a(XkDO^;lex$xS&|zwbu>l2PX7?~h*yoDcU34&3KKh`YN(6Al z0jO2uit?udL>c6cCsdAkX+LCT-DwVt3msD+rRovz&E-=9Jk11+5RjJP7G352!X(>3 zRKSa+ZavxJ#64Wn!^8G^mPWs6)*J}_UkeYRW_cYRt{>zBhp4MSC59q)%CuXj3DSbE zEn7b&Hm!mCToYVqY1#JZew2{}_yF4gHTM<|7w=Ci$=}|>dYTiC=5n~GOyySDYh>e< zA>QkCura>or4GkRLLDwhs24c3YH7u`m4WRVe3hDr74;AY?*-88OJBRDnyOj2sFTxr z+6-X)TO~n~rEJkkChPpJfO)#K7(4}jHAjQD3-@jMka_rfv&|?Z^k!a+zB+pwzqZ)x z-OKuC0oKtR%!!lPN=<2Mwcg9!_0w&7-k%Wyp))aS*@PEV2w35h1lK8rDqnzl4}q8O zxkAjX)$J{B+*#ZrL>(VL%eTp9`0LBnvlO^(jOO%4?ro#Nz9 zWzPkTA{C732*8<>V9VVlaVy;%$2x$PG2^tIJ4XKPA(d&_;?poElF7HBE!)M|A1B)8~jTPeO&N<`nxvH>}O4!Py;@;pM&hU+47i9Vwv^-P5gM zWV!2U;5Ly9=Q-KTr>GAzEg0>TlMWzZ3(ah>H)F#8$2n7czBN5urdb-@;A%A$-mG(g z=L&i~6&KK_MRQlcD-)#SC zid&90P(5#?j67fuF9}dpP{J#mf{P}&VOudoI}9 zbwTB+p{JO&ghMnI-P19#cI^rdvkTQUXvqRyUVR$v{UE70JC1x0|6gga&J;)yd4 zNqa7PR-ndVnmZ-=VyzUXo!gHk4IgoOfAc!-_eP_5fFRYBRxmTy>*hnl zxr0^*ZS-yP5JKAC8Zv9Z1=7?#fpEGKS7{-jpz^o=ksdyQo?8B^r5sC>p)ep~3i|VX z%h)RKn!r-9R0DBY`r#h|&~&8&_t@@_GuVny!k4rYdlBp7DKuw&dPJcE3z7;8s5|p@ zudy$0pg`9BjuDUNV8Em2o%)j>iokvc(u>C>4~nhNHJ&RX0S(nq9<@d=Y)#thJ2sTi}>)#zJKl~C2W;l=0UJC4=SdCt~J57hWL~C zJFwELx&aB~()R28`@jTXK{`nFGTT?#zeByQ*OJ4n59$Ju-+xg--&0w8RofJhu8MsX zrDo-VFoZB`9b`=b?j2_O*}9LNUnM;1;GRYvNp(JVy+FF{)pVG6+^JyB7_&j865$Q= z50i#^;?dD*k}bwbo0x1Ow7nJ4}iMcX5Qk~ zwI!@}3g=oa0x&D$P&H(W2mgIM^ujS~Q{8LzY2&u-s=LnP#o91vhib^@I>mH*sPlrX z{kjrl(QqJE?<~+WF3Gze^xuE0VR)?i*!rq&CNzTaV1q?W=xXI zCL;N#r%Q(2ZTMH0pRM4Rnwq9fTw1g+ThyIKm<+MEYwY)!yieRt^e@a3qxW-GOC@Wj z!+Pwp?wk|V{#)XNhREqMhDB9!p=!kJ5v-EZ|MQm*6#At+53Oest&vV5INCH@U&rL} z#2YBN3h!X%TOuZYYivh?lzTwu(zOizG+w^SJ^Y&KE)3m9wlIa@zNqv{gAhZ-}c;_Pk9HsJTNfe&X3Y9ZFx;l&B+k5W+>1Zxm;e*)os-C`7V zO_T_CxF#wTQ!x-&?MZM)Y7=lwU%pd^Q&~)*=~Y$D>_44pGx381PcFT%+jn+GDz#L7${SPlf}c-)fP$Gp8n_EA z)l}lGp{yZUr^Z*!2Ys0lY5psG5Vpw?J`iVm>%O7GB^2?oYD?7#!Xc(-wVyagA{mu@b`y5`75rQT2^~GJobAT51LyQKP?3Hu6=F(H`^xei7De0CkVa{XZ9d!morGGJ#MHN5>e|{Q##G}}50V~C1bNsj`;mO4CiS?!nKt#75S<-@pP}$o z9q`t>+y#RMGfmrj3)pXMG63h__cJ{L2MSk#ZgR6=1Qm=Uw=V`!0NvH7E|mb@-9`hWDvI|D2WxGcj7W>{>u2vz zt2#&--x2o%)KIKl^IRP_wu`K{TjlDZ=>yUML0e>-E#%SIq+$kPA)I zYLe*Jf(k972fF>JG2PRnI70@ljP|}hdEK1N$p~D@PtaDtVl9u1>hs}-4$qaHV^i71 z!4vC-;;-AqDT7w6OXIV7shc>ghnVn6i6c}&rZ0#&2GGP_Xu37|G%k>WkD()anEwI+Ng=x*w?AC=|> zi+wM{PX1nH?L0b*;{QW;AyF@UFWvC;x6R!R`gC+iVr!Xo#Lh+BDG)Y4eJ5eM-x-jBbfgROSjCK}Zvzr!bCYBO9u~l7 zF~Wf-s3ES%ZaeV5E>2F8jr*6?twWGqCn+5t<<8mk>r0L8OFb5YWj(zi7z)bZQ+brn zRhPg@1mXT?+P?9svNHaf zVxM|ls)FS2;AHCyLncF5e`psT@1jx2N0_mc?2pmET}eK0IQOVwM*fthnQ$^z7Bqez zphb{LfdMYEi6LcuAc%wEbys^y6u!6HsnfyxNS|_=Ncq1@x<%jxFXKNqIQ7nxLsYn zx^K$3=yZPDx_y1AlYt*#8Mx`bjrLk!ziMC-L@0XU>`l8~ZF$$UjwuH+d%ogs-`smW z{mueHyQ%y5Dx zqL_K{g#J!c`4RIaSube}r?DB3lg^Yyt zZK3XVk&J4Qn+x0^0Av5G7On8VCew*x1IoDo={LYLi|M2MP{;V74z5YTF4h5kYa#8(5~V*^nJC2N@ri%k4r= z)>b7&ozk42%o7QTJ`eGOl{`W?lVRp4-NeSHD*iZ9&X`Ul?jsjN3}%A8$DQ0M32c%T z#8Lw9YD`;CL2@(=%j1WJ$0LND!zO#QEdBzJ5OybdcOwb;dReozi7W5^AbX$b7TJ_- zkQQp)cQN5K1awdiZHM?AeoFixk6!l`e0De8uEfc@V$?|AajNp(FF9)xdc8)75HSFY z5x19)#oCRd6G`I=Li;iGLe9#|O`y^CTlskQD~ZN)9aZ8;i>6<%0KaC@-7lnSIW?JQ z$BOY0*i6&FCRJ2Mr0&-pFz@Jr&sc4^N;mZc<#_+#-7N`5Mw{p7=epUV)8lnO8U5X; zqS}PSi0Nc$vMwdwF;T_ukiO7LJG}APh#Bu5e#%=6!5~LX1b&tI^C)Bnr>h+YJB%>v zpWw|e{irp7uV zU>U%M-HG?sD7zbQ$M)Drm#c<<0S|?roaw0hkiE#22iD`c2(&$&WaE9G$!~F^hIf*n z&y(e&Td7Oy^Zfw!qu}H8*wuvK^LMwa>qDYcYb$9Rfr5x!#R<{)xbN=_PPW{Jxmk%` z_)w_rC9!^|HH!iw@ek?C+wo7=FPV27YCOl6J~qa3qI%rs4=8ElIfCN_*4Zu0eB3-2 z<~++-Hy150v!M=T22Y zFr*>$?LAD@AMy`=(&1g7U1;R4oQXLHzpG;jdgzJarHtG_t{3=2nb-9w!EASV5Ze6 zcGUB!^_l#akZuV_jDY>67h5iJHEre3+QNKpKiEKWUAIE1g;GwUN1*?2PkME+_>#cgSJLi zwOEU})RRwh=XpA~B2-@DJw0~466W`2Y_26!_yh+p(A8G2_=Q=2UZ}t`CuKFbWv&^= zW?4TwOeVcZq6jfctgDZy*umIIhs!i!mGtWvluX3)V?|24Qs5*-B8O9hK=Lv78&o!5 zq`^OsRLMq?W!4d+^Q8 z4D2%@1t2HsXEsO*2uqTVAG|lsB zn)g1CAGY|*5ccM`+vimshQ_$j?}Izb3Lj$u0FX4_@u@rEaGMcD$DibRZkG8i7yd2| zCHllu9U$v?T+jj83>^8p@`h01ZPVv|+P<1saBum2ZRI3-(pa^Uq?`BS+{fSb%f}a{ z%2Sr|H4{X}r(5c#k2)j0&uFy#Oo$#Sl;cJ)lD}7lVjMrecm!TgjFs(uHLO^{6w==$ zj}~nu?CGV=jM;M?MmmcA1Az;~Pbps*&Sfkq^luuWL%Tt1aTt7cbqeR^8IIA)VOQSEk?0|`1V!?lq7+rwP#%}+H_ie- z_TDlI@0nJLy)9w7LfRx^NB2y}q2R>a@xpY{z+&d|UK!~YEMf}SZp$OpGMY@$eD_oI zv^HljF8xDR@G5;><{@VmNUpm5NUYO=wxT9_c4H{p2*gocOsf1V(&3uK-K`TU;x`%u z!mBW)gzZIV?UV2C|NECVwy7pt5T`?2?^oZaBcE^R^+C*d-x55y4Iu*QplD zP0V033?R!Gd6YEYs_9k0#!r%s*`o`q*i}R9&d#r>k#bINU*g|@Yfxq9C2QBiSf=xh z5fYY2VFpz!!axjI3tMzcA*GQglk8>`;$u`cnoyT}K(hJ19vOet+v(u-pMKtRv7z`S zj6E1JBsu3VFrd{P6V93(0&8BZ-7*oD0Jg44FH%J#`KM|iUq_C-hJb3?q0&r*^qJsu zyE1RQZG=GBG9Ggo9}#2GrXvjE;qr>{nS-}H{Kp!-ZBSE3DexeZGW?im??Tfv0?_sB zr_gihrSXBibuad;+xEuywlfRpNz&$m1g$(!5pSTJx(l7fzFhQrl6rTi4BElnz1h&` z1Tgtnm^YY5?uyP;6zrPZ(7kt%bRcft{UEvTROTBuGOp{n3MO9tqFF!2 zjdC-Q^Q4u)MPt?NTe^=?paLlTzFa!?euDx+sB&G_FVnRREc)A%5L$v( z=?u7aJ{lLby-wGPo|eyI=4-#xT`DkczN9}6glscT;SQ36zpFYoob0DLlp2?xY2A2Ya-xI>AM#hkx?)>?r-72;{9dsHh62wLn)>Q1n~KbwuvQ?>mBtf9`j+yJWp-NT$8+aZ~tOS{sWs^S&KSg-{5wE9d$ z^7(H54Bg2bjs!Ysd?5Q?b6lPkh0Drf%LYW%bw7xC{JdYsHSkDZ6G+mpqbwIuuyUM{ zDz>AM&hugX{MxZrco~wl8Bq1HuFws98vfyBwczHDa{TyLrQS??g#z3KwJgS)B!}3+ zPiMS7jc2OvNw$98do={JbbftR-BnZ{7skI#?y-+_AYvC#hoBGR=_z^P8XRq-h(srD zA5Ovaw~VHPd|SSVHhK+Rb6VehpA*>0?do^RoE2>uuo}6~E{%pcqMSt}ktljpSupUi)Fq_T1LuGx>bD!;~5s2zIO`%mQ^X7hl@K{57 zBNLLfdr&^WycA-y@LPzMrjbWoo*FNO$NPF!ZRHUw)hqt=aZcZ(TAHo(bOf zD0KIAK*|mE_HiO_t!Mqh1_cUS58Y@EZUR@ch^bGH-`UFmBrjX>R|k)8qpX#O;yZb>D>M~EBLJZXy)?0)t7VTaUOv;E8hQ^>;lai(^P zM~Qr*vy!ZhZ=My}iVSCNIR2C*u9v{9^}pFfVd(NItxjl0CYl461}d?IT}Ut^j9{~w zw&UuC6CilO9B$Pb@8VgB(7@jTS+UsFE@a4HAf{Z4-Pf;A7)%8w|qKAVcSb-(Q^pC}7Wc{!=t@m5JY`WYvq z;rDB|*-JnDMA@F}6oN^0J?khA_v51COed1we$^H2NHqS_IPYOJeAInCcY4BDh(IhwY1Aj-N znTkJ84n-N|nLt*#?nNECeHKBtsW?ogTCj^O@y3$`tzn0nbXP|kNQS{Xom3(!9GRc< z898#uYtI3#aXcpo7cX$GkfAT#Ix;8H4WLj&&C@ab$DWgM%4O~A3T1x@6#G3a&=IrE zA6KyRs9fk?vXfYmOVsRMNzcK6aw7f3scZZ@ddA!=7B2mDfbP8mS5q6bO)97c5`Uw@*&nMqS1?_=NJwDScQik ztaDqn)rw0UW$YC+y@)&4%S<`|?Q|9==SXNf||(_m6FY@S=G8cNK8-?MAQ zoyt7Tztub)a;o3_V7v2(Mu#VJ^1MTF$ZW@YPyy1MiNhR64X+Cp<@TWsQK2=Ia=7aC2$_J#M%9o7wn(?N-Fy;atpaO{w5e3%QD zHwn_R_higyKhFWlpRWWB&*=cvohT!Df}IJF&|1*zECmz?Uj{hq1+Ckt3HrzUX@T5+ zmtM!_&8BEsL{xeEeuu8_HzEd}9MBJI&%=3~TWMVvE?n*oZEZsp^ML{HV+Pe-ou`!4 zThu<==7|d@2BAIbA@Z^`&0B>F;|)srY#RE5pEiL0gxWq6f6n;8dbMi0Xo}IySAsue z;cfFlZKY+c0kcx0pH)Nm^Ap8v1Ri@G0dM5(E}ZfgU;c^6_iZ@qZU!-26rtO7?w{;V zQR5^{r(dnbvz_-vVyGIt&=dG2(#p#+B#LTlfeRyJEEE+MV~N|Gi^G)n3+Ox#fRqH} zgRADR!uWzVWKanEH2Ja1g=87h*^Fb!TM1w(WtuE^YPN151^%n$W%5d19h01CdZmr3 zc+aLMuxP7CL07XN$2Pujs}FSd;$(UwPo7)#SWc#&d8-_Ez4o*IExIqBM)%>i)L)-Z#0fF4 z{KiLlvcPg-UiLYy$h%T2;YjN+u5wMJtwbw$=@?g{BC!ZLIWFbN%{?{7V)b!$k<)0DN-Fj=8Hc$@ z$S?P6njyy$BYW{jAKrhEQQ{O@2RN({*c@z9V@BpV=eRD-TZ zaund8JM+hb4erwVy1(Fai)qT&S$z9N8JF!%pDS+A94)NL@oBj(;fOjKn{=G4Ekqr{ z^5B=?PqOkXL*iesSs{HqeHK~)xu*K~dGjl#1}O~Wli1(H7qznKDu4+IR9Ddx-2K1* z00je>%?)u$`IJ~#qG*HaLwqj{t((EG66;L)_zPU+Fh*cwVEur10-Lf(_TdwJMysuI z2Ufa6aED*%&5II3=?MzbdJh=CIhwYlcw4XA7X;d)TfL!k_@n!&;NVFd^6|Cks2E#qH&Tmny zr#)Ov_7iaDc~(M%#BqwE36htjXYT)152gg#%*7Y5z~52q%Z@s{FWqGKy8-s#wAKOe z-Fm;J#v=x><+8#FY;Bo1Sa3*^NpxhHC@~2~!kbXmlfS`5UF`JH@vB>TDjJYq%j9mY zbRG^ewn$M1sPKmsdhv&;6p!uCpogI>f;k9Y5Y#F9ghhW3GSg~~1tUnCJ#Rj*zTDjO zo;=oegTT37=KohKxd-!l+ntG|mplt4p6pZnsz9ZXWY^ zpowQ4aXE65+XIWQZS}LbR@suV3pCZ+u1u2rR~^+*UtA1^@BS;em3EqlKeUBP$?ll~ z(>qmHE{Iu1oIj6LD6Tyc+{!PKm`2V^z#*}r*>F_b`VwE1sh7jRPgqx4P%)!uWoyQ_vMuG|S;Ko9)2>>r0xL z{7`ib87j2CKF>p!M*<}OLIK5yC$pCPK_9i|wsTWf;O4I#o;k1yQY#XzkWG&r?(4%p zD@##*XreE-0>d~BbqjjUCKG1q(Yl{D-}kA^^|5TLkw@pqvypWnxx>>|X9MVy^*d%A ze*UOVOQt|jpNDHnvDyZ&KrEo)8gi37wE9tb@zXTfx!tqAo-cC&bVn2+mV{I)v)O1B zEk$-{h-40+Dc1bQXT(CC@Yd0+s zMm^Ug2&sx9BFsjvr+2SG#PZY1N^ak-yIlHEbjrd?3Ouip)gNgyW|my2D>l<{G5TI` zD9FFbB$g85j&-Z`Kxy>gix1;@GfsS2^>Il`yg;jMnGDja8lE!7%4+Fh(Ona4@c~l> zl}`mok&b%0TPFx|A%f`M3XieB(xU$7bD4PXo1bM6;Q=wfeFW{~mLhMsn&Ua?8FFCOOVb`M zct;X1mOCJQ%CqC6$Ov}zCaO0mWrSuvXRHtrso$YTx~L%@>0FD5dGTLgajxqQoSNrk zk$1g$q5k|Sff<5oIy)U}{0C`a!bt$z6)JQJsQ60>@s?*2AqHVuI&gTeB35^v6BAN+;R#APDkA|N&EYRrjbIUE6{L(` zjd+~<(?5OdTz{yuTG}{*mOyl;dq1>vcw>F_C-ksH4j<=^ zrN8L7@>~}SP(bnQ4TU2**#^1c?a@)&&DDv2p1_Z)%M}ha6n!!hN?OhJptL{JKykmh zSaYC%$%)>lZK*@oVG8$cM_}DI(8imuY!MKGImD5Cn3?K!bS@qLtdr0=I|o&*$q`n4 zx{B{c52W&Hy`6h_z_yUV2|a1I3_PFDv*&Iu|KMKtM%-w3Y-eHd4S}mY;f}*bjEc7O z*dhjxrAU3B<+ha8-Eb5gYGDsAc5Yt^f*u9EnSwKes)PNO0Bfh+`hU|L53|{%lccSh zC0e{`_LqBEt8jY#Kw)ypy0{R-Een%JYUTqv&0G{xzZ(=Edhjo;KalO@;6+lr7QxcA zGZ0=yt+B|*D+j&Lfe;@o@9=TUuqi#)4{2O3ux9W$Y$MzoJ^#B2%1iST&V@A3Li*mm zwD$X;PI4v@LBuV|BW8>g?><v(>kp)Vi z>&?D}k&Wai+-_$-ycNgS1=V#$fG&tGJgUXQPn8pp(2mF?=4%bbWG{A;y3+?w6nh}0O&*`decH4qcqk9$#+pPIHPiF z^f#@iPB&SjbAtVNu*`*%Vi6qJ9}!zb-3ll5LEU)0b8B_g&#@muA_TL#v3zG4 zCYe4QjyF2Hzr=l3CEVg1?YBg>q;1kEI#!(`>v}L}`PWP8m{#3%gLc0=gqrC<%B>17 z-N;j)t5V7y{d|$h9GwxR9pX5Ho=W*)cKWko{0T-wn+N9+DXqz%X)@G*qdp*93m2R5 z>?n~uM{8EGA+%5U`FO+8C1wuB2G$j3aGL&*N0aH7MRU9<^j%%jSFx!g6@R}T6lJ1#@+b3b`?;ve)%G6#U())FLDpS* zA4K7GJJ4)yZFRf@0fWz8laMue@}!OstB#bs03UCRye{mp^%!;4U*q@>}j~WW^qq;U!5PP{-sKG9)5nxJ{bn=Tn}v~t&>|d z;C+r8a(V3f>`zDOWkj92Sa|1a(aUqBWfaAZ*gDH_^wnsyD4KR;|5n?`Kf$}{nwCkPB!;4MKT@&_ zYkJq3BE&3mTQ{N5EjDX$bm?eIh}t|5_fXq&G30o?=MGe^#dFX4jx%fQa`Hi2)88TV zT*bE%g-etgci#bcY#us1R)_i-JB?A<_xeuii|D`Qk^9dvQ;$riTf#@|4&SO{CPzsy zh+{L+A!YcP4eB1pYFi+AtlnFBz&l_q6G9}w*ggwEMWS!nR+w3jr=V6jhoBC5&k?u) zXKykVuLk;BE1D@=FP)0eYc2KgS@KxfVc3gzSjb9YccAJCyD7hrjZ6Lhj3o&lS4*2*BG|c@ullHg+9GQt0 z0w%Ayto~e#PNCV=H6<>eV_Ju=K^L9bpsZAw>tan;p!NJv=qpymojbRw=Csh4uH0gs zjdo6I>M6y^2GhJ}FFT6;>^Lzej1E`SBlowj&mhG>4hE%f80Dj z@!f_fToUkzvS((*vZL&WIbQ9V;Udk`hlJe&8~_iTyqEyG=g}=|h8~75dIS(l!e?AK zfFA@IVLYlf+K7!N0dAS)3%2YzSTn2z$SshuX#lb=QfIvibd17%t-rtI?C}-tQ#x0z z1VjI*(R|DH!ZDv!cj1A{-=Df?tP)xIn@&WJKK`Z4LS_u+pJs6}A3!8pRzhF)DVlFw z&iLY$tZWX$_imkcb@$jv)Rr-=^+gl*A5{W-!xCZ0Os=BVVVGZ!vC*X$IW5b_3R|Dk zo5d@aU6W8nYd1c8gItZGAK_26oxIRro-Zzg7#2keTD6@%1~ncPc3Qf2a6H%TX-9zT z?*1y5K@>Np2N_*rp3t{UyKBK9xxMAEZJ3D9=8{C2be>X;X4_bo1%t4NQi>z1^LBVO z8*(|ESn*4iw})$IELC<1?V+uzh_YGf4ii(a8Che|+#V5%dCqd^wtcFkhzxauumo8` z1W&45)&Fp&(GVj2%o<3O4r(dF-P>;;7&^GS4>f6HWR2(3%HNlg8ynNGf&1zx1TJ5$ zd}N`~uMc?c{?=t@`8&Uw!>cZ`yty+1zD(HJHrlk{u>Qrt))k0bGcadoqM@~zp$mNc zGQ*K1Obe(C(V!22wvt6TYRNxMYtjLH<17p!vwq3Lm)}f874-lH_&-;7{T`VoJ5F&;UE$i1Zecv@R#Uj?Q8`khV5M15 z$>ZwU<||j0gUtN-6|Fb(EM`K?7uq!qfxJ{w1q%Y$JImIXO`crTo;b!R(TE&gOub<2 zO3ROx!C|T^{dN!0!X;Yd8K%diEH*N&Ao_?romlQdjc=Lm@)v2pjyL7k5RGJE1%PR< z%!LpILV*jY({FP)H_^J!O@ZbFhuY#HDdqG0aM*#XIQS>=0?os@lKm%O(b8~b^|IUP zZKJeyVE?@tHCVKcUQeK7_C02XA8-hzrxg=F-795V=yW9*E;cQ^0QN957XT6FiQWFp zIwaw1IzgVU6F($p<;Pb?HPLaVv9=lib{cs8EvdXd7C97~i(YOD=`L1aS6zOIJo0yK z7@2Hk_hemGi>TbspGvq5pI*Up>!S@f=g*_nY=&a+TI~FJyq2Jm8_HMQjM>ir%90Z! z`VGM9YNKuJP4e&pDKGIke${b$GJsn zcN+fh^jJHBz=(J=xDUz!({b7`D_N)R{Y*!-!$@{n)hUrxk?JRe_5^MjQ&VZI=S!3dFkTv@P2;F)H~nQ2 zj{|{TwH;y2<(Pp9d2;s3`h~68Xa6BL5Z(w|Ea5Gb?7)gphOptb?Dy5KPU(4U4Atmj znc8sJ2r4ogkKtg&l$&q%_xLGdF*)cd$9V=U^}=1USEzobk@(|C{0?@$u;PijU*C0u zkw?}1wsu5X(15*@A5EbJ0ni)XujLn|DPdxuBhO`vliBys!k`TYy@k)!fHMux*=pK< zGt-sF#ubI<;^7A3p+`xu_drP!YnPviJW!{VFu|e|%JZ-?4XzBbInC7Jdhz0_!R)WH zW$-w0Q6rIv&Kn(L6%iDYa2F-ZawhDWTd%wXMCX2idoi7VTo|k^7g#=?7TSodKU__* zRQgY`%y&CXJkdZ_4V@LjWH+|;jNxA#!K1x{K9e6Fw>d1PQxX42eleirvbq26=KMUz zfzq~Ll<610XYgP4;&DiDp9B(oLlf^wiFt)egHq{#WO3yN;ynx z`;0gr8z4AL0l~F%*bGsElkd-PBY{#Bv-}1y(QI&Q)IPw3!C$H@3b zG8@%AiK^?bu~h~3Mw@~6iGMtm?9%1Ei3`$7F{~k$IWYZIS%5zC#>Lz|Dx4RyjWY@wFa(HA^*a3_Y)}t8Qjqw0f2e!4 zxoN%{IteA17$4zgVanXN*p#E&WkV;~4stuV@hj=ips7aGccpW|3&o?Ic5=K! z>iFg*v!;_DhDs5zPOiE*s&`%NNnMa;N#@Z48w%2sX1ctX6y*wDFs;KZV2`mv)!&0u zfiW1tdrYV1xM%aRH9ivR2!O63N)Juy{Ff6Ec2dc9G}%57#;ODSK~h7y!5?z@yaa~O z*BD#x)&RbJQoP1#_H8yepEU8sti`&!{`r;4 z3^@p6?=Ca)i6=4;m2@xqZ&1?;Eacu8IWPL!TQIsBqm+B_q$9jrS0n3Mxu0yIIn*-m}izxJ2^dw4+HQ{^YS=s0f=xd`Z`d2lUr zvu?>2q&$hskYw9Gq{*7vv+pRGZ5CGt7NBi6V2*L0l#0|HK&{~Jqu`aC7iXRk*!^%_ zposPc=-7)7Vj@{nFX%i=b?vm?(Vjagayz{EC`z=5549Mp$d@IjOJysBmiN9xe+ zu2X_t@*Hd>#rzlc0uQ^lf`%+n`{S(N`vpI+5ZE-Vf86Vx=g-ZUU|}t2^DP&t*@$J} z#cI@lL3FY8@lJx3vBbq8G@+*BJbuHjl;8Qf4%U*v@naa|%HYB+v!O~xI0(t6hSzg> z6o4tMvM2NI+5KBI5pnMnC9L9Ag=Y4UNO{}&KbAI)$#?h@w+(qmsDuSBCO>wL(-qz? zXZ>53ejMVj?(pZd(r9y++jTR4ucp+neuia7q*N`;Up5@65>FkFk9mc}rpFZ%XI=Mv zPvFI6S}D#9yZ23h2cJGvb*=9D;mm)^#R;l|rbA#kl4NgX`;se!rOliTSF`(L_@&ST zmrJa(hG>4rfWTE0s6A+v#!{I{#g=OH-Wj&1&L6!8#s>|+O??(BcxL#FsoNzO?Lf3} zcdh7(5@Wsrou>z0eH!=*;6Lp4V6}hzJ#?^JLw$d&LQ1EBl$0#DAhpXvGjlUzP}106 z{aPY3Ca==#$~^l!%*S-u1X~R7C5dw+9aOSh-yjlwD7OreU~6Ky@a-Ys5yxt*dgEIv z#lHxAV811?vUFh=48f>v{XokvuH>ehx|}!(XsW zuiP^L^)g#5Rdl@}GTljh{s9Nc0wShY+MAu!*?8TA@h2K43dv{>rreejBcHJR)>LIFjLe)TYhs*0ZTqM27J_XZe1J#P~Yw^kz=4& zVKbbqxl)qx`}TkQG}5Ob!GCwz7_Z6~>vbTzAjlsJ$#&@b`rnSY6ecTh@FUw#$sN^< z;8d|lSOwzHaB07_F)Y0Yr7Y=Eh%tZ;C*2kT5U53m_*9g`EyAsa`bY)FxR4yPFtmhO zM$KADOvZn*=ZMU_h`)BDSFaSNqq1|@n2WNeWZAJu>{%feid6sHRVNx4a z4JGt!r`w0oS%@M(h2Izx=A~(Zj3Jm-DpD97zU#Cqx~P9h@4NtYvzZbZ`7fQhwhg72 z-Jk;vUdzLNCWmAdk|Ta=);~g-;yS^a@OtH-652<(jJ}O=kC!awN#^)7q-%OH1m6{% zaRld5JZ;qbS)OZ0(>BB*kVmY`=u zA3qgxa7qd)g6sjKT0N&b_UkS2+EMR8FL^#MUQe~3(mncBtV)nS zQ{EJ2ng}?OE3_I?Yc5BMz}J1-L+ z`?|!lNj2lWOF&*O*kU~s{XaE)DUzQ`%=X+at0*J*4;rDjdi2cAdsxbvU67*uYPV3Y z0qZRpZ$mEIHUuB2tP(}khYR0%B=QIc}3gPl^QM!`#Q`KY_ln4{D zvHxM*Kz~I(byF1cplq~sa&2`lfM(h%Qs;>aRo5c$dKZ)*Z=(aNps7-Ky{LA7PHevE z$EJGYAMKlC%`p6;?nKEw>E^I#v{p)(6MTKH>fQad`I`^;Hut$n#ik0R8uhb-l6*JA|qJNF{%g&A;%7WDZ91Pc zYXQ*0^L42i8lsn9K=?*=h9E!N%xoZQ{dfL#(l)y5-{+rL+VCYzzaf{^Ql)+XT8hcc z()!Lx@$7nH+$BoPj9c=%Dq+>{6TAMF$=@TRlV-uZFsDx)o;*qezY^9tkQ7}#UJN=~ z829Kut`H!PucTY&Al7BaB7DEmWZG?D>4GqHy-02{lCOIQE`oCi{4Y0OcY)ez!gdf? zI-XSb?w!>CYV5)uRDfNE9fd~rvw>$A-bt^%=D?A@7Nxn!!7tJgs?hz~Y?7Ha^sEIR z)_Q(4vD{EKIVE%t&p|^VS$E&G?`x893sj<|)$}Klc1I}03X-yXDuKkE43$t?%Qi~g z;|Q*9>@MibQmg? zwc|4NQC4@b`VY1yQ4}UA?%2l>SsNd|jr`!r`h#|4Vb-JtQ^fTEykrKKi))r9H`L92 z?pSaVIbY8z2+z}PZ}fmLeCdc6L-M^sGC=&-25jT?*!HS>d=acD2(3)#>tXw(2^pG+5AQ85y6k{w&z^spo(4^{QP9Qetlv&ANrw8yNo0 zHE9H~B!Qt)WM$ky!;4Vx=Xfl`jQVS8BjjsOC^FP>qpZ9J(%c^mh6~N{OY(WYuYJb3 z&=St$16`2<&ZuC=jhg)dd$;Rn-qlNZV^fOxvhKkDlqN-;vim~)Ad0?iOd$C%M4*&H zj*_=2>owN-4!G$?(LWy*nbdKpIU$h!;sIXfma9&Zxcp@z`mWj5Y0YnE^{(4*lIl78 zy`aGtU^+nxMig4%C_O{K?QfVHus9dZ$`DH)j-sn#r5hq$r&IW$?GQJPl;I%r%h+X? zz0+ek@zZ1nFc|1L?S(h2clvY&tyweRlh=-lX638#JrLYS+k*jxE*1a^sm@*DtADA! zuR9pe29u-w9l@KnUGxC{#SM2it+4KpsVWMp**?o-WqDYnvS7;4JyNWh>PlKB<X{97<$FFiV1hYErTnruGaS|79g}-lFQ;B1CMXJ$oCl%P|kg3b*SIN~@=Rn6C5R^1FI!YXwH!2}<*c;Z= z?$1PMm?J~{`qVgAnyA+S^XFi?OiV7!1mEmluM`Gw_y^{7Fm1!rFzxmkrPzg^(ud8 zgqGuR4BvA=3xH(0%B|JoSvo-9c;}DrgN_HlF(p`jIGr9PTfWebJP$jHiTPA>Kp70_ zp(5vrEzIH*YaDzZ2!*srqRog){D-xm^=@t~6a8pG{f|wwXk&6qnA(O*7{`EwS3jk# zdbF<`o{|4P?T^zTTinx6vrEH#54oBbVY|goK>KAw2Xzq1I+IdJjIu4G7UW%Eq!ha} zlO+rkqO?J({aa?Jw1D=cmT)$9BUvB2?GFsRcuNTiR3%-;V6C5&)tvbcX7FQE>ugl@ z@Jv)8*##Y;R8%^Cq}3OzewULT-IsH`9S`8EoLl#00Pwy2^O3()aekx2{e0zq={^TU z8v?XW8S7vC0yo1*{J+p%0xQJZip$R^lvOpxO(72LjS2HiCd#oUcXx3A!h&xP!7jQF z8UE`jD9C4}KQ7Suw}~U(dwidB&kzA$hrAxl1P~mmt7xjmU}2AFt@ABBh&(jG!F?`U zh8xV};A!4EWPE1Kn6axBw<%|_$S(#)9%z;`mpfMt|9p}Kj|-K!ub1;|(DRx+uf{C5 z-VNVm<3aA8ePCr2v;r3(IO&X+Mf?BQ9SY%5`C zHd%BURqCM8;(J7-AH1e5I$T==>xn1PliT)?f)OYRE+9<@oD{}ei4pgUmP`;ft zjgE1qjQXlY@QvdgSDFuG9Om=&7+h6Oa#+OmsH;$`uXHvjKHLT2c!p%;t{8!5KFk6e5VJz3bODt_=wD>zFDAoxWW$f#M|vQfb4b}KzC1POsFJz#22)mBmVwH zlD-ep5uj#da;(`Rq4U0O#~-uhqET;|b5qdHCWrAC%a--L%R1wP@$~m|fLtYcufYJUbzh5Q+EO-Qa zsp|g?85{M0K>`z9D`yxsy-+I`WD4>a|T7(j83zp$ivDY0#B+ZzZ z;o%G{#w$XS&4fzC}40D-lpCtrzfFf5;-Y+6HrQ23;OSxLaQuM=y~cs3s?(uB&KOH_v%f9C|B z@=IRZ80a}0){hDe-UpkhNP|hxR7{Stw7^{G_~^fo4gxxSJy)dQ*s#^d6y1*n)^b}w z_HxfWTS8Z1Y7%WZ!2kU^jVfllj|7da^5!L9>vY8-8PYYI^1v3G&7_Z5e$JRsv@jb| zE?g1DF~kw^o&ozFu+UK(E3nUS7oYmjgI=i|P7_s_%1)HWtqN$MatY)^y(ub4qIVK1 zTeAPf3RYm^cS3YXe|tJ3rj76I4sv_7j=_5&**N1LH21h(w#|AvbD45-F^w4S_KyLf z2HXwFk1w5_Redg({@HDSJ-4$zF3};&W1d7b4tHT~)scxOQq>difHJuGHG2gYfc44c zS%lmD91x^8KQ7sM&l~Mv{S5CnU#}T6k+AMRb3~1S!cJG=Qlxn6t(=Lcjn96kBr{)$ zOFHD&ZS|n}mZqmnNhszWzqCO2fHH+;PviJf5`r{=Njo{mPV>M-TT^Xascu)VoQBg_ zCe0ydAu3-4$*Ww1^V7QSD`Dn=eFD$SH58-UB{OXJScWyD98Hewpxo%&){){ z=O?KjSR?1L2fn9Ad##O-U^vH@chq(dc`+F^62YbTr^kK9Wo#j4R!`FEkUMg-Q0?8} zWhSZ+kSPiMFl(9vlz%f)tH0_0`tdy zXLMbxvx)-e(|Q>kfb6v7m$hVvyKsM2_9q*}`-I%V0;}b?Xz&N|PXZ@z8WCc9yd2ez zkezHEq+h?oyV^KLmnX?qqP3g$k7d1pu3#>%70X!MNyve!rBJnnWr42qw={sF|-wjVo{kVtxfQ^760>@a9P6xt$MN{Ok0|ArXgoZ%$L3ABni_~xQ`lEs*uj~2h02c^`)-Q;B$2D`n z{yr#P{7+VdusDyCtVt6>N(LQ}wJ)01*UOYjzRmLhcRu}vq#V!c4ERYn1p5p&N5opM zd#|TS?sbIC`{9nQP2ab#Zxf&AmSi|4RV6><+pZ*2ae(ua1u1a^tg0(gvKU3`y3HVf0abLpUSBL4^%$T9tvRK-=|svd5N3`0 zmFeVW5nvDlU>a4U!CFn-hyCT}_m7=#ici4q+x;t+&r+7)%MCrC^)feh<=`z=<(Tfg z9!JhUiO0Uqf1=tKiE-#@^L$_x1s}0_yx#G@K}LqdG~?6OO_K5bZVOU9NUpeWpNw)5EyS33k%N>2jzM7{@@ViNH@YwQ4m~BT{N$&a4sQhzy{Q&n*KRldS z+FT!R(*~u1>3dssG$G(IoJ+nl*kbLz{vH);8Mpr6eP#)@p@;r-dAzW7WzRn?dBKEN znqat*9zeZhp#S~z#3pY9jD0E5^;11L+)Gs^ z{63L#-&VTXxZL>=9(qEt|!ON@l}Lm_#pIa{dUXoW?W*gI0!QYi{0RCBW2wE-TS=KWmFXk!fBN! zS{Nk+xHicmlPfKB)$JeEiJ%tm1rYgkeM%;4L>hv!(bh5^GATE8!&@+wOwLlHYr#TV zo{yhqt#&N2s?C63mv@zHh8pn(zchghpb^@ZZ!Y*2Blcdq_h+1 zyr*Pf(zmn}8nk|7;^_&C70)%Q3bpc-RT452onobB0S*+rs|kh~&0QJw!z%27zhycc z^~W-z*zkwQ<&&6{dvk#A1yw9$o|~&5(TLB-_TJj*`F_;UDVePX9!Cuy7eV~@Vx zUg$OYoc7dc))&(lql3u*I4yYCQYr3QoAQfbWsD_>*(@#VDt(PecFeg_liq~z;SSi^ z!{hS=X`52$)9tF^bAP-!JpZuI`*7e>GwV>KF7l`_U0b=NZp?ADmjJ_WbeM;lrzSq} z_$L37yr*VH^(Ph%sfNc>L&G_qZO;NQ3@(Ol=Li> z#3kUIXdOK$#%bi8x8pEjDX2Fp*%d;EBEfJ4_r2HwxcJTW#6Tgh@$*KT<|VpOm`RFw zD8e6=PT9_vb)^|whwWGJ{G261bva{86AjA6YTFkI%t<&U1y72C0(W&}TIOYI3#pit z>)hMY7P#zE7v9;`2oJ?i@Yk*N&%X6lfmw(;E3-JZ%eu$wkO>zmFRPX23@&f}Hti|o z@PZcL3Nh~L!1m#DRv%r1XoW{AF#ETV=QDxpnx5wwSaI&Ap+nID*Ww{-Kdjr0xYsZ8 zJsGz-GT=GD)j!L!rOe+QaMxMahZCNAY{>_CaAZZC6LW7t*7PQ$@;t^W%xlU*NF>A* zB0<0=f&+)P&Q(V4;M(*|Pz3qIO_n2}c+yMk^rM^LNl!$lu%Rf`#oL2(SA-IKT8jeK zWmvu{#DA}#dBXe8^$d_6rmRL$vSNv+IUAoQ!BpxE)!6-anhUhqZWCHByr2`D*ZEhe(Jb z`in0|u8oAKy9*CK5X}qf2%9gzM-ZH=7Iz$kBlM*V%4^o&vdZ$lKbv8~{BdUb1!#8l z18|ABQ`<=L)>+O7l9EsSpqX(MvvM&^Df^ughM7|9XMN-#btTg586D^t>+D^Oxo> zdx6wpd>SAiW8i3?c+q65`g4N~z@LMmj4CLX$4P!q4?HMGAL~+waHHXmC6n$EmqXg$ zuI<@}x$1eVG(_>}xoQ-Po|HDcJ-Kz=bcjg+LTXs6s%GswDVQFT|NNI*!nZB7iTtC5 zX+mjJU1|8!y7O?k&fe5abY?Yjwp8i8tTxcSRv}Hdj}xLheIh~hWQ5GuJF2O|N3MOx zxm2`R{@akJ>@`+e_-V&r8?$4(cKPh)&x?c+3%kX(7gc zs#sO*Ej~ogZToJT>Fr|r#9Oo|^vU%U-wpQ80U0{ueDpC~{`g$A%=@~qzG%0yqwbNN zdDa{E+;L%9;=tK8Kb*eoW`8wxnD+zi9ZjiUN+`fuPkA#?qs)Z*VYSL#bFu`#oOWFt z9jvjflzk?lo9|?ay#S2Gk*)wQyQ$U`3g`TDF!)e_ap;?9uZ)E65{zSDkn044sP%+1 zgD-rESw11Uh@NtBL{{=dvX+goR*SfC=z06aSCrAW$g4Z6zNt*cB;U2syif z9~c0MURd=9QQknvvPx;+=f(PqwkXmUBxhN-aK4v?4tBJjKC_OVu1XpRmpxJWfi(!+ub8c5}K`>!syr zj{s-Mo(j5{${`CJ&ml|d1sg(&zBX%>Aj_m=)ixDU;_S^uDrJA9g6~5S_+1cK8MIL9 zC8kx10eNr7b>d`EElg`1w>2Kp5-;eps{zE5kii zuwUhPN@{=88YrvZ<2i9%apgQD&R^=X~6I!PY}(4|GXRIiVMiKd;{r;J#qJVxX}oQt(+HQ zVMz1X7xSpE;-^lmedRZzxl>9lOmFo5$ye zn_gqjV|S!}2Ydp}+MS;t^OoE<2AgX_Ep0vB?;T(PRp_ShuJb+bnvaa9o7U zJ=aUro@Xa~n*xU3b41}Gvd&rBt_l@0(V38ImigJ$$QCOV*qX{3wX*{K0phMK(sz~R zSFH|$!KK2UA8`4gV+L}QZANVCSSk{|3n<8ejnOa8;dD<}XATC&@}Gun4aW?BPg3#W zE^0h)r59nU$b_AN-L?O9Mun6Z-S1L-n?35^x{hZy&^|*Juym~AHZ;|K4N{O`oGM@A zqtRT$EOp9qm=r5~$&=3~;@q`#{QBFeM)wY>2^5+cdwCd`Ww4QEUdXj`5vW9lemjF~bl+TnF2iDejXX5ngH5J+M`2?OC`z z4{*ymZW5UgmXE_1KSVWvrRjVbR7ASsMS8a;w?MYvr2cY719ES3$_ z$2I>yv2w&2PT9_Al9yH#0#T{;;X3z(b-!)ny$?-ujRkcir;#hk6#? zS(l|!?+`g)oKL0ci80|K9%3@1%IU(yvAHW;=yQ$+;DZ3TS=y%uoSur#VM2!3w|<#+ zJtx-_cI=rKhxN9U-v#Q{`{CSf2!f$XtTon{qB7G*ah?gyv@M%v`&Dq zS-PJAB1by*d#Sh~MVMccsS@_TifB}+i7>t1*K<7owbUf94l0630mg05#D;M|=3D2F zTs$C_qp4%bQ;;$j;0FUg;G%6`kV#(F(V&v@-7rxHmsu*4{YwJ! z=Cf!JM?F=3KHt}BvK(Z~y`0oq+KOyyn(uL(EDk?4c6PJVXLi=eUCaAw@F>xkG&v$nJsNb zI*Au>x1Pm0b@2Xc5Cod>@`jiz3;zk{f5qGQMaS%mRvbfaRdKrcPbv-4AJ;VZ zDcY(!VG&OGlO(PRYA9&&ds|S*C!hy7BkPgc6_u0~vkbUq6&)DL>oZVtCk<_Jt6N^n zcLnqmmlGQ*t*5Z-G@XhBOO!XH)i`SZSA*hAgLPh!M-Y7FtaXrzm?54dYZ}WUbQ)O- z?0nShSah^M=ml5xDchXQuVpgIzeF;UtKZ;kqw73G+pWxKeCe1>)8+ElY?73ppT%d& z7E<`LvJp(6kf#t_ZdV6NVhrut>3LzeuZAyA+^@>Fl`Em?r0{wP5U^iPli@W-%->r_ z;ON2n)9P&T=U>(51Wrf|i z1y9Vp_gHW-3>tj0i+QXFvdWBh%5wF7a8HxjR26y2fcs<64@dgca1Loj+les9ZT}B5 z*fo0dzJz}}4e(U#wZ;WOy=`%EBex3wJg=d+t5`&HL{M(dpp{*K^6j7?$n1HI!WUpc zM$|e0-;N+GxGcLnrh$TYD_mh_-nVm4H<4e2kjbH~y5e}}W2H=+p|J!}j2Z84#Q znlw-{NQPvGKVBiPhce12+eSu(N}9&nVr+x>mdsk)-E%6W_P3U61{r0HEJ-;fEV_2G zoN^S6D;sV*I^%&$MuYL{P}S}Ev3=?rwt<4+_rwZzqo+;Z0Zq_k?(rn^9m!h~L;q@C zwerP&BVIvtE3ETvohLRJ*}2J|ZkT3%i>w6MefnQC7;Z2-gab)?9wymWTf{b9ECk9r z-$#1I(oQ?~AG?i%x{UozpYU^!r}*S$#hp#L{lj36PPvhkv+fT`dJw6Xx{aUT=((qn zk-V^Q<8YNS?D0={nxjAZfqFeB{nnnR>y|;?@y4rg4!y0d1Zi%&eU<~bKPY4>u2%$-W!aBx@~+?C}uJ;RYuX?^LcUi^W76qPJi^cH`%{EDg(yHb-FqmpF4l3@uPx$oCdi7Cs> zUQ@S0cz*a>4%;=U&|E@(Flfra379nU($IYuBUpbO$T3!xl1+*!Vod&iw{XD!N{2%Ic zuC-^lJFk}uSpi5%jswPLQi!Gt1Kay88-5Nx_C7`I)P#Pyk{^6d_LH4VwJck`{GTk8Y2bdX|_fB4NB z;@JnwbJ$h+(|s=XoWfj1lRnMt;2O*BLD7{q6!!fve2WEzgsnNxYvBJ7RF@bTSIe=ZTSHkSANtk^mM*u9@;BnBIxV%6Z9-}b6+V4k0>*s*!#U_sX@Z|G^`H@cL;vlhG%s*y;MiXi zr(9Wjk2@2KhFlPNMR4WS3JS0zZOYoVpZ9Qmg((#uu+8Rcbjw||$=yx-5)0b&dwrq| z(0E|dSeg;&(l5(&3U{`dxc09I40=`=EKE@AiO2Ep@J!e?{D|+dxn@^M_4{V;@;Q|! z2n~GAVG%|kdHv%e-1T^4`RdM@J2XhYt4P}V9$8HA6bk~t0R5-&J&kzI1UiqOujL%Q z8kT$4{e1Auzw8Ri9b0!QJTE#-ufJ65SFZ5g%*?JC2WsTNG`?$EVeTI2_}?#M`!>Na zuo%5TakM;&!`4Kn-9^eqdcO2EPn{{yY4vy3X^ z%*1*MFR6Xmq5Scq0EM zqWBOi1PsCLSe0bs@~T;e#b|pHe%jS%D!&NMt07?$aS{&9v5li#t`7C;)RG*`k@?A@ zDDdt32#UMDZZ#k1aw^kDp$fNAm~s4?Sd5{;RQ?^V46h zMEY+t3^!9(_xP;{r%=+6GKc zP8zO0lmaro?fxw{8kSjSPQ|I*UlH`%D6u~m!+MYaOE`XibwA4cJWKP?u#MXa;f3^c zg>o>vpxf|yjbwteG&ODimINs;L{2rT(SFpB?CuiKQBRVT0_0IT)e(NIo)2{lsE=B{ zbZ4qJZG3`yC=!N#%;klA7Ut>vo+kzI9o$99SWMR&iWu>r&k~QT~8n0dWdbw-MRP9-1E}=q2H>`KDE}W zT9skL23^8U$$lTReB%y;Gx?{mG%H-JWwiFOmnRWAdSt);mKX!2 zW-2Z@4BE)1?DgFK;@A;EpRibOyM=ZCk~#9o{4wO*s(QL>)I#QbXX))51@;GLd~-2Xv8Gca1*B8bAY7`b)C%WeNW^L>U3tUan$!Cl?fPH0qbX) zgPxZqV+69d0Na$n_!|KrM9v!y1B&`;Nsu(#MRyS*E_ zZd1#DE)qm!{7~p&nJ4J%lOh>6@Fx2HF$nywS$XAb7LJ^Aph%!YE4O44ITiEGAMo!S zh|>@hvoP}qh5Z|Jg0m3vr=murBK(5O*Zw5r_O|LBf@je9HBT6^GkLIu!#HOtIWiXAo)TVonD)(S{h0r1g2o3 zy;N9xly9Zcfkv$@aTU#52zp{kRZ=D^7REy-%<#iP6YPB@Zwk?2%gMZCcl>>ni3$NTI22N_B=I%EI!$=PdQm<{QR(^n32bcak3u z$|Jl3+IjcmPF&awALAy>A^nmnS)TkgUAk7I{nw(1xJ}MSbT4={<13}Ui-~khRvSLG z50!GAh8+uN7OxzL2O$jdCme}L8n_2X2A^82rvm+lXFjvt92+Fu95bG`Id~TdPW{9Z zF*^`W#WLqqQC?+O)*>Ha*~pubyWSz=BY72{R%o)X^=@vOyk9JWy;)67q#^+CvX#Cr zC6A}hr5r)H;|lddkM1GQ^2 z&x(FHL_PX`&Cu<>2IFy)LrT&uiO!RiLBcUR2eZlNf=%3&8#(wf)~xazM)W( z0AL$=idbYqyNPh7QJL4ypfz>ilB}PL-FoD}u5ztKtXAxZogMng5##M?phkgoSKq?1 zoQh&7|7>A}_*yvMe58Ui9Grc=`RbOhN;X&!a~Kr7q1WfKjaX+1W(Np^W}(X~nWuT$JRKAil-dt&LZY z>+f;~zj5U}pa1K!{OkBCGVB5vj~PkvK!1!{SG72(qM|O_qa~Y@a7%JCqY^Oh7ax@h zDD^G*p)iM~o|Fss+}I-KPOOfr^Y>Z5>J$UX(3Cup-FD4vGyxl8&PTFTgFZ=!eEy~b z_Hrn%4O?!$V4j6CQz5D#=YPX+CEJ(0)>)yY+Ut2gMP#@$Z1O;kWCW+J4iuU8L*F)U zl<_{v>ZUkMTN+9XC|5L($X4wXJu=In{77Vo?j-G1Ow=vog>%BiUos65b?*>HR+{n! z>Pqm6CoB&+`@+T*UH$7yVS%$qy1C+Pr4NY&h3g=Sm&UG$rk_}n4k2C7tR3yNC|rul zXX=Z>rat6;K0mzqFarGe)H>TmIEHOXBxfXn86WiLO*6kcSKj#Prux)RQ*i?e9`e>y zq2BIvpl`Y3EC7$g2^AckDiECmWoqyPb*O7?r?socU(|>#*|&$2@O7-O_Zqo-1JuSv zFy{ST>HDM$177Z5f3qskzkgCt2&%?i=WT^&W!y0{*4_W&!C_j=-0H{^dNSPE{$Djq zQx24v4DM^^${A>pP36=D`W6>O%+8w5!MJ6v;!W96+IwV1vBZcECgo{#Ca)`-JhiUS zwsQ@TEAaU&eL|+@0zt!3ccIQZpXO6Di$FEqMvuk8c^Xd7?IJ>z0}>68u4yzO4Yt^K zXG5jN(5uHY_Q75Z0Z&9lv}ar*xik5+D;iqQG5;x0ByZ1czt(he@;Y!ok!`@@YpuAz zGA(2RGL0m@(rlbep=2^IW@}BQ(;81$({gl$H6GhK>-uS^^FxO1gW4?#9ZX>NfE?F} z({RBFssA&7dBhWb>fz9BQ}01XSi9n)0E#g4uPDiBY~@@l&ex+{lz@+0`ah2>$Npea zr`wnH@)w)Wf0w`P{OT}L)5P9hauDZ{ET}uP4ugWU{!(6}qE>8(-E3R6p{Y-H=Cn@Z zC$qb7YH97azS(KD;zXXWDQQ1BBtXc_#U{Bo(LSjajXjn@O$k4al2m-TFx;Mm0sRd{ zI~$HJsd#8WKV!Bj9_<}v!|^kdMRE--IOs0tXRoYGFIsxd(g4a)S-45heSIf||8<2^ zVSE0asKahyOW>8GIl;m?@z`THGGGVjm@aO{W~M~MZ10{cw7Fs0QN_(MXeCgiIVdWv z@{L*;5X(DN4tf5dD05hqDn3JNZ+Ex%r;jm2eh9F4uF^W`2jok&_7&wD3<6<{*4hyi zRfEdi`gk-${77#Q%@}x~*iQxT$caCb6 zSZkHK`Hxig#vc>Mnj&nDx?hcd;>&0oz4?~TE0*|sxK(uSWo1e>W8wtWVg&VQ+FK-Y z`80Kp!WKyoet9S?ITzDsZ`eSz!`F7Nk#6Mil;N|H2(RsDYtvJCyR>I-IQSpLFSkVH zQW3m1;DNwv6@2&aszpj`c7sWut`n6uSJt!meJ>zW$Ja&I6W(Vv`>y+EV^?WaYuI^E z=HIG>GX?1*sMMn7cQe?c8-R(PFQ%xMVh$ss#r-Cd zvF)5?Y}=MN0=pcqoDX|U5beRBn_KKy2uh-58+nT*hB%|~uBV!Zvz@a{m4jDl6Hhri zY!bev%tZSixL+Mn)idw6u!S>$%;brfntKW--cdKQk=WHMfWquzH;UfdyU#{SeAPtk z{vA^~JCu(6r;5Y?$T9I#f)T`+6_zw+w#LT}0W!C7I?95ljY^|vK>=rA1e$B*oKDX` z!SP1nV_m?hdYkJt!nt73+Wp1(nrc5&E2zwS>$%zGo_miVY}hVxXT}1oB>*AZrIV$5 zOM4cn%uySV=&*6Mszn?gDLFj=re0CrlE3rD zmhIG+)jHV?GS{iK8xsRNM9cbf|K9ivsvH{W_)P5LI7kqwD;CVAMxJYABZ`r^t*LyM z_@TlEsdpYj1p7BpQ5^rkm{uJH^@NTi701au9?45l5MpzP($Zx{wt+m}2|z-wxBUAq zbI}`!0jCB_*r-yQmG_!LHy^&@~;CTvi( z6g6KWOKiLQs}urdtB<3NWJC(aOMbV)lm@EC#m{d8NJ()a=uPYoAJRmRtx+!Cr-88d z0$<{(8SL!9*7l+2YH zjiN=BrY$ zM2Q}7&M4$}px^Z#-{|cV1qxxQ1@x5w>{fDVD_s2M*30DI7JoUI_G@GPz4qYU-eC)} zdKuwhZixz;_Sp*byYYqUKJRyO9T~;Wxt&XG1Xj;N`5Tm+fFSq!SEutvPR*ZJ*?NU- z{-GQte(K5r!yn*RxD{XTPdx5*n=eTUo?xzaM1 z`&uIF$WE$p!LLat@^VZ7BC$oQ|2LB7Hyi^t4s?Ea;)?;>A1*>saJj(REYc}smF$>P zkf(39c)aN2c#y-0JY94{eH`w6-OhRMZ@(h+wN>`e+!oyO{CWuiX#PvoI}}fXGut-r zh`9iRHE4g5qu#-x4<|}uhjbpJSo5)|4EuTf&}jTX{m#Ugpr zB(is@j>`iPX@Z?p>Um~lj-jY}W;_zDYbBNOxgBC0jkhekGMD_P^?uBd{a;D_o7UbY zf^hdsj==y4{#cD*%hkT-pNDZm@#=HlVb?U%9JoS(>-{mDyWBq%oq37N>E?;~GUl=fXkuKmh4_eH76suhPc~l}WZ7MB1Ok&ryZrK_;x#pXeu*q;$LtpC`cvr70$4BeyOXdBMymmA?5HT&1Y_P0%hjj}Tj*8Rq zh-=$wGxO(6ctGge@C{luEW0toJ?c@X@*r{NWayPm;``3WgU2U5`J=n(trN0jdi`3Y zKDSo!;Wl-0%+4T&DQ$YN`AgMbKq{e8FCf{c-oHkkqHHl~++dTJ3!U9%vl}Rm-8`MC zBeA;sV@eF7@(w{oL?e;qw&Ghf&>Z%yIt~Wpp&1K7slAs`N`3kY8nDR#0%Q2(kR?jdy@FsnzRv@`>awMI@p; z`>I&S-C@N&Uh*QzvDPGRzRH?ulgJ2>*5PPo(R9vquU|seF1o*md0$a5MX!rF_0(cQ zMnJZZUsbr@G~wo~2L1H9s_f_XsYIgs=FBS1U@qYH`hut{j5c8!0^F2z3yr_&<-wc^nFn zxFrU4?m+K1-~qPR$E7yxI5z7|j`=UZeWAcxckelg2#2+&_PUI{CBk%J_&#O8H4wt^a05*$h zJ^qnvC6=NifdN?9n6_w^OVlqIrL>Joc9_L3Y!`Nw61eNytuPzR;T zoY_)jce?j!lUCJLmY5Rfqdp~mNsC{O*&9DeI zJl+AXZ!VAaZ6780+X-`YEp|=!iN?No-FI&w!=x%Yt{aPen*i^JG!Rd6CJ#CNUwP(= z#;l7QRM->{lKT_Wjx0<(vwd+|T0z&dQ7tP@wm}&W|e_ zRwvC#bDP9vjR8>Yc7wcfE8E~`A4(Kk-p^RO<`U#XZ`(e|0Ov5yILBpuo?!jI8IW0R zS_L^#<o2*2?;8_G1#3w zT9wEpBpCKjmH!)5CL~BobpG5Cm~QbxC)BpOJps|l+@TTnjcs7CaJ2)HZY9+v>rmiJOgflxZ?(1LP6}&Fv z*G2a#iSU1BVNshwWQIaVc~*n~_mjV@i7Q&FUS?xlsq~NQ}cVT{7FcmTuRQ=S7$YW)ZC*Xir;& zSw)NfE~Nn{zwp9~qYUlxC(C-=fFp=ohzgT~SshJHG%KmJ+cOK8{c*?h(px3zLaTte zE*@YRVt!kH#0IMzZ!X{7f1szJqwb@Dx6f9Ut><^uzM`+SuqR6y{(Vv#xidVc*$UJW zH=7H^2=P~0Z#`6KBWA3YJwLm0r)T?=zsbC1b*L4cunUW}xCBfE(%bN=eN{>GmK>}L zDw}3bXHWyrpD@iYY=mZjJ*jLVnKKo}%iPa#NM}M}kmQR@nJi}xL$$FuLE(a8d3?TD z&OLAUlUrGV+wK1a)&Kv4g-e^;n}DJJpWDu@3P1-1}NZJ%X4vPGD))BvL z;~PVQUO!`N^6~kZkrfTZHP@Z*Uk4lu_%sIu7Z<41l{&5tpwMYDIWuj|L;7iQgB?M* zE%K-8NF}<+Fnfbc0*m>~>Qs!uLeI}@m;|u?7A6pWf1<0h;wnEE;qrbcRE(`Z4h#0; zMw7364OSL5VxCF4_iWS1naoIzbX~L8v_X~VRCLOuwh-3Z0G3aqxgn#~#G{OdP%m6E zuasLlqX{R6Ji5kwFH`L;aoBO0sCcyxb|y{MNo(C}5>GsgTX5~lh;}Q|CiKDyLx&b} zVnaYdr#~<1x@9P)&O<&Xw^gzHlu|dLMUad@&naObMmrw+!(XeJ-8G{78kf!nkd)`j}Yeefm z4}8=pQTd?2zkkokn;JgI@bR|&DK*H`4vXl4CwM!i?h@Rj+1zT})f#Mu2s#ejdmo

    ^HCisBeKD9Si=$E@Scnv5O6lTDW@6yUNXlx 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%0DCLjhq@Epw{O=E27h8IR93Hh;(fo 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%0DNhek7_DBg?J?i5qa1L8aE$4CZ%{1G!l)Nm z9zOOIte#0$>_v4)E~qkfc*Wtk7m-4Q%t#-YV=ji$b|E*U?Y(-oFZlhllWou0y3h?1 zZSA|V%Ctpd&kV6po*DI3wAl5+o4UBwseO(g7MB%(G8BBQQ435sg(O5@@mn0R=@_4g znUD9ZOohZwmw{{RYzdU;aAF~uv{Ftmvyd}k4S&yzw@voqdN!C~k!m*DJ1puTH$L5R z*LWUA>Q*!!s(R2Nf$Dfl67g^QZYrv?qbDaR*H-&{Ay%rL=wqJy#E0THwR>c**~mNm zCipCKc5#~!r53mV2g8djKa!{DKMCPX57XGdeF3u{O80yCazAwXD`IYZ&Foti2w5fD z!9&*0!@KtPuI}mtO+!n(Xy@#~==IK=XI>R zE;@^Dv7px#sRH&tCO&q`ktITY6!8K$6`_}!_>{73hk)nB+UwKtK|g3=$^5%h#+DY8 z#;;0U{^v&@X5LBm&h0=Lk5gOpJD1C(d(A$p*Jmw_ zEBLKO__SsmWH_1~E_wgGIt3!-{U=9F2-TcG4S&Z3Qz(qJE4Sm;Q6^ZhvKDw-l^7zj zc7qGo*;H&~XhrAthJWbg*; zHr_igKC1HU1DU$DQz`fdhHA13j`8l z(CS4R@(33>H zpJQG&tRpH;F3Ez7M0?nF#R?ZWvR{^nU>nn+fYkEDi--p}vTxZA4j{Hr2~j#ys+@S0C)HZLwTiBt6iRfMx^m?X$j*s#VM7dy^V zYZ+<2-fp)eZgoCzt81#mzL93Wlx+uo_6_eU8huD5=>M68!R3=H?RTLb?R`mrJsR+lg>8oO^;mm+jWrt zD4Iyeezn8uuG3m}v=EprcJu&C@S*s7pLRR+JF5^rW#Kok9`Fgo-Xyeq8?E@q0CGok zDF4wlqk^8tEq5HGU{*Wm7Ka}PU5YzTtND=PgcU{CMxW zIz3~i)aUShRe4U{{`eCyCJd>{#b;L2E&r9JTnVkMv5KZq`b6*BoEEK!qd!NvVqK|{ zW1tTVfQGW6_ykxEKVS-?-Ne3o5vo|xewEdnwG95N2-Y~jT`ghDP5Ug8`}McB727$- zbzS0LDphd=t+Y^GR5|fBjvc2hKA1ifu$m&XIx5*3?Z05M%mmgCpi(gjxo`%@O+&Sv zms{V?3r{d%EZBVVR!u8_Y;5*rBqX3p?+?zA{?#{%k;WNd_H7Sj~yERIaq&g zQfdpIxwPfNX=E3*Qd5h?#tZX9s_?E_`)iVWs9yIK?%VX|Gr;7%P@Y7Fn4F{T5Kd97 zv94}({_~T?_*W^r?K+xDQ_h+255kGNn#UM#iE2Rj>gPO%!~_qRSao)E zdGqqzkAcFv%U=vv^UQ6yhW^N(^`CaCT|aqsbYBG;9-cu#sBzNczZ@rMjleRj<&0t) z3Q~mdrzl~*l%&a?Qeb(4VQf`3avEQV%~

    ;svNi9-~E1>R~nb}$ZA4a`hG==Z+$W66r+1SZJ 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

    Zl3e$`yEA*?)_Crxc`wSLV+MB9 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

    QL2lcqnQN(Te37r+3V720P<|8>e&fouQ<|^F?|9 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ν{c#ePex5Vl$56wu$JG0U4kXyDpA>Y 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%0DJgr82gfdr+=OXFBU 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 z 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 SV|f3W@ar##pIL`a{r-RFzqEJ& diff --git a/www/public/images/blog/introduction-to-async-snippet.png b/www/public/images/blog/introduction-to-async-snippet.png deleted file mode 100644 index 6f55eae6be8205580289923f305420b74dfdfba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652613 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�$@% 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�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%0D><-hg?U60t*&7r)>Ry^5Y|MD&@+X7BuM7 zP_AxR#}ROS?@a{+4Ye`G@58BY66;xHqD8^&31CgcqX+As{jU{HfHUEfmipBNw4x)> zf{)7FVgf7_IwEBpwAzoQ=dF@>+SmC5Gl8kZsK0MUuovG}Xi^>%7?9q0oSJBa8Td5c zL4sgTbNALO35)%Tx-U;8}TTje*r2eSQN`A5(Hy!L(nhj!WjQGTB;#F*|^;SZ~B zNX#$d$2LFelmv_SKLrwpSLT1Y2mHdv20>2r==1kIW55?uR>~UXLrWh5<>Sze zKl*S6*y>mP{7cXOl4+8oCIXiHPtF2gr<_jw&-HT6PqHvSq-@Cl&=oHmO~+VGT#k*? zPru=wmFChh@OmbAoAccJd^qWEnv;qWN)SwB{_R92YWZejO|l^ajgKH=a?m#!h7xev z2~W#Uu#~(M5DPTwM)s)ZLcfA|;!-RLY`3+s8T{bGKEp0{8!eNYW<# z-T&Qdbu<0^^bL$Zb=7#F6*3W6TNVbaYOP*2(Rh&d4Eu)glDLpXT4IR#vX}th_@_#LM;Y*sklx zWO2jQZ8Pa3`udX2q?kjbrkY6VE#aZ(KKTE9ZutdDI7j(4#gg+s@(lc0waWM*J`?`K zY7$${e`fxM^2q;v!oPZAII;PKD!B|PN(&s^LN&N)vUS#oyfC9lyW|4XgU zxxsUcQp4RQgaGH180_Nk-0ojOk#kI=qrAT_eW(riVr}=?X>FQHV`vYukz9@L!akc^ z-p2Uc#ykDV^_BnM#yP*w<6CMHKjZdZYrWRLKji;b|FXa5JmF0G%uqI?9F(#2w*PB6 zWU8qcryOto@aFGs8}Tau5WLboi%t0jZEgQ&IrU}}GPKD;^R--%l@xGI5ERf zdW(n2F6*!F|MWaS5dbBq{pIqHi)4SZTizdXh;mp|Tj%?{iFz1c7*Qthnzo=7{gpB5 z-j4H4{+a({`2+F9ZkK-9PaH;|vSbkv=YRI-xnaarAELB6ZTyuo0x#af#1`sER$Vp(=`rU|f5o|U2 zA8@^5PxA>!!;4`X3kcEIHhvt~Df#oOYGBQ81+4^xEQdav^c*)Wa@G8s=3LZAe3$T$ zeimfXnQwVO@%#h1Yu1Qh$0*`ue7TQR&-$Q34-XT&Rf6z6C9CNn6t_WrO){J)oaE8Q z^FBZM5TuCCVyA6Df^7qBB=N9)z9bMai?q)P0(|4rXn&n|##Ik=m*9$_=4WEJ^@?o@ zu?dfnr;dyQ72ETNBs1BBoVfcxW9qRubZz6xaf1Av-4Z>D7>1z|M3Eys4*CO?l-M8wRr-RMFvUP|5scRmn8*H08>7l z4iQJ5-gg;ZufdC1-LPg?f0~{hK&`F*Z@CxPW0H9jVtBAezwm!f;9qj!LxGY1g8aYb z|KtDF$0LKU&i|TwUND_}W4f51*!(Rh4;DP+f~y`v5&tuFT8!`^NzOg~pHj>0!WVNu|h;{=oDLJ>{ofr~9tU(aZX%@qEzEn(#b4@q z@Ph-q9Wq}1UvhAdE6MFP@96)=4SaDd={Pf((uu`R#~S_*xxViIYF@Mn|NpxG3&K63 zu*V?_Jvik0cjCWe`$c_Nr^2xD6x~Qvru=_%)7NW`3yB>kskZ;?c|!JoiCOTZKyQ8s z_1yVs|Hu1`ikA}`@$3F?Iylz&x}a7Bc-#LuUHLWfdn8tS5AAyJr#|%C{?9q;pZ9+` z-|@@oK~=XGGvxF0_7IBHkBr}0OOi7j=O1ifT;#b<`Y0$A6W|&de~Y~%%#=sl+9dai zV~gUG6h(38McPA>(DC>+JpC-j^9zZta;N|Q*%wcK^#5GLJFk?@sm>{A6*xfxU_P68 z(K%)2hkVa_am^u7i!oMzCom^}?{-;*xAa*+w{kGYLVi9p_eXtLvmP(h$MXtPey*Os z*WR$hfx9J`&tMq#-jwm696249=|&>jVN2PHGgWl z6Fz9u?QSFW3FU#?w@cc$ z9FFjfZw|xP{h^qJ+it}phHqxIYv47<{cZT5HttbizO{dwS9G%RhJXxWeR!Sez8Fy~ z`+jeViPr5UX8svh8gR=GzW&Rc+r=Q8eDn1-He$q(t&%@G#}IcF&&Sv&=NE+4bv1^-mi&2%;D{v#;^H*y1y@d zrtqJ}y{y6cRt6aElij*ah<`Re^uXfNx80sT9y8RZ1PSzIKe^=pmN!ZU)|~vGHSzI3 z#!aZT?SOq+I2Uk<-n&`B@kF!~ai$919LrZsY?u;A@9e=UyX#Lr8re zqR@0ci#x7YVi+c!eBBlw_kU~`QiW{=Kjpd2mTTgFw5e<}|D)~Z{|U=d+x@uzyJ0?2 z&wEY4?a{Drx8)5l2qXSn0{n5i95ZwEuf1%|!}; zR~wk5zi`-F{_S%scHAxxGa(~_bRribkPy0W|edH^}PVBO&pI{?|e9!G8 zZoUwv{AwS&)US2Y|8D<>0h^j$_kWRbl#<2Rr+Dn8{%!gET5u}aSN{Rq#&uJ_*Ri&0 zy2O`wnlO*GnmUS3PjfXTHE^xJBF@3L+lG}G_TqMcyZ+p*NiyR9>0y+}c;l%Tz-pYE z$@izEzm$=GsZYR2F6HW>3-?!}ul4)>Z!OIa887XD?zzuj%6Z<*`QPoQe^gaDY=!y+ zRGPU?U>R(N-{F47??t#WwCASgu>6YtLQn=f{&RotPkds>j!(&#MB)h;Yr^X{vXL1d3k{M48o;d2PGABd)&Nx+}j>(QuWO~ahqpB-l{ zRd%CGd#F_6FPSPn0bKU6TMnKMQ_*}1-heIlXUFHWAA6?r=1g2{9sP6m^p$OxV{Pc` z&E;PkbMR~FA!C7k+9iGO!Q{DDHsggXC?rYq)P9eGZS%hs=K%-o_O#KxSjXnOd~BZy zvhDMsv75wjc`5O(z=NrEqB_&hJ~qQN=Knj&ma$gZHa9vMQ;6MN@BJW5K}jQO}f z*%QhgQWS+>^Q?hUc9F#43sHOZI&13Y48G*a8(5P6Z^E5?BQb@L885qhIZnSk9ASTF zH53i{7Nqe|+2O1e>1XHO5_$CCrooy9gdwd%w3uk^uSSGjK*aepMDt^7X$R`#N1QGbp1#ZVy2irO|Ky_wPzo8c@kr!KU&_(2TVt<${{16pP>Q~;QcFFXvumDVLCy;`F{dH zN+`dC|A+QV_)8mwzfP?0woRtEBVN+qw0^|l#PhPzvQT$6CuoO*8V|LBNdNa-LqcK` zw<`bZ{D{Mhqsjxp`7iCc%K<7^rj#o*CKzwKUeg3%Ku?Ybp?|`O@?VZ*YcLmSU2qs9 z_Y#%=vo6w2cfMaD+eTg|-!06G|Ia#TeZ>cHN)hZloch-*+ibRl;6J4yPe;ZAL@8Bj?AwkgvfH@-GnPZ`v`+Z<98mdw;|?Dd!VVm9_x<0K_SSRGvm^E=`v?6?c7Qc^ z;7n!jc+NbMLrZTutn}O=;EHk)Jg$Z;IwL#pQ%-7o`cWP~h30dHh1Ybr%KIil(I&bQ zhdTCa^p7)&Jx7kN15LhhBH@ zqj&vM5-!-ehWtdtUQuVlr``8|pOf$2_kWxG_Q9O|I=3=A>hl2^HEIBek3f5R@zK&|0%jY5Cs*0P+*Q`n4$vr^gl}Fd~l~s&_Se~YbB#< z#>&kD3Z`8JFvt~21cV1|oMv~ZQ)4~cNAb;djzI=l<4QPQ`FB3t%krho;nsCyR zO++?hA$h`+1hhkS647a<)0vCq=43~lwBFfUw4}JGt>h&KNTT9H=1M{(a^f9@=^6l) z4I>Fro1j4lPT1|9e5RY_Lz-PG8Om#bps7GX|ENtJ%Zgrf0G0kv$yc7nivH&RSx_gr zi2U2oL=sQ=#E+6dDJY7V1i+23w(K^ULN4Yhsm`*U9IC|V?d4O|gjgymGp4yX*m$Ur zg(tHeHYhm!@Qpd7rlQwWSpoZVJo>kRavpvNQm-kJ*wN!$llx}=-|GG>ALHBF_s~8T zy?eO7hjt>_)Qia@g-)VL1Iaj+!-Lx9+LK~@p_HmQL~LQufDcVNuHG(~tnWCo&8B?P z^w0jpRBMSpaIRDS;#|2Yhivj8FgE@-Sr2kLFbTH_=5PF!d>C6|VOLzHw6IS-NT--_ z{`bwUrc*R}PTX$Fu0*@f?ji0tghINprFVT#F3VH7E`ultCH~BVF8MF>w=^w`&-Tjy zsSnA%Nq=6y=A>{B)6YY;+8uxuuQn3CYZ5#IM7H#$ns=9g;{TZ+_EsMX6#t(8ORv+; z`M;#eO#|fyJ}i{_mo}SKTR49l0G50NZ>B7gAJSm9flUYC2XsN*9pjN@C;CSsLte}G zDHq|xuV|(FOhq2koA@hrHTm+eq}TaT`s*RC)&Ifnnf7|_GUrzPn_RtBul{WT)*zOOY$+^)!jw+mbLHh|Cu{dKRy2o!EK*Ha&nnWch~J-Ck~W9qzqB4?thZC znC2@kxn3h|B(H;aQ!f{dd0&V8l+4VPmRM?0mX7EwRE_&?*4FYI*Z_W$yK{%`;5|0OsS8AiXd;9X0c zY*8DW>-1S7CT*ITS9v264i4Fs1F8hXt1*K(`o6%kme>r-X~)usUytDIT!$u*k|uiTI0w7$C8MivZk!lKXFnQfQ0p=8FJK*-Av25G)X|Hs<3$qC}PvO^xk zJUXS_QZqUZISSC5BT&G|wuA#O7 z{}&$>|6$H`{JF-~`iO6S?fh@KcPY%?x3#fPzWGHiZU-^-Ej^pKcq0#zxIgt-LHD!f z;yg-rdZvVsjA`b!y)<9*s~>~`*B!e!Q`_?sWQMKFp70{vrU=5C z+PEO23EKbwAOJ~3K~(mjNcWJx%a8#@EKlhfqpIQV5RqF7lcEc%PVsIDnk|1^4?^YAXSk*m) zf=_uYRkd25w?XyUaS&itp+Dl8yaFY}y!7$ZAIOjXANZg2dOaHTZ$%Z@3-^g@#|mK> z6bozc|7FA@?p2;)2oyXFY-b#sMa093g+=4|FlmuJk`Qu03DAsnXA}>Gf0+Mc4DA14 z4a`rPn;gd6FCG74-8$f}Iwbwy5yx(;7Mu@AWh6;Uj_^_-Xi`b_ZV*9BgZy_J4?f`4u2|yjWO8H@RSs7&wRd zqp1gT!;m`EB(84;y|46NtNJ2yXkWX02oLNdH|}M^C&A~Ezr>NksdUJQCvh<<`$RP; zQmSp?O%#|+d4(m+Sj*gn{RLb0uyskQJu+??H-Me2{7f?R2{Mf_{c)tg8(E;nqiJL>@%46+Rb&%v9@h} zD=L1yBGge1w1rE@0Ki>E$-xjeS`Rsk4yi!(v&1A+UuSr+JI zZ5}|EZngPWwYz+#w4KF)=l{rVy*!Ni;QFa z^0JGM-TnPUCf69ovs-KYgB6`T2Onp;Jsu@(=5bW~E`P{Up

    4-7*- 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

    }?{x{);IKsQhGs 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 diff --git a/www/public/images/blog/metatag-discord.png b/www/public/images/blog/metatag-discord.png deleted file mode 100644 index 6f26d600225fe00f9730e2ec2f0bf82a50d9f581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129936 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 pLDwf1$-wMB}TiafA!Xo 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ð4qM=ky8KIV9q!kW#{9JXwVtcH% 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

    dZTPfAq`}reHGd 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 diff --git a/www/public/images/blog/metatag-shapes.png b/www/public/images/blog/metatag-shapes.png deleted file mode 100644 index 615f7c5e22b4d3311d713f4717b5d36e849e384e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9540 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 STz0iyR diff --git a/www/public/images/blog/metatag-test-text.png b/www/public/images/blog/metatag-test-text.png deleted file mode 100644 index 3420fc5023f11b7d1fa9e5c20daec2aad0ef8fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7104 zcmeHMeOOXw8$V{lRv7KN)`v~0=G#@*+H#4Mia=$H+LqPUOfl5Vfv?Ap$|2%Oq`8)} z4=cBsW@>9o-xNPWG)07FYNm*3LPm(CVTp)}i1H!t!ENc@f8KxhhkxC0&hwn-{`lSZ z@4oKmhXZ~j$Hl7`0|4N-ch9ab0AOJm04#`Kgn*yy-wquCfMvkmT{{jX8jWSIrq4^t;=%4d+&lLLSLIF$)3oc^It6 z-GkKPYujwEBt+|Z<;^Kwyelvg3bP$MV~Z&4E&C6F&>J%g5dp=a?6-gq55d&u*9e?j zjw}P%XJB>|HLnUS|JH5=P<8+=gPu=4=e*sDO{+rffF)i3=P;FWt0>VtIht%Ss!R2`U!n1dWu{vQE6FsWk)^L8#soJFNb;;xd`TYBIv|Wr-r9^T z$|WQj^;JriX<%9#7>80BRT$3~#!7;rS{P)oUeP}4Cb|N>2W-lx<@zx1fRp7XU6S@; z*olT=g#bs(cegKdTEQb0$n#{#8~(*k5n=(kD_(;&{9<7O0Cr~M^gjDyr^YDFSal0* zfN;8dw9`3UJW#aq7TdEcNDU+A*{KWiVY%6)6^8f>O^&^6kr}i~t8UsYxOS2@ zdE(f#VokDnRNq;!f2DAE=sww!b;S6j_Ztbem3JyOf2);M!Yr{~(GPYNovW!L7^aXN z*+gMKXG0xhwx3M$r91X1drlH$;>MhdZ~n~|$1-ZuL9#C4Xdla&9^55uD+!FtxA?k*{m&}ZN=rwi z55coC{(EsY_s-@d1?RLvoV`wZS-2wM-PuAGq%O3RA|pE@(UEn$;f~4y_M}{`kyoK2 zFMU1N@mSGQGOca{V`}~H<@%y?%Ah=A^0W~yrkyD6TuWRL0T8;=H1gb6e9#cyR%L|K zK&7@uh<9kUJpz;MZ>M9$><(va@!kpNA6Y7T9^{@pOMCgRg65g! zdKOC@!=TC26Iex5ar)3rL3r)_Z(_a&DG3yj8Ti)lTs!hh+DIT~@Kfcnu*k{*hSkBgUzUC%P6 zKB;Hs9PdinIv0}O+JA!-^%g;LMl}u7S`*GOo^pJ{OGiM_D2LC0C4Ali zE13{F!@U&_dmwZyH2&(*SHlg+j5^91BFk))#|o2@jN`Ab2kYdgyQiD?VAufMVE421Fvua_wZNG?5$FyY&8O`cp zr!+yr=!-J-Q%nH4yd_4mcB}((0L&FLx(|7+dHuky<*H1{y|_9|e2k@pYPE8DCP_1a zY*Yyfj_TvjN-P|};pYY3+NKMI4NY5wLjO#YaG1*ApSJd)?hrkxztte z!d6CjQ!eT4!@SmIQA=q`{xIfMH@`lr1VrpG2uft7A={J6U5wP(n~**xUiPB0+lj7JU?B&5RSl*EF;b+66&gA6RrRcV! z8Xb5RVq}QPClXB2P@AbHu+vMK6)Pm^m~H9`YaRgHwz=nRinpinQMP@(R(`U1S-<@B z10<`?CH2`=B414&eIoB64b=&5U0WwXR-oaShv+0aEp64d^fkdX)T+lwfj=vK0{uWZ zP$ReQ2Y|0^{lc#k&Z;^dmGn66XS^_n!NH!*D6MHKLY&zoJxI&ec(n?;9RQz2GfSz4 z*7fPtmI#iwJfdrDKS7;p-z2ZE?p{Y9KOWJ5^&WEhvkAGs*=vu51irk{t9znIBXw-1 z=yEre_62dS2VnAR8{2Ll(V)aKgnXDLwpbkVm1K6FmltMi~E~ARv`Bx@Nocx`;J#d*+nk4Opq_(lv zKTZ_a*I}xqQ!s3wdb;8&$(?q!lCd%I0=EX^EuZq?H{yhx%U&lT_rn1zx^+RzgCR^ diff --git a/www/public/images/blog/middleware-banner.png b/www/public/images/blog/middleware-banner.png deleted file mode 100644 index e9e276ae3f53991ae27fc08fa7e41af87c2a2d5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58724 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 diff --git a/www/public/images/blog/rocket-logs.png b/www/public/images/blog/rocket-logs.png deleted file mode 100644 index 99c08c028f57f7fb0555dd65f8666571e38302e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93309 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 tpk1Mb-~a3n+xq{RzWUWVN~;O{;6txDF1F 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≶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 W_cQeE!cp=OTD$c$a&{iR_nxiFN=sXCh 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

    eM8O}ct^RxOYwl^AtH<=F>s9s&@MFUGY=;mN_< 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�!QzC7O4!ia)l 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�Nv&T+m*OH}Bh3Ksq8hK>UzP8X%rK@pIq|sMqCnD(~sP5_k^D z%S!6nV{`Z*Tx3GY*Jh=rN%|o_h1yTznv!RX=hPmHQaq~R19mlu2RCrHhY#G!+Ecy1 zo+mj;R3NW5#RvGH^$6Kbvi-CF^3xSJ`d-2Z?qhc4J@c9zo~wOL)Ucm60FbW= zcbMS^-XoEU`Q~-Ic@rO;@jcUiPVj+4&QiEai&T^sarB;_sb+0!NOW2`U1B4Oh@d^& zHAV|#Sbh^e|IH+t7`3;D-PrDEg3JsvpEy&fUWs8CH3BWC?UI$F+b{ooDzUO3T0lY4 zak?T)rrr5es=ZN(L8q+QOOIX(R6?gIZuFv{V;3fA7|PQN;~;saD-3CQ+Vb+`aTByi zvM}v*p}dBpj3!x>HkSNcmjjLZ&PwM}?COdRv5*XCIon`b^H({ z(S_qqT-Dnkcgl;28}dx!Ibw+BP_E+xIg

    4S?I@!}C?q(GKu;#_pz}EQ^_ACXWxS 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

    5Ud=? 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⋙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 L|Bry}pR@k~x#6@T diff --git a/www/public/images/blog/shuttle-logo-rectangle.png b/www/public/images/blog/shuttle-logo-rectangle.png deleted file mode 100644 index 55f0b334bf8a435f161bd298eacb01dd6da9e36b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182336 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 BLsW~`v9V#f}G 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

    GZ>Mifu-k2@5E84!i~^Y(9r!z7kk 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 Fe*<2_^nCyT diff --git a/www/public/images/icon1.svg b/www/public/images/icon1.svg deleted file mode 100644 index 472d75709..000000000 --- a/www/public/images/icon1.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/www/public/images/icon2.svg b/www/public/images/icon2.svg deleted file mode 100644 index 2cae1d25d..000000000 --- a/www/public/images/icon2.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/www/public/images/icon3.svg b/www/public/images/icon3.svg deleted file mode 100644 index 3c3e826c6..000000000 --- a/www/public/images/icon3.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/www/public/images/icon4.svg b/www/public/images/icon4.svg deleted file mode 100644 index 47f9a72fa..000000000 --- a/www/public/images/icon4.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/www/public/images/logo.png b/www/public/images/logo.png deleted file mode 100644 index 62509e332544583ba5c272e5d847de0dc2b90934..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20689 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 { - const tocCSS = { - ul: { - "list-style-type": "none", - "padding-left": 0, - margin: 0, - li: { - "padding-left": 0, - }, - a: { - display: "block", - "text-decoration": "none", - fontSize: "0.8rem", - fontWeight: "200", - color: theme("colors.slate[500]"), - "&:hover": { - color: theme("colors.slate[900]"), - }, - "font-weight": "400", - }, - ul: { - "list-style-type": "none", - li: { - marginTop: "0.2rem", - marginBottom: "0.2rem", - "padding-left": "0 !important", - "margin-left": "0.5rem", - }, - a: { - fontWeight: "200", - color: theme("colors.slate[600]"), - "&:hover": { - color: theme("colors.slate[900]"), - }, - }, - }, - }, - }; - - return { - toc: { - css: tocCSS, - }, - "dark-toc": { - css: { - ...tocCSS, - ul: { - ...tocCSS.ul, - a: { - ...tocCSS.ul.a, - color: theme("colors.gray[300]"), - "&:hover": { - ...tocCSS.ul.a["&:hover"], - color: theme("colors.gray[200]"), - }, - }, - ul: { - ...tocCSS.ul.ul, - a: { - ...tocCSS.ul.ul.a, - color: theme("colors.scale[400]"), - "&:hover": { - ...tocCSS.ul.ul.a["&:hover"], - color: theme("colors.gray[200]"), - }, - }, - }, - }, - }, - }, - }; - }, - }, - }, - plugins: [ - require("@tailwindcss/typography"), - require("@tailwindcss/forms"), - // require('@tailwindcss/line-clamp'), - // require('@tailwindcss/aspect-ratio'), - ], -}; diff --git a/www/tsconfig.json b/www/tsconfig.json deleted file mode 100644 index b8d597880..000000000 --- a/www/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] -} diff --git a/www/vercel.json b/www/vercel.json deleted file mode 100644 index 0967ef424..000000000 --- a/www/vercel.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/www/yarn.lock b/www/yarn.lock deleted file mode 100644 index b1691c6b4..000000000 --- a/www/yarn.lock +++ /dev/null @@ -1,5120 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@auth0/nextjs-auth0@^1.7.0": - "integrity" "sha512-twz4f1A94i2ShJ6jB3UsFuVhzE0vJ1M/Ukq5bNBm/gpvCK6E/P8Ew2wQloak73+mXcV7eg5S+HOlmiKpcSe6mw==" - "resolved" "https://registry.npmjs.org/@auth0/nextjs-auth0/-/nextjs-auth0-1.7.0.tgz" - "version" "1.7.0" - dependencies: - "base64url" "^3.0.1" - "cookie" "^0.4.1" - "debug" "^4.3.3" - "futoin-hkdf" "^1.4.2" - "http-errors" "^1.8.1" - "joi" "^17.5.0" - "jose" "^2.0.5" - "on-headers" "^1.0.2" - "openid-client" "^4.9.1" - "tslib" "^2.3.1" - "url-join" "^4.0.1" - -"@babel/code-frame@^7.0.0": - "integrity" "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==" - "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" - "version" "7.16.7" - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - "integrity" "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" - "version" "7.16.7" - -"@babel/highlight@^7.16.7": - "integrity" "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==" - "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz" - "version" "7.16.10" - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - "chalk" "^2.0.0" - "js-tokens" "^4.0.0" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1": - "integrity" "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==" - "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz" - "version" "7.17.8" - dependencies: - "regenerator-runtime" "^0.13.4" - -"@corex/deepmerge@^2.6.148": - "integrity" "sha512-6QMz0/2h5C3ua51iAnXMPWFbb1QOU1UvSM4bKBw5mzdT+WtLgjbETBBIQZ+Sh9WvEcGwlAt/DEdRpIC3XlDBMA==" - "resolved" "https://registry.npmjs.org/@corex/deepmerge/-/deepmerge-2.6.148.tgz" - "version" "2.6.148" - -"@cspotcode/source-map-consumer@0.8.0": - "integrity" "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==" - "resolved" "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz" - "version" "0.8.0" - -"@cspotcode/source-map-support@0.7.0": - "integrity" "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==" - "resolved" "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz" - "version" "0.7.0" - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" - -"@fortawesome/fontawesome-common-types@6.1.0": - "integrity" "sha512-lFIJ5opxOKG9q88xOsuJJAdRZ+2WRldsZwUR/7MJoOMUMhF/LkHUjwWACIEPTa5Wo6uTDHvGRIX+XutdN7zYxA==" - "resolved" "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.0.tgz" - "version" "6.1.0" - -"@fortawesome/fontawesome-svg-core@^6.1.0", "@fortawesome/fontawesome-svg-core@~1 || >=1.3.0-beta1": - "integrity" "sha512-racj+/EDnMZN0jcuHePOa+9kdHHOCpCAbBvVRnEi4G4DA5SWQiT/uXJ8WcfVEbLN51vPJjhukP4o+zH0cfYplg==" - "resolved" "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "@fortawesome/fontawesome-common-types" "6.1.0" - -"@fortawesome/free-brands-svg-icons@^6.1.0": - "integrity" "sha512-9utHuoCL12LCpZqTphg+tPLZeK+qcOX6tjky1DWtRXFmRgm67BA692STRJ2CXGlDkXSqfRGId8WkvsKqFAgmAQ==" - "resolved" "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "@fortawesome/fontawesome-common-types" "6.1.0" - -"@fortawesome/free-regular-svg-icons@^6.1.0": - "integrity" "sha512-MLSBZ3AprHZXVG6zVg9Jd/mGZrlX/1jxqQsHhvZuhdRdL9bZQyXHe5RmP0n4IOth/fdnoj3fs+EnbW/O+0K4dw==" - "resolved" "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "@fortawesome/fontawesome-common-types" "6.1.0" - -"@fortawesome/free-solid-svg-icons@^6.1.0": - "integrity" "sha512-OOr0jRHl5d41RzBS3sZh5Z3HmdPjMr43PxxKlYeLtQxFSixPf4sJFVM12/rTepB2m0rVShI0vtjHQmzOTlBaXg==" - "resolved" "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "@fortawesome/fontawesome-common-types" "6.1.0" - -"@fortawesome/react-fontawesome@^0.1.14": - "integrity" "sha512-dX43Z5IvMaW7fwzU8farosYjKNGfRb2HB/DgjVBHeJZ/NSnuuaujPPx0YOdcAq+n3mqn70tyCde2HM1mqbhiuw==" - "resolved" "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.17.tgz" - "version" "0.1.17" - dependencies: - "prop-types" "^15.8.1" - -"@hapi/hoek@^9.0.0": - "integrity" "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" - "resolved" "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz" - "version" "9.2.1" - -"@hapi/topo@^5.0.0": - "integrity" "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==" - "resolved" "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "@hapi/hoek" "^9.0.0" - -"@headlessui/react@^1.5.0": - "integrity" "sha512-aaRnYxBb3MU2FNJf3Ut9RMTUqqU3as0aI1lQhgo2n9Fa67wRu14iOGqx93xB+uMNVfNwZ5B3y/Ndm7qZGuFeMQ==" - "resolved" "https://registry.npmjs.org/@headlessui/react/-/react-1.5.0.tgz" - "version" "1.5.0" - -"@heroicons/react@^1.0.6": - "integrity" "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==" - "resolved" "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz" - "version" "1.0.6" - -"@mapbox/rehype-prism@^0.8.0": - "integrity" "sha512-bIz4a3oZ8g+pQBHSMMIxNpYOMX4yq4aZdpezoiCl9yJudh1Z9SRmHQqH6f+WtTBNOORzXMEGkvBze4PiH17wtA==" - "resolved" "https://registry.npmjs.org/@mapbox/rehype-prism/-/rehype-prism-0.8.0.tgz" - "version" "0.8.0" - dependencies: - "hast-util-to-string" "^1.0.4" - "mrm" "^3.0.9" - "refractor" "^3.4.0" - "unist-util-visit" "^2.0.3" - -"@mdx-js/mdx@^2.0.0": - "integrity" "sha512-SXC18cChut3F2zkVXwsb2no0fzTQ1z6swjK13XwFbF5QU/SFQM0orAItPypSdL3GvqYyzVJtz8UofzJhPEQtMw==" - "resolved" "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "@types/estree-jsx" "^0.0.1" - "@types/mdx" "^2.0.0" - "astring" "^1.6.0" - "estree-util-build-jsx" "^2.0.0" - "estree-util-is-identifier-name" "^2.0.0" - "estree-walker" "^3.0.0" - "hast-util-to-estree" "^2.0.0" - "markdown-extensions" "^1.0.0" - "periscopic" "^3.0.0" - "remark-mdx" "^2.0.0" - "remark-parse" "^10.0.0" - "remark-rehype" "^10.0.0" - "unified" "^10.0.0" - "unist-util-position-from-estree" "^1.0.0" - "unist-util-stringify-position" "^3.0.0" - "unist-util-visit" "^4.0.0" - "vfile" "^5.0.0" - -"@mdx-js/react@^2.0.0": - "integrity" "sha512-7zlZDf5xmWH8I0kFE4DG91COOkxjaW9DX5f1HWztZpFcVua2gJgMYfIkFaDpO/DH/tWi6Mz+OheW4194r15igg==" - "resolved" "https://registry.npmjs.org/@mdx-js/react/-/react-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "@types/mdx" "^2.0.0" - "@types/react" ">=16" - -"@next/env@12.1.0": - "integrity" "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" - "resolved" "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz" - "version" "12.1.0" - -"@next/swc-darwin-arm64@12.1.0": - "integrity" "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==" - "resolved" "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz" - "version" "12.1.0" - -"@nodelib/fs.scandir@2.1.5": - "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - "version" "2.1.5" - dependencies: - "@nodelib/fs.stat" "2.0.5" - "run-parallel" "^1.1.9" - -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - "version" "2.0.5" - -"@nodelib/fs.walk@^1.2.3": - "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - "version" "1.2.8" - dependencies: - "@nodelib/fs.scandir" "2.1.5" - "fastq" "^1.6.0" - -"@panva/asn1.js@^1.0.0": - "integrity" "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" - "resolved" "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz" - "version" "1.0.0" - -"@sideway/address@^4.1.3": - "integrity" "sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ==" - "resolved" "https://registry.npmjs.org/@sideway/address/-/address-4.1.3.tgz" - "version" "4.1.3" - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.0": - "integrity" "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" - "resolved" "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz" - "version" "3.0.0" - -"@sideway/pinpoint@^2.0.0": - "integrity" "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - "resolved" "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" - "version" "2.0.0" - -"@sindresorhus/is@^0.14.0": - "integrity" "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - "resolved" "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" - "version" "0.14.0" - -"@sindresorhus/is@^4.0.0": - "integrity" "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - "resolved" "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" - "version" "4.6.0" - -"@szmarczak/http-timer@^1.1.2": - "integrity" "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==" - "resolved" "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" - "version" "1.1.2" - dependencies: - "defer-to-connect" "^1.0.1" - -"@szmarczak/http-timer@^4.0.5": - "integrity" "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==" - "resolved" "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" - "version" "4.0.6" - dependencies: - "defer-to-connect" "^2.0.0" - -"@tailwindcss/forms@^0.5.0": - "integrity" "sha512-KzWugryEBFkmoaYcBE18rs6gthWCFHHO7cAZm2/hv3hwD67AzwP7udSCa22E7R1+CEJL/FfhYsJWrc0b1aeSzw==" - "resolved" "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.0.tgz" - "version" "0.5.0" - dependencies: - "mini-svg-data-uri" "^1.2.3" - -"@tailwindcss/typography@^0.5.2": - "integrity" "sha512-coq8DBABRPFcVhVIk6IbKyyHUt7YTEC/C992tatFB+yEx5WGBQrCgsSFjxHUr8AWXphWckadVJbominEduYBqw==" - "resolved" "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.2.tgz" - "version" "0.5.2" - dependencies: - "lodash.castarray" "^4.4.0" - "lodash.isplainobject" "^4.0.6" - "lodash.merge" "^4.6.2" - -"@tsconfig/node10@^1.0.7": - "integrity" "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" - "resolved" "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz" - "version" "1.0.8" - -"@tsconfig/node12@^1.0.7": - "integrity" "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" - "resolved" "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz" - "version" "1.0.9" - -"@tsconfig/node14@^1.0.0": - "integrity" "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" - "resolved" "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz" - "version" "1.0.1" - -"@tsconfig/node16@^1.0.2": - "integrity" "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" - "resolved" "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz" - "version" "1.0.2" - -"@types/acorn@^4.0.0": - "integrity" "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==" - "resolved" "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz" - "version" "4.0.6" - dependencies: - "@types/estree" "*" - -"@types/cacheable-request@^6.0.1": - "integrity" "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==" - "resolved" "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "*" - "@types/node" "*" - "@types/responselike" "*" - -"@types/debug@^4.0.0": - "integrity" "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==" - "resolved" "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" - "version" "4.1.7" - dependencies: - "@types/ms" "*" - -"@types/estree-jsx@^0.0.1": - "integrity" "sha512-gcLAYiMfQklDCPjQegGn0TBAn9it05ISEsEhlKQUddIk7o2XDokOcTN7HBO8tznM0D9dGezvHEfRZBfZf6me0A==" - "resolved" "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-0.0.1.tgz" - "version" "0.0.1" - dependencies: - "@types/estree" "*" - -"@types/estree@*": - "integrity" "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" - "version" "0.0.51" - -"@types/estree@^0.0.46": - "integrity" "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==" - "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz" - "version" "0.0.46" - -"@types/estree@^0.0.50": - "integrity" "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" - "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz" - "version" "0.0.50" - -"@types/gtag.js@^0.0.11": - version "0.0.11" - resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.11.tgz#0c384ea32e4e40043a2dca82db79b5e48d681ad5" - integrity sha512-rUuSDedDjcuUpoc2zf6eX6zRrxqALNgwrmMBfVFopkLH7YGM52C7tt6j9GsYIvaxn+ioVRpOKoHnN1DXzHEqIg== - -"@types/hast@^2.0.0": - "integrity" "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==" - "resolved" "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" - "version" "2.3.4" - dependencies: - "@types/unist" "*" - -"@types/http-cache-semantics@*": - "integrity" "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - "resolved" "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz" - "version" "4.0.1" - -"@types/js-cookie@^2.2.6": - "integrity" "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" - "resolved" "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz" - "version" "2.2.7" - -"@types/js-yaml@^4.0.0": - "integrity" "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz" - "version" "4.0.5" - -"@types/keyv@*": - "integrity" "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==" - "resolved" "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz" - "version" "3.1.3" - dependencies: - "@types/node" "*" - -"@types/mdast@^3.0.0": - "integrity" "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==" - "resolved" "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz" - "version" "3.0.10" - dependencies: - "@types/unist" "*" - -"@types/mdurl@^1.0.0": - "integrity" "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" - "resolved" "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz" - "version" "1.0.2" - -"@types/mdx@^2.0.0": - "integrity" "sha512-JPEv4iAl0I+o7g8yVWDwk30es8mfVrjkvh5UeVR2sYPpZCK44vrAPsbJpIS+rJAUxLgaSAMKTEH5Vn5qd9XsrQ==" - "resolved" "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.1.tgz" - "version" "2.0.1" - -"@types/ms@*": - "integrity" "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - "resolved" "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" - "version" "0.7.31" - -"@types/node@*", "@types/node@^17.0.21": - "integrity" "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz" - "version" "17.0.21" - -"@types/parse-json@^4.0.0": - "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" - "version" "4.0.0" - -"@types/prop-types@*", "@types/prop-types@^15.0.0": - "integrity" "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" - "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz" - "version" "15.7.4" - -"@types/react-syntax-highlighter@^13.5.2": - "integrity" "sha512-sRZoKZBGKaE7CzMvTTgz+0x/aVR58ZYUTfB7HN76vC+yQnvo1FWtzNARBt0fGqcLGEVakEzMu/CtPzssmanu8Q==" - "resolved" "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-13.5.2.tgz" - "version" "13.5.2" - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^17.0.2", "@types/react@>=16": - "integrity" "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==" - "resolved" "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz" - "version" "17.0.40" - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - "csstype" "^3.0.2" - -"@types/responselike@*", "@types/responselike@^1.0.0": - "integrity" "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==" - "resolved" "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "@types/node" "*" - -"@types/scheduler@*": - "integrity" "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" - "version" "0.16.2" - -"@types/unist@*", "@types/unist@^2.0.0": - "integrity" "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - "resolved" "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" - "version" "2.0.6" - -"@xobotyi/scrollbar-width@^1.9.5": - "integrity" "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==" - "resolved" "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz" - "version" "1.9.5" - -"acorn-jsx@^5.0.0": - "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - "version" "5.3.2" - -"acorn-node@^1.6.1": - "integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==" - "resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" - "version" "1.8.2" - dependencies: - "acorn" "^7.0.0" - "acorn-walk" "^7.0.0" - "xtend" "^4.0.2" - -"acorn-walk@^7.0.0": - "integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" - "version" "7.2.0" - -"acorn-walk@^8.1.1": - "integrity" "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" - "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - "version" "8.2.0" - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.0.0", "acorn@^8.4.1": - "integrity" "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" - "version" "8.7.0" - -"acorn@^7.0.0": - "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - "version" "7.4.1" - -"aggregate-error@^3.1.0": - "integrity" "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==" - "resolved" "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "clean-stack" "^2.0.0" - "indent-string" "^4.0.0" - -"ansi-align@^2.0.0": - "integrity" "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==" - "resolved" "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "string-width" "^2.0.0" - -"ansi-align@^3.0.0": - "integrity" "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==" - "resolved" "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "string-width" "^4.1.0" - -"ansi-escapes@^4.2.1": - "integrity" "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==" - "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - "version" "4.3.2" - dependencies: - "type-fest" "^0.21.3" - -"ansi-red@^0.1.1": - "integrity" "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==" - "resolved" "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz" - "version" "0.1.1" - dependencies: - "ansi-wrap" "0.1.0" - -"ansi-regex@^2.0.0": - "integrity" "sha1-w7M6te42DYbg5ijwRorn7yfWVN8= sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - "version" "2.1.1" - -"ansi-regex@^3.0.0": - "integrity" "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" - "version" "3.0.1" - -"ansi-regex@^4.1.0": - "integrity" "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" - "version" "4.1.1" - -"ansi-regex@^5.0.1": - "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - "version" "5.0.1" - -"ansi-styles@^2.2.1": - "integrity" "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" - "version" "2.2.1" - -"ansi-styles@^3.2.0": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.0" - -"ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.0" - -"ansi-styles@^4.1.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"ansi-wrap@0.1.0": - "integrity" "sha1-qCJQ3bABXponyoLoLqYDu/pF768= sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==" - "resolved" "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" - "version" "0.1.0" - -"anymatch@~3.1.2": - "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" - -"arg@^4.1.0": - "integrity" "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - "resolved" "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - "version" "4.1.3" - -"arg@^5.0.1": - "integrity" "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" - "resolved" "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz" - "version" "5.0.1" - -"argparse@^1.0.10", "argparse@^1.0.7": - "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - "version" "1.0.10" - dependencies: - "sprintf-js" "~1.0.2" - -"argparse@^2.0.1": - "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - "version" "2.0.1" - -"astring@^1.6.0": - "integrity" "sha512-Aj3mbwVzj7Vve4I/v2JYOPFkCGM2YS7OqQTNSxmUR+LECRpokuPgAYghePgr6SALDo5bD5DlfbSaYjOzGJZOLQ==" - "resolved" "https://registry.npmjs.org/astring/-/astring-1.8.1.tgz" - "version" "1.8.1" - -"asynckit@^0.4.0": - "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - "version" "0.4.0" - -"autolinker@~0.28.0": - "integrity" "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc= sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==" - "resolved" "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz" - "version" "0.28.1" - dependencies: - "gulp-header" "^1.7.1" - -"autoprefixer@^10.0.2", "autoprefixer@^10.4.4": - "integrity" "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==" - "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz" - "version" "10.4.4" - dependencies: - "browserslist" "^4.20.2" - "caniuse-lite" "^1.0.30001317" - "fraction.js" "^4.2.0" - "normalize-range" "^0.1.2" - "picocolors" "^1.0.0" - "postcss-value-parser" "^4.2.0" - -"axios@^1.0.0": - "integrity" "sha512-SsHsGFN1qNPFT5QhSoSD37SHDfGyLSW5AESmyLk2JeCMHv5g0I9g0Hz/zQHx2KNe0jGXh2q2hAm7OdkXm360CA==" - "resolved" "https://registry.npmjs.org/axios/-/axios-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "follow-redirects" "^1.15.0" - "form-data" "^4.0.0" - "proxy-from-env" "^1.1.0" - -"babel-code-frame@^6.26.0": - "integrity" "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==" - "resolved" "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" - "version" "6.26.0" - dependencies: - "chalk" "^1.1.3" - "esutils" "^2.0.2" - "js-tokens" "^3.0.2" - -"bail@^2.0.0": - "integrity" "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - "resolved" "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" - "version" "2.0.2" - -"balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" - -"base64url@^3.0.1": - "integrity" "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" - "resolved" "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz" - "version" "3.0.1" - -"binary-extensions@^2.0.0": - "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - "version" "2.2.0" - -"boxen@^1.2.1": - "integrity" "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==" - "resolved" "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "ansi-align" "^2.0.0" - "camelcase" "^4.0.0" - "chalk" "^2.0.1" - "cli-boxes" "^1.0.0" - "string-width" "^2.0.0" - "term-size" "^1.2.0" - "widest-line" "^2.0.0" - -"boxen@^4.2.0": - "integrity" "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==" - "resolved" "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz" - "version" "4.2.0" - dependencies: - "ansi-align" "^3.0.0" - "camelcase" "^5.3.1" - "chalk" "^3.0.0" - "cli-boxes" "^2.2.0" - "string-width" "^4.1.0" - "term-size" "^2.1.0" - "type-fest" "^0.8.1" - "widest-line" "^3.1.0" - -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" - dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" - -"braces@^3.0.1", "braces@~3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "fill-range" "^7.0.1" - -"browserslist@^4.20.2": - "integrity" "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz" - "version" "4.20.2" - dependencies: - "caniuse-lite" "^1.0.30001317" - "electron-to-chromium" "^1.4.84" - "escalade" "^3.1.1" - "node-releases" "^2.0.2" - "picocolors" "^1.0.0" - -"buffer-from@^1.0.0": - "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - "version" "1.1.2" - -"builtins@^1.0.3": - "integrity" "sha1-y5T662HIaWRR2zZTThQi+U8K7og= sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==" - "resolved" "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" - "version" "1.0.3" - -"cacheable-lookup@^5.0.3": - "integrity" "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - "resolved" "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" - "version" "5.0.4" - -"cacheable-request@^6.0.0": - "integrity" "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==" - "resolved" "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" - "version" "6.1.0" - dependencies: - "clone-response" "^1.0.2" - "get-stream" "^5.1.0" - "http-cache-semantics" "^4.0.0" - "keyv" "^3.0.0" - "lowercase-keys" "^2.0.0" - "normalize-url" "^4.1.0" - "responselike" "^1.0.2" - -"cacheable-request@^7.0.2": - "integrity" "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==" - "resolved" "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz" - "version" "7.0.2" - dependencies: - "clone-response" "^1.0.2" - "get-stream" "^5.1.0" - "http-cache-semantics" "^4.0.0" - "keyv" "^4.0.0" - "lowercase-keys" "^2.0.0" - "normalize-url" "^6.0.1" - "responselike" "^2.0.0" - -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" - -"camelcase-css@^2.0.1": - "integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - "resolved" "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - "version" "2.0.1" - -"camelcase@^4.0.0": - "integrity" "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" - "version" "4.1.0" - -"camelcase@^5.0.0", "camelcase@^5.3.1": - "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - "version" "5.3.1" - -"caniuse-lite@^1.0.30001283", "caniuse-lite@^1.0.30001317": - "integrity" "sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ==" - "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz" - "version" "1.0.30001317" - -"capture-stack-trace@^1.0.0": - "integrity" "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" - "resolved" "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz" - "version" "1.0.1" - -"ccount@^2.0.0": - "integrity" "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" - "resolved" "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" - "version" "2.0.1" - -"chalk@^1.1.3": - "integrity" "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "ansi-styles" "^2.2.1" - "escape-string-regexp" "^1.0.2" - "has-ansi" "^2.0.0" - "strip-ansi" "^3.0.0" - "supports-color" "^2.0.0" - -"chalk@^2.0.0": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^2.0.1": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^3.0.0": - "integrity" "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"chalk@^4.1.0", "chalk@^4.1.2": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"character-entities-html4@^2.0.0": - "integrity" "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" - "resolved" "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" - "version" "2.1.0" - -"character-entities-legacy@^1.0.0": - "integrity" "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - "resolved" "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" - "version" "1.1.4" - -"character-entities-legacy@^3.0.0": - "integrity" "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" - "resolved" "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" - "version" "3.0.0" - -"character-entities@^1.0.0": - "integrity" "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - "resolved" "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" - "version" "1.2.4" - -"character-entities@^2.0.0": - "integrity" "sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ==" - "resolved" "https://registry.npmjs.org/character-entities/-/character-entities-2.0.1.tgz" - "version" "2.0.1" - -"character-reference-invalid@^1.0.0": - "integrity" "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - "resolved" "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" - "version" "1.1.4" - -"character-reference-invalid@^2.0.0": - "integrity" "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" - "resolved" "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz" - "version" "2.0.1" - -"chardet@^0.7.0": - "integrity" "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - "resolved" "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" - "version" "0.7.0" - -"chokidar@^3.5.3", "chokidar@>=3.0.0 <4.0.0": - "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - "version" "3.5.3" - dependencies: - "anymatch" "~3.1.2" - "braces" "~3.0.2" - "glob-parent" "~5.1.2" - "is-binary-path" "~2.1.0" - "is-glob" "~4.0.1" - "normalize-path" "~3.0.0" - "readdirp" "~3.6.0" - optionalDependencies: - "fsevents" "~2.3.2" - -"ci-info@^1.5.0": - "integrity" "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz" - "version" "1.6.0" - -"ci-info@^2.0.0": - "integrity" "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" - "version" "2.0.0" - -"classnames@^2.3.1": - "integrity" "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - "resolved" "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz" - "version" "2.3.1" - -"clean-stack@^2.0.0": - "integrity" "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - "resolved" "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - "version" "2.2.0" - -"cli-boxes@^1.0.0": - "integrity" "sha1-T6kXw+WclKAEzWH47lCdplFocUM= sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==" - "resolved" "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz" - "version" "1.0.0" - -"cli-boxes@^2.2.0": - "integrity" "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - "resolved" "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" - "version" "2.2.1" - -"cli-cursor@^3.1.0": - "integrity" "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==" - "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "restore-cursor" "^3.1.0" - -"cli-width@^3.0.0": - "integrity" "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - "resolved" "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" - "version" "3.0.0" - -"cliui@^5.0.0": - "integrity" "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "string-width" "^3.1.0" - "strip-ansi" "^5.2.0" - "wrap-ansi" "^5.1.0" - -"clone-response@^1.0.2": - "integrity" "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==" - "resolved" "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "mimic-response" "^1.0.0" - -"coffee-script@^1.12.4": - "integrity" "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==" - "resolved" "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz" - "version" "1.12.7" - -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-convert@^2.0.1": - "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "color-name" "~1.1.4" - -"color-name@^1.1.4", "color-name@~1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "1.1.4" - -"color-name@1.1.3": - "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" - -"combined-stream@^1.0.8": - "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - "version" "1.0.8" - dependencies: - "delayed-stream" "~1.0.0" - -"comma-separated-tokens@^1.0.0": - "integrity" "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - "resolved" "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" - "version" "1.0.8" - -"comma-separated-tokens@^2.0.0": - "integrity" "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" - "resolved" "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz" - "version" "2.0.2" - -"commander@^2.19.0": - "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - "version" "2.20.3" - -"comment-json@^2.2.0": - "integrity" "sha512-T+iXox779qsqneMYx/x5BZyz4xjCeQRmuNVzz8tko7qZUs3MlzpA3RAs+O1XsgcKToNBMIvfVzafGOeiU7RggA==" - "resolved" "https://registry.npmjs.org/comment-json/-/comment-json-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "core-util-is" "^1.0.2" - "esprima" "^4.0.1" - "has-own-prop" "^2.0.0" - "repeat-string" "^1.6.1" - -"concat-map@0.0.1": - "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" - -"concat-stream@^1.5.2": - "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" - "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" - "version" "1.6.2" - dependencies: - "buffer-from" "^1.0.0" - "inherits" "^2.0.3" - "readable-stream" "^2.2.2" - "typedarray" "^0.0.6" - -"concat-with-sourcemaps@*": - "integrity" "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==" - "resolved" "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "source-map" "^0.6.1" - -"configstore@^3.0.0": - "integrity" "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==" - "resolved" "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz" - "version" "3.1.5" - dependencies: - "dot-prop" "^4.2.1" - "graceful-fs" "^4.1.2" - "make-dir" "^1.0.0" - "unique-string" "^1.0.0" - "write-file-atomic" "^2.0.0" - "xdg-basedir" "^3.0.0" - -"configstore@^5.0.1": - "integrity" "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==" - "resolved" "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "dot-prop" "^5.2.0" - "graceful-fs" "^4.1.2" - "make-dir" "^3.0.0" - "unique-string" "^2.0.0" - "write-file-atomic" "^3.0.0" - "xdg-basedir" "^4.0.0" - -"cookie@^0.4.1": - "integrity" "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" - "version" "0.4.2" - -"copy-to-clipboard@^3.3.1": - "integrity" "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==" - "resolved" "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz" - "version" "3.3.1" - dependencies: - "toggle-selection" "^1.0.6" - -"core-util-is@^1.0.2", "core-util-is@~1.0.0": - "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - "version" "1.0.3" - -"cosmiconfig@^7.0.1": - "integrity" "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==" - "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "@types/parse-json" "^4.0.0" - "import-fresh" "^3.2.1" - "parse-json" "^5.0.0" - "path-type" "^4.0.0" - "yaml" "^1.10.0" - -"create-error-class@^3.0.0": - "integrity" "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==" - "resolved" "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "capture-stack-trace" "^1.0.0" - -"create-require@^1.1.0": - "integrity" "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - "resolved" "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - "version" "1.1.1" - -"cross-spawn@^5.0.1": - "integrity" "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==" - "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "lru-cache" "^4.0.1" - "shebang-command" "^1.2.0" - "which" "^1.2.9" - -"crypto-random-string@^1.0.0": - "integrity" "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==" - "resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz" - "version" "1.0.0" - -"crypto-random-string@^2.0.0": - "integrity" "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - "resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" - "version" "2.0.0" - -"css-in-js-utils@^2.0.0": - "integrity" "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==" - "resolved" "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "hyphenate-style-name" "^1.0.2" - "isobject" "^3.0.1" - -"css-tree@^1.1.2": - "integrity" "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==" - "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "mdn-data" "2.0.14" - "source-map" "^0.6.1" - -"cssesc@^3.0.0": - "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - "version" "3.0.0" - -"csstype@^3.0.2", "csstype@^3.0.6": - "integrity" "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz" - "version" "3.0.11" - -"data-uri-to-buffer@^4.0.0": - "integrity" "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" - "resolved" "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz" - "version" "4.0.0" - -"debug@^4.0.0", "debug@^4.3.3": - "integrity" "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" - "version" "4.3.3" - dependencies: - "ms" "2.1.2" - -"decamelize@^1.2.0": - "integrity" "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - "version" "1.2.0" - -"decode-named-character-reference@^1.0.0": - "integrity" "sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w==" - "resolved" "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "character-entities" "^2.0.0" - -"decompress-response@^3.3.0": - "integrity" "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==" - "resolved" "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "mimic-response" "^1.0.0" - -"decompress-response@^6.0.0": - "integrity" "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==" - "resolved" "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "mimic-response" "^3.1.0" - -"deep-extend@^0.6.0": - "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" - "version" "0.6.0" - -"defer-to-connect@^1.0.1": - "integrity" "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - "resolved" "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" - "version" "1.1.3" - -"defer-to-connect@^2.0.0": - "integrity" "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - "resolved" "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" - "version" "2.0.1" - -"defined@^1.0.0": - "integrity" "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==" - "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" - "version" "1.0.0" - -"delayed-stream@~1.0.0": - "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - "version" "1.0.0" - -"depd@~1.1.2": - "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - "version" "1.1.2" - -"dequal@^2.0.0": - "integrity" "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" - "resolved" "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz" - "version" "2.0.2" - -"detect-indent@^6.0.0": - "integrity" "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" - "resolved" "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" - "version" "6.1.0" - -"detective@^5.2.0": - "integrity" "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==" - "resolved" "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz" - "version" "5.2.0" - dependencies: - "acorn-node" "^1.6.1" - "defined" "^1.0.0" - "minimist" "^1.1.1" - -"diacritics-map@^0.1.0": - "integrity" "sha1-bfwP+dAQAKLt8oZTccrDFulJd68= sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==" - "resolved" "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz" - "version" "0.1.0" - -"didyoumean@^1.2.2": - "integrity" "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - "resolved" "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" - "version" "1.2.2" - -"diff@^4.0.1": - "integrity" "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" - "resolved" "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - "version" "4.0.2" - -"diff@^5.0.0": - "integrity" "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" - "resolved" "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - "version" "5.0.0" - -"dlv@^1.1.3": - "integrity" "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - "resolved" "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" - "version" "1.1.3" - -"dot-prop@^4.2.1": - "integrity" "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==" - "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz" - "version" "4.2.1" - dependencies: - "is-obj" "^1.0.0" - -"dot-prop@^5.2.0": - "integrity" "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" - "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - "version" "5.3.0" - dependencies: - "is-obj" "^2.0.0" - -"dotenv@^5.0.1": - "integrity" "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==" - "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz" - "version" "5.0.1" - -"duplexer3@^0.1.4": - "integrity" "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==" - "resolved" "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz" - "version" "0.1.4" - -"editorconfig@^0.15.3": - "integrity" "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==" - "resolved" "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz" - "version" "0.15.3" - dependencies: - "commander" "^2.19.0" - "lru-cache" "^4.1.5" - "semver" "^5.6.0" - "sigmund" "^1.0.1" - -"electron-to-chromium@^1.4.84": - "integrity" "sha512-K9AsQ41WS2bjZUFpRWfvaS4RjEcRCamEkBJN1Z1TQILBfP1H8QnJ9ti0wiLiMv0sRjX3EHKzgs9jDnmGFx2jXg==" - "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.85.tgz" - "version" "1.4.85" - -"emoji-regex@^7.0.1": - "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" - "version" "7.0.3" - -"emoji-regex@^8.0.0": - "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - "version" "8.0.0" - -"end-of-stream@^1.1.0": - "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" - "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - "version" "1.4.4" - dependencies: - "once" "^1.4.0" - -"error-ex@^1.3.1": - "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" - "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "is-arrayish" "^0.2.1" - -"error-stack-parser@^2.0.6": - "integrity" "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==" - "resolved" "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz" - "version" "2.0.7" - dependencies: - "stackframe" "^1.1.1" - -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" - -"escape-goat@^2.0.0": - "integrity" "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - "resolved" "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" - "version" "2.1.1" - -"escape-string-regexp@^1.0.2", "escape-string-regexp@^1.0.5": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" - -"escape-string-regexp@^5.0.0": - "integrity" "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" - "version" "5.0.0" - -"esprima@^4.0.0", "esprima@^4.0.1": - "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - "version" "4.0.1" - -"estree-util-attach-comments@^2.0.0": - "integrity" "sha512-kT9YVRvlt2ewPp9BazfIIgXMGsXOEpOm57bK8aa4F3eOEndMml2JAETjWaG3SZYHmC6axSNIzHGY718dYwIuVg==" - "resolved" "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "@types/estree" "^0.0.46" - -"estree-util-build-jsx@^2.0.0": - "integrity" "sha512-d49hPGqBCJF/bF06g1Ywg7zjH1mrrUdPPrixBlKBxcX4WvMYlUUJ8BkrwlzWc8/fm6XqGgk5jilhgeZBDEGwOQ==" - "resolved" "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "@types/estree-jsx" "^0.0.1" - "estree-util-is-identifier-name" "^2.0.0" - "estree-walker" "^3.0.0" - -"estree-util-is-identifier-name@^2.0.0": - "integrity" "sha512-aXXZFVMnBBDRP81vS4YtAYJ0hUkgEsXea7lNKWCOeaAquGb1Jm2rcONPB5fpzwgbNxulTvrWuKnp9UElUGAKeQ==" - "resolved" "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.0.tgz" - "version" "2.0.0" - -"estree-util-visit@^1.0.0": - "integrity" "sha512-3lXJ4Us9j8TUif9cWcQy81t9p5OLasnDuuhrFiqb+XstmKC1d1LmrQWYsY49/9URcfHE64mPypDBaNK9NwWDPQ==" - "resolved" "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "@types/estree-jsx" "^0.0.1" - "@types/unist" "^2.0.0" - -"estree-walker@^3.0.0": - "integrity" "sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==" - "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.1.tgz" - "version" "3.0.1" - -"esutils@^2.0.2": - "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - "version" "2.0.3" - -"execa@^0.7.0": - "integrity" "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==" - "resolved" "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz" - "version" "0.7.0" - dependencies: - "cross-spawn" "^5.0.1" - "get-stream" "^3.0.0" - "is-stream" "^1.1.0" - "npm-run-path" "^2.0.0" - "p-finally" "^1.0.0" - "signal-exit" "^3.0.0" - "strip-eof" "^1.0.0" - -"expand-range@^1.8.1": - "integrity" "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==" - "resolved" "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz" - "version" "1.8.2" - dependencies: - "fill-range" "^2.1.0" - -"extend-shallow@^2.0.1": - "integrity" "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==" - "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "is-extendable" "^0.1.0" - -"extend@^3.0.0": - "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - "version" "3.0.2" - -"external-editor@^3.0.3": - "integrity" "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==" - "resolved" "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "chardet" "^0.7.0" - "iconv-lite" "^0.4.24" - "tmp" "^0.0.33" - -"fast-deep-equal@^3.1.3": - "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - "version" "3.1.3" - -"fast-glob@^3.2.11": - "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" - "version" "3.2.11" - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - "glob-parent" "^5.1.2" - "merge2" "^1.3.0" - "micromatch" "^4.0.4" - -"fast-shallow-equal@^1.0.0": - "integrity" "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" - "resolved" "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz" - "version" "1.0.0" - -"fastest-stable-stringify@^2.0.2": - "integrity" "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==" - "resolved" "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz" - "version" "2.0.2" - -"fastq@^1.6.0": - "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" - "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - "version" "1.13.0" - dependencies: - "reusify" "^1.0.4" - -"fault@^1.0.0": - "integrity" "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==" - "resolved" "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "format" "^0.2.0" - -"fetch-blob@^3.1.2", "fetch-blob@^3.1.4": - "integrity" "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==" - "resolved" "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz" - "version" "3.1.5" - dependencies: - "node-domexception" "^1.0.0" - "web-streams-polyfill" "^3.0.3" - -"figures@^3.0.0": - "integrity" "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" - "resolved" "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" - "version" "3.2.0" - dependencies: - "escape-string-regexp" "^1.0.5" - -"fill-range@^2.1.0": - "integrity" "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz" - "version" "2.2.4" - dependencies: - "is-number" "^2.1.0" - "isobject" "^2.0.0" - "randomatic" "^3.0.0" - "repeat-element" "^1.1.2" - "repeat-string" "^1.5.2" - -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "to-regex-range" "^5.0.1" - -"find-up@^3.0.0": - "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "locate-path" "^3.0.0" - -"find-up@^4.1.0": - "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "locate-path" "^5.0.0" - "path-exists" "^4.0.0" - -"follow-redirects@^1.15.0": - "integrity" "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - "version" "1.15.2" - -"for-in@^1.0.2": - "integrity" "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" - "resolved" "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" - "version" "1.0.2" - -"form-data@^4.0.0": - "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.8" - "mime-types" "^2.1.12" - -"format@^0.2.0": - "integrity" "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" - "resolved" "https://registry.npmjs.org/format/-/format-0.2.2.tgz" - "version" "0.2.2" - -"formdata-polyfill@^4.0.10": - "integrity" "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==" - "resolved" "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" - "version" "4.0.10" - dependencies: - "fetch-blob" "^3.1.2" - -"fraction.js@^4.2.0": - "integrity" "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" - "resolved" "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" - "version" "4.2.0" - -"fs-exists-sync@^0.1.0": - "integrity" "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==" - "resolved" "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz" - "version" "0.1.0" - -"fs-extra@^8.1.0": - "integrity" "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - "version" "8.1.0" - dependencies: - "graceful-fs" "^4.2.0" - "jsonfile" "^4.0.0" - "universalify" "^0.1.0" - -"fs.realpath@^1.0.0": - "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" - -"fsevents@~2.3.2": - "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" - "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - "version" "2.3.2" - -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" - -"futoin-hkdf@^1.4.2": - "integrity" "sha512-4CerDhtTgx4i5PKccQIpEp4T9wqmosPIP9Kep35SdCpYkQeriD3zddUVhrO1Fc4QvGhsAnd2rXyoOr5047mJEg==" - "resolved" "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.0.tgz" - "version" "1.5.0" - -"get-caller-file@^2.0.1": - "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - "version" "2.0.5" - -"get-stream@^3.0.0": - "integrity" "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==" - "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" - "version" "3.0.0" - -"get-stream@^4.1.0": - "integrity" "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==" - "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "pump" "^3.0.0" - -"get-stream@^5.1.0": - "integrity" "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==" - "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - "version" "5.2.0" - dependencies: - "pump" "^3.0.0" - -"git-config-path@^1.0.1": - "integrity" "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ= sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==" - "resolved" "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "extend-shallow" "^2.0.1" - "fs-exists-sync" "^0.1.0" - "homedir-polyfill" "^1.0.0" - -"git-username@^1.0.0": - "integrity" "sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ==" - "resolved" "https://registry.npmjs.org/git-username/-/git-username-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "parse-github-url" "^1.0.2" - "remote-origin-url" "^1.0.0" - -"github-slugger@^1.1.1": - "integrity" "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" - "resolved" "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz" - "version" "1.4.0" - -"glob-parent@^5.1.2", "glob-parent@~5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - -"glob-parent@^6.0.2": - "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "is-glob" "^4.0.3" - -"glob@^7.1.3", "glob@^7.1.6": - "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^3.0.4" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"global-dirs@^0.1.0": - "integrity" "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==" - "resolved" "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz" - "version" "0.1.1" - dependencies: - "ini" "^1.3.4" - -"global-dirs@^2.0.1": - "integrity" "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==" - "resolved" "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "ini" "1.3.7" - -"got@^11.8.0": - "integrity" "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==" - "resolved" "https://registry.npmjs.org/got/-/got-11.8.3.tgz" - "version" "11.8.3" - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - "cacheable-lookup" "^5.0.3" - "cacheable-request" "^7.0.2" - "decompress-response" "^6.0.0" - "http2-wrapper" "^1.0.0-beta.5.2" - "lowercase-keys" "^2.0.0" - "p-cancelable" "^2.0.0" - "responselike" "^2.0.0" - -"got@^6.7.1": - "integrity" "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==" - "resolved" "https://registry.npmjs.org/got/-/got-6.7.1.tgz" - "version" "6.7.1" - dependencies: - "create-error-class" "^3.0.0" - "duplexer3" "^0.1.4" - "get-stream" "^3.0.0" - "is-redirect" "^1.0.0" - "is-retry-allowed" "^1.0.0" - "is-stream" "^1.0.0" - "lowercase-keys" "^1.0.0" - "safe-buffer" "^5.0.1" - "timed-out" "^4.0.0" - "unzip-response" "^2.0.1" - "url-parse-lax" "^1.0.0" - -"got@^9.6.0": - "integrity" "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==" - "resolved" "https://registry.npmjs.org/got/-/got-9.6.0.tgz" - "version" "9.6.0" - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - "cacheable-request" "^6.0.0" - "decompress-response" "^3.3.0" - "duplexer3" "^0.1.4" - "get-stream" "^4.1.0" - "lowercase-keys" "^1.0.1" - "mimic-response" "^1.0.1" - "p-cancelable" "^1.0.0" - "to-readable-stream" "^1.0.0" - "url-parse-lax" "^3.0.0" - -"graceful-fs@^4.1.11", "graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.2.0": - "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - "version" "4.2.10" - -"gray-matter@^2.1.0": - "integrity" "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4= sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==" - "resolved" "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "ansi-red" "^0.1.1" - "coffee-script" "^1.12.4" - "extend-shallow" "^2.0.1" - "js-yaml" "^3.8.1" - "toml" "^2.3.2" - -"gray-matter@^4.0.3": - "integrity" "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==" - "resolved" "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "js-yaml" "^3.13.1" - "kind-of" "^6.0.2" - "section-matter" "^1.0.0" - "strip-bom-string" "^1.0.0" - -"gulp-header@^1.7.1": - "integrity" "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==" - "resolved" "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz" - "version" "1.8.12" - dependencies: - "concat-with-sourcemaps" "*" - "lodash.template" "^4.4.0" - "through2" "^2.0.0" - -"has-ansi@^2.0.0": - "integrity" "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==" - "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "ansi-regex" "^2.0.0" - -"has-flag@^3.0.0": - "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" - -"has-flag@^4.0.0": - "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - "version" "4.0.0" - -"has-own-prop@^2.0.0": - "integrity" "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==" - "resolved" "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz" - "version" "2.0.0" - -"has-yarn@^2.1.0": - "integrity" "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - "resolved" "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" - "version" "2.1.0" - -"has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "function-bind" "^1.1.1" - -"hast-util-has-property@^2.0.0": - "integrity" "sha512-4Qf++8o5v14us4Muv3HRj+Er6wTNGA/N9uCaZMty4JWvyFKLdhULrv4KE1b65AthsSO9TXSZnjuxS8ecIyhb0w==" - "resolved" "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.0.tgz" - "version" "2.0.0" - -"hast-util-heading-rank@^2.0.0": - "integrity" "sha512-w+Rw20Q/iWp2Bcnr6uTrYU6/ftZLbHKhvc8nM26VIWpDqDMlku2iXUVTeOlsdoih/UKQhY7PHQ+vZ0Aqq8bxtQ==" - "resolved" "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "@types/hast" "^2.0.0" - -"hast-util-parse-selector@^2.0.0": - "integrity" "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" - "resolved" "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" - "version" "2.2.5" - -"hast-util-to-estree@^2.0.0": - "integrity" "sha512-UQrZVeBj6A9od0lpFvqHKNSH9zvDrNoyWKbveu1a2oSCXEDUI+3bnd6BoiQLPnLrcXXn/jzJ6y9hmJTTlvf8lQ==" - "resolved" "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "@types/estree-jsx" "^0.0.1" - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - "comma-separated-tokens" "^2.0.0" - "estree-util-attach-comments" "^2.0.0" - "estree-util-is-identifier-name" "^2.0.0" - "hast-util-whitespace" "^2.0.0" - "mdast-util-mdx-expression" "^1.0.0" - "mdast-util-mdxjs-esm" "^1.0.0" - "property-information" "^6.0.0" - "space-separated-tokens" "^2.0.0" - "style-to-object" "^0.3.0" - "unist-util-position" "^4.0.0" - "zwitch" "^2.0.0" - -"hast-util-to-string@^1.0.4": - "integrity" "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==" - "resolved" "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz" - "version" "1.0.4" - -"hast-util-to-string@^2.0.0": - "integrity" "sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==" - "resolved" "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "@types/hast" "^2.0.0" - -"hast-util-whitespace@^2.0.0": - "integrity" "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==" - "resolved" "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz" - "version" "2.0.0" - -"hastscript@^6.0.0": - "integrity" "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==" - "resolved" "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "@types/hast" "^2.0.0" - "comma-separated-tokens" "^1.0.0" - "hast-util-parse-selector" "^2.0.0" - "property-information" "^5.0.0" - "space-separated-tokens" "^1.0.0" - -"highlight.js@^10.4.1", "highlight.js@~10.7.0": - "integrity" "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - "resolved" "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" - "version" "10.7.3" - -"homedir-polyfill@^1.0.0": - "integrity" "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==" - "resolved" "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "parse-passwd" "^1.0.0" - -"hosted-git-info@^2.7.1": - "integrity" "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" - "version" "2.8.9" - -"http-cache-semantics@^4.0.0": - "integrity" "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - "resolved" "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" - "version" "4.1.0" - -"http-errors@^1.8.1": - "integrity" "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==" - "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" - "version" "1.8.1" - dependencies: - "depd" "~1.1.2" - "inherits" "2.0.4" - "setprototypeof" "1.2.0" - "statuses" ">= 1.5.0 < 2" - "toidentifier" "1.0.1" - -"http2-wrapper@^1.0.0-beta.5.2": - "integrity" "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==" - "resolved" "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "quick-lru" "^5.1.1" - "resolve-alpn" "^1.0.0" - -"hyphenate-style-name@^1.0.2": - "integrity" "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - "resolved" "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" - "version" "1.0.4" - -"iconv-lite@^0.4.24": - "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" - "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - "version" "0.4.24" - dependencies: - "safer-buffer" ">= 2.1.2 < 3" - -"immutable@^4.0.0": - "integrity" "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" - "resolved" "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz" - "version" "4.0.0" - -"import-fresh@^3.2.1": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" - -"import-lazy@^2.1.0": - "integrity" "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" - "resolved" "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" - "version" "2.1.0" - -"imurmurhash@^0.1.4": - "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - "version" "0.1.4" - -"indent-string@^4.0.0": - "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - "version" "4.0.0" - -"inflight@^1.0.4": - "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "once" "^1.3.0" - "wrappy" "1" - -"inherits@^2.0.3", "inherits@~2.0.3", "inherits@2", "inherits@2.0.4": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" - -"ini@^1.3.4", "ini@~1.3.0": - "integrity" "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - "version" "1.3.8" - -"ini@1.3.7": - "integrity" "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" - "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz" - "version" "1.3.7" - -"inline-style-parser@0.1.1": - "integrity" "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - "resolved" "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" - "version" "0.1.1" - -"inline-style-prefixer@^6.0.0": - "integrity" "sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ==" - "resolved" "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.1.tgz" - "version" "6.0.1" - dependencies: - "css-in-js-utils" "^2.0.0" - -"inquirer@^7.0.4": - "integrity" "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==" - "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz" - "version" "7.3.3" - dependencies: - "ansi-escapes" "^4.2.1" - "chalk" "^4.1.0" - "cli-cursor" "^3.1.0" - "cli-width" "^3.0.0" - "external-editor" "^3.0.3" - "figures" "^3.0.0" - "lodash" "^4.17.19" - "mute-stream" "0.0.8" - "run-async" "^2.4.0" - "rxjs" "^6.6.0" - "string-width" "^4.1.0" - "strip-ansi" "^6.0.0" - "through" "^2.3.6" - -"is-alphabetical@^1.0.0": - "integrity" "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - "resolved" "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" - "version" "1.0.4" - -"is-alphabetical@^2.0.0": - "integrity" "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" - "resolved" "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" - "version" "2.0.1" - -"is-alphanumerical@^1.0.0": - "integrity" "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==" - "resolved" "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "is-alphabetical" "^1.0.0" - "is-decimal" "^1.0.0" - -"is-alphanumerical@^2.0.0": - "integrity" "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==" - "resolved" "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "is-alphabetical" "^2.0.0" - "is-decimal" "^2.0.0" - -"is-arrayish@^0.2.1": - "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - "version" "0.2.1" - -"is-binary-path@~2.1.0": - "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "binary-extensions" "^2.0.0" - -"is-buffer@^1.1.5": - "integrity" "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - "version" "1.1.6" - -"is-buffer@^2.0.0": - "integrity" "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - "version" "2.0.5" - -"is-ci@^1.0.10": - "integrity" "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==" - "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "ci-info" "^1.5.0" - -"is-ci@^2.0.0": - "integrity" "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==" - "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "ci-info" "^2.0.0" - -"is-core-module@^2.8.1": - "integrity" "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==" - "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz" - "version" "2.8.1" - dependencies: - "has" "^1.0.3" - -"is-decimal@^1.0.0": - "integrity" "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - "resolved" "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" - "version" "1.0.4" - -"is-decimal@^2.0.0": - "integrity" "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" - "resolved" "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" - "version" "2.0.1" - -"is-directory@^0.3.1": - "integrity" "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==" - "resolved" "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz" - "version" "0.3.1" - -"is-extendable@^0.1.0": - "integrity" "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" - "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - "version" "0.1.1" - -"is-extendable@^1.0.1": - "integrity" "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==" - "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "is-plain-object" "^2.0.4" - -"is-extglob@^2.1.1": - "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" - -"is-fullwidth-code-point@^2.0.0": - "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - "version" "2.0.0" - -"is-fullwidth-code-point@^3.0.0": - "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - "version" "3.0.0" - -"is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": - "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "is-extglob" "^2.1.1" - -"is-hexadecimal@^1.0.0": - "integrity" "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - "resolved" "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" - "version" "1.0.4" - -"is-hexadecimal@^2.0.0": - "integrity" "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" - "resolved" "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz" - "version" "2.0.1" - -"is-installed-globally@^0.1.0": - "integrity" "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==" - "resolved" "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz" - "version" "0.1.0" - dependencies: - "global-dirs" "^0.1.0" - "is-path-inside" "^1.0.0" - -"is-installed-globally@^0.3.1": - "integrity" "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==" - "resolved" "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz" - "version" "0.3.2" - dependencies: - "global-dirs" "^2.0.1" - "is-path-inside" "^3.0.1" - -"is-npm@^1.0.0": - "integrity" "sha1-8vtjpl5JBbQGyGBydloaTceTufQ= sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==" - "resolved" "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz" - "version" "1.0.0" - -"is-npm@^4.0.0": - "integrity" "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" - "resolved" "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz" - "version" "4.0.0" - -"is-number@^2.1.0": - "integrity" "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "kind-of" "^3.0.2" - -"is-number@^4.0.0": - "integrity" "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz" - "version" "4.0.0" - -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" - -"is-obj@^1.0.0": - "integrity" "sha1-PkcprB9f3gJc19g6iW2rn09n2w8= sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" - "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" - "version" "1.0.1" - -"is-obj@^2.0.0": - "integrity" "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - "version" "2.0.0" - -"is-path-inside@^1.0.0": - "integrity" "sha1-jvW33lBDej/cprToZe96pVy0gDY= sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==" - "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "path-is-inside" "^1.0.1" - -"is-path-inside@^3.0.1": - "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - "version" "3.0.3" - -"is-plain-obj@^4.0.0": - "integrity" "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==" - "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz" - "version" "4.0.0" - -"is-plain-object@^2.0.4": - "integrity" "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==" - "resolved" "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - "version" "2.0.4" - dependencies: - "isobject" "^3.0.1" - -"is-redirect@^1.0.0": - "integrity" "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==" - "resolved" "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz" - "version" "1.0.0" - -"is-reference@^3.0.0": - "integrity" "sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q==" - "resolved" "https://registry.npmjs.org/is-reference/-/is-reference-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "@types/estree" "*" - -"is-retry-allowed@^1.0.0": - "integrity" "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - "resolved" "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz" - "version" "1.2.0" - -"is-stream@^1.0.0", "is-stream@^1.1.0": - "integrity" "sha1-EtSj3U5o4Lec6428hBc66A2RykQ= sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" - "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - "version" "1.1.0" - -"is-typedarray@^1.0.0": - "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - "version" "1.0.0" - -"is-yarn-global@^0.3.0": - "integrity" "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - "resolved" "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" - "version" "0.3.0" - -"isarray@~1.0.0", "isarray@1.0.0": - "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - "version" "1.0.0" - -"isexe@^2.0.0": - "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" - -"isobject@^2.0.0": - "integrity" "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==" - "resolved" "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "isarray" "1.0.0" - -"isobject@^3.0.1": - "integrity" "sha1-TkMekrEalzFjaqH5yNHMvP2reN8= sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" - "resolved" "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - "version" "3.0.1" - -"joi@^17.5.0": - "integrity" "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==" - "resolved" "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz" - "version" "17.6.0" - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" - "@sideway/pinpoint" "^2.0.0" - -"jose@^2.0.5": - "integrity" "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==" - "resolved" "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz" - "version" "2.0.5" - dependencies: - "@panva/asn1.js" "^1.0.0" - -"js-cookie@^2.2.1": - "integrity" "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - "resolved" "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" - "version" "2.2.1" - -"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^3.0.2": - "integrity" "sha1-mGbfOVECEw449/mWvOtlRDIJwls= sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" - "version" "3.0.2" - -"js-tokens@^4.0.0": - "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - "version" "4.0.0" - -"js-yaml@^3.13.1", "js-yaml@^3.8.1": - "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - "version" "3.14.1" - dependencies: - "argparse" "^1.0.7" - "esprima" "^4.0.0" - -"js-yaml@^4.0.0": - "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "argparse" "^2.0.1" - -"json-buffer@3.0.0": - "integrity" "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - "resolved" "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" - "version" "3.0.0" - -"json-buffer@3.0.1": - "integrity" "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - "resolved" "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - "version" "3.0.1" - -"json-parse-even-better-errors@^2.3.0": - "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - "version" "2.3.1" - -"jsonfile@^4.0.0": - "integrity" "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" - "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - "version" "4.0.0" - optionalDependencies: - "graceful-fs" "^4.1.6" - -"keyv@^3.0.0": - "integrity" "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==" - "resolved" "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "json-buffer" "3.0.0" - -"keyv@^4.0.0": - "integrity" "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==" - "resolved" "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz" - "version" "4.1.1" - dependencies: - "json-buffer" "3.0.1" - -"kind-of@^3.0.2": - "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - "version" "3.2.2" - dependencies: - "is-buffer" "^1.1.5" - -"kind-of@^6.0.0", "kind-of@^6.0.2": - "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - "version" "6.0.3" - -"kleur@^3.0.3": - "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - "resolved" "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - "version" "3.0.3" - -"kleur@^4.0.3": - "integrity" "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==" - "resolved" "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz" - "version" "4.1.4" - -"latest-version@^3.0.0": - "integrity" "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==" - "resolved" "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "package-json" "^4.0.0" - -"latest-version@^5.0.0": - "integrity" "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==" - "resolved" "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "package-json" "^6.3.0" - -"lazy-cache@^2.0.2": - "integrity" "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==" - "resolved" "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "set-getter" "^0.1.0" - -"libnpx@^10.2.4": - "integrity" "sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA==" - "resolved" "https://registry.npmjs.org/libnpx/-/libnpx-10.2.4.tgz" - "version" "10.2.4" - dependencies: - "dotenv" "^5.0.1" - "npm-package-arg" "^6.0.0" - "rimraf" "^2.6.2" - "safe-buffer" "^5.1.0" - "update-notifier" "^2.3.0" - "which" "^1.3.0" - "y18n" "^4.0.0" - "yargs" "^14.2.3" - -"lilconfig@^2.0.4": - "integrity" "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==" - "resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz" - "version" "2.0.4" - -"lines-and-columns@^1.1.6": - "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - "version" "1.2.4" - -"list-item@^1.1.1": - "integrity" "sha1-DGXQDih8tmPMs8s4Sad+iewmilY= sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==" - "resolved" "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "expand-range" "^1.8.1" - "extend-shallow" "^2.0.1" - "is-number" "^2.1.0" - "repeat-string" "^1.5.2" - -"listify@^1.0.0": - "integrity" "sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg==" - "resolved" "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz" - "version" "1.0.3" - -"locate-path@^3.0.0": - "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "p-locate" "^3.0.0" - "path-exists" "^3.0.0" - -"locate-path@^5.0.0": - "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "p-locate" "^4.1.0" - -"lodash._reinterpolate@^3.0.0": - "integrity" "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" - "resolved" "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" - "version" "3.0.0" - -"lodash.castarray@^4.4.0": - "integrity" "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==" - "resolved" "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz" - "version" "4.4.0" - -"lodash.isplainobject@^4.0.6": - "integrity" "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - "resolved" "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" - "version" "4.0.6" - -"lodash.merge@^4.6.2": - "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - "version" "4.6.2" - -"lodash.template@^4.4.0": - "integrity" "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==" - "resolved" "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz" - "version" "4.5.0" - dependencies: - "lodash._reinterpolate" "^3.0.0" - "lodash.templatesettings" "^4.0.0" - -"lodash.templatesettings@^4.0.0": - "integrity" "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==" - "resolved" "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz" - "version" "4.2.0" - dependencies: - "lodash._reinterpolate" "^3.0.0" - -"lodash@^4.17.15", "lodash@^4.17.19": - "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - "version" "4.17.21" - -"longest-streak@^3.0.0": - "integrity" "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==" - "resolved" "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz" - "version" "3.0.1" - -"longest@^2.0.1": - "integrity" "sha1-eB4YMpaqlPbU2RbcM10NF676I/g= sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==" - "resolved" "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz" - "version" "2.0.1" - -"loose-envify@^1.1.0", "loose-envify@^1.4.0": - "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" - "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "js-tokens" "^3.0.0 || ^4.0.0" - -"lowercase-keys@^1.0.0": - "integrity" "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" - "version" "1.0.1" - -"lowercase-keys@^1.0.1": - "integrity" "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" - "version" "1.0.1" - -"lowercase-keys@^2.0.0": - "integrity" "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" - "version" "2.0.0" - -"lowlight@^1.17.0": - "integrity" "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==" - "resolved" "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz" - "version" "1.20.0" - dependencies: - "fault" "^1.0.0" - "highlight.js" "~10.7.0" - -"lru-cache@^4.0.1", "lru-cache@^4.1.5": - "integrity" "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" - "version" "4.1.5" - dependencies: - "pseudomap" "^1.0.2" - "yallist" "^2.1.2" - -"lru-cache@^6.0.0": - "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "yallist" "^4.0.0" - -"make-dir@^1.0.0": - "integrity" "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==" - "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "pify" "^3.0.0" - -"make-dir@^3.0.0": - "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" - "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "semver" "^6.0.0" - -"make-error@^1.1.1", "make-error@^1.3.6": - "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - "version" "1.3.6" - -"markdown-extensions@^1.0.0": - "integrity" "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==" - "resolved" "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz" - "version" "1.1.1" - -"markdown-link@^0.1.1": - "integrity" "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88= sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==" - "resolved" "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz" - "version" "0.1.1" - -"markdown-table@^3.0.0": - "integrity" "sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA==" - "resolved" "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.2.tgz" - "version" "3.0.2" - -"markdown-toc@^1.2.0": - "integrity" "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==" - "resolved" "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "concat-stream" "^1.5.2" - "diacritics-map" "^0.1.0" - "gray-matter" "^2.1.0" - "lazy-cache" "^2.0.2" - "list-item" "^1.1.1" - "markdown-link" "^0.1.1" - "minimist" "^1.2.0" - "mixin-deep" "^1.1.3" - "object.pick" "^1.2.0" - "remarkable" "^1.7.1" - "repeat-string" "^1.6.1" - "strip-color" "^0.1.0" - -"math-random@^1.0.1": - "integrity" "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" - "resolved" "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz" - "version" "1.0.4" - -"mdast-util-definitions@^5.0.0": - "integrity" "sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==" - "resolved" "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - "unist-util-visit" "^3.0.0" - -"mdast-util-find-and-replace@^2.0.0": - "integrity" "sha512-1w1jbqAd13oU78QPBf5223+xB+37ecNtQ1JElq2feWols5oEYAl+SgNDnOZipe7NfLemoEt362yUS15/wip4mw==" - "resolved" "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "escape-string-regexp" "^5.0.0" - "unist-util-is" "^5.0.0" - "unist-util-visit-parents" "^4.0.0" - -"mdast-util-from-markdown@^1.0.0": - "integrity" "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==" - "resolved" "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - "decode-named-character-reference" "^1.0.0" - "mdast-util-to-string" "^3.1.0" - "micromark" "^3.0.0" - "micromark-util-decode-numeric-character-reference" "^1.0.0" - "micromark-util-decode-string" "^1.0.0" - "micromark-util-normalize-identifier" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "unist-util-stringify-position" "^3.0.0" - "uvu" "^0.5.0" - -"mdast-util-gfm-autolink-literal@^1.0.0": - "integrity" "sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==" - "resolved" "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "@types/mdast" "^3.0.0" - "ccount" "^2.0.0" - "mdast-util-find-and-replace" "^2.0.0" - "micromark-util-character" "^1.0.0" - -"mdast-util-gfm-footnote@^1.0.0": - "integrity" "sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==" - "resolved" "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "@types/mdast" "^3.0.0" - "mdast-util-to-markdown" "^1.3.0" - "micromark-util-normalize-identifier" "^1.0.0" - -"mdast-util-gfm-strikethrough@^1.0.0": - "integrity" "sha512-zKJbEPe+JP6EUv0mZ0tQUyLQOC+FADt0bARldONot/nefuISkaZFlmVK4tU6JgfyZGrky02m/I6PmehgAgZgqg==" - "resolved" "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "@types/mdast" "^3.0.0" - "mdast-util-to-markdown" "^1.3.0" - -"mdast-util-gfm-table@^1.0.0": - "integrity" "sha512-aEuoPwZyP4iIMkf2cLWXxx3EQ6Bmh2yKy9MVCg4i6Sd3cX80dcLEfXO/V4ul3pGH9czBK4kp+FAl+ZHmSUt9/w==" - "resolved" "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "markdown-table" "^3.0.0" - "mdast-util-from-markdown" "^1.0.0" - "mdast-util-to-markdown" "^1.3.0" - -"mdast-util-gfm-task-list-item@^1.0.0": - "integrity" "sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==" - "resolved" "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "@types/mdast" "^3.0.0" - "mdast-util-to-markdown" "^1.3.0" - -"mdast-util-gfm@^2.0.0": - "integrity" "sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==" - "resolved" "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "mdast-util-from-markdown" "^1.0.0" - "mdast-util-gfm-autolink-literal" "^1.0.0" - "mdast-util-gfm-footnote" "^1.0.0" - "mdast-util-gfm-strikethrough" "^1.0.0" - "mdast-util-gfm-table" "^1.0.0" - "mdast-util-gfm-task-list-item" "^1.0.0" - "mdast-util-to-markdown" "^1.0.0" - -"mdast-util-mdx-expression@^1.0.0": - "integrity" "sha512-wb36oi09XxqO9RVqgfD+xo8a7xaNgS+01+k3v0GKW0X0bYbeBmUZz22Z/IJ8SuphVlG+DNgNo9VoEaUJ3PKfJQ==" - "resolved" "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "@types/estree-jsx" "^0.0.1" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - "mdast-util-from-markdown" "^1.0.0" - "mdast-util-to-markdown" "^1.0.0" - -"mdast-util-mdx-jsx@^2.0.0": - "integrity" "sha512-oPC7/smPBf7vxnvIYH5y3fPo2lw1rdrswFfSb4i0GTAXRUQv7JUU/t/hbp07dgGdUFTSDOHm5DNamhNg/s2Hrg==" - "resolved" "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "@types/estree-jsx" "^0.0.1" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - "ccount" "^2.0.0" - "mdast-util-to-markdown" "^1.3.0" - "parse-entities" "^4.0.0" - "stringify-entities" "^4.0.0" - "unist-util-remove-position" "^4.0.0" - "unist-util-stringify-position" "^3.0.0" - "vfile-message" "^3.0.0" - -"mdast-util-mdx@^2.0.0": - "integrity" "sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==" - "resolved" "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "mdast-util-mdx-expression" "^1.0.0" - "mdast-util-mdx-jsx" "^2.0.0" - "mdast-util-mdxjs-esm" "^1.0.0" - -"mdast-util-mdxjs-esm@^1.0.0": - "integrity" "sha512-IPpX9GBzAIbIRCjbyeLDpMhACFb0wxTIujuR3YElB8LWbducUdMgRJuqs/Vg8xQ1bIAMm7lw8L+YNtua0xKXRw==" - "resolved" "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "@types/estree-jsx" "^0.0.1" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - "mdast-util-from-markdown" "^1.0.0" - "mdast-util-to-markdown" "^1.0.0" - -"mdast-util-to-hast@^12.1.0": - "integrity" "sha512-qE09zD6ylVP14jV4mjLIhDBOrpFdShHZcEsYvvKGABlr9mGbV7mTlRWdoFxL/EYSTNDiC9GZXy7y8Shgb9Dtzw==" - "resolved" "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz" - "version" "12.1.1" - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - "@types/mdurl" "^1.0.0" - "mdast-util-definitions" "^5.0.0" - "mdurl" "^1.0.0" - "micromark-util-sanitize-uri" "^1.0.0" - "unist-builder" "^3.0.0" - "unist-util-generated" "^2.0.0" - "unist-util-position" "^4.0.0" - "unist-util-visit" "^4.0.0" - -"mdast-util-to-markdown@^1.0.0", "mdast-util-to-markdown@^1.3.0": - "integrity" "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==" - "resolved" "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - "longest-streak" "^3.0.0" - "mdast-util-to-string" "^3.0.0" - "micromark-util-decode-string" "^1.0.0" - "unist-util-visit" "^4.0.0" - "zwitch" "^2.0.0" - -"mdast-util-to-string@^3.0.0", "mdast-util-to-string@^3.1.0": - "integrity" "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==" - "resolved" "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz" - "version" "3.1.0" - -"mdn-data@2.0.14": - "integrity" "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" - "version" "2.0.14" - -"mdurl@^1.0.0": - "integrity" "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - "resolved" "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" - "version" "1.0.1" - -"merge2@^1.3.0": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" - -"micromark-core-commonmark@^1.0.0", "micromark-core-commonmark@^1.0.1": - "integrity" "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==" - "resolved" "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "decode-named-character-reference" "^1.0.0" - "micromark-factory-destination" "^1.0.0" - "micromark-factory-label" "^1.0.0" - "micromark-factory-space" "^1.0.0" - "micromark-factory-title" "^1.0.0" - "micromark-factory-whitespace" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-chunked" "^1.0.0" - "micromark-util-classify-character" "^1.0.0" - "micromark-util-html-tag-name" "^1.0.0" - "micromark-util-normalize-identifier" "^1.0.0" - "micromark-util-resolve-all" "^1.0.0" - "micromark-util-subtokenize" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.1" - "uvu" "^0.5.0" - -"micromark-extension-gfm-autolink-literal@^1.0.0": - "integrity" "sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==" - "resolved" "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "micromark-util-character" "^1.0.0" - "micromark-util-sanitize-uri" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-extension-gfm-footnote@^1.0.0": - "integrity" "sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==" - "resolved" "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "micromark-core-commonmark" "^1.0.0" - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-normalize-identifier" "^1.0.0" - "micromark-util-sanitize-uri" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-extension-gfm-strikethrough@^1.0.0": - "integrity" "sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==" - "resolved" "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "micromark-util-chunked" "^1.0.0" - "micromark-util-classify-character" "^1.0.0" - "micromark-util-resolve-all" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-extension-gfm-table@^1.0.0": - "integrity" "sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==" - "resolved" "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-extension-gfm-tagfilter@^1.0.0": - "integrity" "sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==" - "resolved" "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "micromark-util-types" "^1.0.0" - -"micromark-extension-gfm-task-list-item@^1.0.0": - "integrity" "sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==" - "resolved" "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-extension-gfm@^2.0.0": - "integrity" "sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==" - "resolved" "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "micromark-extension-gfm-autolink-literal" "^1.0.0" - "micromark-extension-gfm-footnote" "^1.0.0" - "micromark-extension-gfm-strikethrough" "^1.0.0" - "micromark-extension-gfm-table" "^1.0.0" - "micromark-extension-gfm-tagfilter" "^1.0.0" - "micromark-extension-gfm-task-list-item" "^1.0.0" - "micromark-util-combine-extensions" "^1.0.0" - "micromark-util-types" "^1.0.0" - -"micromark-extension-mdx-expression@^1.0.0": - "integrity" "sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==" - "resolved" "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "micromark-factory-mdx-expression" "^1.0.0" - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-events-to-acorn" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-extension-mdx-jsx@^1.0.0": - "integrity" "sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==" - "resolved" "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "@types/acorn" "^4.0.0" - "estree-util-is-identifier-name" "^2.0.0" - "micromark-factory-mdx-expression" "^1.0.0" - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - "vfile-message" "^3.0.0" - -"micromark-extension-mdx-md@^1.0.0": - "integrity" "sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==" - "resolved" "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-types" "^1.0.0" - -"micromark-extension-mdxjs-esm@^1.0.0": - "integrity" "sha512-bIaxblNIM+CCaJvp3L/V+168l79iuNmxEiTU6i3vB0YuDW+rumV64BFMxvhfRDxaJxQE1zD5vTPdyLBbW4efGA==" - "resolved" "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "micromark-core-commonmark" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-events-to-acorn" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "unist-util-position-from-estree" "^1.1.0" - "uvu" "^0.5.0" - "vfile-message" "^3.0.0" - -"micromark-extension-mdxjs@^1.0.0": - "integrity" "sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==" - "resolved" "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "acorn" "^8.0.0" - "acorn-jsx" "^5.0.0" - "micromark-extension-mdx-expression" "^1.0.0" - "micromark-extension-mdx-jsx" "^1.0.0" - "micromark-extension-mdx-md" "^1.0.0" - "micromark-extension-mdxjs-esm" "^1.0.0" - "micromark-util-combine-extensions" "^1.0.0" - "micromark-util-types" "^1.0.0" - -"micromark-factory-destination@^1.0.0": - "integrity" "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==" - "resolved" "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-character" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - -"micromark-factory-label@^1.0.0": - "integrity" "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==" - "resolved" "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "micromark-util-character" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-factory-mdx-expression@^1.0.0": - "integrity" "sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==" - "resolved" "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-events-to-acorn" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "unist-util-position-from-estree" "^1.0.0" - "uvu" "^0.5.0" - "vfile-message" "^3.0.0" - -"micromark-factory-space@^1.0.0": - "integrity" "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==" - "resolved" "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-character" "^1.0.0" - "micromark-util-types" "^1.0.0" - -"micromark-factory-title@^1.0.0": - "integrity" "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==" - "resolved" "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-factory-whitespace@^1.0.0": - "integrity" "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==" - "resolved" "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - -"micromark-util-character@^1.0.0": - "integrity" "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==" - "resolved" "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - -"micromark-util-chunked@^1.0.0": - "integrity" "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==" - "resolved" "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-symbol" "^1.0.0" - -"micromark-util-classify-character@^1.0.0": - "integrity" "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==" - "resolved" "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-character" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - -"micromark-util-combine-extensions@^1.0.0": - "integrity" "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==" - "resolved" "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-chunked" "^1.0.0" - "micromark-util-types" "^1.0.0" - -"micromark-util-decode-numeric-character-reference@^1.0.0": - "integrity" "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==" - "resolved" "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-symbol" "^1.0.0" - -"micromark-util-decode-string@^1.0.0": - "integrity" "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==" - "resolved" "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "decode-named-character-reference" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-decode-numeric-character-reference" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - -"micromark-util-encode@^1.0.0": - "integrity" "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==" - "resolved" "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz" - "version" "1.0.1" - -"micromark-util-events-to-acorn@^1.0.0": - "integrity" "sha512-dpo8ecREK5s/KMph7jJ46RLM6g7N21CMc9LAJQbDLdbQnTpijigkSJPTIfLXZ+h5wdXlcsQ+b6ufAE9v76AdgA==" - "resolved" "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "@types/acorn" "^4.0.0" - "@types/estree" "^0.0.50" - "estree-util-visit" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - "vfile-message" "^3.0.0" - -"micromark-util-html-tag-name@^1.0.0": - "integrity" "sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==" - "resolved" "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz" - "version" "1.0.0" - -"micromark-util-normalize-identifier@^1.0.0": - "integrity" "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==" - "resolved" "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-symbol" "^1.0.0" - -"micromark-util-resolve-all@^1.0.0": - "integrity" "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==" - "resolved" "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-types" "^1.0.0" - -"micromark-util-sanitize-uri@^1.0.0": - "integrity" "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==" - "resolved" "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "micromark-util-character" "^1.0.0" - "micromark-util-encode" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - -"micromark-util-subtokenize@^1.0.0": - "integrity" "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==" - "resolved" "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "micromark-util-chunked" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.0" - "uvu" "^0.5.0" - -"micromark-util-symbol@^1.0.0": - "integrity" "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==" - "resolved" "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz" - "version" "1.0.1" - -"micromark-util-types@^1.0.0", "micromark-util-types@^1.0.1": - "integrity" "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==" - "resolved" "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz" - "version" "1.0.2" - -"micromark@^3.0.0": - "integrity" "sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==" - "resolved" "https://registry.npmjs.org/micromark/-/micromark-3.0.10.tgz" - "version" "3.0.10" - dependencies: - "@types/debug" "^4.0.0" - "debug" "^4.0.0" - "decode-named-character-reference" "^1.0.0" - "micromark-core-commonmark" "^1.0.1" - "micromark-factory-space" "^1.0.0" - "micromark-util-character" "^1.0.0" - "micromark-util-chunked" "^1.0.0" - "micromark-util-combine-extensions" "^1.0.0" - "micromark-util-decode-numeric-character-reference" "^1.0.0" - "micromark-util-encode" "^1.0.0" - "micromark-util-normalize-identifier" "^1.0.0" - "micromark-util-resolve-all" "^1.0.0" - "micromark-util-sanitize-uri" "^1.0.0" - "micromark-util-subtokenize" "^1.0.0" - "micromark-util-symbol" "^1.0.0" - "micromark-util-types" "^1.0.1" - "uvu" "^0.5.0" - -"micromatch@^4.0.4": - "integrity" "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" - "version" "4.0.4" - dependencies: - "braces" "^3.0.1" - "picomatch" "^2.2.3" - -"middleearth-names@^1.1.0": - "integrity" "sha1-wdXuSN77NoEo+66/686IR80Y3f8= sha512-Oo1mbq9odpn6KHsDs8/UA5xFfX/gcrY+jWZpvd5MDaX0tjkxA7S7NTREQuqD7DWfluDgygjhKvETMWbwd3A9sA==" - "resolved" "https://registry.npmjs.org/middleearth-names/-/middleearth-names-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "unique-random-array" "1.0.0" - -"mime-db@1.52.0": - "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - "version" "1.52.0" - -"mime-types@^2.1.12": - "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" - "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - "version" "2.1.35" - dependencies: - "mime-db" "1.52.0" - -"mimic-fn@^2.1.0": - "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - "version" "2.1.0" - -"mimic-response@^1.0.0", "mimic-response@^1.0.1": - "integrity" "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - "resolved" "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" - "version" "1.0.1" - -"mimic-response@^3.1.0": - "integrity" "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - "resolved" "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" - "version" "3.1.0" - -"mini-svg-data-uri@^1.2.3": - "integrity" "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==" - "resolved" "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz" - "version" "1.4.4" - -"minimatch@^3.0.4": - "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "brace-expansion" "^1.1.7" - -"minimist@^1.1.1", "minimist@^1.2.0", "minimist@^1.2.5": - "integrity" "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - "version" "1.2.6" - -"mixin-deep@^1.1.3": - "integrity" "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==" - "resolved" "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "for-in" "^1.0.2" - "is-extendable" "^1.0.1" - -"mixpanel-browser@^2.45.0": - "integrity" "sha512-PQ1DaTk68yyYtLA0iejmzPA9iNDhT4uIZpqZjRTw7HWpYfl123fydHb2laKanaKjm8YDmrGGz3+xZ4Q6joogyg==" - "resolved" "https://registry.npmjs.org/mixpanel-browser/-/mixpanel-browser-2.45.0.tgz" - "version" "2.45.0" - -"mri@^1.1.0": - "integrity" "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" - "resolved" "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" - "version" "1.2.0" - -"mrm-core@^6.1.7": - "integrity" "sha512-jLGWrkupcgGIsLerrI/xmM/dFHbaoehRsuVbgYBrxYKXNMRBHN3Mgkd8cw+/ZCCoiZEXF8/SaZol0GCp6oBQ9g==" - "resolved" "https://registry.npmjs.org/mrm-core/-/mrm-core-6.1.7.tgz" - "version" "6.1.7" - dependencies: - "babel-code-frame" "^6.26.0" - "comment-json" "^2.2.0" - "detect-indent" "^6.0.0" - "editorconfig" "^0.15.3" - "find-up" "^4.1.0" - "fs-extra" "^8.1.0" - "kleur" "^3.0.3" - "listify" "^1.0.0" - "lodash" "^4.17.15" - "minimist" "^1.2.0" - "prop-ini" "^0.0.2" - "rc" "^1.2.8" - "readme-badger" "^0.3.0" - "semver" "^6.3.0" - "smpltmpl" "^1.0.2" - "split-lines" "^2.0.0" - "strip-bom" "^4.0.0" - "validate-npm-package-name" "^3.0.0" - "webpack-merge" "^4.2.2" - "yaml" "^2.0.0-1" - -"mrm@^3.0.9": - "integrity" "sha512-aRByZsPXMM8W0NHNH9afkKyk5OW4bB5pYNRIN+8iSVfpMAzqeMejmj/yIYcdFNJTksXmdPMfTaucm2NYdh4xIw==" - "resolved" "https://registry.npmjs.org/mrm/-/mrm-3.0.10.tgz" - "version" "3.0.10" - dependencies: - "git-username" "^1.0.0" - "glob" "^7.1.6" - "inquirer" "^7.0.4" - "is-directory" "^0.3.1" - "kleur" "^3.0.3" - "libnpx" "^10.2.4" - "listify" "^1.0.0" - "lodash" "^4.17.15" - "longest" "^2.0.1" - "middleearth-names" "^1.1.0" - "minimist" "^1.2.0" - "mrm-core" "^6.1.7" - "semver-utils" "^1.1.4" - "update-notifier" "^4.1.0" - "user-home" "^2.0.0" - "user-meta" "^1.0.0" - "which" "^2.0.2" - -"ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" - -"mute-stream@0.0.8": - "integrity" "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" - "version" "0.0.8" - -"nano-css@^5.3.1": - "integrity" "sha512-wfcviJB6NOxDIDfr7RFn/GlaN7I/Bhe4d39ZRCJ3xvZX60LVe2qZ+rDqM49nm4YT81gAjzS+ZklhKP/Gnfnubg==" - "resolved" "https://registry.npmjs.org/nano-css/-/nano-css-5.3.4.tgz" - "version" "5.3.4" - dependencies: - "css-tree" "^1.1.2" - "csstype" "^3.0.6" - "fastest-stable-stringify" "^2.0.2" - "inline-style-prefixer" "^6.0.0" - "rtl-css-js" "^1.14.0" - "sourcemap-codec" "^1.4.8" - "stacktrace-js" "^2.0.2" - "stylis" "^4.0.6" - -"nanoid@^3.1.30", "nanoid@^3.3.1": - "integrity" "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" - "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz" - "version" "3.3.1" - -"next-mdx-remote@^4.0.2": - "integrity" "sha512-1cZM2xm+G1FyYodGt92lCXisP0owPeppVHeH5TIaXUGdt6ENBZYOxLNFaVl9fkS9wP/s2sLcC9m2c1iLH2H4rA==" - "resolved" "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "@mdx-js/mdx" "^2.0.0" - "@mdx-js/react" "^2.0.0" - "vfile" "^5.3.0" - "vfile-matter" "^3.0.1" - -"next-seo@^5.1.0": - "integrity" "sha512-ampuQfNTOi1x+xtRIb6CZGunIo6rQXtMo2Tyu861d5GjJFIwfOXsA4lzCa4+e2rLkyXDyVpavNNUZWa3US9ELw==" - "resolved" "https://registry.npmjs.org/next-seo/-/next-seo-5.1.0.tgz" - "version" "5.1.0" - -"next-sitemap@^2.5.10": - "integrity" "sha512-9jFvViLL2US0obp6NAGlEpE4gWU5NACupHvVFtLhOhgJ33M/vBPqEgCiZQsG9dKDhZXchjrjQrtDvhk/KZBekg==" - "resolved" "https://registry.npmjs.org/next-sitemap/-/next-sitemap-2.5.10.tgz" - "version" "2.5.10" - dependencies: - "@corex/deepmerge" "^2.6.148" - "minimist" "^1.2.5" - -"next@*", "next@^12.1.0", "next@^8.1.1-canary.54 || >=9.0.0", "next@>=10": - "integrity" "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==" - "resolved" "https://registry.npmjs.org/next/-/next-12.1.0.tgz" - "version" "12.1.0" - dependencies: - "@next/env" "12.1.0" - "caniuse-lite" "^1.0.30001283" - "postcss" "8.4.5" - "styled-jsx" "5.0.0" - "use-subscription" "1.5.1" - optionalDependencies: - "@next/swc-android-arm64" "12.1.0" - "@next/swc-darwin-arm64" "12.1.0" - "@next/swc-darwin-x64" "12.1.0" - "@next/swc-linux-arm-gnueabihf" "12.1.0" - "@next/swc-linux-arm64-gnu" "12.1.0" - "@next/swc-linux-arm64-musl" "12.1.0" - "@next/swc-linux-x64-gnu" "12.1.0" - "@next/swc-linux-x64-musl" "12.1.0" - "@next/swc-win32-arm64-msvc" "12.1.0" - "@next/swc-win32-ia32-msvc" "12.1.0" - "@next/swc-win32-x64-msvc" "12.1.0" - -"node-domexception@^1.0.0": - "integrity" "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" - "resolved" "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" - "version" "1.0.0" - -"node-fetch@^3.2.3": - "integrity" "sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA==" - "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.3.tgz" - "version" "3.2.3" - dependencies: - "data-uri-to-buffer" "^4.0.0" - "fetch-blob" "^3.1.4" - "formdata-polyfill" "^4.0.10" - -"node-releases@^2.0.2": - "integrity" "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz" - "version" "2.0.2" - -"normalize-path@^3.0.0", "normalize-path@~3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" - -"normalize-range@^0.1.2": - "integrity" "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" - "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - "version" "0.1.2" - -"normalize-url@^4.1.0": - "integrity" "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" - "version" "4.5.1" - -"normalize-url@^6.0.1": - "integrity" "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" - "version" "6.1.0" - -"npm-package-arg@^6.0.0": - "integrity" "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==" - "resolved" "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz" - "version" "6.1.1" - dependencies: - "hosted-git-info" "^2.7.1" - "osenv" "^0.1.5" - "semver" "^5.6.0" - "validate-npm-package-name" "^3.0.0" - -"npm-run-path@^2.0.0": - "integrity" "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==" - "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "path-key" "^2.0.0" - -"object-assign@^4.1.1": - "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - "version" "4.1.1" - -"object-hash@^2.0.1", "object-hash@^2.2.0": - "integrity" "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" - "resolved" "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" - "version" "2.2.0" - -"object.pick@^1.2.0": - "integrity" "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==" - "resolved" "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "isobject" "^3.0.1" - -"oidc-token-hash@^5.0.1": - "integrity" "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==" - "resolved" "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz" - "version" "5.0.1" - -"on-headers@^1.0.2": - "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - "resolved" "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - "version" "1.0.2" - -"once@^1.3.0", "once@^1.3.1", "once@^1.4.0": - "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "wrappy" "1" - -"onetime@^5.1.0": - "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" - "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "mimic-fn" "^2.1.0" - -"openid-client@^4.9.1": - "integrity" "sha512-DYUF07AHjI3QDKqKbn2F7RqozT4hyi4JvmpodLrq0HHoNP7t/AjeG/uqiBK1/N2PZSAQEThVjDLHSmJN4iqu/w==" - "resolved" "https://registry.npmjs.org/openid-client/-/openid-client-4.9.1.tgz" - "version" "4.9.1" - dependencies: - "aggregate-error" "^3.1.0" - "got" "^11.8.0" - "jose" "^2.0.5" - "lru-cache" "^6.0.0" - "make-error" "^1.3.6" - "object-hash" "^2.0.1" - "oidc-token-hash" "^5.0.1" - -"os-homedir@^1.0.0": - "integrity" "sha1-/7xJiDNuDoM94MFox+8VISGqf7M= sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" - "resolved" "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" - "version" "1.0.2" - -"os-tmpdir@^1.0.0", "os-tmpdir@~1.0.2": - "integrity" "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" - "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - "version" "1.0.2" - -"osenv@^0.1.5": - "integrity" "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==" - "resolved" "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" - "version" "0.1.5" - dependencies: - "os-homedir" "^1.0.0" - "os-tmpdir" "^1.0.0" - -"p-cancelable@^1.0.0": - "integrity" "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - "resolved" "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" - "version" "1.1.0" - -"p-cancelable@^2.0.0": - "integrity" "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - "resolved" "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" - "version" "2.1.1" - -"p-finally@^1.0.0": - "integrity" "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" - "resolved" "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" - "version" "1.0.0" - -"p-limit@^2.0.0", "p-limit@^2.2.0": - "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - "version" "2.3.0" - dependencies: - "p-try" "^2.0.0" - -"p-locate@^3.0.0": - "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "p-limit" "^2.0.0" - -"p-locate@^4.1.0": - "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "p-limit" "^2.2.0" - -"p-try@^2.0.0": - "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - "version" "2.2.0" - -"package-json@^4.0.0": - "integrity" "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==" - "resolved" "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "got" "^6.7.1" - "registry-auth-token" "^3.0.1" - "registry-url" "^3.0.3" - "semver" "^5.1.0" - -"package-json@^6.3.0": - "integrity" "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==" - "resolved" "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" - "version" "6.5.0" - dependencies: - "got" "^9.6.0" - "registry-auth-token" "^4.0.0" - "registry-url" "^5.0.0" - "semver" "^6.2.0" - -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "callsites" "^3.0.0" - -"parse-entities@^2.0.0": - "integrity" "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==" - "resolved" "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "character-entities" "^1.0.0" - "character-entities-legacy" "^1.0.0" - "character-reference-invalid" "^1.0.0" - "is-alphanumerical" "^1.0.0" - "is-decimal" "^1.0.0" - "is-hexadecimal" "^1.0.0" - -"parse-entities@^4.0.0": - "integrity" "sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==" - "resolved" "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "@types/unist" "^2.0.0" - "character-entities" "^2.0.0" - "character-entities-legacy" "^3.0.0" - "character-reference-invalid" "^2.0.0" - "decode-named-character-reference" "^1.0.0" - "is-alphanumerical" "^2.0.0" - "is-decimal" "^2.0.0" - "is-hexadecimal" "^2.0.0" - -"parse-git-config@^1.1.1": - "integrity" "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w= sha512-S3LGXJZVSy/hswvbSkfdbKBRVsnqKrVu6j8fcvdtJ4TxosSELyQDsJPuGPXuZ+EyuYuJd3O4uAF8gcISR0OFrQ==" - "resolved" "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "extend-shallow" "^2.0.1" - "fs-exists-sync" "^0.1.0" - "git-config-path" "^1.0.1" - "ini" "^1.3.4" - -"parse-github-url@^1.0.2": - "integrity" "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==" - "resolved" "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz" - "version" "1.0.2" - -"parse-json@^5.0.0": - "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" - "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - "version" "5.2.0" - dependencies: - "@babel/code-frame" "^7.0.0" - "error-ex" "^1.3.1" - "json-parse-even-better-errors" "^2.3.0" - "lines-and-columns" "^1.1.6" - -"parse-passwd@^1.0.0": - "integrity" "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" - "resolved" "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" - "version" "1.0.0" - -"path-exists@^3.0.0": - "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - "version" "3.0.0" - -"path-exists@^4.0.0": - "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - "version" "4.0.0" - -"path-is-absolute@^1.0.0": - "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" - -"path-is-inside@^1.0.1": - "integrity" "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - "resolved" "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" - "version" "1.0.2" - -"path-key@^2.0.0": - "integrity" "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" - "resolved" "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - "version" "2.0.1" - -"path-parse@^1.0.7": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" - -"path-type@^4.0.0": - "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - "version" "4.0.0" - -"periscopic@^3.0.0": - "integrity" "sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==" - "resolved" "https://registry.npmjs.org/periscopic/-/periscopic-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "estree-walker" "^3.0.0" - "is-reference" "^3.0.0" - -"picocolors@^1.0.0": - "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - "version" "1.0.0" - -"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.2.3": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" - -"pify@^3.0.0": - "integrity" "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" - "resolved" "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" - "version" "3.0.0" - -"postcss-js@^4.0.0": - "integrity" "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==" - "resolved" "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "camelcase-css" "^2.0.1" - -"postcss-load-config@^3.1.0": - "integrity" "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==" - "resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz" - "version" "3.1.3" - dependencies: - "lilconfig" "^2.0.4" - "yaml" "^1.10.2" - -"postcss-nested@5.0.6": - "integrity" "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==" - "resolved" "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz" - "version" "5.0.6" - dependencies: - "postcss-selector-parser" "^6.0.6" - -"postcss-selector-parser@^6.0.6", "postcss-selector-parser@^6.0.9": - "integrity" "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==" - "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz" - "version" "6.0.9" - dependencies: - "cssesc" "^3.0.0" - "util-deprecate" "^1.0.2" - -"postcss-value-parser@^4.2.0": - "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - "version" "4.2.0" - -"postcss@^8.1.0", "postcss@^8.2.14", "postcss@^8.3.3", "postcss@^8.4.12", "postcss@^8.4.6": - "integrity" "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz" - "version" "8.4.12" - dependencies: - "nanoid" "^3.3.1" - "picocolors" "^1.0.0" - "source-map-js" "^1.0.2" - -"postcss@8.4.5": - "integrity" "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz" - "version" "8.4.5" - dependencies: - "nanoid" "^3.1.30" - "picocolors" "^1.0.0" - "source-map-js" "^1.0.1" - -"prepend-http@^1.0.1": - "integrity" "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==" - "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" - "version" "1.0.4" - -"prepend-http@^2.0.0": - "integrity" "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" - "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" - "version" "2.0.0" - -"prettier-plugin-tailwindcss@^0.1.8": - "integrity" "sha512-hwarSBCswAXa+kqYtaAkFr3Vop9o04WOyZs0qo3NyvW8L7f1rif61wRyq0+ArmVThOuRBcJF5hjGXYk86cwemg==" - "resolved" "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.1.8.tgz" - "version" "0.1.8" - -"prettier@^2.6.1", "prettier@>=2.2.0": - "integrity" "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==" - "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz" - "version" "2.6.1" - -"prism-themes@^1.9.0": - "integrity" "sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw==" - "resolved" "https://registry.npmjs.org/prism-themes/-/prism-themes-1.9.0.tgz" - "version" "1.9.0" - -"prismjs@^1.27.0", "prismjs@~1.27.0": - "integrity" "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" - "resolved" "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz" - "version" "1.27.0" - -"process-nextick-args@~2.0.0": - "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - "version" "2.0.1" - -"prop-ini@^0.0.2": - "integrity" "sha1-ZzOny1JCrKsr5C5gdYPYEksXKls= sha512-qyU57WvAvZDbzmRy9xDbJGVwrGJhmA+rYnVjy4xtX4Ny9c7gzvpmf/j7A3oq9ChbPh15MZQKjPep2mNdnAhtig==" - "resolved" "https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz" - "version" "0.0.2" - dependencies: - "extend" "^3.0.0" - -"prop-types@^15.0.0", "prop-types@^15.7.2", "prop-types@^15.8.1": - "integrity" "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==" - "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - "version" "15.8.1" - dependencies: - "loose-envify" "^1.4.0" - "object-assign" "^4.1.1" - "react-is" "^16.13.1" - -"property-information@^5.0.0": - "integrity" "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==" - "resolved" "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" - "version" "5.6.0" - dependencies: - "xtend" "^4.0.0" - -"property-information@^6.0.0": - "integrity" "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" - "resolved" "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz" - "version" "6.1.1" - -"proxy-from-env@^1.1.0": - "integrity" "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - "resolved" "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - "version" "1.1.0" - -"pseudomap@^1.0.2": - "integrity" "sha1-8FKijacOYYkX7wqKw0wa5aaChrM= sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - "resolved" "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" - "version" "1.0.2" - -"pump@^3.0.0": - "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==" - "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "end-of-stream" "^1.1.0" - "once" "^1.3.1" - -"pupa@^2.0.1": - "integrity" "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==" - "resolved" "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "escape-goat" "^2.0.0" - -"queue-microtask@^1.2.2": - "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - "version" "1.2.3" - -"quick-lru@^5.1.1": - "integrity" "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" - "version" "5.1.1" - -"randomatic@^3.0.0": - "integrity" "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==" - "resolved" "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz" - "version" "3.1.1" - dependencies: - "is-number" "^4.0.0" - "kind-of" "^6.0.0" - "math-random" "^1.0.1" - -"rc@^1.0.1", "rc@^1.1.6", "rc@^1.2.1", "rc@^1.2.8": - "integrity" "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==" - "resolved" "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" - "version" "1.2.8" - dependencies: - "deep-extend" "^0.6.0" - "ini" "~1.3.0" - "minimist" "^1.2.0" - "strip-json-comments" "~2.0.1" - -"react-dom@*", "react-dom@^16 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0", "react-dom@^17.0.2", "react-dom@^17.0.2 || ^18.0.0-0", "react-dom@>=16.0.0", "react-dom@>=16.x <=17.x": - "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==" - "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" - "version" "17.0.2" - dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" - "scheduler" "^0.20.2" - -"react-is@^16.13.1": - "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - "version" "16.13.1" - -"react-is@^18.0.0": - "integrity" "sha512-yUcBYdBBbo3QiPsgYDcfQcIkGZHfxOaoE6HLSnr1sPzMhdyxusbfKOSUbSd/ocGi32dxcj366PsTj+5oggeKKw==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-18.0.0.tgz" - "version" "18.0.0" - -"react-markdown@^8.0.2": - "integrity" "sha512-WeXeDlCPFZBbN75AiLVEmN4gC6pNWadsZVWWxWpvrYQnUTHsB3l1PH60I1sbxTJr0oWOQc3zhxTrRQMTceNifw==" - "resolved" "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.2.tgz" - "version" "8.0.2" - dependencies: - "@types/hast" "^2.0.0" - "@types/prop-types" "^15.0.0" - "@types/unist" "^2.0.0" - "comma-separated-tokens" "^2.0.0" - "hast-util-whitespace" "^2.0.0" - "prop-types" "^15.0.0" - "property-information" "^6.0.0" - "react-is" "^18.0.0" - "remark-parse" "^10.0.0" - "remark-rehype" "^10.0.0" - "space-separated-tokens" "^2.0.0" - "style-to-object" "^0.3.0" - "unified" "^10.0.0" - "unist-util-visit" "^4.0.0" - "vfile" "^5.0.0" - -"react-syntax-highlighter@^15.5.0": - "integrity" "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==" - "resolved" "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz" - "version" "15.5.0" - dependencies: - "@babel/runtime" "^7.3.1" - "highlight.js" "^10.4.1" - "lowlight" "^1.17.0" - "prismjs" "^1.27.0" - "refractor" "^3.6.0" - -"react-tooltip@^4.2.21": - "integrity" "sha512-zSLprMymBDowknr0KVDiJ05IjZn9mQhhg4PRsqln0OZtURAJ1snt1xi5daZfagsh6vfsziZrc9pErPTDY1ACig==" - "resolved" "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.2.21.tgz" - "version" "4.2.21" - dependencies: - "prop-types" "^15.7.2" - "uuid" "^7.0.3" - -"react-universal-interface@^0.6.2": - "integrity" "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==" - "resolved" "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz" - "version" "0.6.2" - -"react-use@^17.3.2": - "integrity" "sha512-bj7OD0/1wL03KyWmzFXAFe425zziuTf7q8olwCYBfOeFHY1qfO1FAMjROQLsLZYwG4Rx63xAfb7XAbBrJsZmEw==" - "resolved" "https://registry.npmjs.org/react-use/-/react-use-17.3.2.tgz" - "version" "17.3.2" - dependencies: - "@types/js-cookie" "^2.2.6" - "@xobotyi/scrollbar-width" "^1.9.5" - "copy-to-clipboard" "^3.3.1" - "fast-deep-equal" "^3.1.3" - "fast-shallow-equal" "^1.0.0" - "js-cookie" "^2.2.1" - "nano-css" "^5.3.1" - "react-universal-interface" "^0.6.2" - "resize-observer-polyfill" "^1.5.1" - "screenfull" "^5.1.0" - "set-harmonic-interval" "^1.0.1" - "throttle-debounce" "^3.0.1" - "ts-easing" "^0.2.0" - "tslib" "^2.1.0" - -"react@*", "react@^16 || ^17 || ^18", "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0", "react@^17.0.2", "react@^17.0.2 || ^18.0.0-0", "react@>= 0.14.0", "react@>= 16", "react@>= 16.8.0 || 17.x.x || 18.x.x", "react@>=16", "react@>=16.0.0", "react@>=16.x", "react@>=16.x <=17.x", "react@17.0.2": - "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==" - "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz" - "version" "17.0.2" - dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" - -"readable-stream@^2.2.2", "readable-stream@~2.3.6": - "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - "version" "2.3.7" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.3" - "isarray" "~1.0.0" - "process-nextick-args" "~2.0.0" - "safe-buffer" "~5.1.1" - "string_decoder" "~1.1.1" - "util-deprecate" "~1.0.1" - -"readdirp@~3.6.0": - "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - "version" "3.6.0" - dependencies: - "picomatch" "^2.2.1" - -"readme-badger@^0.3.0": - "integrity" "sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g==" - "resolved" "https://registry.npmjs.org/readme-badger/-/readme-badger-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "balanced-match" "^1.0.0" - -"refractor@^3.4.0", "refractor@^3.6.0": - "integrity" "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==" - "resolved" "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz" - "version" "3.6.0" - dependencies: - "hastscript" "^6.0.0" - "parse-entities" "^2.0.0" - "prismjs" "~1.27.0" - -"regenerator-runtime@^0.13.4": - "integrity" "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" - "version" "0.13.9" - -"registry-auth-token@^3.0.1": - "integrity" "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==" - "resolved" "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz" - "version" "3.4.0" - dependencies: - "rc" "^1.1.6" - "safe-buffer" "^5.0.1" - -"registry-auth-token@^4.0.0": - "integrity" "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==" - "resolved" "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz" - "version" "4.2.1" - dependencies: - "rc" "^1.2.8" - -"registry-url@^3.0.3": - "integrity" "sha1-PU74cPc93h138M+aOBQyRE4XSUI= sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==" - "resolved" "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "rc" "^1.0.1" - -"registry-url@^5.0.0": - "integrity" "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==" - "resolved" "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "rc" "^1.2.8" - -"rehype-slug@^5.0.1": - "integrity" "sha512-X5v3wV/meuOX9NFcGhJvUpEjIvQl2gDvjg3z40RVprYFt7q3th4qMmYLULiu3gXvbNX1ppx+oaa6JyY1W67pTA==" - "resolved" "https://registry.npmjs.org/rehype-slug/-/rehype-slug-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "@types/hast" "^2.0.0" - "github-slugger" "^1.1.1" - "hast-util-has-property" "^2.0.0" - "hast-util-heading-rank" "^2.0.0" - "hast-util-to-string" "^2.0.0" - "unified" "^10.0.0" - "unist-util-visit" "^4.0.0" - -"remark-gfm@^3.0.1": - "integrity" "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==" - "resolved" "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "@types/mdast" "^3.0.0" - "mdast-util-gfm" "^2.0.0" - "micromark-extension-gfm" "^2.0.0" - "unified" "^10.0.0" - -"remark-mdx@^2.0.0": - "integrity" "sha512-0wXdEITnFyjLquN3VvACNLzbGzWM5ujzTvfgOkONBZgSFJ7ezLLDaTWqf6H9eUgVITEP8asp6LJ0W/X090dXBg==" - "resolved" "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "mdast-util-mdx" "^2.0.0" - "micromark-extension-mdxjs" "^1.0.0" - -"remark-parse@^10.0.0": - "integrity" "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==" - "resolved" "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz" - "version" "10.0.1" - dependencies: - "@types/mdast" "^3.0.0" - "mdast-util-from-markdown" "^1.0.0" - "unified" "^10.0.0" - -"remark-rehype@^10.0.0": - "integrity" "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==" - "resolved" "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" - "version" "10.1.0" - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - "mdast-util-to-hast" "^12.1.0" - "unified" "^10.0.0" - -"remarkable@^1.7.1": - "integrity" "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==" - "resolved" "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz" - "version" "1.7.4" - dependencies: - "argparse" "^1.0.10" - "autolinker" "~0.28.0" - -"remote-origin-url@^1.0.0": - "integrity" "sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==" - "resolved" "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "parse-git-config" "^1.1.1" - -"repeat-element@^1.1.2": - "integrity" "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" - "resolved" "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" - "version" "1.1.4" - -"repeat-string@^1.5.2", "repeat-string@^1.6.1": - "integrity" "sha1-jcrkcOHIirwtYA//Sndihtp15jc= sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - "resolved" "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - "version" "1.6.1" - -"require-directory@^2.1.1": - "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - "version" "2.1.1" - -"require-main-filename@^2.0.0": - "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" - "version" "2.0.0" - -"resize-observer-polyfill@^1.5.1": - "integrity" "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - "resolved" "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" - "version" "1.5.1" - -"resolve-alpn@^1.0.0": - "integrity" "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - "resolved" "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" - "version" "1.2.1" - -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" - -"resolve@^1.22.0": - "integrity" "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" - "version" "1.22.0" - dependencies: - "is-core-module" "^2.8.1" - "path-parse" "^1.0.7" - "supports-preserve-symlinks-flag" "^1.0.0" - -"responselike@^1.0.2": - "integrity" "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==" - "resolved" "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "lowercase-keys" "^1.0.0" - -"responselike@^2.0.0": - "integrity" "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==" - "resolved" "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "lowercase-keys" "^2.0.0" - -"restore-cursor@^3.1.0": - "integrity" "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==" - "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "onetime" "^5.1.0" - "signal-exit" "^3.0.2" - -"reusify@^1.0.4": - "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - "version" "1.0.4" - -"rimraf@^2.6.2": - "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - "version" "2.7.1" - dependencies: - "glob" "^7.1.3" - -"rtl-css-js@^1.14.0": - "integrity" "sha512-99Cu4wNNIhrI10xxUaABHsdDqzalrSRTie4GeCmbGVuehm4oj+fIy8fTzB+16pmKe8Bv9rl+hxIBez6KxExTew==" - "resolved" "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.15.0.tgz" - "version" "1.15.0" - dependencies: - "@babel/runtime" "^7.1.2" - -"run-async@^2.4.0": - "integrity" "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - "resolved" "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" - "version" "2.4.1" - -"run-parallel@^1.1.9": - "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "queue-microtask" "^1.2.2" - -"rxjs@^6.6.0": - "integrity" "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==" - "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - "version" "6.6.7" - dependencies: - "tslib" "^1.9.0" - -"sade@^1.7.3": - "integrity" "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==" - "resolved" "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" - "version" "1.8.1" - dependencies: - "mri" "^1.1.0" - -"safe-buffer@^5.0.1", "safe-buffer@^5.1.0": - "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - "version" "5.2.1" - -"safe-buffer@~5.1.0": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" - -"safe-buffer@~5.1.1": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" - -"safer-buffer@>= 2.1.2 < 3": - "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - "version" "2.1.2" - -"sass@^1.3.0", "sass@^1.32.8": - "integrity" "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==" - "resolved" "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz" - "version" "1.49.9" - dependencies: - "chokidar" ">=3.0.0 <4.0.0" - "immutable" "^4.0.0" - "source-map-js" ">=0.6.2 <2.0.0" - -"scheduler@^0.20.2": - "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==" - "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" - "version" "0.20.2" - dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" - -"screenfull@^5.1.0": - "integrity" "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==" - "resolved" "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz" - "version" "5.2.0" - -"section-matter@^1.0.0": - "integrity" "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==" - "resolved" "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "extend-shallow" "^2.0.1" - "kind-of" "^6.0.0" - -"semver-diff@^2.0.0": - "integrity" "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==" - "resolved" "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "semver" "^5.0.3" - -"semver-diff@^3.1.1": - "integrity" "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==" - "resolved" "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" - "version" "3.1.1" - dependencies: - "semver" "^6.3.0" - -"semver-utils@^1.1.4": - "integrity" "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" - "resolved" "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz" - "version" "1.1.4" - -"semver@^5.0.3", "semver@^5.1.0": - "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - "version" "5.7.1" - -"semver@^5.6.0": - "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - "version" "5.7.1" - -"semver@^6.0.0", "semver@^6.2.0", "semver@^6.3.0": - "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - "version" "6.3.0" - -"set-blocking@^2.0.0": - "integrity" "sha1-BF+XgtARrppoA93TgrJDkrPYkPc= sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - "version" "2.0.0" - -"set-getter@^0.1.0": - "integrity" "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==" - "resolved" "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz" - "version" "0.1.1" - dependencies: - "to-object-path" "^0.3.0" - -"set-harmonic-interval@^1.0.1": - "integrity" "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==" - "resolved" "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz" - "version" "1.0.1" - -"setprototypeof@1.2.0": - "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - "version" "1.2.0" - -"shebang-command@^1.2.0": - "integrity" "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==" - "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "shebang-regex" "^1.0.0" - -"shebang-regex@^1.0.0": - "integrity" "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" - "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - "version" "1.0.0" - -"sigmund@^1.0.1": - "integrity" "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" - "resolved" "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" - "version" "1.0.1" - -"signal-exit@^3.0.0", "signal-exit@^3.0.2": - "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - "version" "3.0.7" - -"smpltmpl@^1.0.2": - "integrity" "sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ==" - "resolved" "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "babel-code-frame" "^6.26.0" - -"source-map-js@^1.0.1", "source-map-js@^1.0.2", "source-map-js@>=0.6.2 <2.0.0": - "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - "version" "1.0.2" - -"source-map@^0.6.1": - "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - "version" "0.6.1" - -"source-map@0.5.6": - "integrity" "sha1-dc449SvwczxafwwRjYEzSiu19BI= sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" - "version" "0.5.6" - -"sourcemap-codec@^1.4.8": - "integrity" "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - "resolved" "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" - "version" "1.4.8" - -"space-separated-tokens@^1.0.0": - "integrity" "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - "resolved" "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" - "version" "1.1.5" - -"space-separated-tokens@^2.0.0": - "integrity" "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" - "resolved" "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz" - "version" "2.0.1" - -"split-lines@^2.0.0": - "integrity" "sha512-8dv+1zKgTpfTkOy8XZLFyWrfxO0NV/bj/3EaQ+hBrBxGv2DwiroljPjU8NlCr+59nLnsVm9WYT7lXKwe4TC6bw==" - "resolved" "https://registry.npmjs.org/split-lines/-/split-lines-2.1.0.tgz" - "version" "2.1.0" - -"sprintf-js@~1.0.2": - "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - "version" "1.0.3" - -"stack-generator@^2.0.5": - "integrity" "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==" - "resolved" "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz" - "version" "2.0.5" - dependencies: - "stackframe" "^1.1.1" - -"stackframe@^1.1.1": - "integrity" "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" - "resolved" "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz" - "version" "1.2.1" - -"stacktrace-gps@^3.0.4": - "integrity" "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==" - "resolved" "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "source-map" "0.5.6" - "stackframe" "^1.1.1" - -"stacktrace-js@^2.0.2": - "integrity" "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==" - "resolved" "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "error-stack-parser" "^2.0.6" - "stack-generator" "^2.0.5" - "stacktrace-gps" "^3.0.4" - -"statuses@>= 1.5.0 < 2": - "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - "version" "1.5.0" - -"string_decoder@~1.1.1": - "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "safe-buffer" "~5.1.0" - -"string-width@^2.0.0", "string-width@^2.1.1": - "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^4.0.0" - -"string-width@^3.0.0": - "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "emoji-regex" "^7.0.1" - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^5.1.0" - -"string-width@^3.1.0": - "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "emoji-regex" "^7.0.1" - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^5.1.0" - -"string-width@^4.0.0", "string-width@^4.1.0": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" - dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" - -"stringify-entities@^4.0.0": - "integrity" "sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==" - "resolved" "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "character-entities-html4" "^2.0.0" - "character-entities-legacy" "^3.0.0" - -"strip-ansi@^3.0.0": - "integrity" "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "ansi-regex" "^2.0.0" - -"strip-ansi@^4.0.0": - "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8= sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "ansi-regex" "^3.0.0" - -"strip-ansi@^5.0.0", "strip-ansi@^5.1.0", "strip-ansi@^5.2.0": - "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - "version" "5.2.0" - dependencies: - "ansi-regex" "^4.1.0" - -"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": - "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - "version" "6.0.1" - dependencies: - "ansi-regex" "^5.0.1" - -"strip-bom-string@^1.0.0": - "integrity" "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" - "resolved" "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" - "version" "1.0.0" - -"strip-bom@^4.0.0": - "integrity" "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - "version" "4.0.0" - -"strip-color@^0.1.0": - "integrity" "sha1-EG9l09PmotlAHKwOsM6LinArT3s= sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==" - "resolved" "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz" - "version" "0.1.0" - -"strip-eof@^1.0.0": - "integrity" "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" - "resolved" "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" - "version" "1.0.0" - -"strip-json-comments@~2.0.1": - "integrity" "sha1-PFMZQukIwml8DsNEhYwobHygpgo= sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - "version" "2.0.1" - -"style-to-object@^0.3.0": - "integrity" "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==" - "resolved" "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "inline-style-parser" "0.1.1" - -"styled-jsx@5.0.0": - "integrity" "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==" - "resolved" "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz" - "version" "5.0.0" - -"stylis@^4.0.6": - "integrity" "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" - "resolved" "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz" - "version" "4.0.13" - -"supports-color@^2.0.0": - "integrity" "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - "version" "2.0.0" - -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" - dependencies: - "has-flag" "^3.0.0" - -"supports-color@^7.1.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "has-flag" "^4.0.0" - -"supports-preserve-symlinks-flag@^1.0.0": - "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - "version" "1.0.0" - -"tailwindcss@^3.0.23", "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1", "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1 || insiders": - "integrity" "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==" - "resolved" "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz" - "version" "3.0.23" - dependencies: - "arg" "^5.0.1" - "chalk" "^4.1.2" - "chokidar" "^3.5.3" - "color-name" "^1.1.4" - "cosmiconfig" "^7.0.1" - "detective" "^5.2.0" - "didyoumean" "^1.2.2" - "dlv" "^1.1.3" - "fast-glob" "^3.2.11" - "glob-parent" "^6.0.2" - "is-glob" "^4.0.3" - "normalize-path" "^3.0.0" - "object-hash" "^2.2.0" - "postcss" "^8.4.6" - "postcss-js" "^4.0.0" - "postcss-load-config" "^3.1.0" - "postcss-nested" "5.0.6" - "postcss-selector-parser" "^6.0.9" - "postcss-value-parser" "^4.2.0" - "quick-lru" "^5.1.1" - "resolve" "^1.22.0" - -"term-size@^1.2.0": - "integrity" "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==" - "resolved" "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "execa" "^0.7.0" - -"term-size@^2.1.0": - "integrity" "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" - "resolved" "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz" - "version" "2.2.1" - -"throttle-debounce@^3.0.1": - "integrity" "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==" - "resolved" "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz" - "version" "3.0.1" - -"through@^2.3.6": - "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - "version" "2.3.8" - -"through2@^2.0.0": - "integrity" "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==" - "resolved" "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" - "version" "2.0.5" - dependencies: - "readable-stream" "~2.3.6" - "xtend" "~4.0.1" - -"timed-out@^4.0.0": - "integrity" "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" - "resolved" "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" - "version" "4.0.1" - -"tmp@^0.0.33": - "integrity" "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==" - "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - "version" "0.0.33" - dependencies: - "os-tmpdir" "~1.0.2" - -"to-object-path@^0.3.0": - "integrity" "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==" - "resolved" "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "kind-of" "^3.0.2" - -"to-readable-stream@^1.0.0": - "integrity" "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - "resolved" "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" - "version" "1.0.0" - -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "is-number" "^7.0.0" - -"toggle-selection@^1.0.6": - "integrity" "sha1-bkWxJj8gF/oKzH2J14sVuL932jI= sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - "resolved" "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" - "version" "1.0.6" - -"toidentifier@1.0.1": - "integrity" "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - "version" "1.0.1" - -"toml@^2.3.2": - "integrity" "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==" - "resolved" "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz" - "version" "2.3.6" - -"trough@^2.0.0": - "integrity" "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==" - "resolved" "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz" - "version" "2.1.0" - -"ts-easing@^0.2.0": - "integrity" "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" - "resolved" "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz" - "version" "0.2.0" - -"ts-node@^10.7.0", "ts-node@>=9.0.0": - "integrity" "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==" - "resolved" "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz" - "version" "10.7.0" - dependencies: - "@cspotcode/source-map-support" "0.7.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - "acorn" "^8.4.1" - "acorn-walk" "^8.1.1" - "arg" "^4.1.0" - "create-require" "^1.1.0" - "diff" "^4.0.1" - "make-error" "^1.1.1" - "v8-compile-cache-lib" "^3.0.0" - "yn" "3.1.1" - -"tslib@*", "tslib@^2.1.0", "tslib@^2.3.1": - "integrity" "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" - "version" "2.3.1" - -"tslib@^1.9.0": - "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - "version" "1.14.1" - -"type-fest@^0.21.3": - "integrity" "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - "version" "0.21.3" - -"type-fest@^0.8.1": - "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - "version" "0.8.1" - -"typedarray-to-buffer@^3.1.5": - "integrity" "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==" - "resolved" "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - "version" "3.1.5" - dependencies: - "is-typedarray" "^1.0.0" - -"typedarray@^0.0.6": - "integrity" "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - "version" "0.0.6" - -"typescript@^4.1.5", "typescript@>=2.7": - "integrity" "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz" - "version" "4.6.2" - -"unified@^10.0.0": - "integrity" "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==" - "resolved" "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" - "version" "10.1.2" - dependencies: - "@types/unist" "^2.0.0" - "bail" "^2.0.0" - "extend" "^3.0.0" - "is-buffer" "^2.0.0" - "is-plain-obj" "^4.0.0" - "trough" "^2.0.0" - "vfile" "^5.0.0" - -"unique-random-array@1.0.0": - "integrity" "sha1-QrNyHFeTiNi2Z8k8Lb3j1dgakTY= sha512-vtj2yltjcHPa69nFjNJ3xnhsEwE8pMyjqUQDw2myz/iSezqf4YCAcygwFQEsOgMid5VNW/dCPbnb2BcmaDCCKg==" - "resolved" "https://registry.npmjs.org/unique-random-array/-/unique-random-array-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "unique-random" "^1.0.0" - -"unique-random@^1.0.0": - "integrity" "sha1-zj4iTIJCzTOg53sNcYDXfmti0MQ= sha512-K1sUkPf9EXCZFNIlMCoX4icAqcvkR4FMPH4Z61HbyiWhQl1ZGo0zYeV2bJmocK8Cp6tnKYrCnpkeKGebXZoRTQ==" - "resolved" "https://registry.npmjs.org/unique-random/-/unique-random-1.0.0.tgz" - "version" "1.0.0" - -"unique-string@^1.0.0": - "integrity" "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==" - "resolved" "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "crypto-random-string" "^1.0.0" - -"unique-string@^2.0.0": - "integrity" "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==" - "resolved" "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "crypto-random-string" "^2.0.0" - -"unist-builder@^3.0.0": - "integrity" "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==" - "resolved" "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "@types/unist" "^2.0.0" - -"unist-util-generated@^2.0.0": - "integrity" "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==" - "resolved" "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz" - "version" "2.0.0" - -"unist-util-is@^4.0.0": - "integrity" "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" - "resolved" "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" - "version" "4.1.0" - -"unist-util-is@^5.0.0": - "integrity" "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" - "resolved" "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz" - "version" "5.1.1" - -"unist-util-position-from-estree@^1.0.0", "unist-util-position-from-estree@^1.1.0": - "integrity" "sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==" - "resolved" "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "@types/unist" "^2.0.0" - -"unist-util-position@^4.0.0": - "integrity" "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==" - "resolved" "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "@types/unist" "^2.0.0" - -"unist-util-remove-position@^4.0.0": - "integrity" "sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==" - "resolved" "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "@types/unist" "^2.0.0" - "unist-util-visit" "^4.0.0" - -"unist-util-stringify-position@^3.0.0": - "integrity" "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==" - "resolved" "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "@types/unist" "^2.0.0" - -"unist-util-visit-parents@^3.0.0": - "integrity" "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==" - "resolved" "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" - "version" "3.1.1" - dependencies: - "@types/unist" "^2.0.0" - "unist-util-is" "^4.0.0" - -"unist-util-visit-parents@^4.0.0": - "integrity" "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==" - "resolved" "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz" - "version" "4.1.1" - dependencies: - "@types/unist" "^2.0.0" - "unist-util-is" "^5.0.0" - -"unist-util-visit-parents@^5.0.0": - "integrity" "sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==" - "resolved" "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "@types/unist" "^2.0.0" - "unist-util-is" "^5.0.0" - -"unist-util-visit@^2.0.3": - "integrity" "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==" - "resolved" "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" - "version" "2.0.3" - dependencies: - "@types/unist" "^2.0.0" - "unist-util-is" "^4.0.0" - "unist-util-visit-parents" "^3.0.0" - -"unist-util-visit@^3.0.0": - "integrity" "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==" - "resolved" "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "@types/unist" "^2.0.0" - "unist-util-is" "^5.0.0" - "unist-util-visit-parents" "^4.0.0" - -"unist-util-visit@^4.0.0": - "integrity" "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==" - "resolved" "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "@types/unist" "^2.0.0" - "unist-util-is" "^5.0.0" - "unist-util-visit-parents" "^5.0.0" - -"universalify@^0.1.0": - "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - "version" "0.1.2" - -"unzip-response@^2.0.1": - "integrity" "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==" - "resolved" "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz" - "version" "2.0.1" - -"update-notifier@^2.3.0": - "integrity" "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==" - "resolved" "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz" - "version" "2.5.0" - dependencies: - "boxen" "^1.2.1" - "chalk" "^2.0.1" - "configstore" "^3.0.0" - "import-lazy" "^2.1.0" - "is-ci" "^1.0.10" - "is-installed-globally" "^0.1.0" - "is-npm" "^1.0.0" - "latest-version" "^3.0.0" - "semver-diff" "^2.0.0" - "xdg-basedir" "^3.0.0" - -"update-notifier@^4.1.0": - "integrity" "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==" - "resolved" "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz" - "version" "4.1.3" - dependencies: - "boxen" "^4.2.0" - "chalk" "^3.0.0" - "configstore" "^5.0.1" - "has-yarn" "^2.1.0" - "import-lazy" "^2.1.0" - "is-ci" "^2.0.0" - "is-installed-globally" "^0.3.1" - "is-npm" "^4.0.0" - "is-yarn-global" "^0.3.0" - "latest-version" "^5.0.0" - "pupa" "^2.0.1" - "semver-diff" "^3.1.1" - "xdg-basedir" "^4.0.0" - -"url-join@^4.0.1": - "integrity" "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - "resolved" "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz" - "version" "4.0.1" - -"url-parse-lax@^1.0.0": - "integrity" "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==" - "resolved" "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "prepend-http" "^1.0.1" - -"url-parse-lax@^3.0.0": - "integrity" "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==" - "resolved" "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "prepend-http" "^2.0.0" - -"use-subscription@1.5.1": - "integrity" "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==" - "resolved" "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz" - "version" "1.5.1" - dependencies: - "object-assign" "^4.1.1" - -"user-home@^2.0.0": - "integrity" "sha1-nHC/2Babwdy/SGBODwS4tJzenp8= sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==" - "resolved" "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "os-homedir" "^1.0.0" - -"user-meta@^1.0.0": - "integrity" "sha512-Q/opMgFhVbBkdlTs44UKzV7L5Uj2zrJ4MVPXTTzJmrU1bHb2cX6wJzBIqEf1gROTzZIH8u39WmHsa5EvfnMPrw==" - "resolved" "https://registry.npmjs.org/user-meta/-/user-meta-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "rc" "^1.2.1" - -"util-deprecate@^1.0.2", "util-deprecate@~1.0.1": - "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - "version" "1.0.2" - -"uuid@^7.0.3": - "integrity" "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz" - "version" "7.0.3" - -"uvu@^0.5.0": - "integrity" "sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==" - "resolved" "https://registry.npmjs.org/uvu/-/uvu-0.5.3.tgz" - "version" "0.5.3" - dependencies: - "dequal" "^2.0.0" - "diff" "^5.0.0" - "kleur" "^4.0.3" - "sade" "^1.7.3" - -"v8-compile-cache-lib@^3.0.0": - "integrity" "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==" - "resolved" "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz" - "version" "3.0.0" - -"validate-npm-package-name@^3.0.0": - "integrity" "sha1-X6kS2B630MdK/BQN5zF/DKffQ34= sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==" - "resolved" "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "builtins" "^1.0.3" - -"vfile-matter@^3.0.1": - "integrity" "sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==" - "resolved" "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "@types/js-yaml" "^4.0.0" - "is-buffer" "^2.0.0" - "js-yaml" "^4.0.0" - -"vfile-message@^3.0.0": - "integrity" "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==" - "resolved" "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "@types/unist" "^2.0.0" - "unist-util-stringify-position" "^3.0.0" - -"vfile@^5.0.0", "vfile@^5.3.0": - "integrity" "sha512-w0PLIugRY3Crkgw89TeMvHCzqCs/zpreR31hl4D92y6SOE07+bfJe+dK5Q2akwS+i/c801kzjoOr9gMcTe6IAA==" - "resolved" "https://registry.npmjs.org/vfile/-/vfile-5.3.2.tgz" - "version" "5.3.2" - dependencies: - "@types/unist" "^2.0.0" - "is-buffer" "^2.0.0" - "unist-util-stringify-position" "^3.0.0" - "vfile-message" "^3.0.0" - -"web-streams-polyfill@^3.0.3": - "integrity" "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==" - "resolved" "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz" - "version" "3.2.0" - -"webpack-merge@^4.2.2": - "integrity" "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==" - "resolved" "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz" - "version" "4.2.2" - dependencies: - "lodash" "^4.17.15" - -"which-module@^2.0.0": - "integrity" "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" - "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" - "version" "2.0.0" - -"which@^1.2.9": - "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" - "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "isexe" "^2.0.0" - -"which@^1.3.0": - "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" - "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "isexe" "^2.0.0" - -"which@^2.0.2": - "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" - "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "isexe" "^2.0.0" - -"widest-line@^2.0.0": - "integrity" "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==" - "resolved" "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "string-width" "^2.1.1" - -"widest-line@^3.1.0": - "integrity" "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==" - "resolved" "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "string-width" "^4.0.0" - -"wrap-ansi@^5.1.0": - "integrity" "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "ansi-styles" "^3.2.0" - "string-width" "^3.0.0" - "strip-ansi" "^5.0.0" - -"wrappy@1": - "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" - -"write-file-atomic@^2.0.0": - "integrity" "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==" - "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" - "version" "2.4.3" - dependencies: - "graceful-fs" "^4.1.11" - "imurmurhash" "^0.1.4" - "signal-exit" "^3.0.2" - -"write-file-atomic@^3.0.0": - "integrity" "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==" - "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - "version" "3.0.3" - dependencies: - "imurmurhash" "^0.1.4" - "is-typedarray" "^1.0.0" - "signal-exit" "^3.0.2" - "typedarray-to-buffer" "^3.1.5" - -"xdg-basedir@^3.0.0": - "integrity" "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==" - "resolved" "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz" - "version" "3.0.0" - -"xdg-basedir@^4.0.0": - "integrity" "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - "resolved" "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" - "version" "4.0.0" - -"xtend@^4.0.0", "xtend@^4.0.2", "xtend@~4.0.1": - "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - "version" "4.0.2" - -"y18n@^4.0.0": - "integrity" "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" - "version" "4.0.3" - -"yallist@^2.1.2": - "integrity" "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" - "version" "2.1.2" - -"yallist@^4.0.0": - "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - "version" "4.0.0" - -"yaml@^1.10.0": - "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - "version" "1.10.2" - -"yaml@^1.10.2": - "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - "version" "1.10.2" - -"yaml@^2.0.0-1": - "integrity" "sha512-JbfdlHKGP2Ik9IHylzWlGd4pPK++EU46/IxMykphS2ZKw7a7h+dHNmcXObLgpRDriBY+rpWslldikckX8oruWQ==" - "resolved" "https://registry.npmjs.org/yaml/-/yaml-2.0.0.tgz" - "version" "2.0.0" - -"yargs-parser@^15.0.1": - "integrity" "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz" - "version" "15.0.3" - dependencies: - "camelcase" "^5.0.0" - "decamelize" "^1.2.0" - -"yargs@^14.2.3": - "integrity" "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz" - "version" "14.2.3" - dependencies: - "cliui" "^5.0.0" - "decamelize" "^1.2.0" - "find-up" "^3.0.0" - "get-caller-file" "^2.0.1" - "require-directory" "^2.1.1" - "require-main-filename" "^2.0.0" - "set-blocking" "^2.0.0" - "string-width" "^3.0.0" - "which-module" "^2.0.0" - "y18n" "^4.0.0" - "yargs-parser" "^15.0.1" - -"yn@3.1.1": - "integrity" "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" - "resolved" "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - "version" "3.1.1" - -"zwitch@^2.0.0": - "integrity" "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==" - "resolved" "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz" - "version" "2.0.2" From a4ef6c335e0bd676bfa961a2782d2827d3acbfc9 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 22 Dec 2022 11:43:57 +0200 Subject: [PATCH 16/74] refactor: one store per request (#510) * refactor: read from file * refactor: make store for every request --- runtime/src/axum/mod.rs | 72 +++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 4424748d5..7dfdc9bc8 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -1,12 +1,11 @@ use std::convert::Infallible; -use std::fs::File; use std::io::{BufReader, Read, Write}; use std::net::{Ipv4Addr, SocketAddr}; use std::ops::DerefMut; use std::os::unix::prelude::RawFd; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::str::FromStr; -use std::sync::{Arc, Mutex}; +use std::sync::Mutex; use async_trait::async_trait; use cap_std::os::unix::net::UnixStream; @@ -134,9 +133,8 @@ impl Runtime for AxumWasm { struct RouterBuilder { engine: Engine, - store: Store, linker: Linker, - src: Option, + src: Option, } impl RouterBuilder { @@ -146,52 +144,39 @@ impl RouterBuilder { let mut linker: Linker = Linker::new(&engine); wasmtime_wasi::add_to_linker(&mut linker, |s| s).unwrap(); - let wasi = WasiCtxBuilder::new() - .inherit_stdio() - .inherit_args() - .unwrap() - .build(); - - let store = Store::new(&engine, wasi); - Self { engine, - store, linker, src: None, } } pub fn src>(mut self, src: P) -> Self { - self.src = Some(File::open(src).unwrap()); + self.src = Some(src.as_ref().to_path_buf()); self } - pub fn build(mut self) -> Router { - let mut buf = Vec::new(); - self.src.unwrap().read_to_end(&mut buf).unwrap(); - let module = Module::new(&self.engine, buf).unwrap(); + pub fn build(self) -> Router { + let file = self.src.unwrap(); + let module = Module::from_file(&self.engine, file).unwrap(); for export in module.exports() { println!("export: {}", export.name()); } - - self.linker - .module(&mut self.store, "axum", &module) - .unwrap(); let inner = RouterInner { - store: self.store, linker: self.linker, + engine: self.engine, + module, }; - Router { - inner: Arc::new(tokio::sync::Mutex::new(inner)), - } + Router { inner } } } +#[derive(Clone)] struct RouterInner { - store: Store, linker: Linker, + engine: Engine, + module: Module, } impl RouterInner { @@ -200,17 +185,28 @@ impl RouterInner { &mut self, req: hyper::Request, ) -> Result, Infallible> { + let wasi = WasiCtxBuilder::new() + .inherit_stdio() + .inherit_args() + .unwrap() + .build(); + + let mut store = Store::new(&self.engine, wasi); + self.linker + .module(&mut store, "axum", &self.module) + .unwrap(); + let (mut parts_stream, parts_client) = UnixStream::pair().unwrap(); let (mut body_stream, body_client) = UnixStream::pair().unwrap(); let parts_client = WasiUnixStream::from_cap_std(parts_client); let body_client = WasiUnixStream::from_cap_std(body_client); - self.store + store .data_mut() .insert_file(3, Box::new(parts_client), FileCaps::all()); - self.store + store .data_mut() .insert_file(4, Box::new(body_client), FileCaps::all()); @@ -231,13 +227,13 @@ impl RouterInner { println!("calling inner Router"); self.linker - .get(&mut self.store, "axum", "__SHUTTLE_Axum_call") + .get(&mut store, "axum", "__SHUTTLE_Axum_call") .unwrap() .into_func() .unwrap() - .typed::<(RawFd, RawFd), (), _>(&self.store) + .typed::<(RawFd, RawFd), (), _>(&store) .unwrap() - .call(&mut self.store, (3, 4)) + .call(&mut store, (3, 4)) .unwrap(); // read response parts from host @@ -269,7 +265,7 @@ impl RouterInner { #[derive(Clone)] struct Router { - inner: Arc>, + inner: RouterInner, } impl Router { @@ -296,10 +292,8 @@ impl Router { let router = router.clone(); async move { Ok::<_, Infallible>(service_fn(move |req: Request| { - let router = router.clone(); - async move { - Ok::<_, Infallible>(router.lock().await.handle_request(req).await.unwrap()) - } + let mut router = router.clone(); + async move { Ok::<_, Infallible>(router.handle_request(req).await.unwrap()) } })) } }); @@ -329,7 +323,7 @@ pub mod tests { #[tokio::test] async fn axum() { let axum = Router::new("axum.wasm"); - let mut inner = axum.inner.lock().await; + let mut inner = axum.inner; // GET /hello let request: Request = Request::builder() From c4dd3912e7642d6938a4cf93d1aa97bbd243a4f1 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 22 Dec 2022 12:02:07 +0200 Subject: [PATCH 17/74] refactor: remove the serenity runtime (#549) --- Cargo.lock | 13 -- runtime/Cargo.toml | 1 - runtime/Makefile | 10 +- runtime/README.md | 45 +------ runtime/src/lib.rs | 2 - runtime/src/main.rs | 6 +- runtime/src/next/mod.rs | 277 ---------------------------------------- tmp/wasm/Cargo.toml | 11 -- tmp/wasm/src/lib.rs | 37 ------ 9 files changed, 6 insertions(+), 396 deletions(-) delete mode 100644 runtime/src/next/mod.rs delete mode 100644 tmp/wasm/Cargo.toml delete mode 100644 tmp/wasm/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4ab269fbc..17ed9210b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6380,7 +6380,6 @@ dependencies = [ "clap 4.0.27", "hyper", "rmp-serde", - "serenity", "shuttle-common", "shuttle-proto", "shuttle-service", @@ -8747,15 +8746,3 @@ dependencies = [ "cc", "libc", ] - -[[patch.unused]] -name = "shuttle-aws-rds" -version = "0.8.0" - -[[patch.unused]] -name = "shuttle-persist" -version = "0.8.0" - -[[patch.unused]] -name = "shuttle-shared-db" -version = "0.8.0" diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index a790bd94a..d9b757938 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -13,7 +13,6 @@ cap-std = "0.26.0" clap ={ version = "4.0.18", features = ["derive"] } hyper = { version = "0.14.23", features = ["full"] } rmp-serde = { version = "1.1.1" } -serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } thiserror = { workspace = true } tokio = { version = "=1.22.0", features = ["full"] } tokio-stream = "0.1.11" diff --git a/runtime/Makefile b/runtime/Makefile index 51f33e409..a706e8146 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -1,16 +1,12 @@ -.PHONY: axum serenity +.PHONY: axum -all: axum serenity +all: axum axum: cd ../tmp/axum-wasm; cargo build --target wasm32-wasi cp ../tmp/axum-wasm/target/wasm32-wasi/debug/shuttle_axum.wasm axum.wasm -serenity: - cd ../tmp/wasm; cargo build --target wasm32-wasi - cp ../tmp/wasm/target/wasm32-wasi/debug/shuttle_serenity.wasm serenity.wasm - -test: serenity axum +test: axum cargo test --all-features -- --nocapture runtime: diff --git a/runtime/README.md b/runtime/README.md index c78b61f19..e0ea4da9f 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -1,48 +1,5 @@ # How to run -## serenity-wasm - -Build and run: - -## shuttle-next - -Compile the shuttle-next serenity runtime: - -```bash -make serenity -``` - -Run the test: - -```bash -cargo test serenity -- --nocapture - -# or, run tests for both axum and serenity: -make test -``` - -Start the shuttle-next runtime: - -```bash -DISCORD_TOKEN=xxx cargo run -``` - -In another terminal: - -``` bash -# load wasm module -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//runtime/serenity.wasm"}' localhost:6001 runtime.Runtime/Load - -# start bot (the deployment ID is needed in the StartRequest, but it isn't used by the serenity bot currently) -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Start - -# subscribe to logs (unimplemented) -grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs - -# stop (the deployment ID is needed in the StopRequest, but it isn't used by the serenity bot currently) -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Stop -``` - ## axum-wasm Compile the wasm axum router: @@ -56,7 +13,7 @@ Run the test: ```bash cargo test axum -- --nocapture -# or, run tests for both axum and serenity: +# or, run tests make test ``` diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 1119bf890..81d7acaef 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,10 +1,8 @@ mod args; mod axum; mod legacy; -mod next; pub mod provisioner_factory; pub use args::Args; pub use axum::AxumWasm; pub use legacy::Legacy; -pub use next::Next; diff --git a/runtime/src/main.rs b/runtime/src/main.rs index f01d95ac0..3c4f64cb5 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -5,7 +5,7 @@ use std::{ use clap::Parser; use shuttle_proto::runtime::runtime_server::RuntimeServer; -use shuttle_runtime::{Args, AxumWasm, Legacy, Next}; +use shuttle_runtime::{Args, AxumWasm, Legacy}; use tonic::transport::Server; use tracing::trace; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; @@ -41,9 +41,7 @@ async fn main() { let svc = RuntimeServer::new(axum); server_builder.add_service(svc) } else { - let next = Next::default(); - let svc = RuntimeServer::new(next); - server_builder.add_service(svc) + panic!("No runtime was selected"); }; router.serve(addr).await.unwrap(); diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs deleted file mode 100644 index da703189a..000000000 --- a/runtime/src/next/mod.rs +++ /dev/null @@ -1,277 +0,0 @@ -use std::env; -use std::fs::File; -use std::io::{Read, Write}; -use std::ops::DerefMut; -use std::os::unix::prelude::RawFd; -use std::path::Path; -use std::str::FromStr; -use std::sync::Arc; - -use async_trait::async_trait; -use cap_std::os::unix::net::UnixStream; -use serenity::{model::prelude::*, prelude::*}; -use shuttle_proto::runtime::runtime_server::Runtime; -use shuttle_proto::runtime::{ - self, LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, - SubscribeLogsRequest, -}; -use shuttle_service::ServiceName; -use tokio::sync::oneshot; -use tokio_stream::wrappers::ReceiverStream; -use tonic::{Request, Response, Status}; -use tracing::{error, trace}; -use wasi_common::file::FileCaps; -use wasmtime::{Engine, Linker, Module, Store}; -use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; -use wasmtime_wasi::{WasiCtx, WasiCtxBuilder}; - -pub struct Next { - bot: std::sync::Mutex>, - kill_tx: std::sync::Mutex>>, -} - -impl Next { - pub fn new() -> Self { - Self { - bot: std::sync::Mutex::new(None), - kill_tx: std::sync::Mutex::new(None), - } - } -} - -impl Default for Next { - fn default() -> Self { - Self::new() - } -} - -#[async_trait] -impl Runtime for Next { - async fn load(&self, request: Request) -> Result, Status> { - let wasm_path = request.into_inner().path; - trace!(wasm_path, "loading"); - - let bot = Bot::new(wasm_path); - - *self.bot.lock().unwrap() = Some(bot); - - let message = LoadResponse { success: true }; - - Ok(Response::new(message)) - } - - async fn start( - &self, - _request: Request, - ) -> Result, Status> { - let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; - let token = env::var("DISCORD_TOKEN").unwrap(); - let bot: Bot = { - let guard = self.bot.lock().unwrap(); - guard.as_ref().unwrap().clone() - }; - let client = bot.into_client(token.as_str(), intents).await; - - let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); - - *self.kill_tx.lock().unwrap() = Some(kill_tx); - - // start bot as a background task with a kill receiver - trace!("starting bot"); - tokio::spawn(run_until_stopped(client, kill_rx)); - - let message = StartResponse { - success: true, - // todo: port set here until I can set the port field to optional in the protobuf - port: 8001, - }; - - Ok(Response::new(message)) - } - - type SubscribeLogsStream = ReceiverStream>; - - async fn subscribe_logs( - &self, - _request: Request, - ) -> Result, Status> { - todo!() - } - - async fn stop(&self, request: Request) -> Result, Status> { - let request = request.into_inner(); - - let service_name = ServiceName::from_str(request.service_name.as_str()) - .map_err(|err| Status::from_error(Box::new(err)))?; - - let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); - - if let Some(kill_tx) = kill_tx { - if kill_tx - .send(format!("stopping deployment: {}", &service_name)) - .is_err() - { - error!("the receiver dropped"); - return Err(Status::internal("failed to stop deployment")); - } - - Ok(Response::new(StopResponse { success: true })) - } else { - Err(Status::internal("failed to stop deployment")) - } - } -} - -/// Run the bot until a stop signal is received -async fn run_until_stopped(mut client: Client, kill_rx: tokio::sync::oneshot::Receiver) { - tokio::select! { - _ = client.start() => { - trace!("serenity bot stopped"); - }, - message = kill_rx => { - match message { - Ok(msg) => trace!("{msg}"), - Err(_) => trace!("the sender dropped") - } - } - } -} - -struct BotBuilder { - engine: Engine, - store: Store, - linker: Linker, - src: Option, -} - -impl BotBuilder { - pub fn new() -> Self { - let engine = Engine::default(); - - let mut linker: Linker = Linker::new(&engine); - wasmtime_wasi::add_to_linker(&mut linker, |s| s).unwrap(); - - let wasi = WasiCtxBuilder::new() - .inherit_stdio() - .inherit_args() - .unwrap() - .build(); - - let store = Store::new(&engine, wasi); - - Self { - engine, - store, - linker, - src: None, - } - } - - pub fn src>(mut self, src: P) -> Self { - self.src = Some(File::open(src).unwrap()); - self - } - - pub fn build(mut self) -> Bot { - let mut buf = Vec::new(); - self.src.unwrap().read_to_end(&mut buf).unwrap(); - let module = Module::new(&self.engine, buf).unwrap(); - - for export in module.exports() { - println!("export: {}", export.name()); - } - - self.linker.module(&mut self.store, "bot", &module).unwrap(); - let inner = BotInner { - store: self.store, - linker: self.linker, - }; - Bot { - inner: Arc::new(Mutex::new(inner)), - } - } -} - -struct BotInner { - store: Store, - linker: Linker, -} - -impl BotInner { - pub async fn message(&mut self, new_message: &str) -> Option { - let (mut host, client) = UnixStream::pair().unwrap(); - let client = WasiUnixStream::from_cap_std(client); - - self.store - .data_mut() - .insert_file(3, Box::new(client), FileCaps::all()); - - host.write_all(new_message.as_bytes()).unwrap(); - host.write_all(&[0]).unwrap(); - - println!("calling inner EventHandler message"); - self.linker - .get(&mut self.store, "bot", "__SHUTTLE_EventHandler_message") - .unwrap() - .into_func() - .unwrap() - .typed::(&self.store) - .unwrap() - .call(&mut self.store, 3) - .unwrap(); - - let mut resp = String::new(); - host.read_to_string(&mut resp).unwrap(); - - if resp.is_empty() { - None - } else { - Some(resp) - } - } -} - -#[derive(Clone)] -struct Bot { - inner: Arc>, -} - -impl Bot { - pub fn builder() -> BotBuilder { - BotBuilder::new() - } - - pub fn new>(src: P) -> Self { - Self::builder().src(src).build() - } - - pub async fn into_client(self, token: &str, intents: GatewayIntents) -> Client { - Client::builder(token, intents) - .event_handler(self) - .await - .unwrap() - } -} - -#[async_trait] -impl EventHandler for Bot { - async fn message(&self, ctx: Context, new_message: Message) { - let mut inner = self.inner.lock().await; - if let Some(resp) = inner.message(new_message.content.as_str()).await { - new_message.channel_id.say(&ctx.http, resp).await.unwrap(); - } - } -} - -#[cfg(test)] -pub mod tests { - use super::*; - - #[tokio::test] - async fn serenity() { - let bot = Bot::new("serenity.wasm"); - let mut inner = bot.inner.lock().await; - assert_eq!(inner.message("not !hello").await, None); - assert_eq!(inner.message("!hello").await, Some("world!".to_string())); - } -} diff --git a/tmp/wasm/Cargo.toml b/tmp/wasm/Cargo.toml deleted file mode 100644 index b935b0340..000000000 --- a/tmp/wasm/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "shuttle-serenity" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -crate-type = [ "cdylib" ] - -[dependencies] diff --git a/tmp/wasm/src/lib.rs b/tmp/wasm/src/lib.rs deleted file mode 100644 index 74c859641..000000000 --- a/tmp/wasm/src/lib.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::fs::File; -use std::io::{Read, Write}; -use std::os::wasi::prelude::*; - -pub fn handle_message(message: &str) -> Option { - if message == "!hello" { - Some("world!".to_string()) - } else { - None - } -} - -#[no_mangle] -#[allow(non_snake_case)] -pub extern "C" fn __SHUTTLE_EventHandler_message(fd: RawFd) { - println!("inner handler awoken; interacting with fd={fd}"); - - let mut f = unsafe { File::from_raw_fd(fd) }; - - let mut buf = Vec::new(); - let mut c_buf = [0; 1]; - loop { - f.read(&mut c_buf).unwrap(); - if c_buf[0] == 0 { - break; - } else { - buf.push(c_buf[0]); - } - } - - let msg = String::from_utf8(buf).unwrap(); - println!("got message: {msg}"); - - if let Some(resp) = handle_message(msg.as_str()) { - f.write_all(resp.as_bytes()).unwrap(); - } -} From 1487ddfe871bbe751ce8c75a3278dc51d8ffd616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Wed, 28 Dec 2022 13:29:28 +0100 Subject: [PATCH 18/74] Feat: shuttle next bump deps (#551) * fix: axum tests * feat: bump wasmtime crates --- Cargo.lock | 331 ++++++++++++++++++--------------------- runtime/Cargo.toml | 11 +- runtime/src/axum/mod.rs | 10 +- tmp/axum-wasm/Cargo.toml | 5 +- tmp/axum-wasm/src/lib.rs | 3 +- 5 files changed, 168 insertions(+), 192 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 17ed9210b..85aeaab15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1332,39 +1332,38 @@ dependencies = [ [[package]] name = "cap-fs-ext" -version = "0.26.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0e103ce36d217d568903ad27b14ec2238ecb5d65bad2e756a8f3c0d651506e" +checksum = "15ed685fe2949d035b080fbe7536b944efffb648af1d34630aa887ca2b132d2b" dependencies = [ "cap-primitives", "cap-std", - "io-lifetimes 0.7.4", - "windows-sys 0.36.1", + "io-lifetimes", + "windows-sys 0.42.0", ] [[package]] name = "cap-primitives" -version = "0.26.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3f336aa91cce16033ed3c94ac91d98956c49b420e6d6cd0dd7d0e386a57085" +checksum = "0315442c0232cb9a1c2be55ee289a0e9bf5fd0b0f162be8e7f16673e095f5e09" dependencies = [ "ambient-authority", "fs-set-times", "io-extras", - "io-lifetimes 0.7.4", + "io-lifetimes", "ipnet", "maybe-owned", - "rustix 0.35.12", - "winapi-util", - "windows-sys 0.36.1", + "rustix", + "windows-sys 0.42.0", "winx", ] [[package]] name = "cap-rand" -version = "0.26.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14b9606aa9550d34651bc481443203bc014237bdb992d201d2afa62d2ec6dea" +checksum = "b78d30c0b3c656f6193bef0697cff6bd903d9b2b1437c7af3d35a6a9d1a7af2e" dependencies = [ "ambient-authority", "rand 0.8.5", @@ -1372,26 +1371,26 @@ dependencies = [ [[package]] name = "cap-std" -version = "0.26.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d6e70b626eceac9d6fc790fe2d72cc3f2f7bc3c35f467690c54a526b0f56db" +checksum = "3e9256648eae510b29aae4d52ed71877239a61f9a2494d23ddad7fb6f50e5de8" dependencies = [ "cap-primitives", "io-extras", - "io-lifetimes 0.7.4", + "io-lifetimes", "ipnet", - "rustix 0.35.12", + "rustix", ] [[package]] name = "cap-time-ext" -version = "0.26.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a0524f7c4cff2ea547ae2b652bf7a348fd3e48f76556dc928d8b45ab2f1d50" +checksum = "384a81c0fb05dbd361f157fd2c822e3d16709540e49300d26a27d3d57f02e8cb" dependencies = [ "cap-primitives", "once_cell", - "rustix 0.35.12", + "rustix", "winx", ] @@ -1679,7 +1678,7 @@ dependencies = [ "bitflags", "clap_derive 4.0.21", "clap_lex 0.3.0", - "is-terminal 0.4.0", + "is-terminal", "once_cell", "strsim", "termcolor", @@ -1940,24 +1939,25 @@ checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" [[package]] name = "cranelift-bforest" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e1ee4c22871d24a95196ea7047d58c1d978e46c88037d3d397b3b3e0af360" +checksum = "fc952b310b24444fc14ab8b9cbe3fafd7e7329e3eec84c3a9b11d2b5cf6f3be1" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f600a52d59eed56a85f33750873b3b42d61e35ca777cd792369893f9e1f9dd" +checksum = "e73470419b33011e50dbf0f6439cbccbaabe9381de172da4e1b6efcda4bb8fa7" dependencies = [ "arrayvec 0.7.2", "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", "cranelift-isle", "gimli", @@ -1969,33 +1969,47 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8418218d0953d73e9b96e9d9ffec56145efa4f18988251530b5872ae4410563" +checksum = "911a1872464108a11ac9965c2b079e61bbdf1bc2e0b9001264264add2e12a38f" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f01be0cfd40aba59153236ab4b99062131b5bbe6f9f3d4bcb238bd2f96ff5262" +checksum = "e036f3f07adb24a86fb46e977e8fe03b18bb16b1eada949cf2c48283e5f8a862" + +[[package]] +name = "cranelift-egraph" +version = "0.91.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6c623f4b5d2a6bad32c403f03765d4484a827eb93ee78f8cb6219ef118fd59" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddae4fec5d6859233ffa175b61d269443c473b3971a2c3e69008c8d3e83d5825" +checksum = "74385eb5e405b3562f0caa7bcc4ab9a93c7958dd5bcd0e910bffb7765eacd6fc" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc3deb0df97748434cf9f7e404f1f5134f6a253fc9a6bca25c5cd6804c08d3" +checksum = "8a4ac920422ee36bff2c66257fec861765e3d95a125cdf58d8c0f3bba7e40e61" dependencies = [ "cranelift-codegen", "log", @@ -2005,18 +2019,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3bb54287de9c36ba354eb849fefb77b5e73955058745fd08f12cfdfa181866" -dependencies = [ - "rayon", -] +checksum = "c541263fb37ad2baa53ec8c37218ee5d02fa0984670d9419dedd8002ea68ff08" [[package]] name = "cranelift-native" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c2a4f2efdce1de1f94e74f12b3b4144e3bcafa6011338b87388325d72d2120" +checksum = "1de5d7a063e8563d670aaca38de16591a9b70dc66cbad4d49a7b4ae8395fd1ce" dependencies = [ "cranelift-codegen", "libc", @@ -2025,9 +2036,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.89.0" +version = "0.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f918c37eb01f5b5ccc632e0ef3b4bf9ee03b5d4c267d3d2d3b62720a6bce0180" +checksum = "dfbc4dd03b713b5d71b582915b8c272f4813cdd8c99a3e03d9ba70c44468a6e0" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2807,13 +2818,13 @@ checksum = "3b5dd19b048b2dfde153588594b4f3da47b18afd18d171bb8d1d27741256bbaa" [[package]] name = "fs-set-times" -version = "0.17.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a267b6a9304912e018610d53fe07115d8b530b160e85db4d2d3a59f3ddde1aec" +checksum = "e25ca26b0001154679ce0901527330e6153b670d17ccd1f86bab4e45dfba1a74" dependencies = [ - "io-lifetimes 0.7.4", - "rustix 0.35.12", - "windows-sys 0.36.1", + "io-lifetimes", + "rustix", + "windows-sys 0.42.0", ] [[package]] @@ -3120,9 +3131,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -3610,22 +3621,12 @@ dependencies = [ [[package]] name = "io-extras" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5d8c2ab5becd8720e30fd25f8fa5500d8dc3fceadd8378f05859bd7b46fc49" -dependencies = [ - "io-lifetimes 0.7.4", - "windows-sys 0.36.1", -] - -[[package]] -name = "io-lifetimes" -version = "0.7.4" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e481ccbe3dea62107216d0d1138bb8ad8e5e5c43009a098bd1990272c497b0" +checksum = "4ad797ac2cd70ff82f6d9246d36762b41c1db15b439fd48bcb70914269642354" dependencies = [ - "libc", - "windows-sys 0.36.1", + "io-lifetimes", + "windows-sys 0.42.0", ] [[package]] @@ -3665,18 +3666,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" -[[package]] -name = "is-terminal" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d508111813f9af3afd2f92758f77e4ed2cc9371b642112c6a48d22eb73105c5" -dependencies = [ - "hermit-abi 0.2.6", - "io-lifetimes 0.7.4", - "rustix 0.35.12", - "windows-sys 0.36.1", -] - [[package]] name = "is-terminal" version = "0.4.0" @@ -3684,8 +3673,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae5bc6e2eb41c9def29a3e0f1306382807764b9b53112030eff57435667352d" dependencies = [ "hermit-abi 0.2.6", - "io-lifetimes 1.0.3", - "rustix 0.36.3", + "io-lifetimes", + "rustix", "windows-sys 0.42.0", ] @@ -3893,12 +3882,6 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" -[[package]] -name = "linux-raw-sys" -version = "0.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" - [[package]] name = "linux-raw-sys" version = "0.1.3" @@ -4036,11 +4019,11 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memfd" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "480b5a5de855d11ff13195950bdc8b98b5e942ef47afc447f6615cdcc4e15d80" +checksum = "b20a59d985586e4a5aef64564ac77299f8586d8be6cf9106a5a40207e8908efb" dependencies = [ - "rustix 0.35.12", + "rustix", ] [[package]] @@ -5332,9 +5315,9 @@ dependencies = [ [[package]] name = "regalloc2" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69025b4a161879ba90719837c06621c3d73cffa147a000aeacf458f6a9572485" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ "fxhash", "log", @@ -5681,22 +5664,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "rustix" -version = "0.35.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985947f9b6423159c4726323f373be0a21bdb514c5af06a849cb3d2dce2d01e8" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes 0.7.4", - "itoa 1.0.2", - "libc", - "linux-raw-sys 0.0.46", - "once_cell", - "windows-sys 0.36.1", -] - [[package]] name = "rustix" version = "0.36.3" @@ -5705,9 +5672,11 @@ checksum = "0b1fbb4dfc4eb1d390c02df47760bb19a84bb80b301ecc947ab5406394d8223e" dependencies = [ "bitflags", "errno", - "io-lifetimes 1.0.3", + "io-lifetimes", + "itoa 1.0.2", "libc", - "linux-raw-sys 0.1.3", + "linux-raw-sys", + "once_cell", "windows-sys 0.42.0", ] @@ -6867,17 +6836,16 @@ checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" [[package]] name = "system-interface" -version = "0.23.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92adbaf536f5aff6986e1e62ba36cee72b1718c5153eee08b9e728ddde3f6029" +checksum = "77b5f685b54fe35201ca824534425d4af3562470fb67682cf20130c568b49042" dependencies = [ - "atty", "bitflags", "cap-fs-ext", "cap-std", - "io-lifetimes 0.7.4", - "rustix 0.35.12", - "windows-sys 0.36.1", + "io-lifetimes", + "rustix", + "windows-sys 0.42.0", "winx", ] @@ -6971,7 +6939,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb20089a8ba2b69debd491f8d2d023761cbf196e999218c591fa1e7e15a21907" dependencies = [ - "rustix 0.36.3", + "rustix", "windows-sys 0.42.0", ] @@ -8030,9 +7998,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi-cap-std-sync" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa9ddcfc9d85e89a10c27801376ea57d2e9421ad91336326160c56044049b49" +checksum = "79eba5cf83a4adb2ccba4c029858229a4992dd88cc35dbfa5a555ec7fc2a8416" dependencies = [ "anyhow", "async-trait", @@ -8042,32 +8010,33 @@ dependencies = [ "cap-time-ext", "fs-set-times", "io-extras", - "io-lifetimes 0.7.4", - "is-terminal 0.3.0", + "io-lifetimes", + "is-terminal", "once_cell", - "rustix 0.35.12", + "rustix", "system-interface", "tracing", "wasi-common", - "windows-sys 0.36.1", + "windows-sys 0.42.0", ] [[package]] name = "wasi-common" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd86a0cd870709441a25d63737bd416db6cf8eb6229c0da08d29d7ab79108bbb" +checksum = "678ff55fb89ae721dae166003b843f53ee3e7bdb96aa96715fec8d44d012b105" dependencies = [ "anyhow", "bitflags", "cap-rand", "cap-std", "io-extras", - "rustix 0.35.12", + "rustix", "thiserror", "tracing", + "wasmtime", "wiggle", - "windows-sys 0.36.1", + "windows-sys 0.42.0", ] [[package]] @@ -8140,27 +8109,28 @@ checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" [[package]] name = "wasm-encoder" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5816e88e8ea7335016aa62eb0485747f786136d505a9b3890f8c400211d9b5f" +checksum = "05632e0a66a6ed8cca593c24223aabd6262f256c3693ad9822c315285f010614" dependencies = [ "leb128", ] [[package]] name = "wasmparser" -version = "0.92.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da34cec2a8c23db906cdf8b26e988d7a7f0d549eb5d51299129647af61a1b37" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ "indexmap", + "url", ] [[package]] name = "wasmtime" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fc5bb3329415030796cfa5530b2481ccef5c4f1e5150733ba94318ab004fe1" +checksum = "4abddf11816dd8f5e7310f6ebe5a2503b43f20ab2bf050b7d63f5b1bb96a81d9" dependencies = [ "anyhow", "async-trait", @@ -8184,23 +8154,23 @@ dependencies = [ "wasmtime-jit", "wasmtime-runtime", "wat", - "windows-sys 0.36.1", + "windows-sys 0.42.0", ] [[package]] name = "wasmtime-asm-macros" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db36545ff0940ad9bf4e9ab0ec2a4e1eaa5ebe2aa9227bcbc4af905375d9e482" +checksum = "c1f5206486f0467ba86e84d35996c4048b077cec2c9e5b322e7b853bdbe79334" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "wasmtime-cache" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c2101b211d9db7db8bcfb2ffa69e119fa99a20266d0e5f19bb989cb6c3280d7" +checksum = "d1e77abcf538af42517e188c109e4b50ecf6c0ee4d77ede76a438e0306b934dc" dependencies = [ "anyhow", "base64 0.13.1", @@ -8208,19 +8178,19 @@ dependencies = [ "directories-next", "file-per-thread-logger", "log", - "rustix 0.35.12", + "rustix", "serde", - "sha2 0.9.9", + "sha2 0.10.2", "toml", - "windows-sys 0.36.1", + "windows-sys 0.42.0", "zstd", ] [[package]] name = "wasmtime-cranelift" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0409e93b5eceaa4e5f498a4bce1cffc7ebe071d14582b5437c10af4aecc23f54" +checksum = "9e5bcb1d5ef211726b11e1286fe96cb40c69044c3632e1d6c67805d88a2e1a34" dependencies = [ "anyhow", "cranelift-codegen", @@ -8239,9 +8209,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55240389c604f68d2e1d2573d7d3740246ab9ea2fa4fe79e10ccd51faf9b9500" +checksum = "dcab3fac5a2ff68ce9857166a7d7c0e5251b554839b9dda7ed3b5528e191936e" dependencies = [ "anyhow", "cranelift-entity", @@ -8258,22 +8228,22 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb9b7b94f7b40d98665feca2338808cf449fa671d01be7176861f8d9aa4a012" +checksum = "2fb38af221b780f2c03764d763fe7f7bc414ea9db744d66dac98f9b694892561" dependencies = [ "cc", "cfg-if 1.0.0", - "rustix 0.35.12", + "rustix", "wasmtime-asm-macros", - "windows-sys 0.36.1", + "windows-sys 0.42.0", ] [[package]] name = "wasmtime-jit" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc15e285b7073ee566e62ea4b6dd38b80465ade0ea8cd4cee13c7ac2e295cfca" +checksum = "a7d866e2a84ee164739b7ed7bd7cc9e1f918639d2ec5e2817a31e24c148cab20" dependencies = [ "addr2line", "anyhow", @@ -8285,32 +8255,42 @@ dependencies = [ "log", "object", "rustc-demangle", - "rustix 0.35.12", "serde", "target-lexicon", - "thiserror", "wasmtime-environ", "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", "wasmtime-runtime", - "windows-sys 0.36.1", + "windows-sys 0.42.0", ] [[package]] name = "wasmtime-jit-debug" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee06d206bcf7a875eacd1e1e957c2a63f64a92934d2535dd8e15cde6d3a9ffe" +checksum = "0104c2b1ce443f2a2806216fcdf6dce09303203ec5797a698d313063b31e5bc8" dependencies = [ "object", "once_cell", - "rustix 0.35.12", + "rustix", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22d9c2e92b0fc124d2cad6cb497a4c840580a7dd2414a37109e8c7cfe699c0ea" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "windows-sys 0.42.0", ] [[package]] name = "wasmtime-runtime" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9969ff36cbf57f18c2d24679db57d0857ea7cc7d839534afc26ecc8003e9914b" +checksum = "0a1f0f99297a94cb20c511d1d4e864d9b54794644016d2530dc797cacfa7224a" dependencies = [ "anyhow", "cc", @@ -8323,20 +8303,19 @@ dependencies = [ "memoffset 0.6.5", "paste", "rand 0.8.5", - "rustix 0.35.12", - "thiserror", + "rustix", "wasmtime-asm-macros", "wasmtime-environ", "wasmtime-fiber", "wasmtime-jit-debug", - "windows-sys 0.36.1", + "windows-sys 0.42.0", ] [[package]] name = "wasmtime-types" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df64c737fc9b3cdf7617bcc65e8b97cb713ceb9c9c58530b20788a8a3482b5d1" +checksum = "62f3d8ee409447cae51651fd812437a0047ed8d7f44e94171ee05ce7cb955c96" dependencies = [ "cranelift-entity", "serde", @@ -8346,9 +8325,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb41d16dfd153d2078ea2347d311cee6c74f2a4ecc109cd9acaf860709137fdb" +checksum = "9f32b06e3282ccbeab6fb96c64fa12a359f1253022dfd5cf99385b2344e70830" dependencies = [ "anyhow", "wasi-cap-std-sync", @@ -8368,9 +8347,9 @@ dependencies = [ [[package]] name = "wast" -version = "48.0.0" +version = "50.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84825b5ac7164df8260c9e2b2e814075334edbe7ac426f2469b93a5eeac23cce" +checksum = "a2cbb59d4ac799842791fe7e806fa5dbbf6b5554d538e51cc8e176db6ff0ae34" dependencies = [ "leb128", "memchr", @@ -8380,11 +8359,11 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.50" +version = "1.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129da4a03ec6d2a815f42c88f641824e789d5be0d86d2f90aa8a218c7068e0be" +checksum = "584aaf7a1ecf4d383bbe1a25eeab0cbb8ff96acc6796707ff65cde48f4632f15" dependencies = [ - "wast 48.0.0", + "wast 50.0.0", ] [[package]] @@ -8470,9 +8449,9 @@ checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" [[package]] name = "wiggle" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2943156975c608cab1b44d28becba4196b07f18be92ea28f1e7f3372a12d81dd" +checksum = "7a2433252352677648dc4ac0c99e7e254e1c58be8019cda3323ab3a3ce29da5b" dependencies = [ "anyhow", "async-trait", @@ -8485,9 +8464,9 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0321263a6b1ba1e0a97174524891a14907cee68cfa183fd5389088dffbeab668" +checksum = "c15bf89e66bd1a9463ee529d37b999947befafd792f345d4a82e0d2b28c0845f" dependencies = [ "anyhow", "heck", @@ -8500,9 +8479,9 @@ dependencies = [ [[package]] name = "wiggle-macro" -version = "2.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa3d3794e5d68ef69f30e65f267c6bf18c920750d3ccd2a3ac04e77d95f66b96" +checksum = "919fb8f106375c7f6daf7b388a1fea3e2092dedb273b17b2d917522917c07a3c" dependencies = [ "proc-macro2 1.0.47", "quote 1.0.21", @@ -8661,13 +8640,13 @@ dependencies = [ [[package]] name = "winx" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b01e010390eb263a4518c8cebf86cb67469d1511c00b749a47b64c39e8054d" +checksum = "9baf690e238840de84bbfad6ad72d6628c41d34c1a5e276dab7fb2c9167ca1ac" dependencies = [ "bitflags", - "io-lifetimes 0.7.4", - "windows-sys 0.36.1", + "io-lifetimes", + "windows-sys 0.42.0", ] [[package]] diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index d9b757938..6840847f8 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -9,9 +9,9 @@ publish = false [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } -cap-std = "0.26.0" +cap-std = "1.0.2" clap ={ version = "4.0.18", features = ["derive"] } -hyper = { version = "0.14.23", features = ["full"] } +hyper = { version = "0.14.23", features = ["server"] } rmp-serde = { version = "1.1.1" } thiserror = { workspace = true } tokio = { version = "=1.22.0", features = ["full"] } @@ -20,9 +20,9 @@ tonic = "0.8.2" tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } uuid = { workspace = true, features = ["v4"] } -wasi-common = "2.0.0" -wasmtime = "2.0.0" -wasmtime-wasi = "2.0.0" +wasi-common = "4.0.0" +wasmtime = "4.0.0" +wasmtime-wasi = "4.0.0" [dependencies.shuttle-common] workspace = true @@ -33,5 +33,4 @@ workspace = true [dependencies.shuttle-service] workspace = true -version = "0.8.0" features = ["loader"] diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 7dfdc9bc8..5bd8fcfe6 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -231,7 +231,7 @@ impl RouterInner { .unwrap() .into_func() .unwrap() - .typed::<(RawFd, RawFd), (), _>(&store) + .typed::<(RawFd, RawFd), ()>(&store) .unwrap() .call(&mut store, (3, 4)) .unwrap(); @@ -323,7 +323,7 @@ pub mod tests { #[tokio::test] async fn axum() { let axum = Router::new("axum.wasm"); - let mut inner = axum.inner; + let inner = axum.inner; // GET /hello let request: Request = Request::builder() @@ -333,7 +333,7 @@ pub mod tests { .body(Body::empty()) .unwrap(); - let res = inner.handle_request(request).await.unwrap(); + let res = inner.clone().handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( @@ -356,7 +356,7 @@ pub mod tests { .body(Body::from("Goodbye world body")) .unwrap(); - let res = inner.handle_request(request).await.unwrap(); + let res = inner.clone().handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( @@ -379,7 +379,7 @@ pub mod tests { .body(Body::empty()) .unwrap(); - let res = inner.handle_request(request).await.unwrap(); + let res = inner.clone().handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::NOT_FOUND); } diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml index 52c5418cf..1b01b15a9 100644 --- a/tmp/axum-wasm/Cargo.toml +++ b/tmp/axum-wasm/Cargo.toml @@ -9,7 +9,7 @@ crate-type = [ "cdylib" ] [dependencies] # most axum features can be enabled, but "tokio" and "ws" depend on socket2 # via "hyper/tcp" which is not compatible with wasi -axum = { version = "0.6.0-rc.4", default-features = false } +axum = { version = "0.6.0", default-features = false } futures-executor = "0.3.21" http = "0.2.7" tower-service = "0.3.1" @@ -17,6 +17,5 @@ rmp-serde = { version = "1.1.1" } [dependencies.shuttle-common] path = "../../common" -default-features = false features = ["axum-wasm"] -version = "0.7.0" +version = "0.8.0" diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs index 00c3778c2..23f49b0c5 100644 --- a/tmp/axum-wasm/src/lib.rs +++ b/tmp/axum-wasm/src/lib.rs @@ -13,8 +13,7 @@ where let mut router = axum::Router::new() .route("/hello", axum::routing::get(hello)) - .route("/goodbye", axum::routing::get(goodbye)) - .into_service(); + .route("/goodbye", axum::routing::get(goodbye)); let response = router.call(request).await.unwrap(); From 9db7f90293142f4c1b716b3502f20634fca8cea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Wed, 4 Jan 2023 15:11:23 +0100 Subject: [PATCH 19/74] feat: return streaming body from wasm router (#558) * feat: stream body to and from router * fix: reader to stream hack didn't work in wasm I added a post endpoint and test, which proved that my hacky stream from BufReader didn't work on the wasm side * refactor: test string * feat: update codegen with axum-wasm changes * refactor: clean up * refactor: typo * feat: guard against large request bodies --- Cargo.lock | 1 + codegen/src/next/mod.rs | 52 ++++++++++-------------- runtime/Cargo.toml | 1 + runtime/src/axum/mod.rs | 88 ++++++++++++++++++++++++++++------------ tmp/axum-wasm/Cargo.toml | 1 + tmp/axum-wasm/src/lib.rs | 63 ++++++++++++++++------------ 6 files changed, 121 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85aeaab15..bc7113212 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6347,6 +6347,7 @@ dependencies = [ "async-trait", "cap-std", "clap 4.0.27", + "futures", "hyper", "rmp-serde", "shuttle-common", diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index f0983bc18..520b9ee95 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -238,15 +238,12 @@ impl ToTokens for App { let Self { endpoints } = self; let app = quote!( - async fn __app(request: http::Request) -> axum::response::Response - where - B: axum::body::HttpBody + Send + 'static, + async fn __app(request: http::Request,) -> axum::response::Response { use tower_service::Service; let mut router = axum::Router::new() - #(#endpoints)* - .into_service(); + #(#endpoints)*; let response = router.call(request).await.unwrap(); @@ -268,12 +265,12 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { pub extern "C" fn __SHUTTLE_Axum_call( fd_3: std::os::wasi::prelude::RawFd, fd_4: std::os::wasi::prelude::RawFd, + fd_5: std::os::wasi::prelude::RawFd, ) { use axum::body::HttpBody; use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; - - println!("inner handler awoken; interacting with fd={fd_3},{fd_4}"); + println!("inner handler awoken; interacting with fd={fd_3},{fd_4},{fd_5}"); // file descriptor 3 for reading and writing http parts let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; @@ -283,28 +280,22 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { // deserialize request parts from rust messagepack let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); - // file descriptor 4 for reading and writing http body - let mut body_fd = unsafe { std::fs::File::from_raw_fd(fd_4) }; + // file descriptor 4 for reading http body into wasm + let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(fd_4) }; - // read body from host + let mut reader = std::io::BufReader::new(&mut body_read_stream); let mut body_buf = Vec::new(); - let mut c_buf: [u8; 1] = [0; 1]; - loop { - body_fd.read(&mut c_buf).unwrap(); - if c_buf[0] == 0 { - break; - } else { - body_buf.push(c_buf[0]); - } - } + reader.read_to_end(&mut body_buf).unwrap(); - let request: http::Request = wrapper + let body = axum::body::Body::from(body_buf); + + let request = wrapper .into_request_builder() - .body(body_buf.into()) + .body(axum::body::boxed(body)) .unwrap(); println!("inner router received request: {:?}", &request); - let res = futures_executor::block_on(__app(request)); + let res = handle_request(request); let (parts, mut body) = res.into_parts(); @@ -314,12 +305,13 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { // write response parts parts_fd.write_all(&response_parts).unwrap(); + // file descriptor 5 for writing http body to host + let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(fd_5) }; + // write body if there is one if let Some(body) = futures_executor::block_on(body.data()) { - body_fd.write_all(body.unwrap().as_ref()).unwrap(); + body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); } - // signal to the reader that end of file has been reached - body_fd.write(&[0]).unwrap(); } ) } @@ -367,16 +359,14 @@ mod tests { let actual = quote!(#app); let expected = quote!( - async fn __app(request: http::Request) -> axum::response::Response - where - B: axum::body::HttpBody + Send + 'static, - { + async fn __app( + request: http::Request, + ) -> axum::response::Response { use tower_service::Service; let mut router = axum::Router::new() .route("/hello", axum::routing::get(hello)) - .route("/goodbye", axum::routing::post(goodbye)) - .into_service(); + .route("/goodbye", axum::routing::post(goodbye)); let response = router.call(request).await.unwrap(); diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 6840847f8..89fbf12b4 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -23,6 +23,7 @@ uuid = { workspace = true, features = ["v4"] } wasi-common = "4.0.0" wasmtime = "4.0.0" wasmtime-wasi = "4.0.0" +futures = "0.3.25" [dependencies.shuttle-common] workspace = true diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 5bd8fcfe6..e3dada547 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -9,6 +9,8 @@ use std::sync::Mutex; use async_trait::async_trait; use cap_std::os::unix::net::UnixStream; +use futures::TryStreamExt; +use hyper::body::HttpBody; use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request, Response}; use shuttle_common::wasm::{RequestWrapper, ResponseWrapper}; @@ -197,18 +199,22 @@ impl RouterInner { .unwrap(); let (mut parts_stream, parts_client) = UnixStream::pair().unwrap(); - let (mut body_stream, body_client) = UnixStream::pair().unwrap(); + let (mut body_write_stream, body_write_client) = UnixStream::pair().unwrap(); + let (body_read_stream, body_read_client) = UnixStream::pair().unwrap(); let parts_client = WasiUnixStream::from_cap_std(parts_client); - let body_client = WasiUnixStream::from_cap_std(body_client); + let body_write_client = WasiUnixStream::from_cap_std(body_write_client); + let body_read_client = WasiUnixStream::from_cap_std(body_read_client); store .data_mut() .insert_file(3, Box::new(parts_client), FileCaps::all()); - store .data_mut() - .insert_file(4, Box::new(body_client), FileCaps::all()); + .insert_file(4, Box::new(body_write_client), FileCaps::all()); + store + .data_mut() + .insert_file(5, Box::new(body_read_client), FileCaps::all()); let (parts, body) = req.into_parts(); @@ -218,12 +224,27 @@ impl RouterInner { // write request parts parts_stream.write_all(&request_rmp).unwrap(); - // write body - body_stream - .write_all(hyper::body::to_bytes(body).await.unwrap().as_ref()) - .unwrap(); - // signal to the receiver that end of file has been reached - body_stream.write_all(&[0]).unwrap(); + // To protect our server, reject requests with bodies larger than + // 64kbs of data. + let body_size = body.size_hint().upper().unwrap_or(u64::MAX); + + if body_size > 1024 * 64 { + let response = Response::builder() + .status(hyper::http::StatusCode::PAYLOAD_TOO_LARGE) + .body(Body::empty()) + .unwrap(); + + // Return early if body is too big + return Ok(response); + } + + let body_bytes = hyper::body::to_bytes(body).await.unwrap(); + + // write body to axum + body_write_stream.write_all(body_bytes.as_ref()).unwrap(); + + // drop stream to signal EOF + drop(body_write_stream); println!("calling inner Router"); self.linker @@ -231,9 +252,9 @@ impl RouterInner { .unwrap() .into_func() .unwrap() - .typed::<(RawFd, RawFd), ()>(&store) + .typed::<(RawFd, RawFd, RawFd), ()>(&store) .unwrap() - .call(&mut store, (3, 4)) + .call(&mut store, (3, 4, 5)) .unwrap(); // read response parts from host @@ -242,22 +263,12 @@ impl RouterInner { // deserialize response parts from rust messagepack let wrapper: ResponseWrapper = rmps::from_read(reader).unwrap(); - // read response body from wasm router - let mut body_buf = Vec::new(); - let mut c_buf: [u8; 1] = [0; 1]; - loop { - body_stream.read_exact(&mut c_buf).unwrap(); - if c_buf[0] == 0 { - break; - } else { - body_buf.push(c_buf[0]); - } - } + // read response body from wasm and stream it to our hyper server + let reader = BufReader::new(body_read_stream); + let stream = futures::stream::iter(reader.bytes()).try_chunks(2); + let body = hyper::Body::wrap_stream(stream); - let response: Response = wrapper - .into_response_builder() - .body(body_buf.into()) - .unwrap(); + let response: Response = wrapper.into_response_builder().body(body).unwrap(); Ok(response) } @@ -382,5 +393,28 @@ pub mod tests { let res = inner.clone().handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::NOT_FOUND); + + // POST /uppercase + let request: Request = Request::builder() + .method(Method::POST) + .version(Version::HTTP_11) + .header("test", HeaderValue::from_static("invalid")) + .uri("https://axum-wasm.example/uppercase") + .body("this should be uppercased".into()) + .unwrap(); + + let res = inner.clone().handle_request(request).await.unwrap(); + + assert_eq!(res.status(), StatusCode::OK); + assert_eq!( + &hyper::body::to_bytes(res.into_body()) + .await + .unwrap() + .iter() + .cloned() + .collect::>() + .as_ref(), + b"THIS SHOULD BE UPPERCASED" + ); } } diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml index 1b01b15a9..740001a64 100644 --- a/tmp/axum-wasm/Cargo.toml +++ b/tmp/axum-wasm/Cargo.toml @@ -14,6 +14,7 @@ futures-executor = "0.3.21" http = "0.2.7" tower-service = "0.3.1" rmp-serde = { version = "1.1.1" } +futures = "0.3.25" [dependencies.shuttle-common] path = "../../common" diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs index 23f49b0c5..e0801ac9a 100644 --- a/tmp/axum-wasm/src/lib.rs +++ b/tmp/axum-wasm/src/lib.rs @@ -1,19 +1,21 @@ -pub fn handle_request(req: http::Request) -> axum::response::Response -where - B: axum::body::HttpBody + Send + 'static, -{ +use axum::{ + body::BoxBody, + extract::BodyStream, + response::{IntoResponse, Response}, +}; +use futures::TryStreamExt; + +pub fn handle_request(req: http::Request) -> axum::response::Response { futures_executor::block_on(app(req)) } -async fn app(request: http::Request) -> axum::response::Response -where - B: axum::body::HttpBody + Send + 'static, -{ +async fn app(request: http::Request) -> axum::response::Response { use tower_service::Service; let mut router = axum::Router::new() .route("/hello", axum::routing::get(hello)) - .route("/goodbye", axum::routing::get(goodbye)); + .route("/goodbye", axum::routing::get(goodbye)) + .route("/uppercase", axum::routing::post(uppercase)); let response = router.call(request).await.unwrap(); @@ -28,17 +30,29 @@ async fn goodbye() -> &'static str { "Goodbye, World!" } +// Map the bytes of the body stream to uppercase and return the stream directly. +async fn uppercase(body: BodyStream) -> impl IntoResponse { + let chunk_stream = body.map_ok(|chunk| { + chunk + .iter() + .map(|byte| byte.to_ascii_uppercase()) + .collect::>() + }); + Response::new(axum::body::StreamBody::new(chunk_stream)) +} + #[no_mangle] #[allow(non_snake_case)] pub extern "C" fn __SHUTTLE_Axum_call( fd_3: std::os::wasi::prelude::RawFd, fd_4: std::os::wasi::prelude::RawFd, + fd_5: std::os::wasi::prelude::RawFd, ) { use axum::body::HttpBody; use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; - println!("inner handler awoken; interacting with fd={fd_3},{fd_4}"); + println!("inner handler awoken; interacting with fd={fd_3},{fd_4},{fd_5}"); // file descriptor 3 for reading and writing http parts let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; @@ -48,24 +62,18 @@ pub extern "C" fn __SHUTTLE_Axum_call( // deserialize request parts from rust messagepack let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); - // file descriptor 4 for reading and writing http body - let mut body_fd = unsafe { std::fs::File::from_raw_fd(fd_4) }; + // file descriptor 4 for reading http body into wasm + let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(fd_4) }; - // read body from host + let mut reader = std::io::BufReader::new(&mut body_read_stream); let mut body_buf = Vec::new(); - let mut c_buf: [u8; 1] = [0; 1]; - loop { - body_fd.read(&mut c_buf).unwrap(); - if c_buf[0] == 0 { - break; - } else { - body_buf.push(c_buf[0]); - } - } + reader.read_to_end(&mut body_buf).unwrap(); - let request: http::Request = wrapper + let body = axum::body::Body::from(body_buf); + + let request = wrapper .into_request_builder() - .body(body_buf.into()) + .body(axum::body::boxed(body)) .unwrap(); println!("inner router received request: {:?}", &request); @@ -79,10 +87,11 @@ pub extern "C" fn __SHUTTLE_Axum_call( // write response parts parts_fd.write_all(&response_parts).unwrap(); + // file descriptor 5 for writing http body to host + let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(fd_5) }; + // write body if there is one if let Some(body) = futures_executor::block_on(body.data()) { - body_fd.write_all(body.unwrap().as_ref()).unwrap(); + body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); } - // signal to the reader that end of file has been reached - body_fd.write(&[0]).unwrap(); } From c34d5e493e6583e697ca0a9718102ee3e49d8690 Mon Sep 17 00:00:00 2001 From: Pieter Date: Fri, 6 Jan 2023 15:48:48 +0200 Subject: [PATCH 20/74] feat: embed runtime into client and deployer (#559) * refactor: runtime startup code * feat: hook cli to runtime * feat: hook up logs * feat: custom port * feat: start a next project with the local runner * feat: embed executable * refactor: axum update * refactor: tonic version from workspace * refactor: kill runtime correctly * feat: DB resources for local runs * feat: static folders for local runs * feat: secrets for local runner * refactor: cleanup logs and errors * refactor: rebuild runtime if it changed * refactor: more comments * feat: minimal axum logs * refactor: unneeded default features * refactor: fix rerun-if for runtime * bug: codegen handle_request * refactor: restore db error --- Cargo.lock | 8 + Cargo.toml | 1 + cargo-shuttle/Cargo.toml | 4 + cargo-shuttle/build.rs | 17 ++ cargo-shuttle/src/lib.rs | 143 +++++++++++----- .../src/{factory.rs => provisioner_server.rs} | 123 +++++++------- codegen/Cargo.toml | 4 + codegen/src/lib.rs | 12 +- codegen/src/next/mod.rs | 6 +- common/src/lib.rs | 1 - common/src/storage_manager.rs | 64 +++++-- deployer/Cargo.toml | 3 +- deployer/build.rs | 17 ++ deployer/src/args.rs | 11 +- deployer/src/deployment/deploy_layer.rs | 15 +- deployer/src/deployment/mod.rs | 28 ++- deployer/src/deployment/queue.rs | 17 +- deployer/src/deployment/run.rs | 137 ++++++++++----- deployer/src/error.rs | 2 + deployer/src/handlers/mod.rs | 1 + deployer/src/lib.rs | 1 + deployer/src/main.rs | 44 ++--- deployer/src/persistence/mod.rs | 3 +- proto/Cargo.toml | 7 +- proto/runtime.proto | 10 +- proto/src/lib.rs | 160 +++++++++++++++++- provisioner/Cargo.toml | 2 +- runtime/Cargo.toml | 2 +- runtime/Makefile | 4 +- runtime/README.md | 10 ++ runtime/src/args.rs | 27 ++- runtime/src/axum/mod.rs | 22 +-- runtime/src/legacy/mod.rs | 73 +++++--- runtime/src/lib.rs | 2 +- runtime/src/main.rs | 26 ++- runtime/src/provisioner_factory.rs | 49 +++--- service/Cargo.toml | 4 +- service/src/error.rs | 11 -- service/src/loader.rs | 27 ++- service/tests/integration/build_crate.rs | 54 ++---- tmp/axum-wasm-expanded/Cargo.toml | 21 +++ tmp/axum-wasm-expanded/src/lib.rs | 96 +++++++++++ tmp/axum-wasm/Cargo.toml | 5 + tmp/axum-wasm/src/lib.rs | 102 +---------- 44 files changed, 912 insertions(+), 464 deletions(-) create mode 100644 cargo-shuttle/build.rs rename cargo-shuttle/src/{factory.rs => provisioner_server.rs} (86%) create mode 100644 deployer/build.rs create mode 100644 tmp/axum-wasm-expanded/Cargo.toml create mode 100644 tmp/axum-wasm-expanded/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index bc7113212..bcafc3d30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1530,6 +1530,7 @@ dependencies = [ "serde", "serde_json", "shuttle-common", + "shuttle-proto", "shuttle-secrets", "shuttle-service", "sqlx", @@ -1542,6 +1543,7 @@ dependencies = [ "tokiotest-httpserver", "toml", "toml_edit 0.15.0", + "tonic", "tracing", "tracing-subscriber", "url", @@ -6232,6 +6234,7 @@ dependencies = [ "opentelemetry-datadog", "opentelemetry-http", "pipe", + "portpicker", "rand 0.8.5", "serde", "serde_json", @@ -6307,11 +6310,16 @@ dependencies = [ name = "shuttle-proto" version = "0.8.0" dependencies = [ + "anyhow", + "chrono", "prost", "prost-types", "shuttle-common", + "tokio", "tonic", "tonic-build", + "tracing", + "uuid 1.2.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 5b2ed622d..483679463 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,5 +44,6 @@ uuid = "1.2.2" thiserror = "1.0.37" serde = "1.0.148" serde_json = "1.0.89" +tonic = "0.8.3" tracing = "0.1.37" tracing-subscriber = "0.3.16" diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index 3b2a6916f..d2a37e792 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -43,6 +43,7 @@ tokio = { version = "1.22.0", features = ["macros"] } tokio-tungstenite = { version = "0.17.2", features = ["native-tls"] } toml = "0.5.9" toml_edit = "0.15.0" +tonic = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } url = "2.3.1" @@ -53,6 +54,9 @@ webbrowser = "0.8.2" workspace = true features= ["models"] +[dependencies.shuttle-proto] +workspace = true + [dependencies.shuttle-secrets] version = "0.8.0" path = "../resources/secrets" diff --git a/cargo-shuttle/build.rs b/cargo-shuttle/build.rs new file mode 100644 index 000000000..4503a843d --- /dev/null +++ b/cargo-shuttle/build.rs @@ -0,0 +1,17 @@ +use std::{env, process::Command}; + +fn main() { + println!("cargo:rerun-if-changed=../runtime"); + + // Build binary for runtime so that it can be embedded in the binary for the cli + let out_dir = env::var_os("OUT_DIR").unwrap(); + Command::new("cargo") + .arg("build") + .arg("--package") + .arg("shuttle-runtime") + .arg("--target-dir") + .arg(out_dir) + .arg("--release") + .output() + .expect("failed to build the shuttle runtime"); +} diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 13236628a..3709bffff 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -1,11 +1,12 @@ mod args; mod client; pub mod config; -mod factory; mod init; +mod provisioner_server; use shuttle_common::project::ProjectName; -use std::collections::BTreeMap; +use shuttle_proto::runtime::{self, LoadRequest, StartRequest, SubscribeLogsRequest}; +use std::collections::HashMap; use std::ffi::OsString; use std::fs::{read_to_string, File}; use std::io::stdout; @@ -21,26 +22,26 @@ use clap_complete::{generate, Shell}; use config::RequestContext; use crossterm::style::Stylize; use dialoguer::{theme::ColorfulTheme, Confirm, FuzzySelect, Input, Password}; -use factory::LocalFactory; use flate2::write::GzEncoder; use flate2::Compression; -use futures::StreamExt; +use futures::{StreamExt, TryFutureExt}; use git2::{Repository, StatusOptions}; use ignore::overrides::OverrideBuilder; use ignore::WalkBuilder; +use provisioner_server::LocalProvisioner; use shuttle_common::models::{project, secret}; -use shuttle_service::loader::{build_crate, Loader, Runtime}; -use shuttle_service::Logger; +use shuttle_service::loader::{build_crate, Runtime}; use std::fmt::Write; use strum::IntoEnumIterator; use tar::Builder; -use tokio::sync::mpsc; use tracing::trace; use uuid::Uuid; use crate::args::{DeploymentCommand, ProjectCommand}; use crate::client::Client; +const BINARY_BYTES: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/release/shuttle-runtime")); + pub struct Shuttle { ctx: RequestContext, } @@ -392,60 +393,116 @@ impl Shuttle { "Building".bold().green(), working_directory.display() ); - let so_path = match build_crate(id, working_directory, false, false, tx).await? { - Runtime::Legacy(path) => path, - Runtime::Next(_) => todo!(), - }; + let runtime = build_crate(id, working_directory, false, tx).await?; trace!("loading secrets"); let secrets_path = working_directory.join("Secrets.toml"); - let secrets: BTreeMap = - if let Ok(secrets_str) = read_to_string(secrets_path) { - let secrets: BTreeMap = - secrets_str.parse::()?.try_into()?; + let secrets: HashMap = if let Ok(secrets_str) = read_to_string(secrets_path) + { + let secrets: HashMap = + secrets_str.parse::()?.try_into()?; - trace!(keys = ?secrets.keys(), "available secrets"); + trace!(keys = ?secrets.keys(), "available secrets"); - secrets - } else { - trace!("no Secrets.toml was found"); - Default::default() - }; + secrets + } else { + trace!("no Secrets.toml was found"); + Default::default() + }; + + let service_name = self.ctx.project_name().to_string(); - let loader = Loader::from_so_file(so_path)?; + let (is_wasm, so_path) = match runtime { + Runtime::Next(path) => (true, path), + Runtime::Legacy(path) => (false, path), + }; - let mut factory = LocalFactory::new( - self.ctx.project_name().clone(), + let provisioner = LocalProvisioner::new()?; + let provisioner_server = provisioner.start(SocketAddr::new( + Ipv4Addr::LOCALHOST.into(), + run_args.port + 1, + )); + let (mut runtime, mut runtime_client) = runtime::start( + BINARY_BYTES, + is_wasm, + runtime::StorageManagerType::WorkingDir(working_directory.to_path_buf()), + &format!("http://localhost:{}", run_args.port + 1), + ) + .await + .map_err(|err| { + provisioner_server.abort(); + + err + })?; + + let load_request = tonic::Request::new(LoadRequest { + path: so_path + .into_os_string() + .into_string() + .expect("to convert path to string"), + service_name: service_name.clone(), secrets, - working_directory.to_path_buf(), - )?; - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), run_args.port); + }); + trace!("loading service"); + let _ = runtime_client + .load(load_request) + .or_else(|err| async { + provisioner_server.abort(); + runtime.kill().await?; + + Err(err) + }) + .await?; - trace!("loading project"); - println!( - "\n{:>12} {} on http://{}", - "Starting".bold().green(), - self.ctx.project_name(), - addr - ); - let (tx, mut rx) = mpsc::unbounded_channel(); + let mut stream = runtime_client + .subscribe_logs(tonic::Request::new(SubscribeLogsRequest {})) + .or_else(|err| async { + provisioner_server.abort(); + runtime.kill().await?; + + Err(err) + }) + .await? + .into_inner(); tokio::spawn(async move { - while let Some(log) = rx.recv().await { + while let Some(log) = stream.message().await.expect("to get log from stream") { + let log: shuttle_common::LogItem = log.into(); println!("{log}"); } }); - let logger = Logger::new(tx, id); - let (handle, so) = loader.load(&mut factory, addr, logger).await?; + let start_request = StartRequest { + deployment_id: id.as_bytes().to_vec(), + service_name, + port: run_args.port as u32, + }; - handle.await??; + trace!(?start_request, "starting service"); + let response = runtime_client + .start(tonic::Request::new(start_request)) + .or_else(|err| async { + provisioner_server.abort(); + runtime.kill().await?; - tokio::task::spawn_blocking(move || { - trace!("closing so file"); - so.close().unwrap(); - }); + Err(err) + }) + .await? + .into_inner(); + + trace!(response = ?response, "client response: "); + + let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), run_args.port); + + println!( + "\n{:>12} {} on http://{}", + "Starting".bold().green(), + self.ctx.project_name(), + addr + ); + + runtime.wait().await?; Ok(()) } diff --git a/cargo-shuttle/src/factory.rs b/cargo-shuttle/src/provisioner_server.rs similarity index 86% rename from cargo-shuttle/src/factory.rs rename to cargo-shuttle/src/provisioner_server.rs index fa9b5ff52..e3640255f 100644 --- a/cargo-shuttle/src/factory.rs +++ b/cargo-shuttle/src/provisioner_server.rs @@ -9,55 +9,53 @@ use bollard::{ }; use crossterm::{ cursor::{MoveDown, MoveUp}, - style::Stylize, terminal::{Clear, ClearType}, QueueableCommand, }; use futures::StreamExt; use portpicker::pick_unused_port; -use shuttle_common::{ - database::{AwsRdsEngine, SharedEngine}, - DatabaseReadyInfo, +use shuttle_common::database::{AwsRdsEngine, SharedEngine}; +use shuttle_proto::provisioner::{ + provisioner_server::{Provisioner, ProvisionerServer}, + DatabaseRequest, DatabaseResponse, }; -use shuttle_service::{database::Type, error::CustomError, Factory, ServiceName}; -use std::{ - collections::{BTreeMap, HashMap}, - io::stdout, - path::PathBuf, - time::Duration, +use shuttle_service::database::Type; +use std::{collections::HashMap, io::stdout, net::SocketAddr, time::Duration}; +use tokio::{task::JoinHandle, time::sleep}; +use tonic::{ + transport::{self, Server}, + Request, Response, Status, }; -use tokio::time::sleep; use tracing::{error, trace}; -pub struct LocalFactory { +/// A provisioner for local runs +/// It uses Docker to create Databases +pub struct LocalProvisioner { docker: Docker, - service_name: ServiceName, - secrets: BTreeMap, - working_directory: PathBuf, } -impl LocalFactory { - pub fn new( - service_name: ServiceName, - secrets: BTreeMap, - working_directory: PathBuf, - ) -> Result { +impl LocalProvisioner { + pub fn new() -> Result { Ok(Self { docker: Docker::connect_with_local_defaults()?, - service_name, - secrets, - working_directory, }) } -} -#[async_trait] -impl Factory for LocalFactory { + pub fn start(self, address: SocketAddr) -> JoinHandle> { + tokio::spawn(async move { + Server::builder() + .add_service(ProvisionerServer::new(self)) + .serve(address) + .await + }) + } + async fn get_db_connection_string( - &mut self, + &self, + service_name: &str, db_type: Type, - ) -> Result { - trace!("getting sql string for service '{}'", self.service_name); + ) -> Result { + trace!("getting sql string for service '{}'", service_name); let EngineConfig { r#type, @@ -70,7 +68,7 @@ impl Factory for LocalFactory { env, is_ready_cmd, } = db_type_to_config(db_type); - let container_name = format!("shuttle_{}_{}", self.service_name, r#type); + let container_name = format!("shuttle_{}_{}", service_name, r#type); let container = match self.docker.inspect_container(&container_name, None).await { Ok(container) => { @@ -118,7 +116,7 @@ impl Factory for LocalFactory { } Err(error) => { error!("got unexpected error while inspecting docker container: {error}"); - return Err(shuttle_service::Error::Custom(CustomError::new(error))); + return Err(Status::internal(error.to_string())); } }; @@ -153,52 +151,24 @@ impl Factory for LocalFactory { self.wait_for_ready(&container_name, is_ready_cmd).await?; - let db_info = DatabaseReadyInfo::new( + let res = DatabaseResponse { engine, username, password, database_name, port, - "localhost".to_string(), - "localhost".to_string(), - ); - - let conn_str = db_info.connection_string_private(); - - println!( - "{:>12} can be reached at {}\n", - "DB ready".bold().cyan(), - conn_str - ); - - Ok(conn_str) - } - - async fn get_secrets( - &mut self, - ) -> Result, shuttle_service::Error> { - Ok(self.secrets.clone()) - } - - fn get_service_name(&self) -> ServiceName { - self.service_name.clone() - } + address_private: "localhost".to_string(), + address_public: "localhost".to_string(), + }; - fn get_build_path(&self) -> Result { - Ok(self.working_directory.clone()) + Ok(res) } - fn get_storage_path(&self) -> Result { - Ok(self.working_directory.clone()) - } -} - -impl LocalFactory { async fn wait_for_ready( &self, container_name: &str, is_ready_cmd: Vec, - ) -> Result<(), shuttle_service::Error> { + ) -> Result<(), Status> { loop { trace!("waiting for '{container_name}' to be ready for connections"); @@ -276,6 +246,27 @@ impl LocalFactory { } } +#[async_trait] +impl Provisioner for LocalProvisioner { + async fn provision_database( + &self, + request: Request, + ) -> Result, Status> { + let DatabaseRequest { + project_name, + db_type, + } = request.into_inner(); + + let db_type: Option = db_type.unwrap().into(); + + let res = self + .get_db_connection_string(&project_name, db_type.unwrap()) + .await?; + + Ok(Response::new(res)) + } +} + fn print_layers(layers: &Vec) { for info in layers { stdout() diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index 00b26b436..407b53b5b 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -18,3 +18,7 @@ syn = { version = "1.0.104", features = ["full", "extra-traits"] } [dev-dependencies] pretty_assertions = "1.3.0" trybuild = "1.0.72" + +[features] +frameworks = [] +next = [] diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index 2adc85247..eddf72e07 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -1,27 +1,33 @@ +#[cfg(feature = "next")] mod next; +#[cfg(feature = "frameworks")] mod shuttle_main; -use next::App; use proc_macro::TokenStream; use proc_macro_error::proc_macro_error; -use syn::{parse_macro_input, File}; +#[cfg(feature = "frameworks")] #[proc_macro_error] #[proc_macro_attribute] pub fn main(attr: TokenStream, item: TokenStream) -> TokenStream { shuttle_main::r#impl(attr, item) } +#[cfg(feature = "next")] #[proc_macro_error] #[proc_macro] pub fn app(item: TokenStream) -> TokenStream { + use next::App; + use syn::{parse_macro_input, File}; + let mut file = parse_macro_input!(item as File); let app = App::from_file(&mut file); + let bindings = next::wasi_bindings(app); quote::quote!( #file - #app + #bindings ) .into() } diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index 520b9ee95..4de2e98ef 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -255,7 +255,6 @@ impl ToTokens for App { } } -#[allow(dead_code)] pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { quote!( #app @@ -270,7 +269,8 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { use axum::body::HttpBody; use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; - println!("inner handler awoken; interacting with fd={fd_3},{fd_4},{fd_5}"); + + println!("inner handler awoken; interacting with fd={},{},{}", fd_3, fd_4, fd_5); // file descriptor 3 for reading and writing http parts let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; @@ -295,7 +295,7 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { .unwrap(); println!("inner router received request: {:?}", &request); - let res = handle_request(request); + let res = futures_executor::block_on(__app(request)); let (parts, mut body) = res.into_parts(); diff --git a/common/src/lib.rs b/common/src/lib.rs index 6443b90a3..a7a3a66fc 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -26,7 +26,6 @@ pub type ApiKey = String; pub type ApiUrl = String; pub type Host = String; pub type DeploymentId = Uuid; -pub type Port = u16; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DatabaseReadyInfo { diff --git a/common/src/storage_manager.rs b/common/src/storage_manager.rs index 5a5fa1300..f2270243a 100644 --- a/common/src/storage_manager.rs +++ b/common/src/storage_manager.rs @@ -2,13 +2,25 @@ use std::{fs, io, path::PathBuf}; use uuid::Uuid; -/// Manager to take care of directories for storing project, services and deployment files +pub trait StorageManager: Clone + Sync + Send { + /// Path for a specific service build files + fn service_build_path>(&self, service_name: S) -> Result; + + /// Path to folder for storing deployment files + fn deployment_storage_path>( + &self, + service_name: S, + deployment_id: &Uuid, + ) -> Result; +} + +/// Manager to take care of directories for storing project, services and deployment files for deployer #[derive(Clone)] -pub struct StorageManager { +pub struct ArtifactsStorageManager { artifacts_path: PathBuf, } -impl StorageManager { +impl ArtifactsStorageManager { pub fn new(artifacts_path: PathBuf) -> Self { Self { artifacts_path } } @@ -21,14 +33,6 @@ impl StorageManager { Ok(builds_path) } - /// Path for a specific service - pub fn service_build_path>(&self, service_name: S) -> Result { - let builds_path = self.builds_path()?.join(service_name.as_ref()); - fs::create_dir_all(&builds_path)?; - - Ok(builds_path) - } - /// The directory in which compiled '.so' files are stored. pub fn libraries_path(&self) -> Result { let libs_path = self.artifacts_path.join("shuttle-libs"); @@ -51,9 +55,17 @@ impl StorageManager { Ok(storage_path) } +} - /// Path to folder for storing deployment files - pub fn deployment_storage_path>( +impl StorageManager for ArtifactsStorageManager { + fn service_build_path>(&self, service_name: S) -> Result { + let builds_path = self.builds_path()?.join(service_name.as_ref()); + fs::create_dir_all(&builds_path)?; + + Ok(builds_path) + } + + fn deployment_storage_path>( &self, service_name: S, deployment_id: &Uuid, @@ -67,3 +79,29 @@ impl StorageManager { Ok(storage_path) } } + +/// Manager to take care of directories for storing project, services and deployment files for the local runner +#[derive(Clone)] +pub struct WorkingDirStorageManager { + working_dir: PathBuf, +} + +impl WorkingDirStorageManager { + pub fn new(working_dir: PathBuf) -> Self { + Self { working_dir } + } +} + +impl StorageManager for WorkingDirStorageManager { + fn service_build_path>(&self, _service_name: S) -> Result { + Ok(self.working_dir.clone()) + } + + fn deployment_storage_path>( + &self, + _service_name: S, + _deployment_id: &Uuid, + ) -> Result { + Ok(self.working_dir.clone()) + } +} diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index db2804a32..fa10591f3 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -27,6 +27,7 @@ opentelemetry = { version = "0.18.0", features = ["rt-tokio"] } opentelemetry-datadog = { version = "0.6.0", features = ["reqwest-client"] } opentelemetry-http = "0.7.0" pipe = "0.4.0" +portpicker = "0.1.1" serde = { workspace = true } serde_json = { workspace = true } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "sqlite", "chrono", "json", "migrate", "uuid"] } @@ -35,7 +36,7 @@ tar = "0.4.38" thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["fs", "process"] } toml = "0.5.9" -tonic = "0.8.3" +tonic = { workspace = true } tower = { version = "0.4.13", features = ["make"] } tower-http = { version = "0.3.4", features = ["auth", "trace"] } tracing = { workspace = true } diff --git a/deployer/build.rs b/deployer/build.rs new file mode 100644 index 000000000..ad2a67032 --- /dev/null +++ b/deployer/build.rs @@ -0,0 +1,17 @@ +use std::{env, process::Command}; + +fn main() { + println!("cargo:rerun-if-changed=../runtime"); + + // Build binary for runtime so that it can be embedded in the binary for deployer + let out_dir = env::var_os("OUT_DIR").unwrap(); + Command::new("cargo") + .arg("build") + .arg("--package") + .arg("shuttle-runtime") + .arg("--target-dir") + .arg(out_dir) + .arg("--release") + .output() + .expect("failed to build the shuttle runtime"); +} diff --git a/deployer/src/args.rs b/deployer/src/args.rs index 87b467bbc..75b417384 100644 --- a/deployer/src/args.rs +++ b/deployer/src/args.rs @@ -3,7 +3,8 @@ use std::{net::SocketAddr, path::PathBuf}; use clap::Parser; use fqdn::FQDN; use hyper::Uri; -use shuttle_common::{project::ProjectName, Port}; +use shuttle_common::project::ProjectName; +use tonic::transport::Endpoint; /// Program to handle the deploys for a single project /// Handling includes, building, testing, and running each service @@ -15,12 +16,8 @@ pub struct Args { pub state: String, /// Address to connect to the provisioning service - #[clap(long)] - pub provisioner_address: String, - - /// Port provisioner is running on - #[clap(long, default_value = "5000")] - pub provisioner_port: Port, + #[clap(long, default_value = "http://provisioner:5000")] + pub provisioner_address: Endpoint, /// FQDN where the proxy can be reached at #[clap(long)] diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index 6cbf3edbb..ca7df03e7 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -411,7 +411,7 @@ mod tests { deploy_layer::LogType, gateway_client::BuildQueueClient, ActiveDeploymentsGetter, Built, DeploymentManager, Queued, }, - persistence::{SecretRecorder, State}, + persistence::{Secret, SecretGetter, SecretRecorder, State}, }; use super::{DeployLayer, Log, LogRecorder}; @@ -536,6 +536,18 @@ mod tests { } } + #[derive(Clone)] + struct StubSecretGetter; + + #[async_trait::async_trait] + impl SecretGetter for StubSecretGetter { + type Err = std::io::Error; + + async fn get_secrets(&self, _service_id: &Uuid) -> Result, Self::Err> { + Ok(Default::default()) + } + } + #[tokio::test(flavor = "multi_thread")] async fn deployment_to_be_queued() { let deployment_manager = get_deployment_manager().await; @@ -944,6 +956,7 @@ mod tests { .secret_recorder(RECORDER.clone()) .active_deployment_getter(StubActiveDeploymentGetter) .artifacts_path(PathBuf::from("/tmp")) + .secret_getter(StubSecretGetter) .runtime(get_runtime_client().await) .queue_client(StubBuildQueueClient) .build() diff --git a/deployer/src/deployment/mod.rs b/deployer/src/deployment/mod.rs index c069e1e7f..0048573ae 100644 --- a/deployer/src/deployment/mod.rs +++ b/deployer/src/deployment/mod.rs @@ -7,13 +7,13 @@ use std::path::PathBuf; pub use queue::Queued; pub use run::{ActiveDeploymentsGetter, Built}; -use shuttle_common::storage_manager::StorageManager; +use shuttle_common::storage_manager::ArtifactsStorageManager; use shuttle_proto::runtime::runtime_client::RuntimeClient; use tonic::transport::Channel; use tracing::{instrument, Span}; use tracing_opentelemetry::OpenTelemetrySpanExt; -use crate::persistence::{SecretRecorder, State}; +use crate::persistence::{SecretGetter, SecretRecorder, State}; use tokio::sync::{broadcast, mpsc}; use uuid::Uuid; @@ -23,20 +23,22 @@ const QUEUE_BUFFER_SIZE: usize = 100; const RUN_BUFFER_SIZE: usize = 100; const KILL_BUFFER_SIZE: usize = 10; -pub struct DeploymentManagerBuilder { +pub struct DeploymentManagerBuilder { build_log_recorder: Option, secret_recorder: Option, active_deployment_getter: Option, artifacts_path: Option, runtime_client: Option>, + secret_getter: Option, queue_client: Option, } -impl DeploymentManagerBuilder +impl DeploymentManagerBuilder where LR: LogRecorder, SR: SecretRecorder, ADG: ActiveDeploymentsGetter, + SG: SecretGetter, QC: BuildQueueClient, { pub fn build_log_recorder(mut self, build_log_recorder: LR) -> Self { @@ -69,11 +71,18 @@ where self } + pub fn secret_getter(mut self, secret_getter: SG) -> Self { + self.secret_getter = Some(secret_getter); + + self + } + pub fn runtime(mut self, runtime_client: RuntimeClient) -> Self { self.runtime_client = Some(runtime_client); self } + /// Creates two Tokio tasks, one for building queued services, the other for /// executing/deploying built services. Two multi-producer, single consumer /// channels are also created which are for moving on-going service @@ -89,11 +98,12 @@ where let artifacts_path = self.artifacts_path.expect("artifacts path to be set"); let queue_client = self.queue_client.expect("a queue client to be set"); let runtime_client = self.runtime_client.expect("a runtime client to be set"); + let secret_getter = self.secret_getter.expect("a secret getter to be set"); let (queue_send, queue_recv) = mpsc::channel(QUEUE_BUFFER_SIZE); let (run_send, run_recv) = mpsc::channel(RUN_BUFFER_SIZE); let (kill_send, _) = broadcast::channel(KILL_BUFFER_SIZE); - let storage_manager = StorageManager::new(artifacts_path); + let storage_manager = ArtifactsStorageManager::new(artifacts_path); let run_send_clone = run_send.clone(); @@ -110,6 +120,7 @@ where runtime_client, kill_send.clone(), active_deployment_getter, + secret_getter, storage_manager.clone(), )); @@ -127,7 +138,7 @@ pub struct DeploymentManager { queue_send: QueueSender, run_send: RunSender, kill_send: KillSender, - storage_manager: StorageManager, + storage_manager: ArtifactsStorageManager, } /// ```no-test @@ -147,13 +158,14 @@ pub struct DeploymentManager { impl DeploymentManager { /// Create a new deployment manager. Manages one or more 'pipelines' for /// processing service building, loading, and deployment. - pub fn builder() -> DeploymentManagerBuilder { + pub fn builder() -> DeploymentManagerBuilder { DeploymentManagerBuilder { build_log_recorder: None, secret_recorder: None, active_deployment_getter: None, artifacts_path: None, runtime_client: None, + secret_getter: None, queue_client: None, } } @@ -179,7 +191,7 @@ impl DeploymentManager { } } - pub fn storage_manager(&self) -> StorageManager { + pub fn storage_manager(&self) -> ArtifactsStorageManager { self.storage_manager.clone() } } diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index c5ae79822..c3bcd1e52 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -3,7 +3,7 @@ use super::gateway_client::BuildQueueClient; use super::{Built, QueueReceiver, RunSender, State}; use crate::error::{Error, Result, TestError}; use crate::persistence::{LogLevel, SecretRecorder}; -use shuttle_common::storage_manager::StorageManager; +use shuttle_common::storage_manager::{ArtifactsStorageManager, StorageManager}; use cargo::util::interning::InternedString; use cargo_metadata::Message; @@ -36,7 +36,7 @@ pub async fn task( run_send: RunSender, log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, - storage_manager: StorageManager, + storage_manager: ArtifactsStorageManager, queue_client: impl BuildQueueClient, ) { info!("Queue task started"); @@ -147,7 +147,7 @@ impl Queued { #[instrument(skip(self, storage_manager, log_recorder, secret_recorder), fields(id = %self.id, state = %State::Building))] async fn handle( self, - storage_manager: StorageManager, + storage_manager: ArtifactsStorageManager, log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, ) -> Result { @@ -200,7 +200,7 @@ impl Queued { }); let project_path = project_path.canonicalize()?; - let so_path = build_deployment(self.id, &project_path, false, tx.clone()).await?; + let so_path = build_deployment(self.id, &project_path, tx.clone()).await?; if self.will_run_tests { info!( @@ -309,10 +309,9 @@ async fn extract_tar_gz_data(data: impl Read, dest: impl AsRef) -> Result< async fn build_deployment( deployment_id: Uuid, project_path: &Path, - wasm: bool, tx: crossbeam_channel::Sender, ) -> Result { - let runtime_path = build_crate(deployment_id, project_path, true, wasm, tx) + let runtime_path = build_crate(deployment_id, project_path, true, tx) .await .map_err(|e| Error::Build(e.into()))?; @@ -384,7 +383,7 @@ async fn run_pre_deploy_tests( /// Store 'so' file in the libs folder #[instrument(skip(storage_manager, so_path, id))] async fn store_lib( - storage_manager: &StorageManager, + storage_manager: &ArtifactsStorageManager, so_path: impl AsRef, id: &Uuid, ) -> Result<()> { @@ -399,7 +398,7 @@ async fn store_lib( mod tests { use std::{collections::BTreeMap, fs::File, io::Write, path::Path}; - use shuttle_common::storage_manager::StorageManager; + use shuttle_common::storage_manager::ArtifactsStorageManager; use tempdir::TempDir; use tokio::fs; use uuid::Uuid; @@ -529,7 +528,7 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", async fn store_lib() { let libs_dir = TempDir::new("lib-store").unwrap(); let libs_p = libs_dir.path(); - let storage_manager = StorageManager::new(libs_p.to_path_buf()); + let storage_manager = ArtifactsStorageManager::new(libs_p.to_path_buf()); let build_p = storage_manager.builds_path().unwrap(); diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index 4837e882f..7b14a4e7b 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -7,8 +7,9 @@ use std::{ use async_trait::async_trait; use opentelemetry::global; +use portpicker::pick_unused_port; use shuttle_common::project::ProjectName as ServiceName; -use shuttle_common::storage_manager::StorageManager; +use shuttle_common::storage_manager::ArtifactsStorageManager; use shuttle_proto::runtime::{runtime_client::RuntimeClient, LoadRequest, StartRequest}; use tokio::task::JoinError; @@ -18,17 +19,20 @@ use tracing_opentelemetry::OpenTelemetrySpanExt; use uuid::Uuid; use super::{KillReceiver, KillSender, RunReceiver, State}; -use crate::error::{Error, Result}; +use crate::{ + error::{Error, Result}, + persistence::SecretGetter, +}; -/// Run a task which takes runnable deploys from a channel and starts them up with a factory provided by the -/// abstract factory and a runtime logger provided by the logger factory +/// Run a task which takes runnable deploys from a channel and starts them up on our runtime /// A deploy is killed when it receives a signal from the kill channel pub async fn task( mut recv: RunReceiver, runtime_client: RuntimeClient, kill_send: KillSender, active_deployment_getter: impl ActiveDeploymentsGetter, - storage_manager: StorageManager, + secret_getter: impl SecretGetter, + storage_manager: ArtifactsStorageManager, ) { info!("Run task started"); @@ -39,12 +43,9 @@ pub async fn task( let kill_send = kill_send.clone(); let kill_recv = kill_send.subscribe(); + let secret_getter = secret_getter.clone(); let storage_manager = storage_manager.clone(); - // todo: this is the port the legacy runtime is hardcoded to start services on - let port = 7001; - - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); let _service_name = match ServiceName::from_str(&built.service_name) { Ok(name) => name, Err(err) => { @@ -82,8 +83,8 @@ pub async fn task( async move { if let Err(err) = built .handle( - addr, storage_manager, + secret_getter, runtime_client, kill_recv, old_deployments_killer, @@ -171,12 +172,12 @@ pub struct Built { } impl Built { - #[instrument(skip(self, storage_manager, runtime_client, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] + #[instrument(skip(self, storage_manager, secret_getter, runtime_client, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] #[allow(clippy::too_many_arguments)] async fn handle( self, - address: SocketAddr, - storage_manager: StorageManager, + storage_manager: ArtifactsStorageManager, + secret_getter: impl SecretGetter, runtime_client: RuntimeClient, kill_recv: KillReceiver, kill_old_deployments: impl futures::Future>, @@ -186,14 +187,32 @@ impl Built { ) -> Result<()> { let so_path = storage_manager.deployment_library_path(&self.id)?; + let port = match pick_unused_port() { + Some(port) => port, + None => { + return Err(Error::PrepareRun( + "could not find a free port to deploy service on".to_string(), + )) + } + }; + + let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); + kill_old_deployments.await?; info!("got handle for deployment"); // Execute loaded service + load( + self.service_name.clone(), + self.service_id, + so_path, + secret_getter, + runtime_client.clone(), + ) + .await; tokio::spawn(run( self.id, self.service_name, - so_path, runtime_client, address, kill_recv, @@ -204,26 +223,30 @@ impl Built { } } -#[instrument(skip(runtime_client, _kill_recv, _cleanup), fields(address = %_address, state = %State::Running))] -async fn run( - id: Uuid, +async fn load( service_name: String, + service_id: Uuid, so_path: PathBuf, + secret_getter: impl SecretGetter, mut runtime_client: RuntimeClient, - _address: SocketAddr, - _kill_recv: KillReceiver, - _cleanup: impl FnOnce(std::result::Result, JoinError>) - + Send - + 'static, ) { info!( "loading project from: {}", so_path.clone().into_os_string().into_string().unwrap() ); + let secrets = secret_getter + .get_secrets(&service_id) + .await + .unwrap() + .into_iter() + .map(|secret| (secret.key, secret.value)); + let secrets = HashMap::from_iter(secrets); + let load_request = tonic::Request::new(LoadRequest { path: so_path.into_os_string().into_string().unwrap(), service_name: service_name.clone(), + secrets, }); info!("loading service"); let response = runtime_client.load(load_request).await; @@ -231,10 +254,23 @@ async fn run( if let Err(e) = response { info!("failed to load service: {}", e); } +} +#[instrument(skip(runtime_client, _kill_recv, _cleanup), fields(state = %State::Running))] +async fn run( + id: Uuid, + service_name: String, + mut runtime_client: RuntimeClient, + address: SocketAddr, + _kill_recv: KillReceiver, + _cleanup: impl FnOnce(std::result::Result, JoinError>) + + Send + + 'static, +) { let start_request = tonic::Request::new(StartRequest { deployment_id: id.as_bytes().to_vec(), service_name, + port: address.port() as u32, }); info!("starting service"); @@ -245,14 +281,10 @@ async fn run( #[cfg(test)] mod tests { - use std::{ - net::{Ipv4Addr, SocketAddr}, - path::PathBuf, - process::Command, - time::Duration, - }; + use std::{path::PathBuf, process::Command, time::Duration}; - use shuttle_common::storage_manager::StorageManager; + use async_trait::async_trait; + use shuttle_common::storage_manager::ArtifactsStorageManager; use shuttle_proto::runtime::runtime_client::RuntimeClient; use tempdir::TempDir; use tokio::{ @@ -263,17 +295,20 @@ mod tests { use tonic::transport::Channel; use uuid::Uuid; - use crate::error::Error; + use crate::{ + error::Error, + persistence::{Secret, SecretGetter}, + }; use super::Built; const RESOURCES_PATH: &str = "tests/resources"; - fn get_storage_manager() -> StorageManager { + fn get_storage_manager() -> ArtifactsStorageManager { let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); let path = tmp_dir.into_path(); - StorageManager::new(path) + ArtifactsStorageManager::new(path) } async fn kill_old_deployments() -> crate::error::Result<()> { @@ -286,6 +321,22 @@ mod tests { .unwrap() } + #[derive(Clone)] + struct StubSecretGetter; + + #[async_trait] + impl SecretGetter for StubSecretGetter { + type Err = std::io::Error; + + async fn get_secrets(&self, _service_id: &Uuid) -> Result, Self::Err> { + Ok(Default::default()) + } + } + + fn get_secret_getter() -> StubSecretGetter { + StubSecretGetter + } + // This test uses the kill signal to make sure a service does stop when asked to #[tokio::test] async fn can_be_killed() { @@ -305,12 +356,12 @@ mod tests { ); cleanup_send.send(()).unwrap(); }; - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); + let secret_getter = get_secret_getter(); built .handle( - addr, storage_manager, + secret_getter, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -350,12 +401,12 @@ mod tests { ); cleanup_send.send(()).unwrap(); }; - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); + let secret_getter = get_secret_getter(); built .handle( - addr, storage_manager, + secret_getter, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -389,12 +440,12 @@ mod tests { ); cleanup_send.send(()).unwrap(); }; - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); + let secret_getter = get_secret_getter(); built .handle( - addr, storage_manager, + secret_getter, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -416,12 +467,12 @@ mod tests { let (_kill_send, kill_recv) = broadcast::channel(1); let handle_cleanup = |_result| panic!("the service shouldn't even start"); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); + let secret_getter = get_secret_getter(); let result = built .handle( - addr, storage_manager, + secret_getter, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -447,13 +498,13 @@ mod tests { let (_kill_send, kill_recv) = broadcast::channel(1); let handle_cleanup = |_result| panic!("no service means no cleanup"); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); + let secret_getter = get_secret_getter(); let storage_manager = get_storage_manager(); let result = built .handle( - addr, storage_manager, + secret_getter, get_runtime_client().await, kill_recv, kill_old_deployments(), @@ -471,7 +522,7 @@ mod tests { ); } - fn make_so_and_built(crate_name: &str) -> (Built, StorageManager) { + fn make_so_and_built(crate_name: &str) -> (Built, ArtifactsStorageManager) { let crate_dir: PathBuf = [RESOURCES_PATH, crate_name].iter().collect(); Command::new("cargo") diff --git a/deployer/src/error.rs b/deployer/src/error.rs index e01766f1f..1adba5ae2 100644 --- a/deployer/src/error.rs +++ b/deployer/src/error.rs @@ -16,6 +16,8 @@ pub enum Error { Build(#[source] Box), #[error("Load error: {0}")] Load(#[from] LoaderError), + #[error("Prepare to run error: {0}")] + PrepareRun(String), #[error("Run error: {0}")] Run(#[from] shuttle_service::Error), #[error("Pre-deployment test failure: {0}")] diff --git a/deployer/src/handlers/mod.rs b/deployer/src/handlers/mod.rs index 3f2a83298..848dbff7f 100644 --- a/deployer/src/handlers/mod.rs +++ b/deployer/src/handlers/mod.rs @@ -16,6 +16,7 @@ use opentelemetry_http::HeaderExtractor; use shuttle_common::backends::metrics::Metrics; use shuttle_common::models::secret; use shuttle_common::project::ProjectName; +use shuttle_common::storage_manager::StorageManager; use shuttle_common::LogItem; use shuttle_service::loader::clean_crate; use tower_http::auth::RequireAuthorizationLayer; diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index 7ba32683d..901b818e2 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -30,6 +30,7 @@ pub async fn start(persistence: Persistence, runtime_client: RuntimeClient secrets = 10; } message LoadResponse { @@ -34,16 +37,13 @@ message StartRequest { bytes deployment_id = 1; // Name of service to start string service_name = 2; + // Port to start the service on + uint32 port = 3; } message StartResponse { // Was the start successful bool success = 1; - - // todo: find a way to add optional flag here - // Optional port the service was started on - // This is likely to be None for bots - uint32 port = 2; } message StopRequest { diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 6d820a561..73726c2e8 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -53,6 +53,36 @@ pub mod provisioner { } } + impl From for Option { + fn from(db_type: database_request::DbType) -> Self { + match db_type { + database_request::DbType::Shared(Shared { + engine: Some(engine), + }) => match engine { + shared::Engine::Postgres(_) => { + Some(database::Type::Shared(SharedEngine::Postgres)) + } + shared::Engine::Mongodb(_) => { + Some(database::Type::Shared(SharedEngine::MongoDb)) + } + }, + database_request::DbType::AwsRds(AwsRds { + engine: Some(engine), + }) => match engine { + aws_rds::Engine::Postgres(_) => { + Some(database::Type::AwsRds(AwsRdsEngine::Postgres)) + } + aws_rds::Engine::Mysql(_) => Some(database::Type::AwsRds(AwsRdsEngine::MySql)), + aws_rds::Engine::Mariadb(_) => { + Some(database::Type::AwsRds(AwsRdsEngine::MariaDB)) + } + }, + database_request::DbType::Shared(Shared { engine: None }) + | database_request::DbType::AwsRds(AwsRds { engine: None }) => None, + } + } + } + impl Display for aws_rds::Engine { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { @@ -65,9 +95,26 @@ pub mod provisioner { } pub mod runtime { - use std::time::SystemTime; + use std::{ + env::temp_dir, + fs::OpenOptions, + io::Write, + path::PathBuf, + time::{Duration, SystemTime}, + }; + use anyhow::Context; + use chrono::DateTime; use prost_types::Timestamp; + use tokio::process; + use tonic::transport::{Channel, Endpoint}; + use tracing::info; + use uuid::Uuid; + + pub enum StorageManagerType { + Artifacts(PathBuf), + WorkingDir(PathBuf), + } tonic::include_proto!("runtime"); @@ -113,4 +160,115 @@ pub mod runtime { } } } + + impl From for shuttle_common::LogItem { + fn from(log: LogItem) -> Self { + Self { + id: Uuid::from_slice(&log.id).unwrap(), + timestamp: DateTime::from(SystemTime::try_from(log.timestamp.unwrap()).unwrap()), + state: LogState::from_i32(log.state).unwrap().into(), + level: LogLevel::from_i32(log.level).unwrap().into(), + file: log.file, + line: log.line, + target: log.target, + fields: log.fields, + } + } + } + + impl From for shuttle_common::deployment::State { + fn from(state: LogState) -> Self { + match state { + LogState::Queued => Self::Queued, + LogState::Building => Self::Building, + LogState::Built => Self::Built, + LogState::Loading => Self::Loading, + LogState::Running => Self::Running, + LogState::Completed => Self::Completed, + LogState::Stopped => Self::Stopped, + LogState::Crashed => Self::Crashed, + LogState::Unknown => Self::Unknown, + } + } + } + + impl From for shuttle_common::log::Level { + fn from(level: LogLevel) -> Self { + match level { + LogLevel::Trace => Self::Trace, + LogLevel::Debug => Self::Debug, + LogLevel::Info => Self::Info, + LogLevel::Warn => Self::Warn, + LogLevel::Error => Self::Error, + } + } + } + + pub async fn start( + binary_bytes: &[u8], + wasm: bool, + storage_manager_type: StorageManagerType, + provisioner_address: &str, + ) -> anyhow::Result<(process::Child, runtime_client::RuntimeClient)> { + let runtime_flag = if wasm { "--axum" } else { "--legacy" }; + + let (storage_manager_type, storage_manager_path) = match storage_manager_type { + StorageManagerType::Artifacts(path) => ("artifacts", path), + StorageManagerType::WorkingDir(path) => ("working-dir", path), + }; + + let runtime_executable = get_runtime_executable(binary_bytes); + + let runtime = process::Command::new(runtime_executable) + .args([ + runtime_flag, + "--provisioner-address", + provisioner_address, + "--storage-manager-type", + storage_manager_type, + "--storage-manager-path", + &storage_manager_path.display().to_string(), + ]) + .spawn() + .context("spawning runtime process")?; + + // Sleep because the timeout below does not seem to work + // TODO: investigate why + tokio::time::sleep(Duration::from_secs(2)).await; + + info!("connecting runtime client"); + let conn = Endpoint::new("http://127.0.0.1:6001") + .context("creating runtime client endpoint")? + .connect_timeout(Duration::from_secs(5)); + + let runtime_client = runtime_client::RuntimeClient::connect(conn) + .await + .context("connecting runtime client")?; + + Ok((runtime, runtime_client)) + } + + fn get_runtime_executable(binary_bytes: &[u8]) -> PathBuf { + let tmp_dir = temp_dir(); + + let path = tmp_dir.join("shuttle-runtime"); + let mut open_options = OpenOptions::new(); + open_options.write(true).create(true).truncate(true); + + #[cfg(target_family = "unix")] + { + use std::os::unix::prelude::OpenOptionsExt; + + open_options.mode(0o755); + } + + let mut file = open_options + .open(&path) + .expect("to create runtime executable file"); + + file.write_all(binary_bytes) + .expect("to write out binary file"); + + path + } } diff --git a/provisioner/Cargo.toml b/provisioner/Cargo.toml index 91b1bff91..1ce62ca7b 100644 --- a/provisioner/Cargo.toml +++ b/provisioner/Cargo.toml @@ -18,7 +18,7 @@ rand = "0.8.5" sqlx = { version = "0.6.2", features = ["postgres", "runtime-tokio-native-tls"] } thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } -tonic = "0.8.3" +tonic = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 89fbf12b4..efc9f2713 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -16,7 +16,7 @@ rmp-serde = { version = "1.1.1" } thiserror = { workspace = true } tokio = { version = "=1.22.0", features = ["full"] } tokio-stream = "0.1.11" -tonic = "0.8.2" +tonic = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } uuid = { workspace = true, features = ["v4"] } diff --git a/runtime/Makefile b/runtime/Makefile index a706e8146..6472a425e 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -3,8 +3,8 @@ all: axum axum: - cd ../tmp/axum-wasm; cargo build --target wasm32-wasi - cp ../tmp/axum-wasm/target/wasm32-wasi/debug/shuttle_axum.wasm axum.wasm + cd ../tmp/axum-wasm-expanded; cargo build --target wasm32-wasi + cp ../tmp/axum-wasm-expanded/target/wasm32-wasi/debug/shuttle_axum_expanded.wasm axum.wasm test: axum cargo test --all-features -- --nocapture diff --git a/runtime/README.md b/runtime/README.md index e0ea4da9f..13205bc4a 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -1,5 +1,15 @@ # How to run +## The easy way +Both the legacy and next examples can be run using the local client: + +``` bash +cd path/to/example +cargo run --manifest ../../../Cargo.toml --bin cargo-shuttle -- run +``` + +When a more fine controlled testing is needed, use the instructions below. + ## axum-wasm Compile the wasm axum router: diff --git a/runtime/src/args.rs b/runtime/src/args.rs index 2e123f4e8..016121d4b 100644 --- a/runtime/src/args.rs +++ b/runtime/src/args.rs @@ -1,17 +1,36 @@ -use clap::Parser; +use std::path::PathBuf; + +use clap::{Parser, ValueEnum}; use tonic::transport::Endpoint; #[derive(Parser, Debug)] pub struct Args { /// Address to reach provisioner at - #[clap(long, default_value = "localhost:5000")] + #[arg(long, default_value = "http://localhost:5000")] pub provisioner_address: Endpoint, /// Is this runtime for a legacy service - #[clap(long, conflicts_with("axum"))] + #[arg(long, conflicts_with("axum"))] pub legacy: bool, /// Is this runtime for an axum-wasm service - #[clap(long, conflicts_with("legacy"))] + #[arg(long, conflicts_with("legacy"))] pub axum: bool, + + /// Type of storage manager to start + #[arg(long, value_enum)] + pub storage_manager_type: StorageManagerType, + + /// Path to use for storage manager + #[arg(long)] + pub storage_manager_path: PathBuf, +} + +#[derive(Clone, Debug, ValueEnum)] +pub enum StorageManagerType { + /// Use a deloyer artifacts directory + Artifacts, + + /// Use a local working directory + WorkingDir, } diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index e3dada547..68fbc07d7 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -5,7 +5,6 @@ use std::ops::DerefMut; use std::os::unix::prelude::RawFd; use std::path::{Path, PathBuf}; use std::str::FromStr; -use std::sync::Mutex; use async_trait::async_trait; use cap_std::os::unix::net::UnixStream; @@ -20,7 +19,7 @@ use shuttle_proto::runtime::{ SubscribeLogsRequest, }; use shuttle_service::ServiceName; -use tokio::sync::oneshot; +use tokio::sync::{mpsc, oneshot}; use tokio_stream::wrappers::ReceiverStream; use tonic::Status; use tracing::{error, trace}; @@ -33,7 +32,6 @@ extern crate rmp_serde as rmps; pub struct AxumWasm { router: std::sync::Mutex>, - port: Mutex>, kill_tx: std::sync::Mutex>>, } @@ -41,7 +39,6 @@ impl AxumWasm { pub fn new() -> Self { Self { router: std::sync::Mutex::new(None), - port: std::sync::Mutex::new(None), kill_tx: std::sync::Mutex::new(None), } } @@ -73,10 +70,10 @@ impl Runtime for AxumWasm { async fn start( &self, - _request: tonic::Request, + request: tonic::Request, ) -> Result, Status> { - let port = 7002; - let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); + let StartRequest { port, .. } = request.into_inner(); + let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port as u16); let router = self.router.lock().unwrap().take().unwrap(); @@ -87,12 +84,7 @@ impl Runtime for AxumWasm { // TODO: split `into_server` up into build and run functions tokio::spawn(router.into_server(address, kill_rx)); - *self.port.lock().unwrap() = Some(port); - - let message = StartResponse { - success: true, - port: port as u32, - }; + let message = StartResponse { success: true }; Ok(tonic::Response::new(message)) } @@ -103,7 +95,9 @@ impl Runtime for AxumWasm { &self, _request: tonic::Request, ) -> Result, Status> { - todo!() + let (_tx, rx) = mpsc::channel(1); + + Ok(tonic::Response::new(ReceiverStream::new(rx))) } async fn stop( diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 18e0f8147..c3d98c44f 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -1,4 +1,6 @@ use std::{ + collections::BTreeMap, + iter::FromIterator, net::{Ipv4Addr, SocketAddr}, ops::DerefMut, path::PathBuf, @@ -31,40 +33,53 @@ use crate::provisioner_factory::{AbstractFactory, AbstractProvisionerFactory}; mod error; -pub struct Legacy { +pub struct Legacy +where + S: StorageManager, +{ // Mutexes are for interior mutability so_path: Mutex>, - port: Mutex>, logs_rx: Mutex>>, logs_tx: Mutex>, provisioner_address: Endpoint, kill_tx: Mutex>>, + secrets: Mutex>>, + storage_manager: S, } -impl Legacy { - pub fn new(provisioner_address: Endpoint) -> Self { +impl Legacy +where + S: StorageManager, +{ + pub fn new(provisioner_address: Endpoint, storage_manager: S) -> Self { let (tx, rx) = mpsc::unbounded_channel(); Self { so_path: Mutex::new(None), - port: Mutex::new(None), logs_rx: Mutex::new(Some(rx)), logs_tx: Mutex::new(tx), kill_tx: Mutex::new(None), provisioner_address, + secrets: Mutex::new(None), + storage_manager, } } } #[async_trait] -impl Runtime for Legacy { +impl Runtime for Legacy +where + S: StorageManager + 'static, +{ async fn load(&self, request: Request) -> Result, Status> { - let so_path = request.into_inner().path; - trace!(so_path, "loading"); + let LoadRequest { path, secrets, .. } = request.into_inner(); + trace!(path, "loading"); - let so_path = PathBuf::from(so_path); + let so_path = PathBuf::from(path); *self.so_path.lock().unwrap() = Some(so_path); + *self.secrets.lock().unwrap() = Some(BTreeMap::from_iter(secrets.into_iter())); + let message = LoadResponse { success: true }; Ok(Response::new(message)) } @@ -73,9 +88,6 @@ impl Runtime for Legacy { &self, request: Request, ) -> Result, Status> { - let service_port = 7001; - let service_address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), service_port); - let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) .await .expect("failed to connect to provisioner"); @@ -91,21 +103,37 @@ impl Runtime for Legacy { }) .map_err(|err| Status::from_error(Box::new(err)))? .clone(); - - let storage_manager = StorageManager::new(so_path.clone()); + let secrets = self + .secrets + .lock() + .unwrap() + .as_ref() + .ok_or_else(|| -> error::Error { + error::Error::Start(anyhow!( + "trying to get secrets from a service that was not loaded" + )) + }) + .map_err(|err| Status::from_error(Box::new(err)))? + .clone(); let StartRequest { deployment_id, service_name, + port, } = request.into_inner(); + let service_address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port as u16); let service_name = ServiceName::from_str(service_name.as_str()) .map_err(|err| Status::from_error(Box::new(err)))?; - let deployment_id = Uuid::from_str(std::str::from_utf8(&deployment_id).unwrap()).unwrap(); + let deployment_id = Uuid::from_slice(&deployment_id).unwrap(); - let mut factory = - abstract_factory.get_factory(service_name, deployment_id, storage_manager); + let mut factory = abstract_factory.get_factory( + service_name, + deployment_id, + secrets, + self.storage_manager.clone(), + ); let logs_tx = self.logs_tx.lock().unwrap().clone(); @@ -114,7 +142,7 @@ impl Runtime for Legacy { trace!(%service_address, "starting"); let service = load_service(service_address, so_path, &mut factory, logger) .await - .unwrap(); + .map_err(|error| Status::internal(error.to_string()))?; let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); @@ -123,12 +151,7 @@ impl Runtime for Legacy { // start service as a background task with a kill receiver tokio::spawn(run_until_stopped(service, service_address, kill_rx)); - *self.port.lock().unwrap() = Some(service_port); - - let message = StartResponse { - success: true, - port: service_port as u32, - }; + let message = StartResponse { success: true }; Ok(Response::new(message)) } @@ -184,7 +207,7 @@ impl Runtime for Legacy { } /// Run the service until a stop signal is received -#[instrument(skip(service))] +#[instrument(skip(service, kill_rx))] async fn run_until_stopped( service: LoadedService, addr: SocketAddr, diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 81d7acaef..fc17f47c4 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -3,6 +3,6 @@ mod axum; mod legacy; pub mod provisioner_factory; -pub use args::Args; +pub use args::{Args, StorageManagerType}; pub use axum::AxumWasm; pub use legacy::Legacy; diff --git a/runtime/src/main.rs b/runtime/src/main.rs index 3c4f64cb5..b7d9f3c3e 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -4,8 +4,9 @@ use std::{ }; use clap::Parser; +use shuttle_common::storage_manager::{ArtifactsStorageManager, WorkingDirStorageManager}; use shuttle_proto::runtime::runtime_server::RuntimeServer; -use shuttle_runtime::{Args, AxumWasm, Legacy}; +use shuttle_runtime::{Args, AxumWasm, Legacy, StorageManagerType}; use tonic::transport::Server; use tracing::trace; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; @@ -33,9 +34,26 @@ async fn main() { Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); let router = if args.legacy { - let legacy = Legacy::new(provisioner_address); - let svc = RuntimeServer::new(legacy); - server_builder.add_service(svc) + match args.storage_manager_type { + StorageManagerType::Artifacts => { + let legacy = Legacy::new( + provisioner_address, + ArtifactsStorageManager::new(args.storage_manager_path), + ); + + let svc = RuntimeServer::new(legacy); + server_builder.add_service(svc) + } + StorageManagerType::WorkingDir => { + let legacy = Legacy::new( + provisioner_address, + WorkingDirStorageManager::new(args.storage_manager_path), + ); + + let svc = RuntimeServer::new(legacy); + server_builder.add_service(svc) + } + } } else if args.axum { let axum = AxumWasm::default(); let svc = RuntimeServer::new(axum); diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs index 28bd9d7c9..58cd34aa2 100644 --- a/runtime/src/provisioner_factory.rs +++ b/runtime/src/provisioner_factory.rs @@ -11,7 +11,7 @@ use tracing::{debug, info, trace}; use uuid::Uuid; /// Trait to make it easy to get a factory (service locator) for each service being started -pub trait AbstractFactory: Send + 'static { +pub trait AbstractFactory: Send + 'static { type Output: Factory; /// Get a factory for a specific service @@ -19,7 +19,8 @@ pub trait AbstractFactory: Send + 'static { &self, service_name: ServiceName, deployment_id: Uuid, - storage_manager: StorageManager, + secrets: BTreeMap, + storage_manager: S, ) -> Self::Output; } @@ -29,19 +30,24 @@ pub struct AbstractProvisionerFactory { provisioner_client: ProvisionerClient, } -impl AbstractFactory for AbstractProvisionerFactory { - type Output = ProvisionerFactory; +impl AbstractFactory for AbstractProvisionerFactory +where + S: StorageManager, +{ + type Output = ProvisionerFactory; fn get_factory( &self, service_name: ServiceName, deployment_id: Uuid, - storage_manager: StorageManager, + secrets: BTreeMap, + storage_manager: S, ) -> Self::Output { ProvisionerFactory::new( self.provisioner_client.clone(), service_name, deployment_id, + secrets, storage_manager, ) } @@ -54,21 +60,28 @@ impl AbstractProvisionerFactory { } /// A factory (service locator) which goes through the provisioner crate -pub struct ProvisionerFactory { +pub struct ProvisionerFactory +where + S: StorageManager, +{ service_name: ServiceName, deployment_id: Uuid, - storage_manager: StorageManager, + storage_manager: S, provisioner_client: ProvisionerClient, info: Option, - secrets: Option>, + secrets: BTreeMap, } -impl ProvisionerFactory { +impl ProvisionerFactory +where + S: StorageManager, +{ pub(crate) fn new( provisioner_client: ProvisionerClient, service_name: ServiceName, deployment_id: Uuid, - storage_manager: StorageManager, + secrets: BTreeMap, + storage_manager: S, ) -> Self { Self { provisioner_client, @@ -76,18 +89,21 @@ impl ProvisionerFactory { deployment_id, storage_manager, info: None, - secrets: None, + secrets, } } } #[async_trait] -impl Factory for ProvisionerFactory { +impl Factory for ProvisionerFactory +where + S: StorageManager + Sync + Send, +{ async fn get_db_connection_string( &mut self, db_type: database::Type, ) -> Result { - info!("Provisioning a {db_type} on the shuttle servers. This can take a while..."); + info!("Provisioning a {db_type}. This can take a while..."); if let Some(ref info) = self.info { debug!("A database has already been provisioned for this deployment, so reusing it"); @@ -119,12 +135,7 @@ impl Factory for ProvisionerFactory { } async fn get_secrets(&mut self) -> Result, shuttle_service::Error> { - if let Some(ref secrets) = self.secrets { - debug!("Returning previously fetched secrets"); - Ok(secrets.clone()) - } else { - todo!() - } + Ok(self.secrets.clone()) } fn get_service_name(&self) -> ServiceName { diff --git a/service/Cargo.toml b/service/Cargo.toml index 08512f6e7..523a16281 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -62,7 +62,9 @@ tokio = { version = "1.22.0", features = ["macros"] } uuid = { workspace = true, features = ["v4"] } [features] -codegen = ["shuttle-codegen"] +default = ["codegen"] + +codegen = ["shuttle-codegen/frameworks"] loader = ["cargo", "libloading"] web-actix-web = ["actix-web", "num_cpus"] diff --git a/service/src/error.rs b/service/src/error.rs index de1898af1..ba261ef46 100644 --- a/service/src/error.rs +++ b/service/src/error.rs @@ -8,8 +8,6 @@ pub enum Error { Io(#[from] std::io::Error), #[error("Database error: {0}")] Database(String), - #[error("Secret error: {0}")] - Secret(String), #[error("Panic occurred in shuttle_service::main`: {0}")] BuildPanic(String), #[error("Panic occurred in `Service::bind`: {0}")] @@ -19,12 +17,3 @@ pub enum Error { } pub type CustomError = anyhow::Error; - -// This is implemented manually as defining `Error::Database(#[from] mongodb::error::Error)` resulted in a -// segfault even with a feature guard. -#[cfg(feature = "mongodb-integration")] -impl From for Error { - fn from(e: mongodb::error::Error) -> Self { - Error::Database(e.to_string()) - } -} diff --git a/service/src/loader.rs b/service/src/loader.rs index b57bffc70..fd4f93cf7 100644 --- a/service/src/loader.rs +++ b/service/src/loader.rs @@ -111,7 +111,6 @@ pub async fn build_crate( deployment_id: Uuid, project_path: &Path, release_mode: bool, - wasm: bool, tx: Sender, ) -> anyhow::Result { let (read, write) = pipe::pipe(); @@ -145,14 +144,18 @@ pub async fn build_crate( let summary = current.manifest_mut().summary_mut(); make_name_unique(summary, deployment_id); - check_version(summary)?; + + let is_next = is_next(summary); + if !is_next { + check_version(summary)?; + } check_no_panic(&ws)?; - let opts = get_compile_options(&config, release_mode, wasm)?; + let opts = get_compile_options(&config, release_mode, is_next)?; let compilation = compile(&ws, &opts); let path = compilation?.cdylibs[0].path.clone(); - Ok(if wasm { + Ok(if is_next { Runtime::Next(path) } else { Runtime::Legacy(path) @@ -246,7 +249,7 @@ fn get_compile_options( }; opts.build_config.requested_kinds = vec![if wasm { - CompileKind::Target(CompileTarget::new("wasm32-unknown-unknown")?) + CompileKind::Target(CompileTarget::new("wasm32-wasi")?) } else { CompileKind::Host }]; @@ -292,6 +295,20 @@ fn make_name_unique(summary: &mut Summary, deployment_id: Uuid) { ); } +fn is_next(summary: &Summary) -> bool { + let features = if let Some(shuttle) = summary + .dependencies() + .iter() + .find(|dependency| dependency.package_name() == "shuttle-codegen") + { + shuttle.features() + } else { + &[] + }; + + features.contains(&InternedString::new("next")) +} + /// Check that the crate being build is compatible with this version of loader fn check_version(summary: &Summary) -> anyhow::Result<()> { let valid_version = VERSION.to_semver().unwrap(); diff --git a/service/tests/integration/build_crate.rs b/service/tests/integration/build_crate.rs index 432ad7751..6c7e289eb 100644 --- a/service/tests/integration/build_crate.rs +++ b/service/tests/integration/build_crate.rs @@ -6,15 +6,9 @@ use shuttle_service::loader::{build_crate, Runtime}; async fn not_shuttle() { let (tx, _) = crossbeam_channel::unbounded(); let project_path = format!("{}/tests/resources/not-shuttle", env!("CARGO_MANIFEST_DIR")); - let so_path = match build_crate( - Default::default(), - Path::new(&project_path), - false, - false, - tx, - ) - .await - .unwrap() + let so_path = match build_crate(Default::default(), Path::new(&project_path), false, tx) + .await + .unwrap() { Runtime::Legacy(path) => path, _ => unreachable!(), @@ -37,15 +31,9 @@ async fn not_shuttle() { async fn not_lib() { let (tx, _) = crossbeam_channel::unbounded(); let project_path = format!("{}/tests/resources/not-lib", env!("CARGO_MANIFEST_DIR")); - build_crate( - Default::default(), - Path::new(&project_path), - false, - false, - tx, - ) - .await - .unwrap(); + build_crate(Default::default(), Path::new(&project_path), false, tx) + .await + .unwrap(); } #[tokio::test(flavor = "multi_thread")] @@ -53,14 +41,7 @@ async fn not_cdylib() { let (tx, _) = crossbeam_channel::unbounded(); let project_path = format!("{}/tests/resources/not-cdylib", env!("CARGO_MANIFEST_DIR")); assert!(matches!( - build_crate( - Default::default(), - Path::new(&project_path), - false, - false, - tx - ) - .await, + build_crate(Default::default(), Path::new(&project_path), false, tx).await, Ok(Runtime::Legacy(_)) )); assert!(PathBuf::from(project_path) @@ -73,14 +54,7 @@ async fn is_cdylib() { let (tx, _) = crossbeam_channel::unbounded(); let project_path = format!("{}/tests/resources/is-cdylib", env!("CARGO_MANIFEST_DIR")); assert!(matches!( - build_crate( - Default::default(), - Path::new(&project_path), - false, - false, - tx - ) - .await, + build_crate(Default::default(), Path::new(&project_path), false, tx).await, Ok(Runtime::Legacy(_)) )); assert!(PathBuf::from(project_path) @@ -96,13 +70,7 @@ async fn not_found() { "{}/tests/resources/non-existing", env!("CARGO_MANIFEST_DIR") ); - build_crate( - Default::default(), - Path::new(&project_path), - false, - false, - tx, - ) - .await - .unwrap(); + build_crate(Default::default(), Path::new(&project_path), false, tx) + .await + .unwrap(); } diff --git a/tmp/axum-wasm-expanded/Cargo.toml b/tmp/axum-wasm-expanded/Cargo.toml new file mode 100644 index 000000000..90948b065 --- /dev/null +++ b/tmp/axum-wasm-expanded/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "shuttle-axum-expanded" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = [ "cdylib" ] + +[dependencies] +# most axum features can be enabled, but "tokio" and "ws" depend on socket2 +# via "hyper/tcp" which is not compatible with wasi +axum = { version = "0.6.0", default-features = false } +futures-executor = "0.3.21" +http = "0.2.7" +tower-service = "0.3.1" +rmp-serde = { version = "1.1.1" } + +[dependencies.shuttle-common] +path = "../../common" +features = ["axum-wasm"] +version = "0.8.0" diff --git a/tmp/axum-wasm-expanded/src/lib.rs b/tmp/axum-wasm-expanded/src/lib.rs new file mode 100644 index 000000000..62ca37c28 --- /dev/null +++ b/tmp/axum-wasm-expanded/src/lib.rs @@ -0,0 +1,96 @@ +use axum::{ + body::BoxBody, + extract::BodyStream, + response::{IntoResponse, Response}, +}; +use futures::TryStreamExt; + +pub fn handle_request(req: http::Request) -> axum::response::Response { + futures_executor::block_on(app(req)) +} + +async fn app(request: http::Request) -> axum::response::Response { + use tower_service::Service; + + let mut router = axum::Router::new() + .route("/hello", axum::routing::get(hello)) + .route("/goodbye", axum::routing::get(goodbye)) + .route("/uppercase", axum::routing::post(uppercase)); + + let response = router.call(request).await.unwrap(); + + response +} + +async fn hello() -> &'static str { + "Hello, World!" +} + +async fn goodbye() -> &'static str { + "Goodbye, World!" +} + +// Map the bytes of the body stream to uppercase and return the stream directly. +async fn uppercase(body: BodyStream) -> impl IntoResponse { + let chunk_stream = body.map_ok(|chunk| { + chunk + .iter() + .map(|byte| byte.to_ascii_uppercase()) + .collect::>() + }); + Response::new(axum::body::StreamBody::new(chunk_stream)) +} + +#[no_mangle] +#[allow(non_snake_case)] +pub extern "C" fn __SHUTTLE_Axum_call( + fd_3: std::os::wasi::prelude::RawFd, + fd_4: std::os::wasi::prelude::RawFd, + fd_5: std::os::wasi::prelude::RawFd, +) { + use axum::body::HttpBody; + use std::io::{Read, Write}; + use std::os::wasi::io::FromRawFd; + + println!("inner handler awoken; interacting with fd={fd_3},{fd_4},{fd_5}"); + + // file descriptor 3 for reading and writing http parts + let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; + + let reader = std::io::BufReader::new(&mut parts_fd); + + // deserialize request parts from rust messagepack + let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); + + // file descriptor 4 for reading http body into wasm + let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(fd_4) }; + + let mut reader = std::io::BufReader::new(&mut body_read_stream); + let mut body_buf = Vec::new(); + reader.read_to_end(&mut body_buf).unwrap(); + + let body = axum::body::Body::from(body_buf); + + let request = wrapper + .into_request_builder() + .body(axum::body::boxed(body)) + .unwrap(); + + println!("inner router received request: {:?}", &request); + let res = handle_request(request); + + let (parts, mut body) = res.into_parts(); + + // wrap and serialize response parts as rmp + let response_parts = shuttle_common::wasm::ResponseWrapper::from(parts).into_rmp(); + + // write response parts + parts_fd.write_all(&response_parts).unwrap(); + + // file descriptor 5 for writing http body to host + let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(fd_5) }; + + // write body if there is one + if let Some(body) = futures_executor::block_on(body.data()) { + body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); +} diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml index 740001a64..02a0b8546 100644 --- a/tmp/axum-wasm/Cargo.toml +++ b/tmp/axum-wasm/Cargo.toml @@ -16,6 +16,11 @@ tower-service = "0.3.1" rmp-serde = { version = "1.1.1" } futures = "0.3.25" +[dependencies.shuttle-codegen] +path = "../../codegen" +features = ["next"] +version = "0.8.0" + [dependencies.shuttle-common] path = "../../common" features = ["axum-wasm"] diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs index e0801ac9a..5be67e21c 100644 --- a/tmp/axum-wasm/src/lib.rs +++ b/tmp/axum-wasm/src/lib.rs @@ -1,97 +1,11 @@ -use axum::{ - body::BoxBody, - extract::BodyStream, - response::{IntoResponse, Response}, -}; -use futures::TryStreamExt; - -pub fn handle_request(req: http::Request) -> axum::response::Response { - futures_executor::block_on(app(req)) -} - -async fn app(request: http::Request) -> axum::response::Response { - use tower_service::Service; - - let mut router = axum::Router::new() - .route("/hello", axum::routing::get(hello)) - .route("/goodbye", axum::routing::get(goodbye)) - .route("/uppercase", axum::routing::post(uppercase)); - - let response = router.call(request).await.unwrap(); - - response -} - -async fn hello() -> &'static str { - "Hello, World!" -} - -async fn goodbye() -> &'static str { - "Goodbye, World!" -} - -// Map the bytes of the body stream to uppercase and return the stream directly. -async fn uppercase(body: BodyStream) -> impl IntoResponse { - let chunk_stream = body.map_ok(|chunk| { - chunk - .iter() - .map(|byte| byte.to_ascii_uppercase()) - .collect::>() - }); - Response::new(axum::body::StreamBody::new(chunk_stream)) -} - -#[no_mangle] -#[allow(non_snake_case)] -pub extern "C" fn __SHUTTLE_Axum_call( - fd_3: std::os::wasi::prelude::RawFd, - fd_4: std::os::wasi::prelude::RawFd, - fd_5: std::os::wasi::prelude::RawFd, -) { - use axum::body::HttpBody; - use std::io::{Read, Write}; - use std::os::wasi::io::FromRawFd; - - println!("inner handler awoken; interacting with fd={fd_3},{fd_4},{fd_5}"); - - // file descriptor 3 for reading and writing http parts - let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; - - let reader = std::io::BufReader::new(&mut parts_fd); - - // deserialize request parts from rust messagepack - let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); - - // file descriptor 4 for reading http body into wasm - let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(fd_4) }; - - let mut reader = std::io::BufReader::new(&mut body_read_stream); - let mut body_buf = Vec::new(); - reader.read_to_end(&mut body_buf).unwrap(); - - let body = axum::body::Body::from(body_buf); - - let request = wrapper - .into_request_builder() - .body(axum::body::boxed(body)) - .unwrap(); - - println!("inner router received request: {:?}", &request); - let res = handle_request(request); - - let (parts, mut body) = res.into_parts(); - - // wrap and serialize response parts as rmp - let response_parts = shuttle_common::wasm::ResponseWrapper::from(parts).into_rmp(); - - // write response parts - parts_fd.write_all(&response_parts).unwrap(); - - // file descriptor 5 for writing http body to host - let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(fd_5) }; +shuttle_codegen::app! { + #[shuttle_codegen::endpoint(method = get, route = "/hello")] + async fn hello() -> &'static str { + "Hello, World!" + } - // write body if there is one - if let Some(body) = futures_executor::block_on(body.data()) { - body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); + #[shuttle_codegen::endpoint(method = get, route = "/goodbye")] + async fn goodbye() -> &'static str { + "Goodbye, World!" } } From d7ff85f445d07936854059ee0d27800f1606eb0e Mon Sep 17 00:00:00 2001 From: Pieter Date: Fri, 6 Jan 2023 17:17:08 +0200 Subject: [PATCH 21/74] bug: expanded broken merge (#567) --- tmp/axum-wasm-expanded/Cargo.toml | 1 + tmp/axum-wasm-expanded/src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/tmp/axum-wasm-expanded/Cargo.toml b/tmp/axum-wasm-expanded/Cargo.toml index 90948b065..16dab848e 100644 --- a/tmp/axum-wasm-expanded/Cargo.toml +++ b/tmp/axum-wasm-expanded/Cargo.toml @@ -10,6 +10,7 @@ crate-type = [ "cdylib" ] # most axum features can be enabled, but "tokio" and "ws" depend on socket2 # via "hyper/tcp" which is not compatible with wasi axum = { version = "0.6.0", default-features = false } +futures = "0.3.25" futures-executor = "0.3.21" http = "0.2.7" tower-service = "0.3.1" diff --git a/tmp/axum-wasm-expanded/src/lib.rs b/tmp/axum-wasm-expanded/src/lib.rs index 62ca37c28..e0801ac9a 100644 --- a/tmp/axum-wasm-expanded/src/lib.rs +++ b/tmp/axum-wasm-expanded/src/lib.rs @@ -93,4 +93,5 @@ pub extern "C" fn __SHUTTLE_Axum_call( // write body if there is one if let Some(body) = futures_executor::block_on(body.data()) { body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); + } } From 832482430524860258403feac2f94abe8cfe2d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Fri, 6 Jan 2023 18:17:56 +0100 Subject: [PATCH 22/74] feat: refactor router and router inner (#566) * refactor: clean up imports * refactor: remove RouterInner * feat: handle wasi errors * feat: handle_request error handling * docs: comments * refactor: make hyper dev-dep, better error message * fix: axum-wasm missed import and bracket --- common/Cargo.toml | 6 +- common/src/wasm.rs | 16 +-- runtime/src/axum/mod.rs | 222 ++++++++++++++++-------------- tmp/axum-wasm-expanded/Cargo.toml | 1 + tmp/axum-wasm/Cargo.toml | 2 +- 5 files changed, 134 insertions(+), 113 deletions(-) diff --git a/common/Cargo.toml b/common/Cargo.toml index cdd16765b..4aeff55fb 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -15,7 +15,6 @@ comfy-table = { version = "6.1.3", optional = true } crossterm = { version = "0.25.0", optional = true } http = { version = "0.2.8", optional = true } http-serde = { version = "1.1.2", optional = true } -hyper = { version = "0.14.23", optional = true } once_cell = { workspace = true } reqwest = { version = "0.11.13", optional = true } rmp-serde = { version = "1.1.1", optional = true } @@ -26,8 +25,11 @@ strum = { version = "0.24.1", features = ["derive"] } tracing = { workspace = true } uuid = { workspace = true, features = ["v4", "serde"] } +[dev-dependencies] +hyper = "0.14.3" + [features] backend = ["async-trait", "axum"] display = ["comfy-table", "crossterm"] -axum-wasm = ["http-serde", "hyper", "rmp-serde"] +axum-wasm = ["http-serde", "http", "rmp-serde"] models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json"] diff --git a/common/src/wasm.rs b/common/src/wasm.rs index 34e19d5e3..46d111d04 100644 --- a/common/src/wasm.rs +++ b/common/src/wasm.rs @@ -1,4 +1,4 @@ -use hyper::http::{HeaderMap, Method, Request, Response, StatusCode, Uri, Version}; +use http::{self, HeaderMap, Method, Request, Response, StatusCode, Uri, Version}; use rmps::Serializer; use serde::{Deserialize, Serialize}; @@ -20,8 +20,8 @@ pub struct RequestWrapper { pub headers: HeaderMap, } -impl From for RequestWrapper { - fn from(parts: hyper::http::request::Parts) -> Self { +impl From for RequestWrapper { + fn from(parts: http::request::Parts) -> Self { RequestWrapper { method: parts.method, uri: parts.uri, @@ -41,7 +41,7 @@ impl RequestWrapper { } /// Consume the wrapper and return a request builder with `Parts` set - pub fn into_request_builder(self) -> hyper::http::request::Builder { + pub fn into_request_builder(self) -> http::request::Builder { let mut request = Request::builder() .method(self.method) .version(self.version) @@ -69,8 +69,8 @@ pub struct ResponseWrapper { pub headers: HeaderMap, } -impl From for ResponseWrapper { - fn from(parts: hyper::http::response::Parts) -> Self { +impl From for ResponseWrapper { + fn from(parts: http::response::Parts) -> Self { ResponseWrapper { status: parts.status, version: parts.version, @@ -89,7 +89,7 @@ impl ResponseWrapper { } /// Consume the wrapper and return a response builder with `Parts` set - pub fn into_response_builder(self) -> hyper::http::response::Builder { + pub fn into_response_builder(self) -> http::response::Builder { let mut response = Response::builder() .status(self.status) .version(self.version); @@ -106,8 +106,8 @@ impl ResponseWrapper { #[cfg(test)] mod test { use super::*; + use http::HeaderValue; use hyper::body::Body; - use hyper::http::HeaderValue; #[test] fn request_roundtrip() { diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 68fbc07d7..7a94889e9 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -6,6 +6,7 @@ use std::os::unix::prelude::RawFd; use std::path::{Path, PathBuf}; use std::str::FromStr; +use anyhow::Context; use async_trait::async_trait; use cap_std::os::unix::net::UnixStream; use futures::TryStreamExt; @@ -59,7 +60,11 @@ impl Runtime for AxumWasm { let wasm_path = request.into_inner().path; trace!(wasm_path, "loading"); - let router = Router::new(wasm_path); + let router = RouterBuilder::new() + .map_err(|err| Status::from_error(err.into()))? + .src(wasm_path) + .build() + .map_err(|err| Status::from_error(err.into()))?; *self.router.lock().unwrap() = Some(router); @@ -75,14 +80,19 @@ impl Runtime for AxumWasm { let StartRequest { port, .. } = request.into_inner(); let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port as u16); - let router = self.router.lock().unwrap().take().unwrap(); - let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); *self.kill_tx.lock().unwrap() = Some(kill_tx); - // TODO: split `into_server` up into build and run functions - tokio::spawn(router.into_server(address, kill_rx)); + let router = self + .router + .lock() + .unwrap() + .take() + .context("tried to start a service that was not loaded") + .map_err(|err| Status::internal(err.to_string()))?; + + tokio::spawn(run_until_stopped(router, address, kill_rx)); let message = StartResponse { success: true }; @@ -122,7 +132,9 @@ impl Runtime for AxumWasm { Ok(tonic::Response::new(StopResponse { success: true })) } else { - Err(Status::internal("failed to stop deployment")) + Err(Status::internal( + "trying to stop a service that was not started", + )) } } } @@ -134,67 +146,68 @@ struct RouterBuilder { } impl RouterBuilder { - pub fn new() -> Self { + fn new() -> anyhow::Result { let engine = Engine::default(); let mut linker: Linker = Linker::new(&engine); - wasmtime_wasi::add_to_linker(&mut linker, |s| s).unwrap(); + wasmtime_wasi::add_to_linker(&mut linker, |s| s)?; - Self { + Ok(Self { engine, linker, src: None, - } + }) } - pub fn src>(mut self, src: P) -> Self { + fn src>(mut self, src: P) -> Self { self.src = Some(src.as_ref().to_path_buf()); self } - pub fn build(self) -> Router { - let file = self.src.unwrap(); - let module = Module::from_file(&self.engine, file).unwrap(); + fn build(self) -> anyhow::Result { + let file = self.src.expect("module path should be set"); + let module = Module::from_file(&self.engine, file)?; for export in module.exports() { println!("export: {}", export.name()); } - let inner = RouterInner { + + Ok(Router { linker: self.linker, engine: self.engine, module, - }; - Router { inner } + }) } } #[derive(Clone)] -struct RouterInner { +struct Router { linker: Linker, engine: Engine, module: Module, } -impl RouterInner { +impl Router { /// Send a HTTP request with body to given endpoint on the axum-wasm router and return the response - pub async fn handle_request( + async fn handle_request( &mut self, req: hyper::Request, - ) -> Result, Infallible> { + ) -> anyhow::Result> { let wasi = WasiCtxBuilder::new() .inherit_stdio() .inherit_args() - .unwrap() + .context("failed to read args")? .build(); let mut store = Store::new(&self.engine, wasi); - self.linker - .module(&mut store, "axum", &self.module) - .unwrap(); + self.linker.module(&mut store, "axum", &self.module)?; - let (mut parts_stream, parts_client) = UnixStream::pair().unwrap(); - let (mut body_write_stream, body_write_client) = UnixStream::pair().unwrap(); - let (body_read_stream, body_read_client) = UnixStream::pair().unwrap(); + let (mut parts_stream, parts_client) = + UnixStream::pair().context("failed to open parts unixstream")?; + let (mut body_write_stream, body_write_client) = + UnixStream::pair().context("failed to open body write unixstream")?; + let (body_read_stream, body_read_client) = + UnixStream::pair().context("failed to open body read unixstream")?; let parts_client = WasiUnixStream::from_cap_std(parts_client); let body_write_client = WasiUnixStream::from_cap_std(body_write_client); @@ -212,11 +225,13 @@ impl RouterInner { let (parts, body) = req.into_parts(); - // serialise request parts to rmp + // Serialise request parts to rmp let request_rmp = RequestWrapper::from(parts).into_rmp(); - // write request parts - parts_stream.write_all(&request_rmp).unwrap(); + // Write request parts to wasm module + parts_stream + .write_all(&request_rmp) + .context("failed to write http parts to wasm")?; // To protect our server, reject requests with bodies larger than // 64kbs of data. @@ -226,98 +241,98 @@ impl RouterInner { let response = Response::builder() .status(hyper::http::StatusCode::PAYLOAD_TOO_LARGE) .body(Body::empty()) - .unwrap(); + .expect("building request with empty body should not fail"); // Return early if body is too big return Ok(response); } - let body_bytes = hyper::body::to_bytes(body).await.unwrap(); + let body_bytes = hyper::body::to_bytes(body) + .await + .context("failed to concatenate request body buffers")?; - // write body to axum - body_write_stream.write_all(body_bytes.as_ref()).unwrap(); + // Write body to wasm + body_write_stream + .write_all(body_bytes.as_ref()) + .context("failed to write body to wasm")?; - // drop stream to signal EOF + // Drop stream to signal EOF drop(body_write_stream); - println!("calling inner Router"); + // Call our function in wasm, telling it to route the request we've written to it + // and write back a response + trace!("calling inner Router"); self.linker .get(&mut store, "axum", "__SHUTTLE_Axum_call") - .unwrap() + .expect("wasm module should be loaded and the router function should be available") .into_func() - .unwrap() - .typed::<(RawFd, RawFd, RawFd), ()>(&store) - .unwrap() - .call(&mut store, (3, 4, 5)) - .unwrap(); + .expect("router function should be a function") + .typed::<(RawFd, RawFd, RawFd), ()>(&store)? + .call(&mut store, (3, 4, 5))?; - // read response parts from host + // Read response parts from wasm let reader = BufReader::new(&mut parts_stream); - // deserialize response parts from rust messagepack - let wrapper: ResponseWrapper = rmps::from_read(reader).unwrap(); + // Deserialize response parts from rust messagepack + let wrapper: ResponseWrapper = + rmps::from_read(reader).context("failed to deserialize response parts")?; - // read response body from wasm and stream it to our hyper server + // Read response body from wasm, convert it to a Stream and pass it to hyper let reader = BufReader::new(body_read_stream); let stream = futures::stream::iter(reader.bytes()).try_chunks(2); let body = hyper::Body::wrap_stream(stream); - let response: Response = wrapper.into_response_builder().body(body).unwrap(); + let response: Response = wrapper + .into_response_builder() + .body(body) + .context("failed to construct http response")?; Ok(response) } } -#[derive(Clone)] -struct Router { - inner: RouterInner, -} - -impl Router { - pub fn builder() -> RouterBuilder { - RouterBuilder::new() - } - - pub fn new>(src: P) -> Self { - Self::builder().src(src).build() - } - - /// Consume the router, build and run server until a stop signal is received via the - /// kill receiver - // TODO: figure out how to handle the complicated generics for hyper::Server and - // hyper::MakeServiceFn and split this up into `build` and `run_until_stopped` functions - pub async fn into_server( - self, - address: SocketAddr, - kill_rx: tokio::sync::oneshot::Receiver, - ) { - let router = self.inner; - - let make_service = make_service_fn(move |_conn| { - let router = router.clone(); - async move { - Ok::<_, Infallible>(service_fn(move |req: Request| { - let mut router = router.clone(); - async move { Ok::<_, Infallible>(router.handle_request(req).await.unwrap()) } - })) - } - }); - - let server = hyper::Server::bind(&address).serve(make_service); - - trace!("starting hyper server on: {}", &address); - tokio::select! { - _ = server => { - trace!("axum wasm server stopped"); - }, - message = kill_rx => { - match message { - Ok(msg) => trace!("{msg}"), - Err(_) => trace!("the sender dropped") +/// Start a hyper server with a service that calls an axum router in WASM, +/// and a kill receiver for stopping the server. +async fn run_until_stopped( + router: Router, + address: SocketAddr, + kill_rx: tokio::sync::oneshot::Receiver, +) { + let make_service = make_service_fn(move |_conn| { + let router = router.clone(); + async move { + Ok::<_, Infallible>(service_fn(move |req: Request| { + let mut router = router.clone(); + async move { + Ok::<_, Infallible>(match router.handle_request(req).await { + Ok(res) => res, + Err(err) => { + error!("error sending request: {}", err); + Response::builder() + .status(hyper::http::StatusCode::INTERNAL_SERVER_ERROR) + .body(Body::empty()) + .expect("building request with empty body should not fail") + } + }) } + })) + } + }); + + let server = hyper::Server::bind(&address).serve(make_service); + + trace!("starting hyper server on: {}", &address); + tokio::select! { + _ = server => { + trace!("axum wasm server stopped"); + }, + message = kill_rx => { + match message { + Ok(msg) => trace!("{msg}"), + Err(_) => trace!("the sender dropped") } - }; - } + } + }; } #[cfg(test)] @@ -327,8 +342,11 @@ pub mod tests { #[tokio::test] async fn axum() { - let axum = Router::new("axum.wasm"); - let inner = axum.inner; + let router = RouterBuilder::new() + .unwrap() + .src("axum.wasm") + .build() + .unwrap(); // GET /hello let request: Request = Request::builder() @@ -338,7 +356,7 @@ pub mod tests { .body(Body::empty()) .unwrap(); - let res = inner.clone().handle_request(request).await.unwrap(); + let res = router.clone().handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( @@ -361,7 +379,7 @@ pub mod tests { .body(Body::from("Goodbye world body")) .unwrap(); - let res = inner.clone().handle_request(request).await.unwrap(); + let res = router.clone().handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( @@ -384,7 +402,7 @@ pub mod tests { .body(Body::empty()) .unwrap(); - let res = inner.clone().handle_request(request).await.unwrap(); + let res = router.clone().handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::NOT_FOUND); @@ -397,7 +415,7 @@ pub mod tests { .body("this should be uppercased".into()) .unwrap(); - let res = inner.clone().handle_request(request).await.unwrap(); + let res = router.clone().handle_request(request).await.unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( diff --git a/tmp/axum-wasm-expanded/Cargo.toml b/tmp/axum-wasm-expanded/Cargo.toml index 16dab848e..23a77e86a 100644 --- a/tmp/axum-wasm-expanded/Cargo.toml +++ b/tmp/axum-wasm-expanded/Cargo.toml @@ -12,6 +12,7 @@ crate-type = [ "cdylib" ] axum = { version = "0.6.0", default-features = false } futures = "0.3.25" futures-executor = "0.3.21" +futures = "0.3.25" http = "0.2.7" tower-service = "0.3.1" rmp-serde = { version = "1.1.1" } diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml index 02a0b8546..aba75386b 100644 --- a/tmp/axum-wasm/Cargo.toml +++ b/tmp/axum-wasm/Cargo.toml @@ -11,10 +11,10 @@ crate-type = [ "cdylib" ] # via "hyper/tcp" which is not compatible with wasi axum = { version = "0.6.0", default-features = false } futures-executor = "0.3.21" +futures = "0.3.25" http = "0.2.7" tower-service = "0.3.1" rmp-serde = { version = "1.1.1" } -futures = "0.3.25" [dependencies.shuttle-codegen] path = "../../codegen" From 5b033d0ba27b9c976e1051df224f224138aee513 Mon Sep 17 00:00:00 2001 From: Pieter Date: Tue, 10 Jan 2023 10:25:35 +0200 Subject: [PATCH 23/74] feat: hook in runtime logs (#568) * feat: simple wasm log to send over unix socket * feat: hook up logs subscription * refactor: extra comments * refactor: simpler interface * refactor: combine JsonVisitors * refactor: clippy suggestions * refactor: update tests * refactor: extra comment * refactor: increase channel for better performance * refactor: move off stderr --- Cargo.lock | 2 + codegen/src/next/mod.rs | 24 +- common/Cargo.toml | 5 +- common/src/lib.rs | 2 + common/src/tracing.rs | 53 ++++ common/src/wasm.rs | 363 +++++++++++++++++++++++- deployer/src/deployment/deploy_layer.rs | 66 +---- proto/src/lib.rs | 35 +++ runtime/src/axum/mod.rs | 155 ++++++++-- service/Cargo.toml | 1 + service/src/logger.rs | 56 +--- tmp/axum-wasm-expanded/Cargo.toml | 3 +- tmp/axum-wasm-expanded/src/lib.rs | 28 +- tmp/axum-wasm/Cargo.toml | 2 + tmp/axum-wasm/src/lib.rs | 4 + 15 files changed, 640 insertions(+), 159 deletions(-) create mode 100644 common/src/tracing.rs diff --git a/Cargo.lock b/Cargo.lock index bcafc3d30..01d04921a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6192,6 +6192,7 @@ dependencies = [ "anyhow", "async-trait", "axum", + "cap-std", "chrono", "comfy-table", "crossterm", @@ -6206,6 +6207,7 @@ dependencies = [ "serde_json", "strum", "tracing", + "tracing-subscriber", "uuid 1.2.2", ] diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index 4de2e98ef..f91c19928 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -262,18 +262,28 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { #[no_mangle] #[allow(non_snake_case)] pub extern "C" fn __SHUTTLE_Axum_call( - fd_3: std::os::wasi::prelude::RawFd, - fd_4: std::os::wasi::prelude::RawFd, - fd_5: std::os::wasi::prelude::RawFd, + logs_fd: std::os::wasi::prelude::RawFd, + parts_fd: std::os::wasi::prelude::RawFd, + body_read_fd: std::os::wasi::prelude::RawFd, + body_write_fd: std::os::wasi::prelude::RawFd, ) { use axum::body::HttpBody; + use shuttle_common::wasm::Logger; use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; + use tracing_subscriber::prelude::*; - println!("inner handler awoken; interacting with fd={},{},{}", fd_3, fd_4, fd_5); + println!("inner handler awoken; interacting with fd={},{},{},{}", logs_fd, parts_fd, body_read_fd, body_write_fd); + + // file descriptor 2 for writing logs to + let logs_fd = unsafe { std::fs::File::from_raw_fd(logs_fd) }; + + tracing_subscriber::registry() + .with(Logger::new(logs_fd)) + .init(); // this sets the subscriber as the global default and also adds a compatibility layer for capturing `log::Record`s // file descriptor 3 for reading and writing http parts - let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; + let mut parts_fd = unsafe { std::fs::File::from_raw_fd(parts_fd) }; let reader = std::io::BufReader::new(&mut parts_fd); @@ -281,7 +291,7 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); // file descriptor 4 for reading http body into wasm - let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(fd_4) }; + let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(body_read_fd) }; let mut reader = std::io::BufReader::new(&mut body_read_stream); let mut body_buf = Vec::new(); @@ -306,7 +316,7 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { parts_fd.write_all(&response_parts).unwrap(); // file descriptor 5 for writing http body to host - let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(fd_5) }; + let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(body_write_fd) }; // write body if there is one if let Some(body) = futures_executor::block_on(body.data()) { diff --git a/common/Cargo.toml b/common/Cargo.toml index 4aeff55fb..f90991bd9 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -23,13 +23,16 @@ serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true, optional = true } strum = { version = "0.24.1", features = ["derive"] } tracing = { workspace = true } +tracing-subscriber = { workspace = true, optional = true } uuid = { workspace = true, features = ["v4", "serde"] } [dev-dependencies] +cap-std = "1.0.2" hyper = "0.14.3" [features] backend = ["async-trait", "axum"] display = ["comfy-table", "crossterm"] -axum-wasm = ["http-serde", "http", "rmp-serde"] +tracing = ["serde_json"] +axum-wasm = ["http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json"] diff --git a/common/src/lib.rs b/common/src/lib.rs index a7a3a66fc..f57e647b2 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -7,6 +7,8 @@ pub mod log; pub mod models; pub mod project; pub mod storage_manager; +#[cfg(feature = "tracing")] +pub mod tracing; #[cfg(feature = "axum-wasm")] pub mod wasm; diff --git a/common/src/tracing.rs b/common/src/tracing.rs new file mode 100644 index 000000000..2532262fe --- /dev/null +++ b/common/src/tracing.rs @@ -0,0 +1,53 @@ +use serde_json::json; +use tracing::field::Visit; + +// Boilerplate for extracting the fields from the event +#[derive(Default)] +pub struct JsonVisitor { + pub fields: serde_json::Map, + pub target: Option, + pub file: Option, + pub line: Option, +} + +impl JsonVisitor { + /// Ignores log metadata as it is included in the other LogItem fields (target, file, line...) + fn filter_insert(&mut self, field: &tracing::field::Field, value: serde_json::Value) { + match field.name() { + "log.line" => self.line = value.as_u64().map(|u| u as u32), + "log.target" => self.target = value.as_str().map(ToOwned::to_owned), + "log.file" => self.file = value.as_str().map(ToOwned::to_owned), + "log.module_path" => {} + name => { + self.fields.insert(name.to_string(), json!(value)); + } + } + } +} +impl Visit for JsonVisitor { + fn record_str(&mut self, field: &tracing::field::Field, value: &str) { + self.filter_insert(field, json!(value)); + } + fn record_bool(&mut self, field: &tracing::field::Field, value: bool) { + self.filter_insert(field, json!(value)); + } + fn record_u64(&mut self, field: &tracing::field::Field, value: u64) { + self.filter_insert(field, json!(value)); + } + fn record_i64(&mut self, field: &tracing::field::Field, value: i64) { + self.filter_insert(field, json!(value)); + } + fn record_f64(&mut self, field: &tracing::field::Field, value: f64) { + self.filter_insert(field, json!(value)); + } + fn record_error( + &mut self, + field: &tracing::field::Field, + value: &(dyn std::error::Error + 'static), + ) { + self.filter_insert(field, json!(value.to_string())); + } + fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) { + self.filter_insert(field, json!(format!("{value:?}"))); + } +} diff --git a/common/src/wasm.rs b/common/src/wasm.rs index 46d111d04..82da1d2ee 100644 --- a/common/src/wasm.rs +++ b/common/src/wasm.rs @@ -1,6 +1,17 @@ -use http::{self, HeaderMap, Method, Request, Response, StatusCode, Uri, Version}; +use std::{ + io::Write, + slice::IterMut, + sync::{Arc, Mutex}, +}; + +use chrono::{DateTime, NaiveDateTime, Utc}; +use http::{HeaderMap, Method, Request, Response, StatusCode, Uri, Version}; use rmps::Serializer; use serde::{Deserialize, Serialize}; +use tracing::Subscriber; +use tracing_subscriber::Layer; + +use crate::tracing::JsonVisitor; extern crate rmp_serde as rmps; @@ -103,11 +114,269 @@ impl ResponseWrapper { } } +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Log { + pub level: Level, + pub timestamp: DateTime, + pub file: String, + pub line: u32, + pub target: String, + pub fields: Vec, +} + +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum Level { + Trace, + Debug, + Info, + Warn, + Error, +} + +impl From<&tracing::Level> for Level { + fn from(level: &tracing::Level) -> Self { + match *level { + tracing::Level::TRACE => Self::Trace, + tracing::Level::DEBUG => Self::Debug, + tracing::Level::INFO => Self::Info, + tracing::Level::WARN => Self::Warn, + tracing::Level::ERROR => Self::Error, + } + } +} + +impl Log { + pub fn into_bytes(self) -> Vec { + let mut buf = Vec::new(); + + buf.add(self); + + buf + } +} + +/// Like [slice::fill_with] but allows unwrapping of [Option]s +trait TryFillWith: Sized { + fn try_fill_with>(self, iter: &mut I) -> Option<()>; +} + +impl<'a> TryFillWith for IterMut<'a, u8> { + fn try_fill_with>(self, iter: &mut I) -> Option<()> { + for el in self { + *el = iter.next()?; + } + + Some(()) + } +} + +/// Convert a structure to and from bytes (array of u8) +pub trait Bytesable: Sized { + /// Add self to bytes vec + fn append_bytes(self, buf: &mut Vec); + + /// Get self from bytes vec + fn from_bytes>(iter: &mut I) -> Option; +} + +macro_rules! impl_bytesable { + ($($int:ident),*) => { + $(impl Bytesable for $int { + fn append_bytes(self, buf: &mut Vec) { + buf.extend_from_slice(&self.to_le_bytes()); + } + + fn from_bytes>(iter: &mut I) -> Option { + let mut buf = [0; $int::BITS as usize / 8]; + buf.iter_mut().try_fill_with(iter)?; + + Some($int::from_le_bytes(buf)) + } + })* + }; +} + +// Never implement for usize because it could map to u64 in the runtime and a u32 inside wasm +// This will cause the deserialization step to fail +impl_bytesable!(u32, u64, i64); + +impl Bytesable for String { + fn append_bytes(self, buf: &mut Vec) { + buf.add(self.len() as u64); + buf.extend_from_slice(self.as_bytes()); + } + + fn from_bytes>(iter: &mut I) -> Option { + let length: u64 = iter.get()?; + + let mut vec = vec![0; length as usize]; + vec.iter_mut().try_fill_with(iter)?; + + String::from_utf8(vec).ok() + } +} + +impl Bytesable for Level { + fn append_bytes(self, buf: &mut Vec) { + buf.add(self as u32); + } + + fn from_bytes>(iter: &mut I) -> Option { + let i: u32 = iter.get()?; + + let res = match i { + 0 => Self::Trace, + 1 => Self::Debug, + 2 => Self::Info, + 3 => Self::Warn, + 4 => Self::Error, + _ => Self::Trace, + }; + + Some(res) + } +} + +impl Bytesable for DateTime { + fn append_bytes(self, buf: &mut Vec) { + buf.add(self.naive_utc().timestamp_millis()); + } + + fn from_bytes>(iter: &mut I) -> Option { + let millis: i64 = iter.get()?; + + let datetime = NaiveDateTime::from_timestamp_millis(millis)?; + + Some(Self::from_utc(datetime, Utc)) + } +} + +impl Bytesable for Vec { + fn append_bytes(self, buf: &mut Vec) { + buf.add(self.len() as u64); + buf.extend_from_slice(&self); + } + + fn from_bytes>(iter: &mut I) -> Option { + let length: u64 = iter.get()?; + + let mut vec = vec![0; length as usize]; + vec.iter_mut().try_fill_with(iter)?; + + Some(vec) + } +} + +impl Bytesable for Log { + fn append_bytes(self, buf: &mut Vec) { + buf.add(self.level); + buf.add(self.timestamp); + buf.add(self.file); + buf.add(self.line); + buf.add(self.target); + buf.add(self.fields); + } + + // These should be in the same order as they appear in [Self::append_bytes] + fn from_bytes>(iter: &mut I) -> Option { + Some(Self { + level: iter.get()?, + timestamp: iter.get()?, + file: iter.get()?, + line: iter.get()?, + target: iter.get()?, + fields: iter.get()?, + }) + } +} + +/// Trait to make it easier to add a bytable type to a data source +trait BytesableAppendExt { + fn add(&mut self, i: B); +} + +impl BytesableAppendExt for Vec { + fn add(&mut self, i: B) { + i.append_bytes(self); + } +} + +/// Trait to make it easier to get a bytable type from a data source +trait BytesableFromExt { + fn get(&mut self) -> Option; +} + +impl> BytesableFromExt for I { + fn get(&mut self) -> Option { + B::from_bytes(self) + } +} + +pub struct Logger { + writer: Arc>, +} + +impl Logger { + pub fn new(writer: W) -> Self { + Self { + writer: Arc::new(Mutex::new(writer)), + } + } +} + +impl Layer for Logger +where + S: Subscriber, + W: Write + 'static, +{ + fn on_event( + &self, + event: &tracing::Event<'_>, + _ctx: tracing_subscriber::layer::Context<'_, S>, + ) { + let datetime = Utc::now(); + + let item = { + let metadata = event.metadata(); + let mut visitor = JsonVisitor::default(); + + event.record(&mut visitor); + + Log { + level: metadata.level().into(), + timestamp: datetime, + file: visitor + .file + .or_else(|| metadata.file().map(str::to_string)) + .unwrap_or_default(), + line: visitor.line.or_else(|| metadata.line()).unwrap_or_default(), + target: visitor + .target + .unwrap_or_else(|| metadata.target().to_string()), + fields: serde_json::to_vec(&visitor.fields).unwrap(), + } + }; + + let _ = self + .writer + .lock() + .expect("to get lock on writer") + .write(&item.into_bytes()) + .expect("sending log should succeed"); + } +} + #[cfg(test)] mod test { + use cap_std::os::unix::net::UnixStream; + use serde_json::json; + use std::io::{Read, Write}; + use super::*; + use chrono::SubsecRound; use http::HeaderValue; use hyper::body::Body; + use tracing_subscriber::prelude::*; #[test] fn request_roundtrip() { @@ -157,4 +426,96 @@ mod test { assert_eq!(back.status, StatusCode::NOT_MODIFIED); assert_eq!(back.version, Version::HTTP_11); } + + #[test] + fn log_roundtrip() { + let log = Log { + level: Level::Debug, + timestamp: Utc::now().trunc_subsecs(3), + file: "main.rs".to_string(), + line: 5, + target: "crate::main".to_string(), + fields: serde_json::to_vec(&json!({"message": "Hello"})).unwrap(), + }; + + let mut buf = Vec::new(); + buf.add(log.clone()); + let mut iter = buf.into_iter(); + + let actual = iter.get::(); + + assert_eq!(log, actual.unwrap()); + assert_eq!(iter.next(), None); + } + + #[test] + fn logs_over_socket() { + let (mut tx, rx) = UnixStream::pair().unwrap(); + let log1 = Log { + level: Level::Debug, + timestamp: Utc::now().trunc_subsecs(3), + file: "lib.rs".to_string(), + line: 9, + target: "crate::lib".to_string(), + fields: serde_json::to_vec(&json!({"message": "starting"})).unwrap(), + }; + let log2 = Log { + level: Level::Debug, + timestamp: Utc::now().trunc_subsecs(3), + file: Default::default(), + line: Default::default(), + target: Default::default(), + fields: Default::default(), + }; + + let _ = tx.write(&log1.clone().into_bytes()).unwrap(); + let _ = tx.write(&log2.clone().into_bytes()).unwrap(); + + let mut rx = rx.bytes().filter_map(Result::ok); + + let actual = rx.get::().unwrap(); + assert_eq!(log1, actual); + + let actual = rx.get::().unwrap(); + assert_eq!(log2, actual); + + // Make sure the closed channel (end) is handled correctly + drop(tx); + assert_eq!(rx.get::(), None); + } + + #[test] + fn logging() { + let (tx, rx) = UnixStream::pair().unwrap(); + let mut rx = rx.bytes().filter_map(Result::ok); + + let logger = Logger::new(tx); + let to_tuple = |log: Option| { + let log = log.unwrap(); + let fields: serde_json::Map = + serde_json::from_slice(&log.fields).unwrap(); + + let message = fields["message"].as_str().unwrap().to_owned(); + + (message, log.level) + }; + + tracing_subscriber::registry().with(logger).init(); + + tracing::debug!("this is"); + tracing::info!("hi"); + tracing::warn!("from"); + tracing::error!("logger"); + + assert_eq!( + to_tuple(rx.get::()), + ("this is".to_string(), Level::Debug) + ); + assert_eq!(to_tuple(rx.get::()), ("hi".to_string(), Level::Info)); + assert_eq!(to_tuple(rx.get::()), ("from".to_string(), Level::Warn)); + assert_eq!( + to_tuple(rx.get::()), + ("logger".to_string(), Level::Error) + ); + } } diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index ca7df03e7..afe795a72 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -21,7 +21,7 @@ use chrono::{DateTime, Utc}; use serde_json::json; -use shuttle_common::STATE_MESSAGE; +use shuttle_common::{tracing::JsonVisitor, STATE_MESSAGE}; use shuttle_proto::runtime; use std::{net::SocketAddr, str::FromStr, time::SystemTime}; use tracing::{error, field::Visit, span, warn, Metadata, Subscriber}; @@ -218,36 +218,17 @@ where event.record(&mut visitor); let metadata = event.metadata(); - // Extract details from log::Log interface which is different from tracing - let target = if let Some(target) = visitor.0.remove("log.target") { - target.as_str().unwrap_or_default().to_string() - } else { - metadata.target().to_string() - }; - - let line = if let Some(line) = visitor.0.remove("log.line") { - line.as_u64().and_then(|u| u32::try_from(u).ok()) - } else { - metadata.line() - }; - - let file = if let Some(file) = visitor.0.remove("log.file") { - file.as_str().map(str::to_string) - } else { - metadata.file().map(str::to_string) - }; - - visitor.0.remove("log.module_path"); - self.recorder.record(Log { id: details.id, state: details.state, level: metadata.level().into(), timestamp: Utc::now(), - file, - line, - target, - fields: serde_json::Value::Object(visitor.0), + file: visitor.file.or_else(|| metadata.file().map(str::to_string)), + line: visitor.line.or_else(|| metadata.line()), + target: visitor + .target + .unwrap_or_else(|| metadata.target().to_string()), + fields: serde_json::Value::Object(visitor.fields), r#type: LogType::Event, address: None, }); @@ -355,39 +336,6 @@ impl Visit for NewStateVisitor { } } -#[derive(Default)] -struct JsonVisitor(serde_json::Map); - -impl Visit for JsonVisitor { - fn record_str(&mut self, field: &tracing::field::Field, value: &str) { - self.0.insert(field.name().to_string(), json!(value)); - } - fn record_bool(&mut self, field: &tracing::field::Field, value: bool) { - self.0.insert(field.name().to_string(), json!(value)); - } - fn record_u64(&mut self, field: &tracing::field::Field, value: u64) { - self.0.insert(field.name().to_string(), json!(value)); - } - fn record_i64(&mut self, field: &tracing::field::Field, value: i64) { - self.0.insert(field.name().to_string(), json!(value)); - } - fn record_f64(&mut self, field: &tracing::field::Field, value: f64) { - self.0.insert(field.name().to_string(), json!(value)); - } - fn record_error( - &mut self, - field: &tracing::field::Field, - value: &(dyn std::error::Error + 'static), - ) { - self.0 - .insert(field.name().to_string(), json!(value.to_string())); - } - fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) { - self.0 - .insert(field.name().to_string(), json!(format!("{value:?}"))); - } -} - #[cfg(test)] mod tests { use std::{ diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 73726c2e8..ae78a8487 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -204,6 +204,41 @@ pub mod runtime { } } + impl From for LogItem { + fn from(log: shuttle_common::wasm::Log) -> Self { + let file = if log.file.is_empty() { + None + } else { + Some(log.file) + }; + + let line = if log.line == 0 { None } else { Some(log.line) }; + + Self { + id: Default::default(), + timestamp: Some(Timestamp::from(SystemTime::from(log.timestamp))), + state: LogState::Running as i32, + level: LogLevel::from(log.level) as i32, + file, + line, + target: log.target, + fields: log.fields, + } + } + } + + impl From for LogLevel { + fn from(level: shuttle_common::wasm::Level) -> Self { + match level { + shuttle_common::wasm::Level::Trace => Self::Trace, + shuttle_common::wasm::Level::Debug => Self::Debug, + shuttle_common::wasm::Level::Info => Self::Info, + shuttle_common::wasm::Level::Warn => Self::Warn, + shuttle_common::wasm::Level::Error => Self::Error, + } + } + } + pub async fn start( binary_bytes: &[u8], wasm: bool, diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 7a94889e9..967764270 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -5,6 +5,7 @@ use std::ops::DerefMut; use std::os::unix::prelude::RawFd; use std::path::{Path, PathBuf}; use std::str::FromStr; +use std::sync::Mutex; use anyhow::Context; use async_trait::async_trait; @@ -13,13 +14,14 @@ use futures::TryStreamExt; use hyper::body::HttpBody; use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request, Response}; -use shuttle_common::wasm::{RequestWrapper, ResponseWrapper}; +use shuttle_common::wasm::{Bytesable, Log, RequestWrapper, ResponseWrapper}; use shuttle_proto::runtime::runtime_server::Runtime; use shuttle_proto::runtime::{ self, LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, SubscribeLogsRequest, }; use shuttle_service::ServiceName; +use tokio::sync::mpsc::{Receiver, Sender}; use tokio::sync::{mpsc, oneshot}; use tokio_stream::wrappers::ReceiverStream; use tonic::Status; @@ -31,16 +33,33 @@ use wasmtime_wasi::{WasiCtx, WasiCtxBuilder}; extern crate rmp_serde as rmps; +const LOGS_FD: u32 = 20; +const PARTS_FD: u32 = 3; +const BODY_WRITE_FD: u32 = 4; +const BODY_READ_FD: u32 = 5; + pub struct AxumWasm { - router: std::sync::Mutex>, - kill_tx: std::sync::Mutex>>, + router: Mutex>, + logs_rx: Mutex>>>, + logs_tx: Mutex>>, + kill_tx: Mutex>>, } impl AxumWasm { pub fn new() -> Self { + // Allow about 2^15 = 32k logs of backpressure + // We know the wasm currently handles about 16k requests per second (req / sec) so 16k seems to be a safe number + // As we make performance gains elsewhere this might eventually become the new bottleneck to increase :D + // + // Testing has shown that a number half the req / sec yields poor performance. A number the same as the req / sec + // seems acceptable so going with double the number for some headroom + let (tx, rx) = mpsc::channel(1 << 15); + Self { - router: std::sync::Mutex::new(None), - kill_tx: std::sync::Mutex::new(None), + router: Mutex::new(None), + logs_rx: Mutex::new(Some(rx)), + logs_tx: Mutex::new(tx), + kill_tx: Mutex::new(None), } } } @@ -77,9 +96,16 @@ impl Runtime for AxumWasm { &self, request: tonic::Request, ) -> Result, Status> { - let StartRequest { port, .. } = request.into_inner(); + let StartRequest { + deployment_id, + port, + .. + } = request.into_inner(); + let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port as u16); + let logs_tx = self.logs_tx.lock().unwrap().clone(); + let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); *self.kill_tx.lock().unwrap() = Some(kill_tx); @@ -92,7 +118,13 @@ impl Runtime for AxumWasm { .context("tried to start a service that was not loaded") .map_err(|err| Status::internal(err.to_string()))?; - tokio::spawn(run_until_stopped(router, address, kill_rx)); + tokio::spawn(run_until_stopped( + router, + deployment_id, + address, + logs_tx, + kill_rx, + )); let message = StartResponse { success: true }; @@ -105,9 +137,13 @@ impl Runtime for AxumWasm { &self, _request: tonic::Request, ) -> Result, Status> { - let (_tx, rx) = mpsc::channel(1); + let logs_rx = self.logs_rx.lock().unwrap().deref_mut().take(); - Ok(tonic::Response::new(ReceiverStream::new(rx))) + if let Some(logs_rx) = logs_rx { + Ok(tonic::Response::new(ReceiverStream::new(logs_rx))) + } else { + Err(Status::internal("logs have already been subscribed to")) + } } async fn stop( @@ -191,7 +227,9 @@ impl Router { /// Send a HTTP request with body to given endpoint on the axum-wasm router and return the response async fn handle_request( &mut self, + deployment_id: Vec, req: hyper::Request, + logs_tx: Sender>, ) -> anyhow::Result> { let wasi = WasiCtxBuilder::new() .inherit_stdio() @@ -202,6 +240,8 @@ impl Router { let mut store = Store::new(&self.engine, wasi); self.linker.module(&mut store, "axum", &self.module)?; + let (logs_stream, logs_client) = + UnixStream::pair().context("failed to open logs unixstream")?; let (mut parts_stream, parts_client) = UnixStream::pair().context("failed to open parts unixstream")?; let (mut body_write_stream, body_write_client) = @@ -209,19 +249,35 @@ impl Router { let (body_read_stream, body_read_client) = UnixStream::pair().context("failed to open body read unixstream")?; + let logs_client = WasiUnixStream::from_cap_std(logs_client); let parts_client = WasiUnixStream::from_cap_std(parts_client); let body_write_client = WasiUnixStream::from_cap_std(body_write_client); let body_read_client = WasiUnixStream::from_cap_std(body_read_client); store .data_mut() - .insert_file(3, Box::new(parts_client), FileCaps::all()); + .insert_file(LOGS_FD, Box::new(logs_client), FileCaps::all()); + + store + .data_mut() + .insert_file(PARTS_FD, Box::new(parts_client), FileCaps::all()); store .data_mut() - .insert_file(4, Box::new(body_write_client), FileCaps::all()); + .insert_file(BODY_WRITE_FD, Box::new(body_write_client), FileCaps::all()); store .data_mut() - .insert_file(5, Box::new(body_read_client), FileCaps::all()); + .insert_file(BODY_READ_FD, Box::new(body_read_client), FileCaps::all()); + + tokio::task::spawn(async move { + let mut iter = logs_stream.bytes().filter_map(Result::ok); + + while let Some(log) = Log::from_bytes(&mut iter) { + let mut log: runtime::LogItem = log.into(); + log.id = deployment_id.clone(); + + logs_tx.send(Ok(log)).await.unwrap(); + } + }); let (parts, body) = req.into_parts(); @@ -261,14 +317,22 @@ impl Router { // Call our function in wasm, telling it to route the request we've written to it // and write back a response - trace!("calling inner Router"); + trace!("calling Router"); self.linker .get(&mut store, "axum", "__SHUTTLE_Axum_call") .expect("wasm module should be loaded and the router function should be available") .into_func() .expect("router function should be a function") - .typed::<(RawFd, RawFd, RawFd), ()>(&store)? - .call(&mut store, (3, 4, 5))?; + .typed::<(RawFd, RawFd, RawFd, RawFd), ()>(&store)? + .call( + &mut store, + ( + LOGS_FD as i32, + PARTS_FD as i32, + BODY_WRITE_FD as i32, + BODY_READ_FD as i32, + ), + )?; // Read response parts from wasm let reader = BufReader::new(&mut parts_stream); @@ -295,25 +359,33 @@ impl Router { /// and a kill receiver for stopping the server. async fn run_until_stopped( router: Router, + deployment_id: Vec, address: SocketAddr, + logs_tx: Sender>, kill_rx: tokio::sync::oneshot::Receiver, ) { let make_service = make_service_fn(move |_conn| { + let deployment_id = deployment_id.clone(); let router = router.clone(); + let logs_tx = logs_tx.clone(); async move { Ok::<_, Infallible>(service_fn(move |req: Request| { + let deployment_id = deployment_id.clone(); let mut router = router.clone(); + let logs_tx = logs_tx.clone(); async move { - Ok::<_, Infallible>(match router.handle_request(req).await { - Ok(res) => res, - Err(err) => { - error!("error sending request: {}", err); - Response::builder() - .status(hyper::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(Body::empty()) - .expect("building request with empty body should not fail") - } - }) + Ok::<_, Infallible>( + match router.handle_request(deployment_id, req, logs_tx).await { + Ok(res) => res, + Err(err) => { + error!("error sending request: {}", err); + Response::builder() + .status(hyper::http::StatusCode::INTERNAL_SERVER_ERROR) + .body(Body::empty()) + .expect("building request with empty body should not fail") + } + }, + ) } })) } @@ -339,6 +411,7 @@ async fn run_until_stopped( pub mod tests { use super::*; use hyper::{http::HeaderValue, Method, Request, StatusCode, Version}; + use uuid::Uuid; #[tokio::test] async fn axum() { @@ -347,6 +420,14 @@ pub mod tests { .src("axum.wasm") .build() .unwrap(); + let id = Uuid::default().as_bytes().to_vec(); + let (tx, mut rx) = mpsc::channel(1); + + tokio::spawn(async move { + while let Some(log) = rx.recv().await { + println!("{log:?}"); + } + }); // GET /hello let request: Request = Request::builder() @@ -356,7 +437,11 @@ pub mod tests { .body(Body::empty()) .unwrap(); - let res = router.clone().handle_request(request).await.unwrap(); + let res = router + .clone() + .handle_request(id.clone(), request, tx.clone()) + .await + .unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( @@ -379,7 +464,11 @@ pub mod tests { .body(Body::from("Goodbye world body")) .unwrap(); - let res = router.clone().handle_request(request).await.unwrap(); + let res = router + .clone() + .handle_request(id.clone(), request, tx.clone()) + .await + .unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( @@ -402,7 +491,11 @@ pub mod tests { .body(Body::empty()) .unwrap(); - let res = router.clone().handle_request(request).await.unwrap(); + let res = router + .clone() + .handle_request(id.clone(), request, tx.clone()) + .await + .unwrap(); assert_eq!(res.status(), StatusCode::NOT_FOUND); @@ -415,7 +508,11 @@ pub mod tests { .body("this should be uppercased".into()) .unwrap(); - let res = router.clone().handle_request(request).await.unwrap(); + let res = router + .clone() + .handle_request(id, request, tx) + .await + .unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( diff --git a/service/Cargo.toml b/service/Cargo.toml index 523a16281..6c0baa322 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -54,6 +54,7 @@ optional = true [dependencies.shuttle-common] workspace = true +features = ["tracing"] [dev-dependencies] portpicker = "0.1.1" diff --git a/service/src/logger.rs b/service/src/logger.rs index 8572aea99..79b2f6a49 100644 --- a/service/src/logger.rs +++ b/service/src/logger.rs @@ -1,8 +1,7 @@ use chrono::Utc; -use serde_json::json; -use shuttle_common::{deployment::State, DeploymentId, LogItem}; +use shuttle_common::{deployment::State, tracing::JsonVisitor, DeploymentId, LogItem}; use tokio::sync::mpsc::UnboundedSender; -use tracing::{field::Visit, Subscriber}; +use tracing::Subscriber; use tracing_subscriber::Layer; pub struct Logger { @@ -51,57 +50,6 @@ where } } -// Boilerplate for extracting the fields from the event -#[derive(Default)] -struct JsonVisitor { - fields: serde_json::Map, - target: Option, - file: Option, - line: Option, -} - -impl JsonVisitor { - /// Ignores log metadata as it is included in the other LogItem fields (target, file, line...) - fn filter_insert(&mut self, field: &tracing::field::Field, value: serde_json::Value) { - match field.name() { - "log.line" => self.line = value.as_u64().map(|u| u as u32), - "log.target" => self.target = value.as_str().map(ToOwned::to_owned), - "log.file" => self.file = value.as_str().map(ToOwned::to_owned), - "log.module_path" => {} - name => { - self.fields.insert(name.to_string(), json!(value)); - } - } - } -} -impl Visit for JsonVisitor { - fn record_str(&mut self, field: &tracing::field::Field, value: &str) { - self.filter_insert(field, json!(value)); - } - fn record_bool(&mut self, field: &tracing::field::Field, value: bool) { - self.filter_insert(field, json!(value)); - } - fn record_u64(&mut self, field: &tracing::field::Field, value: u64) { - self.filter_insert(field, json!(value)); - } - fn record_i64(&mut self, field: &tracing::field::Field, value: i64) { - self.filter_insert(field, json!(value)); - } - fn record_f64(&mut self, field: &tracing::field::Field, value: f64) { - self.filter_insert(field, json!(value)); - } - fn record_error( - &mut self, - field: &tracing::field::Field, - value: &(dyn std::error::Error + 'static), - ) { - self.filter_insert(field, json!(value.to_string())); - } - fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) { - self.filter_insert(field, json!(format!("{value:?}"))); - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/tmp/axum-wasm-expanded/Cargo.toml b/tmp/axum-wasm-expanded/Cargo.toml index 23a77e86a..7a36a408a 100644 --- a/tmp/axum-wasm-expanded/Cargo.toml +++ b/tmp/axum-wasm-expanded/Cargo.toml @@ -12,10 +12,11 @@ crate-type = [ "cdylib" ] axum = { version = "0.6.0", default-features = false } futures = "0.3.25" futures-executor = "0.3.21" -futures = "0.3.25" http = "0.2.7" tower-service = "0.3.1" rmp-serde = { version = "1.1.1" } +tracing = "0.1.37" +tracing-subscriber = "0.3.16" [dependencies.shuttle-common] path = "../../common" diff --git a/tmp/axum-wasm-expanded/src/lib.rs b/tmp/axum-wasm-expanded/src/lib.rs index e0801ac9a..a15b022a1 100644 --- a/tmp/axum-wasm-expanded/src/lib.rs +++ b/tmp/axum-wasm-expanded/src/lib.rs @@ -4,6 +4,7 @@ use axum::{ response::{IntoResponse, Response}, }; use futures::TryStreamExt; +use tracing::debug; pub fn handle_request(req: http::Request) -> axum::response::Response { futures_executor::block_on(app(req)) @@ -23,15 +24,18 @@ async fn app(request: http::Request) -> axum::response::Response { } async fn hello() -> &'static str { + debug!("in hello()"); "Hello, World!" } async fn goodbye() -> &'static str { + debug!("in goodbye()"); "Goodbye, World!" } // Map the bytes of the body stream to uppercase and return the stream directly. async fn uppercase(body: BodyStream) -> impl IntoResponse { + debug!("in uppercase()"); let chunk_stream = body.map_ok(|chunk| { chunk .iter() @@ -44,18 +48,28 @@ async fn uppercase(body: BodyStream) -> impl IntoResponse { #[no_mangle] #[allow(non_snake_case)] pub extern "C" fn __SHUTTLE_Axum_call( - fd_3: std::os::wasi::prelude::RawFd, - fd_4: std::os::wasi::prelude::RawFd, - fd_5: std::os::wasi::prelude::RawFd, + logs_fd: std::os::wasi::prelude::RawFd, + parts_fd: std::os::wasi::prelude::RawFd, + body_read_fd: std::os::wasi::prelude::RawFd, + body_write_fd: std::os::wasi::prelude::RawFd, ) { use axum::body::HttpBody; + use shuttle_common::wasm::Logger; use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; + use tracing_subscriber::prelude::*; - println!("inner handler awoken; interacting with fd={fd_3},{fd_4},{fd_5}"); + println!("inner handler awoken; interacting with fd={logs_fd},{parts_fd},{body_read_fd},{body_write_fd}"); + + // file descriptor 2 for writing logs to + let logs_fd = unsafe { std::fs::File::from_raw_fd(logs_fd) }; + + tracing_subscriber::registry() + .with(Logger::new(logs_fd)) + .init(); // this sets the subscriber as the global default and also adds a compatibility layer for capturing `log::Record`s // file descriptor 3 for reading and writing http parts - let mut parts_fd = unsafe { std::fs::File::from_raw_fd(fd_3) }; + let mut parts_fd = unsafe { std::fs::File::from_raw_fd(parts_fd) }; let reader = std::io::BufReader::new(&mut parts_fd); @@ -63,7 +77,7 @@ pub extern "C" fn __SHUTTLE_Axum_call( let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); // file descriptor 4 for reading http body into wasm - let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(fd_4) }; + let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(body_read_fd) }; let mut reader = std::io::BufReader::new(&mut body_read_stream); let mut body_buf = Vec::new(); @@ -88,7 +102,7 @@ pub extern "C" fn __SHUTTLE_Axum_call( parts_fd.write_all(&response_parts).unwrap(); // file descriptor 5 for writing http body to host - let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(fd_5) }; + let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(body_write_fd) }; // write body if there is one if let Some(body) = futures_executor::block_on(body.data()) { diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml index aba75386b..2f5171163 100644 --- a/tmp/axum-wasm/Cargo.toml +++ b/tmp/axum-wasm/Cargo.toml @@ -15,6 +15,8 @@ futures = "0.3.25" http = "0.2.7" tower-service = "0.3.1" rmp-serde = { version = "1.1.1" } +tracing = "0.1.37" +tracing-subscriber = "0.3.16" [dependencies.shuttle-codegen] path = "../../codegen" diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs index 5be67e21c..b4620386a 100644 --- a/tmp/axum-wasm/src/lib.rs +++ b/tmp/axum-wasm/src/lib.rs @@ -1,11 +1,15 @@ +use tracing::debug; + shuttle_codegen::app! { #[shuttle_codegen::endpoint(method = get, route = "/hello")] async fn hello() -> &'static str { + debug!("called hello()"); "Hello, World!" } #[shuttle_codegen::endpoint(method = get, route = "/goodbye")] async fn goodbye() -> &'static str { + debug!("called goodbye()"); "Goodbye, World!" } } From 9697090557cd70c7e9a4abffa525bd3e225758b9 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 11 Jan 2023 08:28:54 +0200 Subject: [PATCH 24/74] misc: merge main (#572) * Merge remote-tracking branch 'upstream/main' into shuttle-next * refactor: touch ups --- .circleci/config.yml | 158 +++++++-------- CONTRIBUTING.md | 23 ++- Cargo.lock | 73 +++++-- Containerfile | 8 +- Makefile | 5 + cargo-shuttle/Cargo.toml | 2 +- cargo-shuttle/README.md | 13 +- cargo-shuttle/src/args.rs | 43 +++-- cargo-shuttle/src/client.rs | 18 +- cargo-shuttle/src/init.rs | 137 +++++++++++++ cargo-shuttle/src/lib.rs | 31 +-- cargo-shuttle/tests/integration/run.rs | 105 +++++----- common/src/models/project.rs | 50 ++++- deployer/Cargo.toml | 2 +- deployer/src/deployment/storage_manager.rs | 69 +++++++ deployer/src/lib.rs | 2 + deployer/src/persistence/mod.rs | 116 +++++++++++ gateway/src/api/latest.rs | 18 ++ gateway/src/project.rs | 204 +++++++++++++++++--- gateway/src/service.rs | 48 ++++- resources/aws-rds/Cargo.toml | 2 +- resources/persist/Cargo.toml | 4 +- resources/secrets/Cargo.toml | 2 +- resources/shared-db/Cargo.toml | 2 +- resources/static-folder/Cargo.toml | 2 +- service/Cargo.toml | 2 + service/src/lib.rs | 21 +- service/src/loader.rs | 2 +- service/tests/integration/helpers/loader.rs | 2 +- 29 files changed, 915 insertions(+), 249 deletions(-) create mode 100644 deployer/src/deployment/storage_manager.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 01a31a151..3e9650676 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -118,6 +118,10 @@ commands: type: string default: "" steps: + - run: + name: Set git tag in the environment" + command: | + echo TAG=$(git describe --tags) >> $BASH_ENV - run: name: Make artifact command: | @@ -125,12 +129,16 @@ commands: mv target/<< parameters.target >>/release/cargo-shuttle<< parameters.suffix >> shuttle/cargo-shuttle<< parameters.suffix >> mv LICENSE shuttle/ mv README.md shuttle/ - mkdir artifacts - tar -cvzf artifacts/cargo-shuttle-${CIRCLE_TAG}-<< parameters.target >>.tar.gz shuttle + mkdir -p artifacts/<< parameters.target >> + cp $BASH_ENV artifacts/bash.env + tar -cvzf artifacts/<< parameters.target >>/cargo-shuttle-$TAG-<< parameters.target >>.tar.gz shuttle + # Persist the bash environment to the workspace as well, we need it for the release job. + # https://discuss.circleci.com/t/share-environment-variable-between-different-job/45647/4 - persist_to_workspace: root: artifacts paths: - - cargo-shuttle-${CIRCLE_TAG}-<< parameters.target >>.tar.gz + - << parameters.target >>/* + - bash.env jobs: workspace-fmt: @@ -354,98 +362,94 @@ jobs: steps: - attach_workspace: at: artifacts + - run: + name: "Set tag in environment" + command: | + cat artifacts/bash.env >> "$BASH_ENV" + rm artifacts/bash.env - run: name: "Publish Release on GitHub" - environment: - GITHUB_TOKEN: $GITHUB_TOKEN + # Since each binary is in a sub directory named after its target, we flatten + # the artifacts directory before passing it to ghr command: | + find artifacts -mindepth 2 -type f -exec mv -t artifacts {} + go install github.com/tcnksm/ghr@v0.16.0 - ghr -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete -draft ${CIRCLE_TAG} artifacts/ + ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete -draft ${TAG} ./artifacts/ workflows: version: 2 ci: jobs: - - workspace-fmt - - workspace-clippy: - name: workspace-clippy-<< matrix.framework >> - requires: - - workspace-fmt - matrix: - parameters: - framework: ["web-actix-web", "web-axum", "web-rocket", "web-poem", "web-thruster", "web-tide", "web-tower","web-warp", "web-salvo", "bot-serenity"] - - check-standalone: - matrix: - parameters: - path: - - resources/aws-rds - - resources/persist - - resources/secrets - - resources/shared-db - - resources/static-folder - - service-test: - requires: - - workspace-clippy - - platform-test: - requires: - - workspace-clippy - matrix: - parameters: - crate: ["shuttle-deployer", "cargo-shuttle", "shuttle-codegen", "shuttle-common", "shuttle-proto", "shuttle-provisioner"] - - e2e-test: - requires: - - service-test - - platform-test - - check-standalone - filters: - branches: - only: production - - build-and-push: - requires: - - e2e-test + - workspace-fmt + - workspace-clippy: + name: workspace-clippy-<< matrix.framework >> + requires: + - workspace-fmt + matrix: + parameters: + framework: ["web-actix-web", "web-axum", "web-rocket", "web-poem", "web-thruster", "web-tide", "web-tower","web-warp", "web-salvo", "bot-serenity", "bot-poise"] + - check-standalone: + matrix: + parameters: + path: + - resources/aws-rds + - resources/persist + - resources/secrets + - resources/shared-db + - resources/static-folder + - service-test: + requires: + - workspace-clippy + - platform-test: + requires: + - workspace-clippy + matrix: + parameters: + crate: ["shuttle-deployer", "cargo-shuttle", "shuttle-codegen", "shuttle-common", "shuttle-proto", "shuttle-provisioner"] + - e2e-test: + requires: + - service-test + - platform-test + - check-standalone + filters: + branches: + only: production + - build-and-push: + requires: + - e2e-test + filters: + branches: + only: production + - build-binaries-linux: + name: build-binaries-x86_64 + image: ubuntu-2204:2022.04.1 + target: x86_64-unknown-linux-musl + resource_class: medium + filters: + branches: + only: production + - build-binaries-linux: + name: build-binaries-aarch64 + image: ubuntu-2004:202101-01 + target: aarch64-unknown-linux-musl + resource_class: arm.medium + filters: + branches: + only: production + - build-binaries-windows: filters: branches: only: production - - build-binaries-linux: - name: build-binaries-x86_64 - image: ubuntu-2204:2022.04.1 - target: x86_64-unknown-linux-musl - resource_class: medium + - build-binaries-mac: filters: - tags: - only: /^v.*/ branches: - only: production - - build-binaries-linux: - name: build-binaries-aarch64 - image: ubuntu-2004:202101-01 - target: aarch64-unknown-linux-musl - resource_class: arm.medium - filters: - tags: - only: /^v.*/ - branches: - only: production - - build-binaries-windows: - filters: - tags: - only: /^v.*/ - branches: - only: production - - build-binaries-mac: - filters: - tags: - only: /^v.*/ - branches: - only: production - - publish-github-release: + only: production + - publish-github-release: requires: - build-binaries-x86_64 - build-binaries-aarch64 - build-binaries-windows - build-binaries-mac filters: - tags: - only: /^v.*/ branches: - only: production + only: production diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 145a72150..f4842765a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,7 @@ Build the required images with: make images ``` -> Note: The current [Makefile](https://github.com/shuttle-hq/shuttle/blob/main/Makefile) does not work on Windows systems, if you want to build the local environment on Windows you could use [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install). +> Note: The current [Makefile](https://github.com/shuttle-hq/shuttle/blob/main/Makefile) does not work on Windows systems by itself - if you want to build the local environment on Windows you could use [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install). Additional Windows considerations are listed at the bottom of this page. The images get built with [cargo-chef](https://github.com/LukeMathWalker/cargo-chef) and therefore support incremental builds (most of the time). So they will be much faster to re-build after an incremental change in your code - should you wish to deploy it locally straight away. @@ -109,7 +109,7 @@ cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- logs The steps outlined above starts all the services used by shuttle locally (ie. both `gateway` and `deployer`). However, sometimes you will want to quickly test changes to `deployer` only. To do this replace `make up` with the following: ```bash -docker-compose -f docker-compose.rendered.yml up provisioner +docker compose -f docker-compose.rendered.yml up provisioner ``` This prevents `gateway` from starting up. Now you can start deployer only using: @@ -224,3 +224,22 @@ The rest are the following libraries: - `e2e` just contains tests which starts up the `deployer` in a container and then deploys services to it using `cargo-shuttle`. Lastly, the `user service` is not a folder in this repository, but is the user service that will be deployed by `deployer`. + +## Windows Considerations +Currently, if you try to use 'make images' on Windows, you may find that the shell files cannot be read by Bash/WSL. This is due to the fact that Windows may have pulled the files in CRLF format rather than LF[^1], which causes problems with Bash as to run the commands, Linux needs the file in LF format. + +Thankfully, we can fix this problem by simply using the `git config core.autocrlf` command to change how Git handles line endings. It takes a single argument: + +``` +git config --global core.autocrlf input +``` + +This should allow you to run `make images` and other Make commands with no issues. + +If you need to change it back for whatever reason, you can just change the last argument from 'input' to 'true' like so: +``` +git config --global core.autocrlf true +``` +After you run this command, you should be able to checkout projects that are maintained using CRLF (Windows) again. + +[^1]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_autocrlf diff --git a/Cargo.lock b/Cargo.lock index 01d04921a..ff2cff0bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1332,9 +1332,9 @@ dependencies = [ [[package]] name = "cap-fs-ext" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15ed685fe2949d035b080fbe7536b944efffb648af1d34630aa887ca2b132d2b" +checksum = "0f8079425cfd20227020f2bff1320710ca68d6eddb4f64aba8e2741b2b4d8133" dependencies = [ "cap-primitives", "cap-std", @@ -1344,9 +1344,9 @@ dependencies = [ [[package]] name = "cap-primitives" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0315442c0232cb9a1c2be55ee289a0e9bf5fd0b0f162be8e7f16673e095f5e09" +checksum = "84bf8faa0b6397a4e26082818be03641a40e3aba1afc4ec44cbd6228c73c3a61" dependencies = [ "ambient-authority", "fs-set-times", @@ -1361,9 +1361,9 @@ dependencies = [ [[package]] name = "cap-rand" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78d30c0b3c656f6193bef0697cff6bd903d9b2b1437c7af3d35a6a9d1a7af2e" +checksum = "53df044ddcb88611e19b712211b342ab106105cf658406f5ed4ee09ab10ed727" dependencies = [ "ambient-authority", "rand 0.8.5", @@ -1371,9 +1371,9 @@ dependencies = [ [[package]] name = "cap-std" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9256648eae510b29aae4d52ed71877239a61f9a2494d23ddad7fb6f50e5de8" +checksum = "e4ad2b9e262a5c3b67ee92e4b9607ace704384c50c32aa6017a9282ddf15df20" dependencies = [ "cap-primitives", "io-extras", @@ -1384,9 +1384,9 @@ dependencies = [ [[package]] name = "cap-time-ext" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384a81c0fb05dbd361f157fd2c822e3d16709540e49300d26a27d3d57f02e8cb" +checksum = "6dcbdbcced5c88b20f27c637faaed5dd283898cbefea48d2d8f3dcfaf048e5cc" dependencies = [ "cap-primitives", "once_cell", @@ -2387,6 +2387,7 @@ dependencies = [ "hashbrown", "lock_api", "parking_lot_core 0.9.3", + "serde", ] [[package]] @@ -3623,9 +3624,9 @@ dependencies = [ [[package]] name = "io-extras" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad797ac2cd70ff82f6d9246d36762b41c1db15b439fd48bcb70914269642354" +checksum = "b87bc110777311d7832025f38c4ab0f089f764644009edef3b5cbadfedee8c40" dependencies = [ "io-lifetimes", "windows-sys 0.42.0", @@ -3703,9 +3704,9 @@ checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "ittapi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "663fe0550070071ff59e981864a9cd3ee1c869ed0a088140d9ac4dc05ea6b1a1" +checksum = "e8c4f6ff06169ce7048dac5150b1501c7e3716a929721aeb06b87e51a43e42f4" dependencies = [ "anyhow", "ittapi-sys", @@ -3714,9 +3715,9 @@ dependencies = [ [[package]] name = "ittapi-sys" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e21911b7183f38c71d75ab478a527f314e28db51027037ece2e5511ed9410703" +checksum = "87e078cce01485f418bae3beb34dd604aaedf2065502853c7da17fbce8e64eda" dependencies = [ "cc", ] @@ -4752,6 +4753,37 @@ dependencies = [ "syn 1.0.104", ] +[[package]] +name = "poise" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ca787e4e516076de1995a83ee05fbdfed71d072ea0da3df018318db42a87803" +dependencies = [ + "async-trait", + "derivative", + "futures-core", + "futures-util", + "log", + "once_cell", + "parking_lot 0.12.1", + "poise_macros", + "regex", + "serenity", + "tokio", +] + +[[package]] +name = "poise_macros" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b80c1f4e04114527f9d41ed6bb31707a095276f51bb0aef3ca11f062b25a67c4" +dependencies = [ + "darling 0.14.1", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.104", +] + [[package]] name = "polling" version = "2.2.0" @@ -6055,12 +6087,16 @@ dependencies = [ "bitflags", "bytes 1.3.0", "cfg-if 1.0.0", + "chrono", + "dashmap", "flate2", "futures", "mime", "mime_guess", + "parking_lot 0.12.1", "percent-encoding", "reqwest", + "rustversion", "serde", "serde-value", "serde_json", @@ -6404,6 +6440,7 @@ dependencies = [ "num_cpus", "pipe", "poem", + "poise", "portpicker", "rocket", "salvo", @@ -8729,9 +8766,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.1+zstd.1.5.2" +version = "2.0.4+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" +checksum = "4fa202f2ef00074143e219d15b62ffc317d17cc33909feac471c044087cad7b0" dependencies = [ "cc", "libc", diff --git a/Containerfile b/Containerfile index b866f55b4..9c382250a 100644 --- a/Containerfile +++ b/Containerfile @@ -1,5 +1,6 @@ #syntax=docker/dockerfile-upstream:1.4.0-rc1 -FROM rust:1.65.0-buster as shuttle-build +ARG RUSTUP_TOOLCHAIN +FROM rust:${RUSTUP_TOOLCHAIN}-buster as shuttle-build RUN apt-get update &&\ apt-get install -y curl # download protoc binary and unzip it in usr/bin @@ -26,7 +27,8 @@ COPY --from=cache /build . ARG folder RUN cargo build --bin shuttle-${folder} -FROM rust:1.65.0-buster as shuttle-common +ARG RUSTUP_TOOLCHAIN +FROM rust:${RUSTUP_TOOLCHAIN}-buster as shuttle-common RUN apt-get update &&\ apt-get install -y curl RUN rustup component add rust-src @@ -37,4 +39,6 @@ ARG folder COPY ${folder}/prepare.sh /prepare.sh RUN /prepare.sh COPY --from=builder /build/target/debug/shuttle-${folder} /usr/local/bin/service +ARG RUSTUP_TOOLCHAIN +ENV RUSTUP_TOOLCHAIN=${RUSTUP_TOOLCHAIN} ENTRYPOINT ["/usr/local/bin/service"] diff --git a/Makefile b/Makefile index ee94af8f2..e57ba12b4 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,10 @@ endif BUILDX_FLAGS=$(BUILDX_OP) $(PLATFORM_FLAGS) $(CACHE_FLAGS) +# the rust version used by our containers, and as an override for our deployers +# ensuring all user crates are compiled with the same rustc toolchain +RUSTUP_TOOLCHAIN=1.65.0 + TAG?=$(shell git describe --tags) BACKEND_TAG?=$(TAG) DEPLOYER_TAG?=$(TAG) @@ -107,6 +111,7 @@ down: docker-compose.rendered.yml shuttle-%: ${SRC} Cargo.lock docker buildx build \ --build-arg folder=$(*) \ + --build-arg RUSTUP_TOOLCHAIN=$(RUSTUP_TOOLCHAIN) \ --tag $(CONTAINER_REGISTRY)/$(*):$(COMMIT_SHA) \ --tag $(CONTAINER_REGISTRY)/$(*):$(TAG) \ --tag $(CONTAINER_REGISTRY)/$(*):latest \ diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index d2a37e792..865cd4e67 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -63,7 +63,7 @@ path = "../resources/secrets" [dependencies.shuttle-service] workspace = true -features = ["loader", "codegen"] +features = ["loader"] [features] vendored-openssl = ["openssl/vendored"] diff --git a/cargo-shuttle/README.md b/cargo-shuttle/README.md index 964a2a478..8a4d3ff2c 100644 --- a/cargo-shuttle/README.md +++ b/cargo-shuttle/README.md @@ -77,10 +77,15 @@ To initialize a shuttle project with boilerplates, run `cargo shuttle init [OPTI Currently, `cargo shuttle init` supports the following frameworks: - `--axum`: for [axum](https://github.com/tokio-rs/axum) framework +- `--actix-web`: for [actix web](https://actix.rs/) framework - `--poem`: for [poem](https://github.com/poem-web/poem) framework - `--rocket`: for [rocket](https://rocket.rs/) framework +- `--salvo`: for [salvo](https://salvo.rs/) framework +- `--serenity`: for [serenity](https://serenity.rs/) discord bot framework +- `--thruster`: for [thruster](https://github.com/thruster-rs/Thruster) framework - `--tide`: for [tide](https://github.com/http-rs/tide) framework - `--tower`: for [tower](https://github.com/tower-rs/tower) library +- `--warp`: for [warp](https://github.com/seanmonstar/warp) framework For example, running the following command will initialize a project for [rocket](https://rocket.rs/): @@ -177,14 +182,6 @@ Check the logs of your deployed shuttle project with: $ cargo shuttle logs ``` -### Subcommand: `auth` - -Run the following to create user credentials for shuttle platform: - -```sh -$ cargo shuttle auth your-desired-username -``` - ### Subcommand: `delete` Once you are done with a deployment, you can delete it by running: diff --git a/cargo-shuttle/src/args.rs b/cargo-shuttle/src/args.rs index 9976d3f6d..e7f0d8d59 100644 --- a/cargo-shuttle/src/args.rs +++ b/cargo-shuttle/src/args.rs @@ -85,8 +85,6 @@ pub enum Command { Delete, /// manage secrets for this shuttle service Secrets, - /// create user credentials for the shuttle platform - Auth(AuthArgs), /// login to the shuttle platform Login(LoginArgs), /// run a shuttle service locally @@ -111,6 +109,8 @@ pub enum DeploymentCommand { pub enum ProjectCommand { /// create an environment for this project on shuttle New, + /// list all projects belonging to the calling account + List, /// remove this project environment from shuttle Rm, /// show the status of this project's environment on shuttle @@ -128,13 +128,6 @@ pub struct LoginArgs { pub api_key: Option, } -#[derive(Parser)] -pub struct AuthArgs { - /// the desired username for the shuttle platform - #[clap()] - pub username: String, -} - #[derive(Parser)] pub struct DeployArgs { /// allow dirty working directories to be packaged @@ -150,42 +143,48 @@ pub struct RunArgs { /// port to start service on #[clap(long, default_value = "8000")] pub port: u16, + /// use 0.0.0.0 instead of localhost (for usage with local external devices) + #[clap(long)] + pub external: bool, } #[derive(Parser, Debug)] pub struct InitArgs { /// Initialize with actix-web framework - #[clap(long="actix-web", conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] + #[clap(long="actix-web", conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] pub actix_web: bool, /// Initialize with axum framework - #[clap(long, conflicts_with_all = &["actix-web","rocket", "tide", "tower", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","rocket", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] pub axum: bool, /// Initialize with rocket framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "tide", "tower", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] pub rocket: bool, /// Initialize with tide framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tower", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] pub tide: bool, /// Initialize with tower framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "poem", "serenity", "warp", "salvo", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] pub tower: bool, /// Initialize with poem framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "serenity", "warp", "salvo", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] pub poem: bool, /// Initialize with salvo framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "poise", "thruster", "no-framework"])] pub salvo: bool, /// Initialize with serenity framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "poise", "salvo", "thruster", "no-framework"])] pub serenity: bool, + /// Initialize with poise framework + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "salvo", "thruster", "no-framework"])] + pub poise: bool, /// Initialize with warp framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "serenity", "salvo", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "serenity", "poise", "salvo", "thruster", "no-framework"])] pub warp: bool, /// Initialize with thruster framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "poise", "no-framework"])] pub thruster: bool, /// Initialize without a framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "thruster"])] + #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "poise", "thruster"])] pub no_framework: bool, /// Whether to create the environment for this project on Shuttle #[clap(long)] @@ -216,6 +215,8 @@ impl InitArgs { Some(Framework::Poem) } else if self.salvo { Some(Framework::Salvo) + } else if self.poise { + Some(Framework::Poise) } else if self.serenity { Some(Framework::Serenity) } else if self.warp { @@ -264,6 +265,7 @@ mod tests { poem: false, salvo: false, serenity: false, + poise: false, warp: false, thruster: false, no_framework: false, @@ -281,6 +283,7 @@ mod tests { "poem" => init_args.poem = true, "salvo" => init_args.salvo = true, "serenity" => init_args.serenity = true, + "poise" => init_args.poise = true, "warp" => init_args.warp = true, "thruster" => init_args.thruster = true, "none" => init_args.no_framework = true, diff --git a/cargo-shuttle/src/client.rs b/cargo-shuttle/src/client.rs index 4f3c4c778..3a7e98263 100644 --- a/cargo-shuttle/src/client.rs +++ b/cargo-shuttle/src/client.rs @@ -7,7 +7,7 @@ use reqwest_middleware::{ClientBuilder, ClientWithMiddleware, RequestBuilder}; use reqwest_retry::policies::ExponentialBackoff; use reqwest_retry::RetryTransientMiddleware; use serde::Deserialize; -use shuttle_common::models::{deployment, project, secret, service, user, ToJson}; +use shuttle_common::models::{deployment, project, secret, service, ToJson}; use shuttle_common::project::ProjectName; use shuttle_common::{ApiKey, ApiUrl, LogItem}; use tokio::net::TcpStream; @@ -33,16 +33,6 @@ impl Client { self.api_key = Some(api_key); } - pub async fn auth(&self, username: String) -> Result { - let path = format!("/users/{}", username); - - self.post(path, Option::::None) - .await - .context("failed to get API key from Shuttle server")? - .to_json() - .await - } - pub async fn deploy( &self, data: Vec, @@ -122,6 +112,12 @@ impl Client { self.get(path).await } + pub async fn get_projects_list(&self) -> Result> { + let path = "/projects".to_string(); + + self.get(path).await + } + pub async fn delete_project(&self, project: &ProjectName) -> Result { let path = format!("/projects/{}", project.as_str()); diff --git a/cargo-shuttle/src/init.rs b/cargo-shuttle/src/init.rs index ea09f305a..b36c1c52c 100644 --- a/cargo-shuttle/src/init.rs +++ b/cargo-shuttle/src/init.rs @@ -20,6 +20,7 @@ pub enum Framework { Poem, Salvo, Serenity, + Poise, Warp, Thruster, None, @@ -39,6 +40,7 @@ impl Framework { Framework::Poem => Box::new(ShuttleInitPoem), Framework::Salvo => Box::new(ShuttleInitSalvo), Framework::Serenity => Box::new(ShuttleInitSerenity), + Framework::Poise => Box::new(ShuttleInitPoise), Framework::Warp => Box::new(ShuttleInitWarp), Framework::Thruster => Box::new(ShuttleInitThruster), Framework::None => Box::new(ShuttleInitNoOp), @@ -446,6 +448,106 @@ impl ShuttleInit for ShuttleInitSerenity { } } +pub struct ShuttleInitPoise; + +impl ShuttleInit for ShuttleInitPoise { + fn set_cargo_dependencies( + &self, + dependencies: &mut Table, + manifest_path: &Path, + url: &Url, + get_dependency_version_fn: GetDependencyVersionFn, + ) { + set_inline_table_dependency_features( + "shuttle-service", + dependencies, + vec!["bot-poise".to_string()], + ); + + set_key_value_dependency_version( + "anyhow", + dependencies, + manifest_path, + url, + false, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "poise", + dependencies, + manifest_path, + url, + false, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "shuttle-secrets", + dependencies, + manifest_path, + url, + false, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "tracing", + dependencies, + manifest_path, + url, + false, + get_dependency_version_fn, + ); + } + + fn get_boilerplate_code_for_framework(&self) -> &'static str { + indoc! {r#" + use anyhow::Context as _; + use poise::serenity_prelude as serenity; + use shuttle_secrets::SecretStore; + use shuttle_service::ShuttlePoise; + + struct Data {} // User data, which is stored and accessible in all command invocations + type Error = Box; + type Context<'a> = poise::Context<'a, Data, Error>; + + /// Responds with "world!" + #[poise::command(slash_command)] + async fn hello(ctx: Context<'_>) -> Result<(), Error> { + ctx.say("world!").await?; + Ok(()) + } + + #[shuttle_service::main] + async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { + // Get the discord token set in `Secrets.toml` + let discord_token = secret_store + .get("DISCORD_TOKEN") + .context("'DISCORD_TOKEN' was not found")?; + + let framework = poise::Framework::builder() + .options(poise::FrameworkOptions { + commands: vec![hello()], + ..Default::default() + }) + .token(discord_token) + .intents(serenity::GatewayIntents::non_privileged()) + .setup(|ctx, _ready, framework| { + Box::pin(async move { + poise::builtins::register_globally(ctx, &framework.options().commands).await?; + Ok(Data {}) + }) + }) + .build() + .await + .map_err(shuttle_service::error::CustomError::new)?; + + Ok(framework) + }"#} + } +} + pub struct ShuttleInitTower; impl ShuttleInit for ShuttleInitTower { @@ -1125,6 +1227,41 @@ mod shuttle_init_tests { assert_eq!(cargo_toml.to_string(), expected); } + #[test] + fn test_set_cargo_dependencies_poise() { + let mut cargo_toml = cargo_toml_factory(); + let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); + let manifest_path = PathBuf::new(); + let url = Url::parse("https://shuttle.rs").unwrap(); + + set_inline_table_dependency_version( + "shuttle-service", + dependencies, + &manifest_path, + &url, + false, + mock_get_latest_dependency_version, + ); + + ShuttleInitPoise.set_cargo_dependencies( + dependencies, + &manifest_path, + &url, + mock_get_latest_dependency_version, + ); + + let expected = indoc! {r#" + [dependencies] + shuttle-service = { version = "1.0", features = ["bot-poise"] } + anyhow = "1.0" + poise = "1.0" + shuttle-secrets = "1.0" + tracing = "1.0" + "#}; + + assert_eq!(cargo_toml.to_string(), expected); + } + #[test] fn test_set_cargo_dependencies_warp() { let mut cargo_toml = cargo_toml_factory(); diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 3709bffff..56e4edea9 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -14,7 +14,6 @@ use std::net::{Ipv4Addr, SocketAddr}; use std::path::{Path, PathBuf}; use anyhow::{anyhow, bail, Context, Result}; -use args::AuthArgs; pub use args::{Args, Command, DeployArgs, InitArgs, LoginArgs, ProjectArgs, RunArgs}; use cargo_metadata::Message; use clap::CommandFactory; @@ -95,11 +94,11 @@ impl Shuttle { Command::Delete => self.delete(&client).await, Command::Clean => self.clean(&client).await, Command::Secrets => self.secrets(&client).await, - Command::Auth(auth_args) => self.auth(auth_args, &client).await, Command::Project(ProjectCommand::New) => self.project_create(&client).await, Command::Project(ProjectCommand::Status { follow }) => { self.project_status(&client, follow).await } + Command::Project(ProjectCommand::List) => self.projects_list(&client).await, Command::Project(ProjectCommand::Rm) => self.project_delete(&client).await, _ => { unreachable!("commands that don't need a client have already been matched") @@ -250,17 +249,6 @@ impl Shuttle { Ok(()) } - async fn auth(&mut self, auth_args: AuthArgs, client: &Client) -> Result<()> { - let user = client.auth(auth_args.username).await?; - - self.ctx.set_api_key(user.key)?; - - println!("User authorized!!!"); - println!("Run `cargo shuttle init --help` next"); - - Ok(()) - } - async fn delete(&self, client: &Client) -> Result<()> { let service = client.delete_service(self.ctx.project_name()).await?; @@ -493,7 +481,13 @@ impl Shuttle { trace!(response = ?response, "client response: "); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), run_args.port); + let addr = if run_args.external { + std::net::IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)) + } else { + Ipv4Addr::LOCALHOST.into() + }; + + let addr = SocketAddr::new(addr, run_args.port); println!( "\n{:>12} {} on http://{}", @@ -581,6 +575,15 @@ impl Shuttle { Ok(()) } + async fn projects_list(&self, client: &Client) -> Result<()> { + let projects = client.get_projects_list().await?; + let projects_table = project::get_table(&projects); + + println!("{projects_table}"); + + Ok(()) + } + async fn project_status(&self, client: &Client, follow: bool) -> Result<()> { match follow { true => { diff --git a/cargo-shuttle/tests/integration/run.rs b/cargo-shuttle/tests/integration/run.rs index 318145ffb..3207d019c 100644 --- a/cargo-shuttle/tests/integration/run.rs +++ b/cargo-shuttle/tests/integration/run.rs @@ -5,10 +5,18 @@ use std::{fs::canonicalize, process::exit, time::Duration}; use tokio::time::sleep; /// creates a `cargo-shuttle` run instance with some reasonable defaults set. -async fn cargo_shuttle_run(working_directory: &str) -> u16 { +async fn cargo_shuttle_run(working_directory: &str, external: bool) -> String { let working_directory = canonicalize(working_directory).unwrap(); + let port = pick_unused_port().unwrap(); - let run_args = RunArgs { port }; + + let url = if !external { + format!("http://localhost:{port}") + } else { + format!("http://0.0.0.0:{port}") + }; + + let run_args = RunArgs { port, external }; let runner = Shuttle::new().unwrap().run(Args { api_url: Some("http://shuttle.invalid:80".to_string()), @@ -34,12 +42,7 @@ async fn cargo_shuttle_run(working_directory: &str) -> u16 { tokio::spawn(runner); // Wait for service to be responsive - while (reqwest::Client::new() - .get(format!("http://localhost:{port}")) - .send() - .await) - .is_err() - { + while (reqwest::Client::new().get(url.clone()).send().await).is_err() { println!( "waiting for '{}' to start up...", working_directory.display() @@ -47,15 +50,15 @@ async fn cargo_shuttle_run(working_directory: &str) -> u16 { sleep(Duration::from_millis(350)).await; } - port + url } #[tokio::test(flavor = "multi_thread")] async fn rocket_hello_world() { - let port = cargo_shuttle_run("../examples/rocket/hello-world").await; + let url = cargo_shuttle_run("../examples/rocket/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -68,10 +71,10 @@ async fn rocket_hello_world() { #[tokio::test(flavor = "multi_thread")] async fn rocket_secrets() { - let port = cargo_shuttle_run("../examples/rocket/secrets").await; + let url = cargo_shuttle_run("../examples/rocket/secrets", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/secret")) + .get(format!("{url}/secret")) .send() .await .unwrap() @@ -85,11 +88,11 @@ async fn rocket_secrets() { // This example uses a shared Postgres. Thus local runs should create a docker container for it. #[tokio::test(flavor = "multi_thread")] async fn rocket_postgres() { - let port = cargo_shuttle_run("../examples/rocket/postgres").await; + let url = cargo_shuttle_run("../examples/rocket/postgres", false).await; let client = reqwest::Client::new(); let post_text = client - .post(format!("http://localhost:{port}/todo")) + .post(format!("{url}/todo")) .body("{\"note\": \"Deploy to shuttle\"}") .send() .await @@ -101,7 +104,7 @@ async fn rocket_postgres() { assert_eq!(post_text, "{\"id\":1,\"note\":\"Deploy to shuttle\"}"); let request_text = client - .get(format!("http://localhost:{port}/todo/1")) + .get(format!("{url}/todo/1")) .send() .await .unwrap() @@ -114,11 +117,11 @@ async fn rocket_postgres() { #[tokio::test(flavor = "multi_thread")] async fn rocket_authentication() { - let port = cargo_shuttle_run("../examples/rocket/authentication").await; + let url = cargo_shuttle_run("../examples/rocket/authentication", false).await; let client = reqwest::Client::new(); let public_text = client - .get(format!("http://localhost:{port}/public")) + .get(format!("{url}/public")) .send() .await .unwrap() @@ -132,7 +135,7 @@ async fn rocket_authentication() { ); let private_status = client - .get(format!("http://localhost:{port}/private")) + .get(format!("{url}/private")) .send() .await .unwrap() @@ -141,7 +144,7 @@ async fn rocket_authentication() { assert_eq!(private_status, StatusCode::FORBIDDEN); let body = client - .post(format!("http://localhost:{port}/login")) + .post(format!("{url}/login")) .body("{\"username\": \"username\", \"password\": \"password\"}") .send() .await @@ -153,7 +156,7 @@ async fn rocket_authentication() { let token = format!("Bearer {}", json["token"].as_str().unwrap()); let private_text = client - .get(format!("http://localhost:{port}/private")) + .get(format!("{url}/private")) .header("Authorization", token) .send() .await @@ -170,10 +173,10 @@ async fn rocket_authentication() { #[tokio::test(flavor = "multi_thread")] async fn actix_web_hello_world() { - let port = cargo_shuttle_run("../examples/actix-web/hello-world").await; + let url = cargo_shuttle_run("../examples/actix-web/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -186,10 +189,10 @@ async fn actix_web_hello_world() { #[tokio::test(flavor = "multi_thread")] async fn axum_hello_world() { - let port = cargo_shuttle_run("../examples/axum/hello-world").await; + let url = cargo_shuttle_run("../examples/axum/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -202,10 +205,10 @@ async fn axum_hello_world() { #[tokio::test(flavor = "multi_thread")] async fn tide_hello_world() { - let port = cargo_shuttle_run("../examples/tide/hello-world").await; + let url = cargo_shuttle_run("../examples/tide/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -218,10 +221,10 @@ async fn tide_hello_world() { #[tokio::test(flavor = "multi_thread")] async fn tower_hello_world() { - let port = cargo_shuttle_run("../examples/tower/hello-world").await; + let url = cargo_shuttle_run("../examples/tower/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -234,10 +237,10 @@ async fn tower_hello_world() { #[tokio::test(flavor = "multi_thread")] async fn warp_hello_world() { - let port = cargo_shuttle_run("../examples/warp/hello-world").await; + let url = cargo_shuttle_run("../examples/warp/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -250,10 +253,10 @@ async fn warp_hello_world() { #[tokio::test(flavor = "multi_thread")] async fn poem_hello_world() { - let port = cargo_shuttle_run("../examples/poem/hello-world").await; + let url = cargo_shuttle_run("../examples/poem/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -267,11 +270,11 @@ async fn poem_hello_world() { // This example uses a shared Postgres. Thus local runs should create a docker container for it. #[tokio::test(flavor = "multi_thread")] async fn poem_postgres() { - let port = cargo_shuttle_run("../examples/poem/postgres").await; + let url = cargo_shuttle_run("../examples/poem/postgres", false).await; let client = reqwest::Client::new(); let post_text = client - .post(format!("http://localhost:{port}/todo")) + .post(format!("{url}/todo")) .body("{\"note\": \"Deploy to shuttle\"}") .header("content-type", "application/json") .send() @@ -284,7 +287,7 @@ async fn poem_postgres() { assert_eq!(post_text, "{\"id\":1,\"note\":\"Deploy to shuttle\"}"); let request_text = client - .get(format!("http://localhost:{port}/todo/1")) + .get(format!("{url}/todo/1")) .send() .await .unwrap() @@ -298,12 +301,12 @@ async fn poem_postgres() { // This example uses a shared MongoDb. Thus local runs should create a docker container for it. #[tokio::test(flavor = "multi_thread")] async fn poem_mongodb() { - let port = cargo_shuttle_run("../examples/poem/mongodb").await; + let url = cargo_shuttle_run("../examples/poem/mongodb", false).await; let client = reqwest::Client::new(); // Post a todo note and get the persisted todo objectId let post_text = client - .post(format!("http://localhost:{port}/todo")) + .post(format!("{url}/todo")) .body("{\"note\": \"Deploy to shuttle\"}") .header("content-type", "application/json") .send() @@ -317,7 +320,7 @@ async fn poem_mongodb() { assert_eq!(post_text.len(), 24); let request_text = client - .get(format!("http://localhost:{port}/todo/{post_text}")) + .get(format!("{url}/todo/{post_text}")) .send() .await .unwrap() @@ -330,10 +333,10 @@ async fn poem_mongodb() { #[tokio::test(flavor = "multi_thread")] async fn salvo_hello_world() { - let port = cargo_shuttle_run("../examples/salvo/hello-world").await; + let url = cargo_shuttle_run("../examples/salvo/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -346,10 +349,10 @@ async fn salvo_hello_world() { #[tokio::test(flavor = "multi_thread")] async fn thruster_hello_world() { - let port = cargo_shuttle_run("../examples/thruster/hello-world").await; + let url = cargo_shuttle_run("../examples/thruster/hello-world", false).await; let request_text = reqwest::Client::new() - .get(format!("http://localhost:{port}/hello")) + .get(format!("{url}/hello")) .send() .await .unwrap() @@ -359,3 +362,19 @@ async fn thruster_hello_world() { assert_eq!(request_text, "Hello, World!"); } + +#[tokio::test(flavor = "multi_thread")] +async fn rocket_hello_world_with_router_ip() { + let url = cargo_shuttle_run("../examples/rocket/hello-world", true).await; + + let request_text = reqwest::Client::new() + .get(format!("{url}/hello")) + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + + assert_eq!(request_text, "Hello, world!"); +} diff --git a/common/src/models/project.rs b/common/src/models/project.rs index 171c4e46a..82ba3f927 100644 --- a/common/src/models/project.rs +++ b/common/src/models/project.rs @@ -1,4 +1,7 @@ -use comfy_table::Color; +use comfy_table::{ + modifiers::UTF8_ROUND_CORNERS, presets::UTF8_FULL, Cell, CellAlignment, Color, + ContentArrangement, Table, +}; use crossterm::style::Stylize; use serde::{Deserialize, Serialize}; use std::fmt::{Display, Formatter}; @@ -15,6 +18,7 @@ pub struct Response { #[strum(serialize_all = "lowercase")] pub enum State { Creating, + Attaching, Starting, Started, Ready, @@ -39,10 +43,10 @@ impl Display for Response { impl State { pub fn get_color(&self) -> Color { match self { - State::Creating | State::Starting | State::Started => Color::Cyan, - State::Ready => Color::Green, - State::Stopped | State::Stopping | State::Destroying | State::Destroyed => Color::Blue, - State::Errored => Color::Red, + Self::Creating | Self::Attaching | Self::Starting | Self::Started => Color::Cyan, + Self::Ready => Color::Green, + Self::Stopped | Self::Stopping | Self::Destroying | Self::Destroyed => Color::Blue, + Self::Errored => Color::Red, } } } @@ -52,3 +56,39 @@ pub struct AdminResponse { pub project_name: String, pub account_name: String, } + +pub fn get_table(projects: &Vec) -> String { + if projects.is_empty() { + format!( + "{}\n", + "No projects are linked to this account".yellow().bold() + ) + } else { + let mut table = Table::new(); + table + .load_preset(UTF8_FULL) + .apply_modifier(UTF8_ROUND_CORNERS) + .set_content_arrangement(ContentArrangement::DynamicFullWidth) + .set_header(vec![ + Cell::new("Project Name").set_alignment(CellAlignment::Center), + Cell::new("Status").set_alignment(CellAlignment::Center), + ]); + + for project in projects.iter() { + table.add_row(vec![ + Cell::new(&project.name), + Cell::new(&project.state) + .fg(project.state.get_color()) + .set_alignment(CellAlignment::Center), + ]); + } + + format!( + r#" +These projects are linked to this account +{} +"#, + table, + ) + } +} diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index fa10591f3..71e9fa3b4 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -53,7 +53,7 @@ workspace = true [dependencies.shuttle-service] workspace = true -features = ["loader", "codegen"] +features = ["loader"] [dev-dependencies] ctor = "0.1.26" diff --git a/deployer/src/deployment/storage_manager.rs b/deployer/src/deployment/storage_manager.rs new file mode 100644 index 000000000..5a5fa1300 --- /dev/null +++ b/deployer/src/deployment/storage_manager.rs @@ -0,0 +1,69 @@ +use std::{fs, io, path::PathBuf}; + +use uuid::Uuid; + +/// Manager to take care of directories for storing project, services and deployment files +#[derive(Clone)] +pub struct StorageManager { + artifacts_path: PathBuf, +} + +impl StorageManager { + pub fn new(artifacts_path: PathBuf) -> Self { + Self { artifacts_path } + } + + /// Path of the directory that contains extracted service Cargo projects. + pub fn builds_path(&self) -> Result { + let builds_path = self.artifacts_path.join("shuttle-builds"); + fs::create_dir_all(&builds_path)?; + + Ok(builds_path) + } + + /// Path for a specific service + pub fn service_build_path>(&self, service_name: S) -> Result { + let builds_path = self.builds_path()?.join(service_name.as_ref()); + fs::create_dir_all(&builds_path)?; + + Ok(builds_path) + } + + /// The directory in which compiled '.so' files are stored. + pub fn libraries_path(&self) -> Result { + let libs_path = self.artifacts_path.join("shuttle-libs"); + fs::create_dir_all(&libs_path)?; + + Ok(libs_path) + } + + /// Path to `.so` for a service + pub fn deployment_library_path(&self, deployment_id: &Uuid) -> Result { + let library_path = self.libraries_path()?.join(deployment_id.to_string()); + + Ok(library_path) + } + + /// Path of the directory to store user files + pub fn storage_path(&self) -> Result { + let storage_path = self.artifacts_path.join("shuttle-storage"); + fs::create_dir_all(&storage_path)?; + + Ok(storage_path) + } + + /// Path to folder for storing deployment files + pub fn deployment_storage_path>( + &self, + service_name: S, + deployment_id: &Uuid, + ) -> Result { + let storage_path = self + .storage_path()? + .join(service_name.as_ref()) + .join(deployment_id.to_string()); + fs::create_dir_all(&storage_path)?; + + Ok(storage_path) + } +} diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index 901b818e2..cb9b3bf0d 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -34,6 +34,8 @@ pub async fn start(persistence: Persistence, runtime_client: RuntimeClient Result<()> { + sqlx::query("UPDATE deployments SET state = ? WHERE state IN(?, ?, ?, ?)") + .bind(State::Stopped) + .bind(State::Queued) + .bind(State::Built) + .bind(State::Building) + .bind(State::Loading) + .execute(&self.pool) + .await?; + + Ok(()) + } + pub async fn get_or_create_service(&self, name: &str) -> Result { if let Some(service) = self.get_service_by_name(name).await? { Ok(service) @@ -554,6 +568,108 @@ mod tests { ); } + // Test that we are correctly cleaning up any stale / unexpected states for a deployment + // The reason this does not clean up two (or more) running states for a single deployment is because + // it should theoretically be impossible for a service to have two deployments in the running state. + // And even if a service where to have this, then the start ups of these deployments (more specifically + // the last deployment that is starting up) will stop all the deployments correctly. + #[tokio::test(flavor = "multi_thread")] + async fn cleanup_invalid_states() { + let (p, _) = Persistence::new_in_memory().await; + + let service_id = add_service(&p.pool).await.unwrap(); + + let queued_id = Uuid::new_v4(); + let building_id = Uuid::new_v4(); + let built_id = Uuid::new_v4(); + let loading_id = Uuid::new_v4(); + + let deployment_crashed = Deployment { + id: Uuid::new_v4(), + service_id, + state: State::Crashed, + last_update: Utc::now(), + address: None, + }; + let deployment_stopped = Deployment { + id: Uuid::new_v4(), + service_id, + state: State::Stopped, + last_update: Utc::now(), + address: None, + }; + let deployment_running = Deployment { + id: Uuid::new_v4(), + service_id, + state: State::Running, + last_update: Utc::now(), + address: Some(SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 9876)), + }; + let deployment_queued = Deployment { + id: queued_id, + service_id, + state: State::Queued, + last_update: Utc::now(), + address: None, + }; + let deployment_building = Deployment { + id: building_id, + service_id, + state: State::Building, + last_update: Utc::now(), + address: None, + }; + let deployment_built = Deployment { + id: built_id, + service_id, + state: State::Built, + last_update: Utc::now(), + address: None, + }; + let deployment_loading = Deployment { + id: loading_id, + service_id, + state: State::Loading, + last_update: Utc::now(), + address: None, + }; + + for deployment in [ + &deployment_crashed, + &deployment_stopped, + &deployment_running, + &deployment_queued, + &deployment_built, + &deployment_building, + &deployment_loading, + ] { + p.insert_deployment(deployment.clone()).await.unwrap(); + } + + p.cleanup_invalid_states().await.unwrap(); + + let actual: Vec<_> = p + .get_deployments(&service_id) + .await + .unwrap() + .into_iter() + .map(|deployment| (deployment.id, deployment.state)) + .collect(); + let expected = vec![ + (deployment_crashed.id, State::Crashed), + (deployment_stopped.id, State::Stopped), + (deployment_running.id, State::Running), + (queued_id, State::Stopped), + (built_id, State::Stopped), + (building_id, State::Stopped), + (loading_id, State::Stopped), + ]; + + assert_eq!( + actual, expected, + "invalid states should be moved to the stopped state" + ); + } #[tokio::test(flavor = "multi_thread")] async fn fetching_runnable_deployments() { let (p, _) = Persistence::new_in_memory().await; diff --git a/gateway/src/api/latest.rs b/gateway/src/api/latest.rs index 9b7093f1a..b9210cc97 100644 --- a/gateway/src/api/latest.rs +++ b/gateway/src/api/latest.rs @@ -104,6 +104,23 @@ async fn get_project( Ok(AxumJson(response)) } +async fn get_projects_list( + State(RouterState { service, .. }): State, + User { name, .. }: User, +) -> Result>, Error> { + let projects = service + .iter_user_projects_detailed(name.clone()) + .await? + .into_iter() + .map(|project| project::Response { + name: project.0.to_string(), + state: project.1.into(), + }) + .collect(); + + Ok(AxumJson(projects)) +} + #[instrument(skip_all, fields(%project))] async fn post_project( State(RouterState { @@ -457,6 +474,7 @@ impl ApiBuilder { self.router = self .router .route("/", get(get_status)) + .route("/projects", get(get_projects_list)) .route( "/projects/:project_name", get(get_project).delete(delete_project).post(post_project), diff --git a/gateway/src/project.rs b/gateway/src/project.rs index e77f4a62e..d352d9f14 100644 --- a/gateway/src/project.rs +++ b/gateway/src/project.rs @@ -8,6 +8,8 @@ use bollard::container::{ }; use bollard::errors::Error as DockerError; use bollard::models::{ContainerInspectResponse, ContainerStateStatusEnum}; +use bollard::network::{ConnectNetworkOptions, DisconnectNetworkOptions}; +use bollard::service::EndpointSettings; use bollard::system::EventsOptions; use fqdn::FQDN; use futures::prelude::*; @@ -19,7 +21,7 @@ use once_cell::sync::Lazy; use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; use tokio::time::{self, timeout}; -use tracing::{debug, error, instrument}; +use tracing::{debug, error, info, instrument}; use crate::{ ContainerSettings, DockerContext, EndState, Error, ErrorKind, IntoTryState, ProjectName, @@ -146,6 +148,7 @@ impl From for Error { #[serde(rename_all = "lowercase")] pub enum Project { Creating(ProjectCreating), + Attaching(ProjectAttaching), Starting(ProjectStarting), Started(ProjectStarted), Ready(ProjectReady), @@ -158,6 +161,7 @@ pub enum Project { impl_from_variant!(Project: ProjectCreating => Creating, + ProjectAttaching => Attaching, ProjectStarting => Starting, ProjectStarted => Started, ProjectReady => Ready, @@ -220,6 +224,7 @@ impl Project { Self::Starting(_) => "starting", Self::Stopping(_) => "stopping", Self::Creating(_) => "creating", + Self::Attaching(_) => "attaching", Self::Destroying(_) => "destroying", Self::Destroyed(_) => "destroyed", Self::Errored(_) => "error", @@ -230,6 +235,7 @@ impl Project { match self { Self::Starting(ProjectStarting { container, .. }) | Self::Started(ProjectStarted { container, .. }) + | Self::Attaching(ProjectAttaching { container, .. }) | Self::Ready(ProjectReady { container, .. }) | Self::Stopping(ProjectStopping { container }) | Self::Stopped(ProjectStopped { container }) @@ -256,6 +262,7 @@ impl From for shuttle_common::models::project::State { fn from(project: Project) -> Self { match project { Project::Creating(_) => Self::Creating, + Project::Attaching(_) => Self::Attaching, Project::Starting(_) => Self::Starting, Project::Started(_) => Self::Started, Project::Ready(_) => Self::Ready, @@ -283,6 +290,17 @@ where let mut new = match self { Self::Creating(creating) => creating.next(ctx).await.into_try_state(), + Self::Attaching(attaching) => match attaching.next(ctx).await { + Err(ProjectError { + kind: ProjectErrorKind::NoNetwork, + ctx, + .. + }) => { + // Restart the container to try and connect to the network again + Ok(ctx.unwrap().stop().unwrap()) + } + attaching => attaching.into_try_state(), + }, Self::Starting(ready) => ready.next(ctx).await.into_try_state(), Self::Started(started) => match started.next(ctx).await { Ok(ProjectReadying::Ready(ready)) => Ok(ready.into()), @@ -350,6 +368,7 @@ where async fn refresh(self, ctx: &Ctx) -> Result { let refreshed = match self { Self::Creating(creating) => Self::Creating(creating), + Self::Attaching(attaching) => Self::Attaching(attaching), Self::Starting(ProjectStarting { container }) | Self::Started(ProjectStarted { container, .. }) | Self::Ready(ProjectReady { container, .. }) @@ -463,8 +482,6 @@ impl ProjectCreating { image: default_image, prefix, provisioner_host, - network_name, - network_id, fqdn: public, .. } = ctx.container_settings(); @@ -501,9 +518,7 @@ impl ProjectCreating { "--api-address", format!("0.0.0.0:{RUNTIME_API_PORT}"), "--provisioner-address", - provisioner_host, - "--provisioner-port", - "8000", + format!("http://{provisioner_host}:8000"), "--proxy-address", "0.0.0.0:8000", "--proxy-fqdn", @@ -521,14 +536,6 @@ impl ProjectCreating { let mut config = Config::::from(container_config); - config.networking_config = deserialize_json!({ - "EndpointsConfig": { - network_name: { - "NetworkID": network_id - } - } - }); - config.host_config = deserialize_json!({ "Mounts": [{ "Target": "/opt/shuttle", @@ -559,7 +566,7 @@ impl State for ProjectCreating where Ctx: DockerContext, { - type Next = ProjectStarting; + type Next = ProjectAttaching; type Error = ProjectError; #[instrument(skip_all)] @@ -582,6 +589,85 @@ where } }) .await?; + Ok(ProjectAttaching { container }) + } +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct ProjectAttaching { + container: ContainerInspectResponse, +} + +#[async_trait] +impl State for ProjectAttaching +where + Ctx: DockerContext, +{ + type Next = ProjectStarting; + type Error = ProjectError; + + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { + let Self { container } = self; + + let container_id = container.id.as_ref().unwrap(); + let ContainerSettings { + network_name, + network_id, + .. + } = ctx.container_settings(); + + // Disconnect the bridge network before trying to start up + // For docker bug https://github.com/docker/cli/issues/1891 + // + // Also disconnecting from all network because docker just losses track of their IDs sometimes when restarting + for network in safe_unwrap!(container.network_settings.networks).keys() { + ctx.docker().disconnect_network(network, DisconnectNetworkOptions{ + container: container_id, + force: true, + }) + .await + .or_else(|err| { + if matches!(err, DockerError::DockerResponseServerError { status_code, .. } if status_code == 500) { + info!("already disconnected from the {network} network"); + Ok(()) + } else { + Err(err) + } + })?; + } + + // Make sure the container is connected to the user network + let network_config = ConnectNetworkOptions { + container: container_id, + endpoint_config: EndpointSettings { + network_id: Some(network_id.to_string()), + ..Default::default() + }, + }; + ctx.docker() + .connect_network(network_name, network_config) + .await + .or_else(|err| { + if matches!( + err, + DockerError::DockerResponseServerError { status_code, .. } if status_code == 409 + ) { + info!("already connected to the shuttle network"); + Ok(()) + } else { + error!( + error = &err as &dyn std::error::Error, + "failed to connect to shuttle network" + ); + Err(ProjectError::no_network( + "failed to connect to shuttle network", + )) + } + })?; + + let container = container.refresh(ctx).await?; + Ok(ProjectStarting { container }) } } @@ -602,6 +688,7 @@ where #[instrument(skip_all)] async fn next(self, ctx: &Ctx) -> Result { let container_id = self.container.id.as_ref().unwrap(); + ctx.docker() .start_container::(container_id, None) .await @@ -916,6 +1003,7 @@ where #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum ProjectErrorKind { Internal, + NoNetwork, } /// A runtime error coming from inside a project @@ -934,6 +1022,14 @@ impl ProjectError { ctx: None, } } + + pub fn no_network>(message: S) -> Self { + Self { + kind: ProjectErrorKind::NoNetwork, + message: message.as_ref().to_string(), + ctx: None, + } + } } impl std::fmt::Display for ProjectError { @@ -1032,22 +1128,47 @@ pub mod exec { .inspect_container(safe_unwrap!(container.id), None) .await { - if let Some(ContainerState { - status: Some(ContainerStateStatusEnum::EXITED), - .. - }) = container.state - { - debug!("{} will be revived", project_name.clone()); - _ = gateway - .new_task() - .project(project_name) - .and_then(task::run(|ctx| async move { - TaskResult::Done(Project::Stopped(ProjectStopped { - container: ctx.state.container().unwrap(), + match container.state { + Some(ContainerState { + status: Some(ContainerStateStatusEnum::EXITED), + .. + }) => { + debug!("{} will be revived", project_name.clone()); + _ = gateway + .new_task() + .project(project_name) + .and_then(task::run(|ctx| async move { + TaskResult::Done(Project::Stopped(ProjectStopped { + container: ctx.state.container().unwrap(), + })) + })) + .send(&sender) + .await; + } + Some(ContainerState { + status: Some(ContainerStateStatusEnum::RUNNING), + .. + }) + | Some(ContainerState { + status: Some(ContainerStateStatusEnum::CREATED), + .. + }) => { + debug!( + "{} is errored but ready according to docker. So restarting it", + project_name.clone() + ); + _ = gateway + .new_task() + .project(project_name) + .and_then(task::run(|ctx| async move { + TaskResult::Done(Project::Stopping(ProjectStopping { + container: ctx.state.container().unwrap(), + })) })) - })) - .send(&sender) - .await; + .send(&sender) + .await; + } + _ => {} } } } @@ -1062,6 +1183,7 @@ pub mod exec { pub mod tests { use bollard::models::ContainerState; + use bollard::service::NetworkSettings; use futures::prelude::*; use hyper::{Body, Request, StatusCode}; @@ -1084,7 +1206,21 @@ pub mod tests { image: None, from: None, }), - #[assertion = "Container created, assigned an `id`"] + #[assertion = "Container created, attach network"] + Ok(Project::Attaching(ProjectAttaching { + container: ContainerInspectResponse { + state: Some(ContainerState { + status: Some(ContainerStateStatusEnum::CREATED), + .. + }), + network_settings: Some(NetworkSettings { + networks: Some(networks), + .. + }), + .. + } + })) if networks.keys().collect::>() == vec!["bridge"], + #[assertion = "Container attached, assigned an `id`"] Ok(Project::Starting(ProjectStarting { container: ContainerInspectResponse { id: Some(container_id), @@ -1092,9 +1228,13 @@ pub mod tests { status: Some(ContainerStateStatusEnum::CREATED), .. }), + network_settings: Some(NetworkSettings { + networks: Some(networks), + .. + }), .. } - })), + })) if networks.keys().collect::>() == vec![&ctx.container_settings.network_name], #[assertion = "Container started, in a running state"] Ok(Project::Started(ProjectStarted { container: ContainerInspectResponse { diff --git a/gateway/src/service.rs b/gateway/src/service.rs index 20ca92a05..16d6bfcc9 100644 --- a/gateway/src/service.rs +++ b/gateway/src/service.rs @@ -276,6 +276,25 @@ impl GatewayService { .ok_or_else(|| Error::from_kind(ErrorKind::ProjectNotFound)) } + pub async fn iter_user_projects_detailed( + &self, + account_name: AccountName, + ) -> Result, Error> { + let iter = + query("SELECT project_name, project_state FROM projects WHERE account_name = ?1") + .bind(account_name) + .fetch_all(&self.db) + .await? + .into_iter() + .map(|row| { + ( + row.get("project_name"), + row.get::, _>("project_state").0, + ) + }); + Ok(iter) + } + pub async fn update_project( &self, project_name: &ProjectName, @@ -687,6 +706,14 @@ pub mod tests { account_name: neo.clone(), } ); + assert_eq!( + svc.iter_user_projects_detailed(neo.clone()) + .await + .unwrap() + .map(|item| item.0) + .collect::>(), + vec![matrix.clone()] + ); let mut work = svc .new_task() @@ -814,11 +841,22 @@ pub mod tests { assert_eq!(custom_domain.certificate, certificate); assert_eq!(custom_domain.private_key, private_key); - assert_err_kind!( - svc.create_custom_domain(project_name.clone(), &domain, certificate, private_key) - .await, - ErrorKind::CustomDomainAlreadyExists - ); + // Should auto replace the domain details + let certificate = "dummy certificate update"; + let private_key = "dummy private key update"; + + svc.create_custom_domain(project_name.clone(), &domain, certificate, private_key) + .await + .unwrap(); + + let custom_domain = svc + .project_details_for_custom_domain(&domain) + .await + .unwrap(); + + assert_eq!(custom_domain.project_name, project_name); + assert_eq!(custom_domain.certificate, certificate); + assert_eq!(custom_domain.private_key, private_key); Ok(()) } diff --git a/resources/aws-rds/Cargo.toml b/resources/aws-rds/Cargo.toml index 2403eeaad..bcf5652c1 100644 --- a/resources/aws-rds/Cargo.toml +++ b/resources/aws-rds/Cargo.toml @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "rds"] [dependencies] async-trait = "0.1.56" paste = "1.0.7" -shuttle-service = { path = "../../service", version = "0.8.0" } +shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"] } tokio = { version = "1.19.2", features = ["rt"] } diff --git a/resources/persist/Cargo.toml b/resources/persist/Cargo.toml index 837caf372..7686a44c1 100644 --- a/resources/persist/Cargo.toml +++ b/resources/persist/Cargo.toml @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "persistence"] async-trait = "0.1.56" bincode = "1.2.1" serde = { version = "1.0.0", features = ["derive"] } -shuttle-common = { path = "../../common", version = "0.8.0" } -shuttle-service = { path = "../../service", version = "0.8.0" } +shuttle-common = { path = "../../common", version = "0.8.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } thiserror = "1.0.32" tokio = { version = "1.19.2", features = ["rt"] } diff --git a/resources/secrets/Cargo.toml b/resources/secrets/Cargo.toml index f5b1b713e..13455707e 100644 --- a/resources/secrets/Cargo.toml +++ b/resources/secrets/Cargo.toml @@ -9,5 +9,5 @@ keywords = ["shuttle-service", "secrets"] [dependencies] async-trait = "0.1.56" -shuttle-service = { path = "../../service", version = "0.8.0" } +shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } tokio = { version = "1.19.2", features = ["rt"] } diff --git a/resources/shared-db/Cargo.toml b/resources/shared-db/Cargo.toml index 6e205e6aa..611d5126a 100644 --- a/resources/shared-db/Cargo.toml +++ b/resources/shared-db/Cargo.toml @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "database"] [dependencies] async-trait = "0.1.56" mongodb = { version = "2.3.0", optional = true } -shuttle-service = { path = "../../service", version = "0.8.0" } +shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"], optional = true } tokio = { version = "1.19.2", features = ["rt"] } diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml index 4ac0f8671..bd44daee7 100644 --- a/resources/static-folder/Cargo.toml +++ b/resources/static-folder/Cargo.toml @@ -9,7 +9,7 @@ keywords = ["shuttle-service", "static-folder"] [dependencies] async-trait = "0.1.56" -shuttle-service = { path = "../../service", version = "0.8.0" } +shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } tokio = { version = "1.19.2", features = ["rt"] } [dev-dependencies] diff --git a/service/Cargo.toml b/service/Cargo.toml index 6c0baa322..b829619c9 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -30,6 +30,7 @@ rocket = { version = "0.5.0-rc.2", optional = true } salvo = { version = "0.37.5", optional = true } serde_json = { workspace = true } serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"], optional = true } +poise = { version = "0.5.2", optional = true } sync_wrapper = { version = "0.1.1", optional = true } thiserror = { workspace = true } thruster = { version = "1.3.0", optional = true } @@ -78,4 +79,5 @@ web-poem = ["poem"] web-salvo = ["salvo"] bot-serenity = ["serenity"] +bot-poise = ["poise"] web-warp = ["warp"] diff --git a/service/src/lib.rs b/service/src/lib.rs index aafe1f887..66e673e05 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -264,8 +264,8 @@ extern crate shuttle_codegen; /// | `ShuttlePoem` | web-poem | [poem](https://docs.rs/poem/1.3.35) | 1.3.35 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/poem/hello-world) | /// | `Result` | web-tower | [tower](https://docs.rs/tower/0.4.12) | 0.14.12 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/tower/hello-world) | /// | `ShuttleSerenity` | bot-serenity | [serenity](https://docs.rs/serenity/0.11.5) | 0.11.5 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/serenity/hello-world) | -/// | `ShuttleActixWeb` | web-actix-web| [actix-web](https://docs.rs/actix-web/4.2.1)| 4.2.1 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/actix-web/hello-world) | - +/// | `ShuttlePoise` | bot-poise | [poise](https://docs.rs/poise/0.5.2) | 0.5.2 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/poise/hello-world) | +/// | `ShuttleActixWeb` | web-actix-web| [actix-web](https://docs.rs/actix-web/4.2.1)| 4.2.1 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/actix-web/hello-world) | /// /// # Getting shuttle managed resources /// Shuttle is able to manage resource dependencies for you. These resources are passed in as inputs to your `#[shuttle_service::main]` function and are configured using attributes: @@ -661,5 +661,22 @@ impl Service for serenity::Client { #[cfg(feature = "bot-serenity")] pub type ShuttleSerenity = Result; +#[cfg(feature = "bot-poise")] +#[async_trait] +impl Service for std::sync::Arc> +where + T: std::marker::Send + std::marker::Sync + 'static, + E: std::marker::Send + std::marker::Sync + 'static, +{ + async fn bind(mut self: Box, _addr: SocketAddr) -> Result<(), error::Error> { + self.start().await.map_err(error::CustomError::new)?; + + Ok(()) + } +} + +#[cfg(feature = "bot-poise")] +pub type ShuttlePoise = Result>, Error>; + pub const VERSION: &str = env!("CARGO_PKG_VERSION"); pub const NAME: &str = env!("CARGO_PKG_NAME"); diff --git a/service/src/loader.rs b/service/src/loader.rs index fd4f93cf7..19d1114c3 100644 --- a/service/src/loader.rs +++ b/service/src/loader.rs @@ -320,7 +320,7 @@ fn check_version(summary: &Summary) -> anyhow::Result<()> { { shuttle.version_req() } else { - return Err(anyhow!("this crate does not use the shutte service")); + return Err(anyhow!("this crate does not use the shuttle service")); }; if version_req.matches(&valid_version) { diff --git a/service/tests/integration/helpers/loader.rs b/service/tests/integration/helpers/loader.rs index 9f3b7294a..2d09238c2 100644 --- a/service/tests/integration/helpers/loader.rs +++ b/service/tests/integration/helpers/loader.rs @@ -24,5 +24,5 @@ pub fn build_so_create_loader(resources: &str, crate_name: &str) -> Result Date: Wed, 11 Jan 2023 09:50:58 +0100 Subject: [PATCH 25/74] fix: missing feature flag in common dep (#573) --- common/Cargo.toml | 2 +- common/src/lib.rs | 2 +- proto/Cargo.toml | 2 +- runtime/Cargo.toml | 2 +- tmp/axum-wasm-expanded/Cargo.toml | 2 +- tmp/axum-wasm/Cargo.toml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/Cargo.toml b/common/Cargo.toml index f90991bd9..e3e90ddb8 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -34,5 +34,5 @@ hyper = "0.14.3" backend = ["async-trait", "axum"] display = ["comfy-table", "crossterm"] tracing = ["serde_json"] -axum-wasm = ["http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] +wasm = ["http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json"] diff --git a/common/src/lib.rs b/common/src/lib.rs index f57e647b2..2c037786e 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -9,7 +9,7 @@ pub mod project; pub mod storage_manager; #[cfg(feature = "tracing")] pub mod tracing; -#[cfg(feature = "axum-wasm")] +#[cfg(feature = "wasm")] pub mod wasm; use serde::{Deserialize, Serialize}; diff --git a/proto/Cargo.toml b/proto/Cargo.toml index 1b7be9abb..ab998ffa0 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -18,7 +18,7 @@ uuid = { workspace = true, features = ["v4"] } [dependencies.shuttle-common] workspace = true -features = ["models"] +features = ["models", "wasm"] [build-dependencies] tonic-build = "0.8.3" diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index efc9f2713..adee32637 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -27,7 +27,7 @@ futures = "0.3.25" [dependencies.shuttle-common] workspace = true -features = ["axum-wasm"] +features = ["wasm"] [dependencies.shuttle-proto] workspace = true diff --git a/tmp/axum-wasm-expanded/Cargo.toml b/tmp/axum-wasm-expanded/Cargo.toml index 7a36a408a..81cc6ad1c 100644 --- a/tmp/axum-wasm-expanded/Cargo.toml +++ b/tmp/axum-wasm-expanded/Cargo.toml @@ -20,5 +20,5 @@ tracing-subscriber = "0.3.16" [dependencies.shuttle-common] path = "../../common" -features = ["axum-wasm"] +features = ["wasm"] version = "0.8.0" diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml index 2f5171163..07b361e91 100644 --- a/tmp/axum-wasm/Cargo.toml +++ b/tmp/axum-wasm/Cargo.toml @@ -25,5 +25,5 @@ version = "0.8.0" [dependencies.shuttle-common] path = "../../common" -features = ["axum-wasm"] +features = ["wasm"] version = "0.8.0" From 509e373e4224b33bcbf419e6b5c831002ecb5b5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Thu, 12 Jan 2023 09:11:28 +0100 Subject: [PATCH 26/74] feat: change log read to spawn blocking (#574) --- runtime/README.md | 2 +- runtime/src/axum/mod.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/README.md b/runtime/README.md index 13205bc4a..a3b0c40fb 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -5,7 +5,7 @@ Both the legacy and next examples can be run using the local client: ``` bash cd path/to/example -cargo run --manifest ../../../Cargo.toml --bin cargo-shuttle -- run +cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- run ``` When a more fine controlled testing is needed, use the instructions below. diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 967764270..86e5e929e 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -268,14 +268,14 @@ impl Router { .data_mut() .insert_file(BODY_READ_FD, Box::new(body_read_client), FileCaps::all()); - tokio::task::spawn(async move { + tokio::task::spawn_blocking(move || { let mut iter = logs_stream.bytes().filter_map(Result::ok); while let Some(log) = Log::from_bytes(&mut iter) { let mut log: runtime::LogItem = log.into(); log.id = deployment_id.clone(); - logs_tx.send(Ok(log)).await.unwrap(); + logs_tx.blocking_send(Ok(log)).unwrap(); } }); From 39c9d1cdef9345d9d0e886a394ab2b9b9da55293 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 12 Jan 2023 16:21:03 +0200 Subject: [PATCH 27/74] feat: DX (#577) * feat: shuttle-next crate for better DX * refactor: trim dependencies * bug: fix next check * ci: add shuttle-runtime * refactor: activating missing features on dependencies * refactor: update to shuttle_next::endpoint --- .circleci/config.yml | 2 +- Cargo.lock | 18 +++++++++++-- Cargo.toml | 11 ++++---- cargo-shuttle/Cargo.toml | 2 +- codegen/src/next/mod.rs | 42 +++++++++++++++---------------- common/Cargo.toml | 15 +++++------ common/src/lib.rs | 9 +++++++ deployer/Cargo.toml | 4 +-- gateway/Cargo.toml | 2 +- next/Cargo.toml | 27 ++++++++++++++++++++ next/src/lib.rs | 8 ++++++ proto/Cargo.toml | 2 +- provisioner/Cargo.toml | 2 +- runtime/Cargo.toml | 2 +- service/Cargo.toml | 2 +- service/src/lib.rs | 1 + service/src/loader.rs | 13 +++------- tmp/axum-wasm-expanded/Cargo.toml | 14 +---------- tmp/axum-wasm-expanded/src/lib.rs | 40 ++++++++++++++--------------- tmp/axum-wasm/Cargo.toml | 20 +-------------- tmp/axum-wasm/src/lib.rs | 6 ++--- 21 files changed, 133 insertions(+), 109 deletions(-) create mode 100644 next/Cargo.toml create mode 100644 next/src/lib.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 3e9650676..d14ee3eca 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -405,7 +405,7 @@ workflows: - workspace-clippy matrix: parameters: - crate: ["shuttle-deployer", "cargo-shuttle", "shuttle-codegen", "shuttle-common", "shuttle-proto", "shuttle-provisioner"] + crate: ["shuttle-deployer", "cargo-shuttle", "shuttle-codegen", "shuttle-common", "shuttle-proto", "shuttle-provisioner", "shuttle-runtime"] - e2e-test: requires: - service-test diff --git a/Cargo.lock b/Cargo.lock index ff2cff0bd..42b9b445d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6023,9 +6023,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "184c643044780f7ceb59104cef98a5a6f12cb2288a7bc701ab93a362b49fd47d" +checksum = "26b04f22b563c91331a10074bda3dd5492e3cc39d56bd557e91c0af42b6c7341" dependencies = [ "serde", ] @@ -6344,6 +6344,20 @@ dependencies = [ "uuid 1.2.2", ] +[[package]] +name = "shuttle-next" +version = "0.8.0" +dependencies = [ + "axum", + "futures-executor", + "http 0.2.8", + "rmp-serde", + "shuttle-codegen", + "shuttle-common", + "tower-service", + "tracing-subscriber", +] + [[package]] name = "shuttle-proto" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 483679463..c58f1d94e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "common", "deployer", "gateway", + "next", "proto", "provisioner", "runtime", @@ -37,13 +38,13 @@ shuttle-service = { path = "service", version = "0.8.0" } anyhow = "1.0.66" async-trait = "0.1.58" -axum = "0.6.0" -chrono = "0.4.23" +axum = { version = "0.6.0", default-features = false } +chrono = { version = "0.4.23", default-features = false, features = ["clock"] } once_cell = "1.16.0" uuid = "1.2.2" thiserror = "1.0.37" -serde = "1.0.148" +serde = { version = "1.0.148", default-features = false } serde_json = "1.0.89" tonic = "0.8.3" -tracing = "0.1.37" -tracing-subscriber = "0.3.16" +tracing = { version = "0.1.37", default-features = false } +tracing-subscriber = { version = "0.3.16", default-features = false, features = ["registry", "std"] } diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index 865cd4e67..4d484c8e3 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -45,7 +45,7 @@ toml = "0.5.9" toml_edit = "0.15.0" tonic = { workspace = true } tracing = { workspace = true } -tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } url = "2.3.1" uuid = { workspace = true, features = ["v4"] } webbrowser = "0.8.2" diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index f91c19928..3c0f93b3e 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -203,7 +203,7 @@ impl ToTokens for Endpoint { } }; - let route = quote!(.route(#route, axum::routing::#method(#function))); + let route = quote!(.route(#route, shuttle_next::routing::#method(#function))); route.to_tokens(tokens); } @@ -238,11 +238,11 @@ impl ToTokens for App { let Self { endpoints } = self; let app = quote!( - async fn __app(request: http::Request,) -> axum::response::Response + async fn __app(request: shuttle_next::Request,) -> shuttle_next::response::Response { - use tower_service::Service; + use shuttle_next::Service; - let mut router = axum::Router::new() + let mut router = shuttle_next::Router::new() #(#endpoints)*; let response = router.call(request).await.unwrap(); @@ -267,18 +267,18 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { body_read_fd: std::os::wasi::prelude::RawFd, body_write_fd: std::os::wasi::prelude::RawFd, ) { - use axum::body::HttpBody; - use shuttle_common::wasm::Logger; + use shuttle_next::body::{Body, HttpBody}; + use shuttle_next::tracing_prelude::*; + use shuttle_next::Logger; use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; - use tracing_subscriber::prelude::*; println!("inner handler awoken; interacting with fd={},{},{},{}", logs_fd, parts_fd, body_read_fd, body_write_fd); // file descriptor 2 for writing logs to let logs_fd = unsafe { std::fs::File::from_raw_fd(logs_fd) }; - tracing_subscriber::registry() + shuttle_next::tracing_registry() .with(Logger::new(logs_fd)) .init(); // this sets the subscriber as the global default and also adds a compatibility layer for capturing `log::Record`s @@ -288,7 +288,7 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { let reader = std::io::BufReader::new(&mut parts_fd); // deserialize request parts from rust messagepack - let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); + let wrapper: shuttle_next::RequestWrapper = shuttle_next::from_read(reader).unwrap(); // file descriptor 4 for reading http body into wasm let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(body_read_fd) }; @@ -297,20 +297,20 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { let mut body_buf = Vec::new(); reader.read_to_end(&mut body_buf).unwrap(); - let body = axum::body::Body::from(body_buf); + let body = Body::from(body_buf); let request = wrapper .into_request_builder() - .body(axum::body::boxed(body)) + .body(shuttle_next::body::boxed(body)) .unwrap(); println!("inner router received request: {:?}", &request); - let res = futures_executor::block_on(__app(request)); + let res = shuttle_next::block_on(__app(request)); let (parts, mut body) = res.into_parts(); // wrap and serialize response parts as rmp - let response_parts = shuttle_common::wasm::ResponseWrapper::from(parts).into_rmp(); + let response_parts = shuttle_next::ResponseWrapper::from(parts).into_rmp(); // write response parts parts_fd.write_all(&response_parts).unwrap(); @@ -319,7 +319,7 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(body_write_fd) }; // write body if there is one - if let Some(body) = futures_executor::block_on(body.data()) { + if let Some(body) = shuttle_next::block_on(body.data()) { body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); } } @@ -345,7 +345,7 @@ mod tests { }; let actual = quote!(#endpoint); - let expected = quote!(.route("/hello", axum::routing::get(hello))); + let expected = quote!(.route("/hello", shuttle_next::routing::get(hello))); assert_eq!(actual.to_string(), expected.to_string()); } @@ -370,13 +370,13 @@ mod tests { let actual = quote!(#app); let expected = quote!( async fn __app( - request: http::Request, - ) -> axum::response::Response { - use tower_service::Service; + request: shuttle_next::Request, + ) -> shuttle_next::response::Response { + use shuttle_next::Service; - let mut router = axum::Router::new() - .route("/hello", axum::routing::get(hello)) - .route("/goodbye", axum::routing::post(goodbye)); + let mut router = shuttle_next::Router::new() + .route("/hello", shuttle_next::routing::get(hello)) + .route("/goodbye", shuttle_next::routing::post(goodbye)); let response = router.call(request).await.unwrap(); diff --git a/common/Cargo.toml b/common/Cargo.toml index e3e90ddb8..47db8aa75 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -10,21 +10,21 @@ description = "Common library for the shuttle platform (https://www.shuttle.rs/) anyhow = { workspace = true, optional = true } async-trait = { workspace = true , optional = true } axum = { workspace = true, optional = true } -chrono = { workspace = true, features = ["serde"] } +chrono = { workspace = true } comfy-table = { version = "6.1.3", optional = true } crossterm = { version = "0.25.0", optional = true } http = { version = "0.2.8", optional = true } http-serde = { version = "1.1.2", optional = true } -once_cell = { workspace = true } +once_cell = { workspace = true, optional = true } reqwest = { version = "0.11.13", optional = true } rmp-serde = { version = "1.1.1", optional = true } -rustrict = "0.5.5" -serde = { workspace = true, features = ["derive"] } +rustrict = { version = "0.5.5", optional = true } +serde = { workspace = true } serde_json = { workspace = true, optional = true } -strum = { version = "0.24.1", features = ["derive"] } +strum = { version = "0.24.1", features = ["derive"], optional = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, optional = true } -uuid = { workspace = true, features = ["v4", "serde"] } +uuid = { workspace = true, features = ["v4", "serde"], optional = true } [dev-dependencies] cap-std = "1.0.2" @@ -35,4 +35,5 @@ backend = ["async-trait", "axum"] display = ["comfy-table", "crossterm"] tracing = ["serde_json"] wasm = ["http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] -models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json"] +models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json", "service"] +service = ["chrono/serde", "once_cell", "rustrict", "serde/derive", "strum", "uuid"] diff --git a/common/src/lib.rs b/common/src/lib.rs index 2c037786e..11d3741c1 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -1,11 +1,16 @@ #[cfg(feature = "backend")] pub mod backends; +#[cfg(feature = "service")] pub mod database; +#[cfg(feature = "service")] pub mod deployment; +#[cfg(feature = "service")] pub mod log; #[cfg(feature = "models")] pub mod models; +#[cfg(feature = "service")] pub mod project; +#[cfg(feature = "service")] pub mod storage_manager; #[cfg(feature = "tracing")] pub mod tracing; @@ -13,9 +18,12 @@ pub mod tracing; pub mod wasm; use serde::{Deserialize, Serialize}; +#[cfg(feature = "service")] use uuid::Uuid; +#[cfg(feature = "service")] pub use log::Item as LogItem; +#[cfg(feature = "service")] pub use log::STATE_MESSAGE; #[cfg(debug_assertions)] @@ -27,6 +35,7 @@ pub const API_URL_DEFAULT: &str = "https://api.shuttle.rs"; pub type ApiKey = String; pub type ApiUrl = String; pub type Host = String; +#[cfg(feature = "service")] pub type DeploymentId = Uuid; #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index 71e9fa3b4..21672f357 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -8,7 +8,7 @@ description = "Service with instances created per project for handling the compi [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } -axum = { workspace = true, features = ["ws"] } +axum = { workspace = true, features = ["default", "ws"] } bytes = "1.3.0" # TODO: debug the libgit2-sys conflict with cargo-edit when upgrading cargo to 0.66 cargo = "0.65.0" @@ -41,7 +41,7 @@ tower = { version = "0.4.13", features = ["make"] } tower-http = { version = "0.3.4", features = ["auth", "trace"] } tracing = { workspace = true } tracing-opentelemetry = "0.18.0" -tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } uuid = { workspace = true, features = ["v4"] } [dependencies.shuttle-common] diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 932b2e7a8..46623e80f 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -8,7 +8,7 @@ publish = false [dependencies] acme2 = "0.5.1" async-trait = { workspace = true } -axum = { workspace = true, features = [ "headers" ] } +axum = { workspace = true, features = [ "default", "headers" ] } axum-server = { version = "0.4.4", features = [ "tls-rustls" ] } base64 = "0.13.1" bollard = "0.13.0" diff --git a/next/Cargo.toml b/next/Cargo.toml new file mode 100644 index 000000000..214eaed0e --- /dev/null +++ b/next/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "shuttle-next" +version = "0.8.0" +edition.workspace = true +license.workspace = true +description = "Macros and aliases to deploy wasm on the shuttle platform (https://www.shuttle.rs/)" +homepage = "https://www.shuttle.rs" + +[lib] + +[dependencies] +# most axum features can be enabled, but "tokio" and "ws" depend on socket2 +# via "hyper/tcp" which is not compatible with wasi +axum = { workspace = true } +futures-executor = "0.3.21" +http = "0.2.7" +rmp-serde = "1.1.1" +tower-service = "0.3.1" +tracing-subscriber = { workspace = true } + +[dependencies.shuttle-codegen] +workspace = true +features = ["next"] + +[dependencies.shuttle-common] +workspace = true +features = ["wasm"] diff --git a/next/src/lib.rs b/next/src/lib.rs new file mode 100644 index 000000000..a53c79c79 --- /dev/null +++ b/next/src/lib.rs @@ -0,0 +1,8 @@ +pub use axum::*; +pub use futures_executor::block_on; +pub use http::Request; +pub use rmp_serde::from_read; +pub use shuttle_codegen::app; +pub use shuttle_common::wasm::{Logger, RequestWrapper, ResponseWrapper}; +pub use tower_service::Service; +pub use tracing_subscriber::{prelude as tracing_prelude, registry as tracing_registry}; diff --git a/proto/Cargo.toml b/proto/Cargo.toml index ab998ffa0..bc1680850 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -18,7 +18,7 @@ uuid = { workspace = true, features = ["v4"] } [dependencies.shuttle-common] workspace = true -features = ["models", "wasm"] +features = ["models", "service", "wasm"] [build-dependencies] tonic-build = "0.8.3" diff --git a/provisioner/Cargo.toml b/provisioner/Cargo.toml index 1ce62ca7b..02b1b8f50 100644 --- a/provisioner/Cargo.toml +++ b/provisioner/Cargo.toml @@ -20,7 +20,7 @@ thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } tonic = { workspace = true } tracing = { workspace = true } -tracing-subscriber = { workspace = true } +tracing-subscriber = { workspace = true, features = ["fmt"] } [dependencies.shuttle-proto] workspace = true diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index adee32637..d57b96596 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -18,7 +18,7 @@ tokio = { version = "=1.22.0", features = ["full"] } tokio-stream = "0.1.11" tonic = { workspace = true } tracing = { workspace = true } -tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } uuid = { workspace = true, features = ["v4"] } wasi-common = "4.0.0" wasmtime = "4.0.0" diff --git a/service/Cargo.toml b/service/Cargo.toml index b829619c9..261d85514 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -55,7 +55,7 @@ optional = true [dependencies.shuttle-common] workspace = true -features = ["tracing"] +features = ["tracing", "service"] [dev-dependencies] portpicker = "0.1.1" diff --git a/service/src/lib.rs b/service/src/lib.rs index 66e673e05..2ece4b571 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -680,3 +680,4 @@ pub type ShuttlePoise = Result>, Err pub const VERSION: &str = env!("CARGO_PKG_VERSION"); pub const NAME: &str = env!("CARGO_PKG_NAME"); +pub const NEXT_NAME: &str = "shuttle-next"; diff --git a/service/src/loader.rs b/service/src/loader.rs index 19d1114c3..98f42db29 100644 --- a/service/src/loader.rs +++ b/service/src/loader.rs @@ -22,7 +22,7 @@ use futures::FutureExt; use uuid::Uuid; use crate::error::CustomError; -use crate::{logger, Bootstrapper, NAME, VERSION}; +use crate::{logger, Bootstrapper, NAME, NEXT_NAME, VERSION}; use crate::{Error, Factory, ServeHandle}; const ENTRYPOINT_SYMBOL_NAME: &[u8] = b"_create_service\0"; @@ -296,17 +296,10 @@ fn make_name_unique(summary: &mut Summary, deployment_id: Uuid) { } fn is_next(summary: &Summary) -> bool { - let features = if let Some(shuttle) = summary + summary .dependencies() .iter() - .find(|dependency| dependency.package_name() == "shuttle-codegen") - { - shuttle.features() - } else { - &[] - }; - - features.contains(&InternedString::new("next")) + .any(|dependency| dependency.package_name() == NEXT_NAME) } /// Check that the crate being build is compatible with this version of loader diff --git a/tmp/axum-wasm-expanded/Cargo.toml b/tmp/axum-wasm-expanded/Cargo.toml index 81cc6ad1c..b0aab9207 100644 --- a/tmp/axum-wasm-expanded/Cargo.toml +++ b/tmp/axum-wasm-expanded/Cargo.toml @@ -7,18 +7,6 @@ edition = "2021" crate-type = [ "cdylib" ] [dependencies] -# most axum features can be enabled, but "tokio" and "ws" depend on socket2 -# via "hyper/tcp" which is not compatible with wasi -axum = { version = "0.6.0", default-features = false } futures = "0.3.25" -futures-executor = "0.3.21" -http = "0.2.7" -tower-service = "0.3.1" -rmp-serde = { version = "1.1.1" } +shuttle-next = "0.8.0" tracing = "0.1.37" -tracing-subscriber = "0.3.16" - -[dependencies.shuttle-common] -path = "../../common" -features = ["wasm"] -version = "0.8.0" diff --git a/tmp/axum-wasm-expanded/src/lib.rs b/tmp/axum-wasm-expanded/src/lib.rs index a15b022a1..84d1b8569 100644 --- a/tmp/axum-wasm-expanded/src/lib.rs +++ b/tmp/axum-wasm-expanded/src/lib.rs @@ -1,22 +1,22 @@ -use axum::{ +use futures::TryStreamExt; +use shuttle_next::{ body::BoxBody, extract::BodyStream, response::{IntoResponse, Response}, }; -use futures::TryStreamExt; use tracing::debug; -pub fn handle_request(req: http::Request) -> axum::response::Response { - futures_executor::block_on(app(req)) +pub fn handle_request(req: shuttle_next::Request) -> shuttle_next::response::Response { + shuttle_next::block_on(app(req)) } -async fn app(request: http::Request) -> axum::response::Response { - use tower_service::Service; +async fn app(request: shuttle_next::Request) -> shuttle_next::response::Response { + use shuttle_next::Service; - let mut router = axum::Router::new() - .route("/hello", axum::routing::get(hello)) - .route("/goodbye", axum::routing::get(goodbye)) - .route("/uppercase", axum::routing::post(uppercase)); + let mut router = shuttle_next::Router::new() + .route("/hello", shuttle_next::routing::get(hello)) + .route("/goodbye", shuttle_next::routing::get(goodbye)) + .route("/uppercase", shuttle_next::routing::post(uppercase)); let response = router.call(request).await.unwrap(); @@ -42,7 +42,7 @@ async fn uppercase(body: BodyStream) -> impl IntoResponse { .map(|byte| byte.to_ascii_uppercase()) .collect::>() }); - Response::new(axum::body::StreamBody::new(chunk_stream)) + Response::new(shuttle_next::body::StreamBody::new(chunk_stream)) } #[no_mangle] @@ -53,18 +53,18 @@ pub extern "C" fn __SHUTTLE_Axum_call( body_read_fd: std::os::wasi::prelude::RawFd, body_write_fd: std::os::wasi::prelude::RawFd, ) { - use axum::body::HttpBody; - use shuttle_common::wasm::Logger; + use shuttle_next::body::{Body, HttpBody}; + use shuttle_next::tracing_prelude::*; + use shuttle_next::Logger; use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; - use tracing_subscriber::prelude::*; println!("inner handler awoken; interacting with fd={logs_fd},{parts_fd},{body_read_fd},{body_write_fd}"); // file descriptor 2 for writing logs to let logs_fd = unsafe { std::fs::File::from_raw_fd(logs_fd) }; - tracing_subscriber::registry() + shuttle_next::tracing_registry() .with(Logger::new(logs_fd)) .init(); // this sets the subscriber as the global default and also adds a compatibility layer for capturing `log::Record`s @@ -74,7 +74,7 @@ pub extern "C" fn __SHUTTLE_Axum_call( let reader = std::io::BufReader::new(&mut parts_fd); // deserialize request parts from rust messagepack - let wrapper: shuttle_common::wasm::RequestWrapper = rmp_serde::from_read(reader).unwrap(); + let wrapper: shuttle_next::RequestWrapper = shuttle_next::from_read(reader).unwrap(); // file descriptor 4 for reading http body into wasm let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(body_read_fd) }; @@ -83,11 +83,11 @@ pub extern "C" fn __SHUTTLE_Axum_call( let mut body_buf = Vec::new(); reader.read_to_end(&mut body_buf).unwrap(); - let body = axum::body::Body::from(body_buf); + let body = Body::from(body_buf); let request = wrapper .into_request_builder() - .body(axum::body::boxed(body)) + .body(shuttle_next::body::boxed(body)) .unwrap(); println!("inner router received request: {:?}", &request); @@ -96,7 +96,7 @@ pub extern "C" fn __SHUTTLE_Axum_call( let (parts, mut body) = res.into_parts(); // wrap and serialize response parts as rmp - let response_parts = shuttle_common::wasm::ResponseWrapper::from(parts).into_rmp(); + let response_parts = shuttle_next::ResponseWrapper::from(parts).into_rmp(); // write response parts parts_fd.write_all(&response_parts).unwrap(); @@ -105,7 +105,7 @@ pub extern "C" fn __SHUTTLE_Axum_call( let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(body_write_fd) }; // write body if there is one - if let Some(body) = futures_executor::block_on(body.data()) { + if let Some(body) = shuttle_next::block_on(body.data()) { body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); } } diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml index 07b361e91..341c6524f 100644 --- a/tmp/axum-wasm/Cargo.toml +++ b/tmp/axum-wasm/Cargo.toml @@ -7,23 +7,5 @@ edition = "2021" crate-type = [ "cdylib" ] [dependencies] -# most axum features can be enabled, but "tokio" and "ws" depend on socket2 -# via "hyper/tcp" which is not compatible with wasi -axum = { version = "0.6.0", default-features = false } -futures-executor = "0.3.21" -futures = "0.3.25" -http = "0.2.7" -tower-service = "0.3.1" -rmp-serde = { version = "1.1.1" } +shuttle-next = "0.8.0" tracing = "0.1.37" -tracing-subscriber = "0.3.16" - -[dependencies.shuttle-codegen] -path = "../../codegen" -features = ["next"] -version = "0.8.0" - -[dependencies.shuttle-common] -path = "../../common" -features = ["wasm"] -version = "0.8.0" diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs index b4620386a..a6af35583 100644 --- a/tmp/axum-wasm/src/lib.rs +++ b/tmp/axum-wasm/src/lib.rs @@ -1,13 +1,13 @@ use tracing::debug; -shuttle_codegen::app! { - #[shuttle_codegen::endpoint(method = get, route = "/hello")] +shuttle_next::app! { + #[shuttle_next::endpoint(method = get, route = "/hello")] async fn hello() -> &'static str { debug!("called hello()"); "Hello, World!" } - #[shuttle_codegen::endpoint(method = get, route = "/goodbye")] + #[shuttle_next::endpoint(method = get, route = "/goodbye")] async fn goodbye() -> &'static str { debug!("called goodbye()"); "Goodbye, World!" From b17b3a19193779a63a6cbe914aaeb71877ede03b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 16 Jan 2023 10:34:19 +0100 Subject: [PATCH 28/74] feat: get runtime binary from cargo install (#578) * feat: get runtime binary from cargo install * refactor: remove build.rs * refactor: determine environment with debug assertions * ci: comment out cargo-sort installation * fix: clippy * feat: use cargo home dir, install runtime in prepare.sh * fix: unused import * refactor: build from local version in prepare.sh * fix: local debug run installing from incorrect path * feat: canonicalize path to debug runtime * feat: set release runtime install branch to prod * refactor: move secondary protoc install to common stage --- .circleci/config.yml | 4 +-- Cargo.lock | 1 + Containerfile | 5 ++++ cargo-shuttle/build.rs | 17 ------------ cargo-shuttle/src/lib.rs | 3 --- deployer/build.rs | 17 ------------ deployer/prepare.sh | 3 +++ deployer/src/main.rs | 3 --- proto/Cargo.toml | 1 + proto/src/lib.rs | 58 +++++++++++++++++++++++----------------- 10 files changed, 46 insertions(+), 66 deletions(-) delete mode 100644 cargo-shuttle/build.rs delete mode 100644 deployer/build.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index d14ee3eca..910fb6085 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -148,9 +148,9 @@ jobs: - restore-cargo-cache - install-protoc - run: cargo fmt --all --check - - run: cargo install cargo-sort # TODO: this is incompatible with workspace inheritance, uncomment when # https://github.com/DevinR528/cargo-sort/pull/29 is merged + # - run: cargo install cargo-sort # - run: cargo sort --check --workspace - run: cargo check --workspace --all-targets - save-cargo-cache @@ -185,9 +185,9 @@ jobs: - install-protoc - apply-patches - run: cargo fmt --all --check --manifest-path << parameters.path >>/Cargo.toml - - run: cargo install cargo-sort # TODO: this is incompatible with workspace inheritance, uncomment when # https://github.com/DevinR528/cargo-sort/pull/29 is merged + # - run: cargo install cargo-sort # - run: cargo sort --check << parameters.path >> - run: | cargo clippy --tests \ diff --git a/Cargo.lock b/Cargo.lock index 42b9b445d..e94855c62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6364,6 +6364,7 @@ version = "0.8.0" dependencies = [ "anyhow", "chrono", + "home", "prost", "prost-types", "shuttle-common", diff --git a/Containerfile b/Containerfile index 9c382250a..015bfae3f 100644 --- a/Containerfile +++ b/Containerfile @@ -31,6 +31,11 @@ ARG RUSTUP_TOOLCHAIN FROM rust:${RUSTUP_TOOLCHAIN}-buster as shuttle-common RUN apt-get update &&\ apt-get install -y curl +# download protoc binary and unzip it in usr/bin +RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.9/protoc-21.9-linux-x86_64.zip &&\ + unzip -o protoc-21.9-linux-x86_64.zip -d /usr bin/protoc &&\ + unzip -o protoc-21.9-linux-x86_64.zip -d /usr/ 'include/*' &&\ + rm -f protoc-21.9-linux-x86_64.zip RUN rustup component add rust-src COPY --from=cache /build/ /usr/src/shuttle/ diff --git a/cargo-shuttle/build.rs b/cargo-shuttle/build.rs deleted file mode 100644 index 4503a843d..000000000 --- a/cargo-shuttle/build.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::{env, process::Command}; - -fn main() { - println!("cargo:rerun-if-changed=../runtime"); - - // Build binary for runtime so that it can be embedded in the binary for the cli - let out_dir = env::var_os("OUT_DIR").unwrap(); - Command::new("cargo") - .arg("build") - .arg("--package") - .arg("shuttle-runtime") - .arg("--target-dir") - .arg(out_dir) - .arg("--release") - .output() - .expect("failed to build the shuttle runtime"); -} diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 56e4edea9..e6851fb4c 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -39,8 +39,6 @@ use uuid::Uuid; use crate::args::{DeploymentCommand, ProjectCommand}; use crate::client::Client; -const BINARY_BYTES: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/release/shuttle-runtime")); - pub struct Shuttle { ctx: RequestContext, } @@ -412,7 +410,6 @@ impl Shuttle { run_args.port + 1, )); let (mut runtime, mut runtime_client) = runtime::start( - BINARY_BYTES, is_wasm, runtime::StorageManagerType::WorkingDir(working_directory.to_path_buf()), &format!("http://localhost:{}", run_args.port + 1), diff --git a/deployer/build.rs b/deployer/build.rs deleted file mode 100644 index ad2a67032..000000000 --- a/deployer/build.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::{env, process::Command}; - -fn main() { - println!("cargo:rerun-if-changed=../runtime"); - - // Build binary for runtime so that it can be embedded in the binary for deployer - let out_dir = env::var_os("OUT_DIR").unwrap(); - Command::new("cargo") - .arg("build") - .arg("--package") - .arg("shuttle-runtime") - .arg("--target-dir") - .arg(out_dir) - .arg("--release") - .output() - .expect("failed to build the shuttle runtime"); -} diff --git a/deployer/prepare.sh b/deployer/prepare.sh index 70eac8a23..119b2e834 100755 --- a/deployer/prepare.sh +++ b/deployer/prepare.sh @@ -15,6 +15,9 @@ shuttle-shared-db = { path = "/usr/src/shuttle/resources/shared-db" } shuttle-secrets = { path = "/usr/src/shuttle/resources/secrets" } shuttle-static-folder = { path = "/usr/src/shuttle/resources/static-folder" }' > $CARGO_HOME/config.toml +# Install the shuttle runtime +cargo install shuttle-runtime --path "/usr/src/shuttle/runtime" + # Make future crates requests to our own mirror echo ' [source.shuttle-crates-io-mirror] diff --git a/deployer/src/main.rs b/deployer/src/main.rs index 846f5c30c..d14296fef 100644 --- a/deployer/src/main.rs +++ b/deployer/src/main.rs @@ -9,8 +9,6 @@ use tracing::{error, trace}; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; -const BINARY_BYTES: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/release/shuttle-runtime")); - // The `multi_thread` is needed to prevent a deadlock in shuttle_service::loader::build_crate() which spawns two threads // Without this, both threads just don't start up #[tokio::main(flavor = "multi_thread")] @@ -41,7 +39,6 @@ async fn main() { .init(); let (mut runtime, mut runtime_client) = runtime::start( - BINARY_BYTES, false, runtime::StorageManagerType::Artifacts(args.artifacts_path.clone()), &args.provisioner_address.uri().to_string(), diff --git a/proto/Cargo.toml b/proto/Cargo.toml index bc1680850..9e44fa415 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -9,6 +9,7 @@ publish = false [dependencies] anyhow = { workspace = true } chrono = { workspace = true } +home = "0.5.4" prost = "0.11.2" prost-types = "0.11.0" tokio = { version = "1.22.0", features = ["process"] } diff --git a/proto/src/lib.rs b/proto/src/lib.rs index ae78a8487..887e54a81 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -96,10 +96,8 @@ pub mod provisioner { pub mod runtime { use std::{ - env::temp_dir, - fs::OpenOptions, - io::Write, path::PathBuf, + process::Command, time::{Duration, SystemTime}, }; @@ -240,7 +238,6 @@ pub mod runtime { } pub async fn start( - binary_bytes: &[u8], wasm: bool, storage_manager_type: StorageManagerType, provisioner_address: &str, @@ -252,7 +249,7 @@ pub mod runtime { StorageManagerType::WorkingDir(path) => ("working-dir", path), }; - let runtime_executable = get_runtime_executable(binary_bytes); + let runtime_executable = get_runtime_executable(); let runtime = process::Command::new(runtime_executable) .args([ @@ -283,27 +280,40 @@ pub mod runtime { Ok((runtime, runtime_client)) } - fn get_runtime_executable(binary_bytes: &[u8]) -> PathBuf { - let tmp_dir = temp_dir(); - - let path = tmp_dir.join("shuttle-runtime"); - let mut open_options = OpenOptions::new(); - open_options.write(true).create(true).truncate(true); - - #[cfg(target_family = "unix")] - { - use std::os::unix::prelude::OpenOptionsExt; - - open_options.mode(0o755); + fn get_runtime_executable() -> PathBuf { + // When this library is compiled in debug mode with `cargo run --bin cargo-shuttle`, + // install the checked-out local version of `shuttle-runtime + if cfg!(debug_assertions) { + // Path to cargo-shuttle + let manifest_dir = env!("CARGO_MANIFEST_DIR"); + + // Canonicalized path to shuttle-runtime + let path = std::fs::canonicalize(format!("{manifest_dir}/../runtime")) + .expect("failed to canonicalize path to runtime"); + + Command::new("cargo") + .arg("install") + .arg("shuttle-runtime") + .arg("--path") + .arg(path) + .output() + .expect("failed to install the shuttle runtime"); + // When this library is compiled in release mode with `cargo install cargo-shuttle`, + // install the latest released `shuttle-runtime` + } else { + Command::new("cargo") + .arg("install") + .arg("shuttle-runtime") + .arg("--git") + .arg("https://github.com/shuttle-hq/shuttle") + .arg("--branch") + .arg("production") + .output() + .expect("failed to install the shuttle runtime"); } - let mut file = open_options - .open(&path) - .expect("to create runtime executable file"); - - file.write_all(binary_bytes) - .expect("to write out binary file"); + let cargo_home = home::cargo_home().expect("failed to find cargo home directory"); - path + cargo_home.join("bin/shuttle-runtime") } } From cc072b2bb392126c075aa80bf03fd482ddda4f6d Mon Sep 17 00:00:00 2001 From: Pieter Date: Mon, 16 Jan 2023 13:29:31 +0200 Subject: [PATCH 29/74] feat: deployer next (#575) * feat: propagate next runtime * feat: store is_next in DB * feat: runtime manager to allow deployer to start up both runtimes * feat: make sure tests run * refactor: better migration query * refactor: handle runtime errors better * feat: shutdown runtimes * bug: missing so * bug: stop services * bug: ffi and runtime manager not living long enough * bug: missing so error * refactor: run cleanups * refactor: clippy suggestions --- cargo-shuttle/src/lib.rs | 1 + codegen/src/next/mod.rs | 1 + deployer/migrations/0001_next.sql | 1 + deployer/src/deployment/deploy_layer.rs | 96 +++------ deployer/src/deployment/mod.rs | 43 ++-- deployer/src/deployment/queue.rs | 52 +++-- deployer/src/deployment/run.rs | 248 ++++++++++++++---------- deployer/src/error.rs | 6 +- deployer/src/handlers/mod.rs | 1 + deployer/src/lib.rs | 17 +- deployer/src/main.rs | 36 +--- deployer/src/persistence/deployment.rs | 17 +- deployer/src/persistence/mod.rs | 78 ++++++-- deployer/src/runtime_manager.rs | 127 ++++++++++++ proto/src/lib.rs | 5 +- runtime/src/args.rs | 4 + runtime/src/legacy/mod.rs | 10 + runtime/src/main.rs | 2 +- service/src/loader.rs | 2 + tmp/axum-wasm/Cargo.toml | 4 + tmp/axum-wasm/src/lib.rs | 24 +++ 21 files changed, 525 insertions(+), 250 deletions(-) create mode 100644 deployer/migrations/0001_next.sql create mode 100644 deployer/src/runtime_manager.rs diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index e6851fb4c..16c7866f9 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -413,6 +413,7 @@ impl Shuttle { is_wasm, runtime::StorageManagerType::WorkingDir(working_directory.to_path_buf()), &format!("http://localhost:{}", run_args.port + 1), + run_args.port + 2, ) .await .map_err(|err| { diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index 3c0f93b3e..5e8ad4e88 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -259,6 +259,7 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { quote!( #app + #[cfg(not(test))] #[no_mangle] #[allow(non_snake_case)] pub extern "C" fn __SHUTTLE_Axum_call( diff --git a/deployer/migrations/0001_next.sql b/deployer/migrations/0001_next.sql new file mode 100644 index 000000000..42b89c217 --- /dev/null +++ b/deployer/migrations/0001_next.sql @@ -0,0 +1 @@ +ALTER TABLE deployments ADD COLUMN is_next BOOLEAN DEFAULT 0 NOT NULL; diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index afe795a72..5b56dcba0 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -23,8 +23,8 @@ use chrono::{DateTime, Utc}; use serde_json::json; use shuttle_common::{tracing::JsonVisitor, STATE_MESSAGE}; use shuttle_proto::runtime; -use std::{net::SocketAddr, str::FromStr, time::SystemTime}; -use tracing::{error, field::Visit, span, warn, Metadata, Subscriber}; +use std::{str::FromStr, time::SystemTime}; +use tracing::{field::Visit, span, warn, Metadata, Subscriber}; use tracing_subscriber::Layer; use uuid::Uuid; @@ -63,8 +63,6 @@ pub struct Log { pub fields: serde_json::Value, pub r#type: LogType, - - pub address: Option, } impl From for persistence::Log { @@ -106,23 +104,10 @@ impl From for shuttle_common::LogItem { impl From for DeploymentState { fn from(log: Log) -> Self { - let address = if let Some(address_str) = log.address { - match SocketAddr::from_str(&address_str) { - Ok(address) => Some(address), - Err(err) => { - error!(error = %err, "failed to convert to [SocketAddr]"); - None - } - } - } else { - None - }; - Self { id: log.id, state: log.state, last_update: log.timestamp, - address, } } } @@ -139,7 +124,6 @@ impl From for Log { target: log.target, fields: serde_json::from_slice(&log.fields).unwrap(), r#type: LogType::Event, - address: None, } } } @@ -230,7 +214,6 @@ where .unwrap_or_else(|| metadata.target().to_string()), fields: serde_json::Value::Object(visitor.fields), r#type: LogType::Event, - address: None, }); break; } @@ -274,7 +257,6 @@ where target: metadata.target().to_string(), fields: Default::default(), r#type: LogType::State, - address: details.address.clone(), }); extensions.insert::(details); @@ -286,7 +268,6 @@ where struct ScopeDetails { id: Uuid, state: State, - address: Option, } impl From<&tracing::Level> for LogLevel { @@ -314,9 +295,6 @@ impl NewStateVisitor { /// Field containing the deployment state identifier const STATE_IDENT: &'static str = "state"; - /// Field containing the deployment address identifier - const ADDRESS_IDENT: &'static str = "address"; - fn is_valid(metadata: &Metadata) -> bool { metadata.is_span() && metadata.fields().field(Self::ID_IDENT).is_some() @@ -330,8 +308,6 @@ impl Visit for NewStateVisitor { self.details.state = State::from_str(&format!("{value:?}")).unwrap_or_default(); } else if field.name() == Self::ID_IDENT { self.details.id = Uuid::try_parse(&format!("{value:?}")).unwrap_or_default(); - } else if field.name() == Self::ADDRESS_IDENT { - self.details.address = Some(format!("{value:?}")); } } } @@ -340,17 +316,18 @@ impl Visit for NewStateVisitor { mod tests { use std::{ fs::read_dir, + net::SocketAddr, path::PathBuf, sync::{Arc, Mutex}, time::Duration, }; + use crate::{persistence::DeploymentUpdater, RuntimeManager}; use axum::body::Bytes; use ctor::ctor; use flate2::{write::GzEncoder, Compression}; - use shuttle_proto::runtime::runtime_client::RuntimeClient; + use tempdir::TempDir; use tokio::{select, time::sleep}; - use tonic::transport::Channel; use tracing_subscriber::prelude::*; use uuid::Uuid; @@ -383,7 +360,6 @@ mod tests { struct StateLog { id: Uuid, state: State, - has_address: bool, } impl From for StateLog { @@ -391,7 +367,6 @@ mod tests { Self { id: log.id, state: log.state, - has_address: log.address.is_some(), } } } @@ -423,10 +398,12 @@ mod tests { } } - async fn get_runtime_client() -> RuntimeClient { - RuntimeClient::connect("http://127.0.0.1:6001") - .await - .unwrap() + fn get_runtime_manager() -> Arc> { + let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); + let path = tmp_dir.into_path(); + let (tx, _rx) = crossbeam_channel::unbounded(); + + RuntimeManager::new(path, "http://provisioner:8000".to_string(), tx) } #[async_trait::async_trait] @@ -449,6 +426,22 @@ mod tests { } } + #[derive(Clone)] + struct StubDeploymentUpdater; + + #[async_trait::async_trait] + impl DeploymentUpdater for StubDeploymentUpdater { + type Err = std::io::Error; + + async fn set_address(&self, _id: &Uuid, _address: &SocketAddr) -> Result<(), Self::Err> { + Ok(()) + } + + async fn set_is_next(&self, _id: &Uuid, _is_next: bool) -> Result<(), Self::Err> { + Ok(()) + } + } + #[derive(Clone)] struct StubActiveDeploymentGetter; @@ -527,27 +520,22 @@ mod tests { StateLog { id, state: State::Queued, - has_address: false, }, StateLog { id, state: State::Building, - has_address: false, }, StateLog { id, state: State::Built, - has_address: false, }, StateLog { id, state: State::Loading, - has_address: true, }, StateLog { id, state: State::Running, - has_address: true, }, ] ); @@ -577,32 +565,26 @@ mod tests { StateLog { id, state: State::Queued, - has_address: false, }, StateLog { id, state: State::Building, - has_address: false, }, StateLog { id, state: State::Built, - has_address: false, }, StateLog { id, state: State::Loading, - has_address: true, }, StateLog { id, state: State::Running, - has_address: true, }, StateLog { id, state: State::Stopped, - has_address: false, }, ] ); @@ -639,32 +621,26 @@ mod tests { StateLog { id, state: State::Queued, - has_address: false, }, StateLog { id, state: State::Building, - has_address: false, }, StateLog { id, state: State::Built, - has_address: false, }, StateLog { id, state: State::Loading, - has_address: true, }, StateLog { id, state: State::Running, - has_address: true, }, StateLog { id, state: State::Completed, - has_address: false, }, ] ); @@ -712,32 +688,26 @@ mod tests { StateLog { id, state: State::Queued, - has_address: false, }, StateLog { id, state: State::Building, - has_address: false, }, StateLog { id, state: State::Built, - has_address: false, }, StateLog { id, state: State::Loading, - has_address: true, }, StateLog { id, state: State::Running, - has_address: true, }, StateLog { id, state: State::Crashed, - has_address: false, }, ] ); @@ -785,27 +755,22 @@ mod tests { StateLog { id, state: State::Queued, - has_address: false, }, StateLog { id, state: State::Building, - has_address: false, }, StateLog { id, state: State::Built, - has_address: false, }, StateLog { id, state: State::Loading, - has_address: true, }, StateLog { id, state: State::Crashed, - has_address: false, }, ] ); @@ -833,6 +798,7 @@ mod tests { service_name: "run-test".to_string(), service_id: Uuid::new_v4(), tracing_context: Default::default(), + is_next: false, }) .await; @@ -854,17 +820,14 @@ mod tests { StateLog { id, state: State::Built, - has_address: false, }, StateLog { id, state: State::Loading, - has_address: true, }, StateLog { id, state: State::Crashed, - has_address: false, }, ] ); @@ -905,7 +868,8 @@ mod tests { .active_deployment_getter(StubActiveDeploymentGetter) .artifacts_path(PathBuf::from("/tmp")) .secret_getter(StubSecretGetter) - .runtime(get_runtime_client().await) + .runtime(get_runtime_manager()) + .deployment_updater(StubDeploymentUpdater) .queue_client(StubBuildQueueClient) .build() } diff --git a/deployer/src/deployment/mod.rs b/deployer/src/deployment/mod.rs index 0048573ae..121a4c926 100644 --- a/deployer/src/deployment/mod.rs +++ b/deployer/src/deployment/mod.rs @@ -3,18 +3,19 @@ pub mod gateway_client; mod queue; mod run; -use std::path::PathBuf; +use std::{path::PathBuf, sync::Arc}; pub use queue::Queued; pub use run::{ActiveDeploymentsGetter, Built}; use shuttle_common::storage_manager::ArtifactsStorageManager; -use shuttle_proto::runtime::runtime_client::RuntimeClient; -use tonic::transport::Channel; use tracing::{instrument, Span}; use tracing_opentelemetry::OpenTelemetrySpanExt; -use crate::persistence::{SecretGetter, SecretRecorder, State}; -use tokio::sync::{broadcast, mpsc}; +use crate::{ + persistence::{DeploymentUpdater, SecretGetter, SecretRecorder, State}, + RuntimeManager, +}; +use tokio::sync::{broadcast, mpsc, Mutex}; use uuid::Uuid; use self::{deploy_layer::LogRecorder, gateway_client::BuildQueueClient}; @@ -23,21 +24,23 @@ const QUEUE_BUFFER_SIZE: usize = 100; const RUN_BUFFER_SIZE: usize = 100; const KILL_BUFFER_SIZE: usize = 10; -pub struct DeploymentManagerBuilder { +pub struct DeploymentManagerBuilder { build_log_recorder: Option, secret_recorder: Option, active_deployment_getter: Option, artifacts_path: Option, - runtime_client: Option>, + runtime_manager: Option>>, + deployment_updater: Option, secret_getter: Option, queue_client: Option, } -impl DeploymentManagerBuilder +impl DeploymentManagerBuilder where LR: LogRecorder, SR: SecretRecorder, ADG: ActiveDeploymentsGetter, + DU: DeploymentUpdater, SG: SecretGetter, QC: BuildQueueClient, { @@ -77,8 +80,14 @@ where self } - pub fn runtime(mut self, runtime_client: RuntimeClient) -> Self { - self.runtime_client = Some(runtime_client); + pub fn runtime(mut self, runtime_manager: Arc>) -> Self { + self.runtime_manager = Some(runtime_manager); + + self + } + + pub fn deployment_updater(mut self, deployment_updater: DU) -> Self { + self.deployment_updater = Some(deployment_updater); self } @@ -97,7 +106,10 @@ where .expect("an active deployment getter to be set"); let artifacts_path = self.artifacts_path.expect("artifacts path to be set"); let queue_client = self.queue_client.expect("a queue client to be set"); - let runtime_client = self.runtime_client.expect("a runtime client to be set"); + let runtime_manager = self.runtime_manager.expect("a runtime manager to be set"); + let deployment_updater = self + .deployment_updater + .expect("a deployment updater to be set"); let secret_getter = self.secret_getter.expect("a secret getter to be set"); let (queue_send, queue_recv) = mpsc::channel(QUEUE_BUFFER_SIZE); @@ -110,6 +122,7 @@ where tokio::spawn(queue::task( queue_recv, run_send_clone, + deployment_updater.clone(), build_log_recorder, secret_recorder, storage_manager.clone(), @@ -117,7 +130,8 @@ where )); tokio::spawn(run::task( run_recv, - runtime_client, + runtime_manager, + deployment_updater, kill_send.clone(), active_deployment_getter, secret_getter, @@ -158,13 +172,14 @@ pub struct DeploymentManager { impl DeploymentManager { /// Create a new deployment manager. Manages one or more 'pipelines' for /// processing service building, loading, and deployment. - pub fn builder() -> DeploymentManagerBuilder { + pub fn builder() -> DeploymentManagerBuilder { DeploymentManagerBuilder { build_log_recorder: None, secret_recorder: None, active_deployment_getter: None, artifacts_path: None, - runtime_client: None, + runtime_manager: None, + deployment_updater: None, secret_getter: None, queue_client: None, } diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index c3bcd1e52..9e871986c 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -2,7 +2,7 @@ use super::deploy_layer::{Log, LogRecorder, LogType}; use super::gateway_client::BuildQueueClient; use super::{Built, QueueReceiver, RunSender, State}; use crate::error::{Error, Result, TestError}; -use crate::persistence::{LogLevel, SecretRecorder}; +use crate::persistence::{DeploymentUpdater, LogLevel, SecretRecorder}; use shuttle_common::storage_manager::{ArtifactsStorageManager, StorageManager}; use cargo::util::interning::InternedString; @@ -34,6 +34,7 @@ use tokio::fs; pub async fn task( mut recv: QueueReceiver, run_send: RunSender, + deployment_updater: impl DeploymentUpdater, log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, storage_manager: ArtifactsStorageManager, @@ -46,6 +47,7 @@ pub async fn task( info!("Queued deployment at the front of the queue: {id}"); + let deployment_updater = deployment_updater.clone(); let run_send_cloned = run_send.clone(); let log_recorder = log_recorder.clone(); let secret_recorder = secret_recorder.clone(); @@ -71,7 +73,12 @@ pub async fn task( } match queued - .handle(storage_manager, log_recorder, secret_recorder) + .handle( + storage_manager, + deployment_updater, + log_recorder, + secret_recorder, + ) .await { Ok(built) => promote_to_run(built, run_send_cloned).await, @@ -144,10 +151,11 @@ pub struct Queued { } impl Queued { - #[instrument(skip(self, storage_manager, log_recorder, secret_recorder), fields(id = %self.id, state = %State::Building))] + #[instrument(skip(self, storage_manager, deployment_updater, log_recorder, secret_recorder), fields(id = %self.id, state = %State::Building))] async fn handle( self, storage_manager: ArtifactsStorageManager, + deployment_updater: impl DeploymentUpdater, log_recorder: impl LogRecorder, secret_recorder: impl SecretRecorder, ) -> Result { @@ -180,7 +188,6 @@ impl Queued { target: String::new(), fields: json!({ "build_line": line }), r#type: LogType::Event, - address: None, }, message => Log { id, @@ -192,7 +199,6 @@ impl Queued { target: String::new(), fields: serde_json::to_value(message).unwrap(), r#type: LogType::Event, - address: None, }, }; log_recorder.record(log); @@ -200,7 +206,7 @@ impl Queued { }); let project_path = project_path.canonicalize()?; - let so_path = build_deployment(self.id, &project_path, tx.clone()).await?; + let runtime = build_deployment(self.id, &project_path, tx.clone()).await?; if self.will_run_tests { info!( @@ -213,13 +219,21 @@ impl Queued { info!("Moving built library"); - store_lib(&storage_manager, so_path, &self.id).await?; + store_lib(&storage_manager, &runtime, &self.id).await?; + + let is_next = matches!(runtime, Runtime::Next(_)); + + deployment_updater + .set_is_next(&id, is_next) + .await + .map_err(|e| Error::Build(Box::new(e)))?; let built = Built { id: self.id, service_name: self.service_name, service_id: self.service_id, tracing_context: Default::default(), + is_next, }; Ok(built) @@ -310,15 +324,10 @@ async fn build_deployment( deployment_id: Uuid, project_path: &Path, tx: crossbeam_channel::Sender, -) -> Result { - let runtime_path = build_crate(deployment_id, project_path, true, tx) +) -> Result { + build_crate(deployment_id, project_path, true, tx) .await - .map_err(|e| Error::Build(e.into()))?; - - match runtime_path { - Runtime::Legacy(so_path) => Ok(so_path), - Runtime::Next(_) => todo!(), - } + .map_err(|e| Error::Build(e.into())) } #[instrument(skip(project_path, tx))] @@ -381,12 +390,17 @@ async fn run_pre_deploy_tests( } /// Store 'so' file in the libs folder -#[instrument(skip(storage_manager, so_path, id))] +#[instrument(skip(storage_manager, runtime, id))] async fn store_lib( storage_manager: &ArtifactsStorageManager, - so_path: impl AsRef, + runtime: &Runtime, id: &Uuid, ) -> Result<()> { + let so_path = match runtime { + Runtime::Next(path) => path, + Runtime::Legacy(path) => path, + }; + let new_so_path = storage_manager.deployment_library_path(id)?; fs::rename(so_path, new_so_path).await?; @@ -399,6 +413,7 @@ mod tests { use std::{collections::BTreeMap, fs::File, io::Write, path::Path}; use shuttle_common::storage_manager::ArtifactsStorageManager; + use shuttle_service::loader::Runtime; use tempdir::TempDir; use tokio::fs; use uuid::Uuid; @@ -533,11 +548,12 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", let build_p = storage_manager.builds_path().unwrap(); let so_path = build_p.join("xyz.so"); + let runtime = Runtime::Legacy(so_path.clone()); let id = Uuid::new_v4(); fs::write(&so_path, "barfoo").await.unwrap(); - super::store_lib(&storage_manager, &so_path, &id) + super::store_lib(&storage_manager, &runtime, &id) .await .unwrap(); diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index 7b14a4e7b..a9edebc1d 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -2,33 +2,36 @@ use std::{ collections::HashMap, net::{Ipv4Addr, SocketAddr}, path::PathBuf, - str::FromStr, + sync::Arc, }; use async_trait::async_trait; use opentelemetry::global; use portpicker::pick_unused_port; -use shuttle_common::project::ProjectName as ServiceName; use shuttle_common::storage_manager::ArtifactsStorageManager; -use shuttle_proto::runtime::{runtime_client::RuntimeClient, LoadRequest, StartRequest}; +use shuttle_proto::runtime::{ + runtime_client::RuntimeClient, LoadRequest, StartRequest, StopRequest, StopResponse, +}; -use tokio::task::JoinError; -use tonic::transport::Channel; -use tracing::{debug_span, error, info, instrument, trace, Instrument}; +use tokio::sync::Mutex; +use tonic::{transport::Channel, Response, Status}; +use tracing::{debug, debug_span, error, info, instrument, trace, Instrument}; use tracing_opentelemetry::OpenTelemetrySpanExt; use uuid::Uuid; use super::{KillReceiver, KillSender, RunReceiver, State}; use crate::{ error::{Error, Result}, - persistence::SecretGetter, + persistence::{DeploymentUpdater, SecretGetter}, + RuntimeManager, }; /// Run a task which takes runnable deploys from a channel and starts them up on our runtime /// A deploy is killed when it receives a signal from the kill channel pub async fn task( mut recv: RunReceiver, - runtime_client: RuntimeClient, + runtime_manager: Arc>, + deployment_updater: impl DeploymentUpdater, kill_send: KillSender, active_deployment_getter: impl ActiveDeploymentsGetter, secret_getter: impl SecretGetter, @@ -41,37 +44,27 @@ pub async fn task( info!("Built deployment at the front of run queue: {id}"); + let deployment_updater = deployment_updater.clone(); let kill_send = kill_send.clone(); let kill_recv = kill_send.subscribe(); let secret_getter = secret_getter.clone(); let storage_manager = storage_manager.clone(); - let _service_name = match ServiceName::from_str(&built.service_name) { - Ok(name) => name, - Err(err) => { - start_crashed_cleanup(&id, err); - continue; - } - }; - let old_deployments_killer = kill_old_deployments( built.service_id, id, active_deployment_getter.clone(), kill_send, ); - let cleanup = move |result: std::result::Result< - std::result::Result<(), shuttle_service::Error>, - JoinError, - >| match result { - Ok(inner) => match inner { - Ok(()) => completed_cleanup(&id), + let cleanup = move |result: std::result::Result, Status>| { + info!(response = ?result, "stop client response: "); + + match result { + Ok(_) => completed_cleanup(&id), Err(err) => crashed_cleanup(&id, err), - }, - Err(err) if err.is_cancelled() => stopped_cleanup(&id), - Err(err) => start_crashed_cleanup(&id, err), + } }; - let runtime_client = runtime_client.clone(); + let runtime_manager = runtime_manager.clone(); tokio::spawn(async move { let parent_cx = global::get_text_map_propagator(|propagator| { @@ -85,7 +78,8 @@ pub async fn task( .handle( storage_manager, secret_getter, - runtime_client, + runtime_manager, + deployment_updater, kill_recv, old_deployments_killer, cleanup, @@ -169,21 +163,21 @@ pub struct Built { pub service_name: String, pub service_id: Uuid, pub tracing_context: HashMap, + pub is_next: bool, } impl Built { - #[instrument(skip(self, storage_manager, secret_getter, runtime_client, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] + #[instrument(skip(self, storage_manager, secret_getter, runtime_manager, deployment_updater, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] #[allow(clippy::too_many_arguments)] async fn handle( self, storage_manager: ArtifactsStorageManager, secret_getter: impl SecretGetter, - runtime_client: RuntimeClient, + runtime_manager: Arc>, + deployment_updater: impl DeploymentUpdater, kill_recv: KillReceiver, kill_old_deployments: impl futures::Future>, - cleanup: impl FnOnce(std::result::Result, JoinError>) - + Send - + 'static, + cleanup: impl FnOnce(std::result::Result, Status>) + Send + 'static, ) -> Result<()> { let so_path = storage_manager.deployment_library_path(&self.id)?; @@ -197,6 +191,11 @@ impl Built { }; let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); + let mut runtime_manager = runtime_manager.lock().await.clone(); + let runtime_client = runtime_manager + .get_runtime_client(self.is_next) + .await + .map_err(Error::Runtime)?; kill_old_deployments.await?; @@ -207,17 +206,27 @@ impl Built { self.service_id, so_path, secret_getter, - runtime_client.clone(), - ) - .await; - tokio::spawn(run( - self.id, - self.service_name, runtime_client, - address, - kill_recv, - cleanup, - )); + ) + .await?; + + // Move runtime manager to this thread so that the runtime lives long enough + tokio::spawn(async move { + let runtime_client = runtime_manager + .get_runtime_client(self.is_next) + .await + .unwrap(); + run( + self.id, + self.service_name, + runtime_client, + address, + deployment_updater, + kill_recv, + cleanup, + ) + .await + }); Ok(()) } @@ -228,8 +237,8 @@ async fn load( service_id: Uuid, so_path: PathBuf, secret_getter: impl SecretGetter, - mut runtime_client: RuntimeClient, -) { + runtime_client: &mut RuntimeClient, +) -> Result<()> { info!( "loading project from: {}", so_path.clone().into_os_string().into_string().unwrap() @@ -248,56 +257,81 @@ async fn load( service_name: service_name.clone(), secrets, }); - info!("loading service"); + + debug!("loading service"); let response = runtime_client.load(load_request).await; - if let Err(e) = response { - info!("failed to load service: {}", e); + match response { + Ok(response) => { + info!(response = ?response.into_inner(), "loading response: "); + Ok(()) + } + Err(error) => { + error!(%error, "failed to load service"); + Err(Error::Load(error.to_string())) + } } } -#[instrument(skip(runtime_client, _kill_recv, _cleanup), fields(state = %State::Running))] +#[instrument(skip(runtime_client, deployment_updater, kill_recv, cleanup), fields(state = %State::Running))] async fn run( id: Uuid, service_name: String, - mut runtime_client: RuntimeClient, + runtime_client: &mut RuntimeClient, address: SocketAddr, - _kill_recv: KillReceiver, - _cleanup: impl FnOnce(std::result::Result, JoinError>) - + Send - + 'static, + deployment_updater: impl DeploymentUpdater, + mut kill_recv: KillReceiver, + cleanup: impl FnOnce(std::result::Result, Status>) + Send + 'static, ) { + deployment_updater.set_address(&id, &address).await.unwrap(); + let start_request = tonic::Request::new(StartRequest { deployment_id: id.as_bytes().to_vec(), - service_name, + service_name: service_name.clone(), port: address.port() as u32, }); info!("starting service"); let response = runtime_client.start(start_request).await.unwrap(); - info!(response = ?response.into_inner(), "client response: "); + info!(response = ?response.into_inner(), "start client response: "); + + let mut response = Err(Status::unknown("not stopped yet")); + + while let Ok(kill_id) = kill_recv.recv().await { + if kill_id == id { + let stop_request = tonic::Request::new(StopRequest { + deployment_id: id.as_bytes().to_vec(), + service_name: service_name.clone(), + }); + response = runtime_client.stop(stop_request).await; + + break; + } + } + + cleanup(response); } #[cfg(test)] mod tests { - use std::{path::PathBuf, process::Command, time::Duration}; + use std::{net::SocketAddr, path::PathBuf, process::Command, sync::Arc, time::Duration}; use async_trait::async_trait; use shuttle_common::storage_manager::ArtifactsStorageManager; - use shuttle_proto::runtime::runtime_client::RuntimeClient; + use shuttle_proto::runtime::StopResponse; use tempdir::TempDir; use tokio::{ - sync::{broadcast, oneshot}, - task::JoinError, + sync::{broadcast, oneshot, Mutex}, time::sleep, }; - use tonic::transport::Channel; + use tonic::{Response, Status}; use uuid::Uuid; use crate::{ error::Error, - persistence::{Secret, SecretGetter}, + persistence::{DeploymentUpdater, Secret, SecretGetter}, + RuntimeManager, }; use super::Built; @@ -315,10 +349,12 @@ mod tests { Ok(()) } - async fn get_runtime_client() -> RuntimeClient { - RuntimeClient::connect("http://127.0.0.1:6001") - .await - .unwrap() + fn get_runtime_manager() -> Arc> { + let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); + let path = tmp_dir.into_path(); + let (tx, _rx) = crossbeam_channel::unbounded(); + + RuntimeManager::new(path, "http://localhost:5000".to_string(), tx) } #[derive(Clone)] @@ -337,6 +373,22 @@ mod tests { StubSecretGetter } + #[derive(Clone)] + struct StubDeploymentUpdater; + + #[async_trait] + impl DeploymentUpdater for StubDeploymentUpdater { + type Err = std::io::Error; + + async fn set_address(&self, _id: &Uuid, _address: &SocketAddr) -> Result<(), Self::Err> { + Ok(()) + } + + async fn set_is_next(&self, _id: &Uuid, _is_next: bool) -> Result<(), Self::Err> { + Ok(()) + } + } + // This test uses the kill signal to make sure a service does stop when asked to #[tokio::test] async fn can_be_killed() { @@ -345,14 +397,10 @@ mod tests { let (kill_send, kill_recv) = broadcast::channel(1); let (cleanup_send, cleanup_recv) = oneshot::channel(); - let handle_cleanup = |result: std::result::Result< - std::result::Result<(), shuttle_service::Error>, - JoinError, - >| { + let handle_cleanup = |result: std::result::Result, Status>| { assert!( - matches!(result, Err(ref join_error) if join_error.is_cancelled()), - "handle should have been cancelled: {:?}", - result + result.unwrap().into_inner().success, + "handle should have been cancelled", ); cleanup_send.send(()).unwrap(); }; @@ -362,7 +410,8 @@ mod tests { .handle( storage_manager, secret_getter, - get_runtime_client().await, + get_runtime_manager(), + StubDeploymentUpdater, kill_recv, kill_old_deployments(), handle_cleanup, @@ -389,16 +438,13 @@ mod tests { let (_kill_send, kill_recv) = broadcast::channel(1); let (cleanup_send, cleanup_recv) = oneshot::channel(); - let handle_cleanup = |result: std::result::Result< - std::result::Result<(), shuttle_service::Error>, - JoinError, - >| { - let result = result.unwrap(); - assert!( - result.is_ok(), - "did not expect error from self stopping service: {}", - result.unwrap_err() - ); + let handle_cleanup = |_result: std::result::Result, Status>| { + // let result = result.unwrap(); + // assert!( + // result.is_ok(), + // "did not expect error from self stopping service: {}", + // result.unwrap_err() + // ); cleanup_send.send(()).unwrap(); }; let secret_getter = get_secret_getter(); @@ -407,7 +453,8 @@ mod tests { .handle( storage_manager, secret_getter, - get_runtime_client().await, + get_runtime_manager(), + StubDeploymentUpdater, kill_recv, kill_old_deployments(), handle_cleanup, @@ -428,16 +475,13 @@ mod tests { let (_kill_send, kill_recv) = broadcast::channel(1); let (cleanup_send, cleanup_recv): (oneshot::Sender<()>, _) = oneshot::channel(); - let handle_cleanup = |result: std::result::Result< - std::result::Result<(), shuttle_service::Error>, - JoinError, - >| { - let result = result.unwrap(); - assert!( - matches!(result, Err(shuttle_service::Error::BindPanic(ref msg)) if msg == "panic in bind"), - "expected inner error from handle: {:?}", - result - ); + let handle_cleanup = |_result: std::result::Result, Status>| { + // let result = result.unwrap(); + // assert!( + // matches!(result, Err(shuttle_service::Error::BindPanic(ref msg)) if msg == "panic in bind"), + // "expected inner error from handle: {:?}", + // result + // ); cleanup_send.send(()).unwrap(); }; let secret_getter = get_secret_getter(); @@ -446,7 +490,8 @@ mod tests { .handle( storage_manager, secret_getter, - get_runtime_client().await, + get_runtime_manager(), + StubDeploymentUpdater, kill_recv, kill_old_deployments(), handle_cleanup, @@ -473,7 +518,8 @@ mod tests { .handle( storage_manager, secret_getter, - get_runtime_client().await, + get_runtime_manager(), + StubDeploymentUpdater, kill_recv, kill_old_deployments(), handle_cleanup, @@ -494,6 +540,7 @@ mod tests { service_name: "test".to_string(), service_id: Uuid::new_v4(), tracing_context: Default::default(), + is_next: false, }; let (_kill_send, kill_recv) = broadcast::channel(1); @@ -505,7 +552,8 @@ mod tests { .handle( storage_manager, secret_getter, - get_runtime_client().await, + get_runtime_manager(), + StubDeploymentUpdater, kill_recv, kill_old_deployments(), handle_cleanup, @@ -513,10 +561,7 @@ mod tests { .await; assert!( - matches!( - result, - Err(Error::Load(shuttle_service::loader::LoaderError::Load(_))) - ), + matches!(result, Err(Error::Load(_))), "expected missing 'so' error: {:?}", result ); @@ -554,6 +599,7 @@ mod tests { service_name: crate_name.to_string(), service_id: Uuid::new_v4(), tracing_context: Default::default(), + is_next: false, }, storage_manager, ) diff --git a/deployer/src/error.rs b/deployer/src/error.rs index 1adba5ae2..0f9ad03cc 100644 --- a/deployer/src/error.rs +++ b/deployer/src/error.rs @@ -2,8 +2,6 @@ use std::error::Error as StdError; use std::io; use thiserror::Error; -use shuttle_service::loader::LoaderError; - use cargo::util::errors::CargoTestError; use crate::deployment::gateway_client; @@ -15,7 +13,7 @@ pub enum Error { #[error("Build error: {0}")] Build(#[source] Box), #[error("Load error: {0}")] - Load(#[from] LoaderError), + Load(String), #[error("Prepare to run error: {0}")] PrepareRun(String), #[error("Run error: {0}")] @@ -30,6 +28,8 @@ pub enum Error { OldCleanup(#[source] Box), #[error("Gateway client error: {0}")] GatewayClient(#[from] gateway_client::Error), + #[error("Failed to get runtime: {0}")] + Runtime(#[source] anyhow::Error), } #[derive(Error, Debug)] diff --git a/deployer/src/handlers/mod.rs b/deployer/src/handlers/mod.rs index 848dbff7f..f3def2080 100644 --- a/deployer/src/handlers/mod.rs +++ b/deployer/src/handlers/mod.rs @@ -224,6 +224,7 @@ async fn post_service( state: State::Queued, last_update: Utc::now(), address: None, + is_next: false, }; let mut data = Vec::new(); diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index cb9b3bf0d..e5ae62450 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -1,4 +1,4 @@ -use std::{convert::Infallible, net::SocketAddr}; +use std::{convert::Infallible, net::SocketAddr, sync::Arc}; pub use args::Args; pub use deployment::deploy_layer::DeployLayer; @@ -10,8 +10,8 @@ use hyper::{ }; pub use persistence::Persistence; use proxy::AddressGetter; -use shuttle_proto::runtime::runtime_client::RuntimeClient; -use tonic::transport::Channel; +pub use runtime_manager::RuntimeManager; +use tokio::sync::Mutex; use tracing::{error, info}; use crate::deployment::gateway_client::GatewayClient; @@ -22,14 +22,20 @@ mod error; mod handlers; mod persistence; mod proxy; +mod runtime_manager; -pub async fn start(persistence: Persistence, runtime_client: RuntimeClient, args: Args) { +pub async fn start( + persistence: Persistence, + runtime_manager: Arc>, + args: Args, +) { let deployment_manager = DeploymentManager::builder() .build_log_recorder(persistence.clone()) .secret_recorder(persistence.clone()) .active_deployment_getter(persistence.clone()) .artifacts_path(args.artifacts_path) - .runtime(runtime_client) + .runtime(runtime_manager) + .deployment_updater(persistence.clone()) .secret_getter(persistence.clone()) .queue_client(GatewayClient::new(args.gateway_uri)) .build(); @@ -44,6 +50,7 @@ pub async fn start(persistence: Persistence, runtime_client: RuntimeClient { error!("Proxy stopped.") }, - _ = start(persistence, runtime_client, args) => { + _ = start(persistence, runtime_manager, args) => { error!("Deployment service stopped.") }, - _ = runtime.wait() => { - error!("Legacy runtime stopped.") - }, - _ = logs_task => { - error!("Logs task stopped") - }, } exit(1); diff --git a/deployer/src/persistence/deployment.rs b/deployer/src/persistence/deployment.rs index 03d210066..b7e50f8b8 100644 --- a/deployer/src/persistence/deployment.rs +++ b/deployer/src/persistence/deployment.rs @@ -1,5 +1,6 @@ use std::{net::SocketAddr, str::FromStr}; +use async_trait::async_trait; use chrono::{DateTime, Utc}; use sqlx::{sqlite::SqliteRow, FromRow, Row}; use tracing::error; @@ -14,6 +15,7 @@ pub struct Deployment { pub state: State, pub last_update: DateTime, pub address: Option, + pub is_next: bool, } impl FromRow<'_, SqliteRow> for Deployment { @@ -36,6 +38,7 @@ impl FromRow<'_, SqliteRow> for Deployment { state: row.try_get("state")?, last_update: row.try_get("last_update")?, address, + is_next: row.try_get("is_next")?, }) } } @@ -51,12 +54,23 @@ impl From for shuttle_common::models::deployment::Response { } } +/// Update the details of a deployment +#[async_trait] +pub trait DeploymentUpdater: Clone + Send + Sync + 'static { + type Err: std::error::Error + Send; + + /// Set the address for a deployment + async fn set_address(&self, id: &Uuid, address: &SocketAddr) -> Result<(), Self::Err>; + + /// Set if a deployment is build on shuttle-next + async fn set_is_next(&self, id: &Uuid, is_next: bool) -> Result<(), Self::Err>; +} + #[derive(Debug, PartialEq, Eq)] pub struct DeploymentState { pub id: Uuid, pub state: State, pub last_update: DateTime, - pub address: Option, } #[derive(sqlx::FromRow, Debug, PartialEq, Eq)] @@ -64,4 +78,5 @@ pub struct DeploymentRunnable { pub id: Uuid, pub service_name: String, pub service_id: Uuid, + pub is_next: bool, } diff --git a/deployer/src/persistence/mod.rs b/deployer/src/persistence/mod.rs index bc9ce7054..7ac9f3e2d 100644 --- a/deployer/src/persistence/mod.rs +++ b/deployer/src/persistence/mod.rs @@ -27,7 +27,7 @@ use tracing::{error, info, instrument, trace}; use uuid::Uuid; use self::deployment::DeploymentRunnable; -pub use self::deployment::{Deployment, DeploymentState}; +pub use self::deployment::{Deployment, DeploymentState, DeploymentUpdater}; pub use self::error::Error as PersistenceError; pub use self::log::{Level as LogLevel, Log}; pub use self::resource::{Resource, ResourceRecorder, Type as ResourceType}; @@ -158,13 +158,14 @@ impl Persistence { let deployment = deployment.into(); sqlx::query( - "INSERT INTO deployments (id, service_id, state, last_update, address) VALUES (?, ?, ?, ?, ?)", + "INSERT INTO deployments (id, service_id, state, last_update, address, is_next) VALUES (?, ?, ?, ?, ?, ?)", ) .bind(deployment.id) .bind(deployment.service_id) .bind(deployment.state) .bind(deployment.last_update) .bind(deployment.address.map(|socket| socket.to_string())) + .bind(deployment.is_next) .execute(&self.pool) .await .map(|_| ()) @@ -265,7 +266,7 @@ impl Persistence { pub async fn get_all_runnable_deployments(&self) -> Result> { sqlx::query_as( - r#"SELECT d.id, service_id, s.name AS service_name + r#"SELECT d.id, service_id, s.name AS service_name, d.is_next FROM deployments AS d JOIN services AS s ON s.id = d.service_id WHERE state = ? @@ -304,12 +305,9 @@ impl Persistence { async fn update_deployment(pool: &SqlitePool, state: impl Into) -> Result<()> { let state = state.into(); - // TODO: Handle moving to 'active_deployments' table for State::Running. - - sqlx::query("UPDATE deployments SET state = ?, last_update = ?, address = ? WHERE id = ?") + sqlx::query("UPDATE deployments SET state = ?, last_update = ? WHERE id = ?") .bind(state.state) .bind(state.last_update) - .bind(state.address.map(|socket| socket.to_string())) .bind(state.id) .execute(pool) .await @@ -442,6 +440,31 @@ impl AddressGetter for Persistence { } } +#[async_trait::async_trait] +impl DeploymentUpdater for Persistence { + type Err = Error; + + async fn set_address(&self, id: &Uuid, address: &SocketAddr) -> Result<()> { + sqlx::query("UPDATE deployments SET address = ? WHERE id = ?") + .bind(address.to_string()) + .bind(id) + .execute(&self.pool) + .await + .map(|_| ()) + .map_err(Error::from) + } + + async fn set_is_next(&self, id: &Uuid, is_next: bool) -> Result<()> { + sqlx::query("UPDATE deployments SET is_next = ? WHERE id = ?") + .bind(is_next) + .bind(id) + .execute(&self.pool) + .await + .map(|_| ()) + .map_err(Error::from) + } +} + #[async_trait::async_trait] impl ActiveDeploymentsGetter for Persistence { type Err = Error; @@ -493,7 +516,9 @@ mod tests { state: State::Queued, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 43, 33).unwrap(), address: None, + is_next: false, }; + let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 12345); p.insert_deployment(deployment.clone()).await.unwrap(); assert_eq!(p.get_deployment(&id).await.unwrap().unwrap(), deployment); @@ -504,13 +529,18 @@ mod tests { id, state: State::Built, last_update: Utc::now(), - address: None, }, ) .await .unwrap(); + + p.set_address(&id, &address).await.unwrap(); + p.set_is_next(&id, true).await.unwrap(); + let update = p.get_deployment(&id).await.unwrap().unwrap(); assert_eq!(update.state, State::Built); + assert_eq!(update.address, Some(address)); + assert!(update.is_next); assert_ne!( update.last_update, Utc.with_ymd_and_hms(2022, 4, 25, 4, 43, 33).unwrap() @@ -530,6 +560,7 @@ mod tests { state: State::Crashed, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 7, 29, 35).unwrap(), address: None, + is_next: false, }; let deployment_stopped = Deployment { id: Uuid::new_v4(), @@ -537,6 +568,7 @@ mod tests { state: State::Stopped, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 7, 49, 35).unwrap(), address: None, + is_next: false, }; let deployment_other = Deployment { id: Uuid::new_v4(), @@ -544,6 +576,7 @@ mod tests { state: State::Running, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 7, 39, 39).unwrap(), address: None, + is_next: false, }; let deployment_running = Deployment { id: Uuid::new_v4(), @@ -551,6 +584,7 @@ mod tests { state: State::Running, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 7, 48, 29).unwrap(), address: Some(SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 9876)), + is_next: true, }; for deployment in [ @@ -590,6 +624,7 @@ mod tests { state: State::Crashed, last_update: Utc::now(), address: None, + is_next: false, }; let deployment_stopped = Deployment { id: Uuid::new_v4(), @@ -597,6 +632,7 @@ mod tests { state: State::Stopped, last_update: Utc::now(), address: None, + is_next: false, }; let deployment_running = Deployment { id: Uuid::new_v4(), @@ -604,6 +640,7 @@ mod tests { state: State::Running, last_update: Utc::now(), address: Some(SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 9876)), + is_next: false, }; let deployment_queued = Deployment { id: queued_id, @@ -611,6 +648,7 @@ mod tests { state: State::Queued, last_update: Utc::now(), address: None, + is_next: false, }; let deployment_building = Deployment { id: building_id, @@ -618,6 +656,7 @@ mod tests { state: State::Building, last_update: Utc::now(), address: None, + is_next: false, }; let deployment_built = Deployment { id: built_id, @@ -625,6 +664,7 @@ mod tests { state: State::Built, last_update: Utc::now(), address: None, + is_next: true, }; let deployment_loading = Deployment { id: loading_id, @@ -632,6 +672,7 @@ mod tests { state: State::Loading, last_update: Utc::now(), address: None, + is_next: false, }; for deployment in [ @@ -690,6 +731,7 @@ mod tests { state: State::Built, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 29, 33).unwrap(), address: None, + is_next: false, }, Deployment { id: id_1, @@ -697,6 +739,7 @@ mod tests { state: State::Running, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 29, 44).unwrap(), address: None, + is_next: false, }, Deployment { id: id_2, @@ -704,6 +747,7 @@ mod tests { state: State::Running, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 33, 48).unwrap(), address: None, + is_next: true, }, Deployment { id: Uuid::new_v4(), @@ -711,6 +755,7 @@ mod tests { state: State::Crashed, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 38, 52).unwrap(), address: None, + is_next: true, }, Deployment { id: id_3, @@ -718,6 +763,7 @@ mod tests { state: State::Running, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 42, 32).unwrap(), address: None, + is_next: false, }, ] { p.insert_deployment(deployment).await.unwrap(); @@ -731,16 +777,19 @@ mod tests { id: id_1, service_name: "foo".to_string(), service_id: foo_id, + is_next: false, }, DeploymentRunnable { id: id_2, service_name: "bar".to_string(), service_id: bar_id, + is_next: true, }, DeploymentRunnable { id: id_3, service_name: "foo".to_string(), service_id: foo_id, + is_next: false, }, ] ); @@ -759,6 +808,7 @@ mod tests { state: State::Running, last_update: Utc::now(), address: None, + is_next: true, }, Deployment { id: Uuid::new_v4(), @@ -766,6 +816,7 @@ mod tests { state: State::Running, last_update: Utc::now(), address: None, + is_next: false, }, ]; @@ -875,7 +926,6 @@ mod tests { target: "tests::log_recorder_event".to_string(), fields: json!({"message": "job queued"}), r#type: deploy_layer::LogType::Event, - address: None, }; p.record(event); @@ -910,6 +960,7 @@ mod tests { state: State::Queued, // Should be different from the state recorded below last_update: Utc.with_ymd_and_hms(2022, 4, 29, 2, 39, 39).unwrap(), address: None, + is_next: false, }) .await .unwrap(); @@ -923,7 +974,6 @@ mod tests { target: String::new(), fields: serde_json::Value::Null, r#type: deploy_layer::LogType::State, - address: Some("127.0.0.1:12345".to_string()), }; p.record(state); @@ -949,7 +999,8 @@ mod tests { service_id, state: State::Running, last_update: Utc.with_ymd_and_hms(2022, 4, 29, 2, 39, 59).unwrap(), - address: Some(SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 12345)), + address: None, + is_next: false, } ); } @@ -1126,6 +1177,7 @@ mod tests { state: State::Built, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 29, 33).unwrap(), address: None, + is_next: false, }, Deployment { id: Uuid::new_v4(), @@ -1133,6 +1185,7 @@ mod tests { state: State::Stopped, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 29, 44).unwrap(), address: None, + is_next: false, }, Deployment { id: id_1, @@ -1140,6 +1193,7 @@ mod tests { state: State::Running, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 33, 48).unwrap(), address: None, + is_next: false, }, Deployment { id: Uuid::new_v4(), @@ -1147,6 +1201,7 @@ mod tests { state: State::Crashed, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 38, 52).unwrap(), address: None, + is_next: false, }, Deployment { id: id_2, @@ -1154,6 +1209,7 @@ mod tests { state: State::Running, last_update: Utc.with_ymd_and_hms(2022, 4, 25, 4, 42, 32).unwrap(), address: None, + is_next: true, }, ] { p.insert_deployment(deployment).await.unwrap(); diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs new file mode 100644 index 000000000..089350c17 --- /dev/null +++ b/deployer/src/runtime_manager.rs @@ -0,0 +1,127 @@ +use std::{path::PathBuf, sync::Arc}; + +use anyhow::Context; +use shuttle_proto::runtime::{self, runtime_client::RuntimeClient, SubscribeLogsRequest}; +use tokio::{process, sync::Mutex}; +use tonic::transport::Channel; +use tracing::{info, instrument, trace}; + +use crate::deployment::deploy_layer; + +#[derive(Clone)] +pub struct RuntimeManager { + legacy: Option>, + legacy_process: Option>>, + next: Option>, + next_process: Option>>, + artifacts_path: PathBuf, + provisioner_address: String, + log_sender: crossbeam_channel::Sender, +} + +impl RuntimeManager { + pub fn new( + artifacts_path: PathBuf, + provisioner_address: String, + log_sender: crossbeam_channel::Sender, + ) -> Arc> { + Arc::new(Mutex::new(Self { + legacy: None, + legacy_process: None, + next: None, + next_process: None, + artifacts_path, + provisioner_address, + log_sender, + })) + } + + pub async fn get_runtime_client( + &mut self, + is_next: bool, + ) -> anyhow::Result<&mut RuntimeClient> { + if is_next { + Self::get_runtime_client_helper( + &mut self.next, + &mut self.next_process, + is_next, + 6002, + self.artifacts_path.clone(), + &self.provisioner_address, + self.log_sender.clone(), + ) + .await + } else { + Self::get_runtime_client_helper( + &mut self.legacy, + &mut self.legacy_process, + is_next, + 6001, + self.artifacts_path.clone(), + &self.provisioner_address, + self.log_sender.clone(), + ) + .await + } + } + + #[instrument(skip(runtime_option, process_option, log_sender))] + async fn get_runtime_client_helper<'a>( + runtime_option: &'a mut Option>, + process_option: &mut Option>>, + is_next: bool, + port: u16, + artifacts_path: PathBuf, + provisioner_address: &str, + log_sender: crossbeam_channel::Sender, + ) -> anyhow::Result<&'a mut RuntimeClient> { + if let Some(runtime_client) = runtime_option { + trace!("returning previous client"); + Ok(runtime_client) + } else { + trace!("making new client"); + let (process, runtime_client) = runtime::start( + is_next, + runtime::StorageManagerType::Artifacts(artifacts_path), + provisioner_address, + port, + ) + .await + .context("failed to start shuttle runtime")?; + + let sender = log_sender; + let mut stream = runtime_client + .clone() + .subscribe_logs(tonic::Request::new(SubscribeLogsRequest {})) + .await + .context("subscribing to runtime logs stream")? + .into_inner(); + + tokio::spawn(async move { + while let Ok(Some(log)) = stream.message().await { + sender.send(log.into()).expect("to send log to persistence"); + } + }); + + *runtime_option = Some(runtime_client); + *process_option = Some(Arc::new(std::sync::Mutex::new(process))); + + // Safe to unwrap as it was just set + Ok(runtime_option.as_mut().unwrap()) + } + } +} + +impl Drop for RuntimeManager { + fn drop(&mut self) { + info!("runtime manager shutting down"); + + if let Some(ref process) = self.legacy_process.take() { + let _ = process.lock().unwrap().start_kill(); + } + + if let Some(ref process) = self.next_process.take() { + let _ = process.lock().unwrap().start_kill(); + } + } +} diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 887e54a81..122a2cb0c 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -241,6 +241,7 @@ pub mod runtime { wasm: bool, storage_manager_type: StorageManagerType, provisioner_address: &str, + port: u16, ) -> anyhow::Result<(process::Child, runtime_client::RuntimeClient)> { let runtime_flag = if wasm { "--axum" } else { "--legacy" }; @@ -254,6 +255,8 @@ pub mod runtime { let runtime = process::Command::new(runtime_executable) .args([ runtime_flag, + "--port", + &port.to_string(), "--provisioner-address", provisioner_address, "--storage-manager-type", @@ -269,7 +272,7 @@ pub mod runtime { tokio::time::sleep(Duration::from_secs(2)).await; info!("connecting runtime client"); - let conn = Endpoint::new("http://127.0.0.1:6001") + let conn = Endpoint::new(format!("http://127.0.0.1:{port}")) .context("creating runtime client endpoint")? .connect_timeout(Duration::from_secs(5)); diff --git a/runtime/src/args.rs b/runtime/src/args.rs index 016121d4b..57e78eced 100644 --- a/runtime/src/args.rs +++ b/runtime/src/args.rs @@ -5,6 +5,10 @@ use tonic::transport::Endpoint; #[derive(Parser, Debug)] pub struct Args { + /// Port to start runtime on + #[arg(long)] + pub port: u16, + /// Address to reach provisioner at #[arg(long, default_value = "http://localhost:5000")] pub provisioner_address: Endpoint, diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index c3d98c44f..9c2663f60 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -76,6 +76,11 @@ where trace!(path, "loading"); let so_path = PathBuf::from(path); + + if !so_path.exists() { + return Err(Status::not_found("'.so' to load does not exist")); + } + *self.so_path.lock().unwrap() = Some(so_path); *self.secrets.lock().unwrap() = Some(BTreeMap::from_iter(secrets.into_iter())); @@ -88,6 +93,8 @@ where &self, request: Request, ) -> Result, Status> { + trace!("legacy starting"); + let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) .await .expect("failed to connect to provisioner"); @@ -116,6 +123,8 @@ where .map_err(|err| Status::from_error(Box::new(err)))? .clone(); + trace!("prepare done"); + let StartRequest { deployment_id, service_name, @@ -134,6 +143,7 @@ where secrets, self.storage_manager.clone(), ); + trace!("got factory"); let logs_tx = self.logs_tx.lock().unwrap().clone(); diff --git a/runtime/src/main.rs b/runtime/src/main.rs index b7d9f3c3e..8a3a5f803 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -27,7 +27,7 @@ async fn main() { trace!(args = ?args, "parsed args"); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 6001); + let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); let provisioner_address = args.provisioner_address; let mut server_builder = diff --git a/service/src/loader.rs b/service/src/loader.rs index 98f42db29..9f130716c 100644 --- a/service/src/loader.rs +++ b/service/src/loader.rs @@ -72,6 +72,8 @@ impl Loader { addr: SocketAddr, logger: logger::Logger, ) -> Result { + trace!("loading service"); + let mut bootstrapper = self.bootstrapper; AssertUnwindSafe(bootstrapper.bootstrap(factory, logger)) diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml index 341c6524f..e9e38ca2c 100644 --- a/tmp/axum-wasm/Cargo.toml +++ b/tmp/axum-wasm/Cargo.toml @@ -9,3 +9,7 @@ crate-type = [ "cdylib" ] [dependencies] shuttle-next = "0.8.0" tracing = "0.1.37" + +[dev-dependencies] +tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } +hyper = "0.14.23" diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs index a6af35583..14776b925 100644 --- a/tmp/axum-wasm/src/lib.rs +++ b/tmp/axum-wasm/src/lib.rs @@ -13,3 +13,27 @@ shuttle_next::app! { "Goodbye, World!" } } + +#[cfg(test)] +mod tests { + use crate::__app; + use http::Request; + use hyper::Method; + + #[tokio::test] + async fn hello() { + let request = Request::builder() + .uri("http://local.test/hello") + .method(Method::GET) + .body(axum::body::boxed(axum::body::Body::empty())) + .unwrap(); + + let response = __app(request).await; + + assert!(response.status().is_success()); + + let body = &hyper::body::to_bytes(response.into_body()).await.unwrap(); + + assert_eq!(body, "Hello, World!"); + } +} From 05f746967c5a556fef8c7f8259b0fd62f8849410 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 18 Jan 2023 11:16:15 +0200 Subject: [PATCH 30/74] misc: remove unneeded codegen feature (#584) --- deployer/tests/resources/bind-panic/Cargo.toml | 2 +- deployer/tests/resources/main-panic/Cargo.toml | 2 +- deployer/tests/resources/sleep-async/Cargo.toml | 2 +- service/tests/resources/bind-panic/Cargo.toml | 2 +- service/tests/resources/build-panic/Cargo.toml | 2 +- service/tests/resources/is-cdylib/Cargo.toml | 2 +- service/tests/resources/not-cdylib/Cargo.toml | 2 +- service/tests/resources/sleep/Cargo.toml | 2 +- service/tests/resources/sqlx-pool/Cargo.toml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/deployer/tests/resources/bind-panic/Cargo.toml b/deployer/tests/resources/bind-panic/Cargo.toml index 807f8044a..0a721bd4a 100644 --- a/deployer/tests/resources/bind-panic/Cargo.toml +++ b/deployer/tests/resources/bind-panic/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../../service", features = ["codegen"] } +shuttle-service = { path = "../../../../service" } diff --git a/deployer/tests/resources/main-panic/Cargo.toml b/deployer/tests/resources/main-panic/Cargo.toml index 76833b28c..da7b5c841 100644 --- a/deployer/tests/resources/main-panic/Cargo.toml +++ b/deployer/tests/resources/main-panic/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../../service", features = ["codegen"] } +shuttle-service = { path = "../../../../service" } diff --git a/deployer/tests/resources/sleep-async/Cargo.toml b/deployer/tests/resources/sleep-async/Cargo.toml index f02de505e..c0dc45479 100644 --- a/deployer/tests/resources/sleep-async/Cargo.toml +++ b/deployer/tests/resources/sleep-async/Cargo.toml @@ -12,4 +12,4 @@ crate-type = ["cdylib"] [dependencies] tokio = { version = "1.0", features = ["time"]} -shuttle-service = { path = "../../../../service", features = ["codegen"] } +shuttle-service = { path = "../../../../service" } diff --git a/service/tests/resources/bind-panic/Cargo.toml b/service/tests/resources/bind-panic/Cargo.toml index f48c8442b..eb3331848 100644 --- a/service/tests/resources/bind-panic/Cargo.toml +++ b/service/tests/resources/bind-panic/Cargo.toml @@ -9,4 +9,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../", features = ["codegen"] } +shuttle-service = { path = "../../../" } diff --git a/service/tests/resources/build-panic/Cargo.toml b/service/tests/resources/build-panic/Cargo.toml index 8f8cb8167..93a0b14e8 100644 --- a/service/tests/resources/build-panic/Cargo.toml +++ b/service/tests/resources/build-panic/Cargo.toml @@ -9,4 +9,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../", features = ["codegen"] } +shuttle-service = { path = "../../../" } diff --git a/service/tests/resources/is-cdylib/Cargo.toml b/service/tests/resources/is-cdylib/Cargo.toml index 903e50335..99083de80 100644 --- a/service/tests/resources/is-cdylib/Cargo.toml +++ b/service/tests/resources/is-cdylib/Cargo.toml @@ -10,4 +10,4 @@ crate-type = ["cdylib", "staticlib"] [dependencies] rocket = "0.5.0-rc.2" -shuttle-service = { path = "../../../", features = ["codegen", "web-rocket"] } +shuttle-service = { path = "../../../", features = ["web-rocket"] } diff --git a/service/tests/resources/not-cdylib/Cargo.toml b/service/tests/resources/not-cdylib/Cargo.toml index 09fc3c69c..47a2afa53 100644 --- a/service/tests/resources/not-cdylib/Cargo.toml +++ b/service/tests/resources/not-cdylib/Cargo.toml @@ -10,4 +10,4 @@ crate-type = ["staticlib"] [dependencies] rocket = "0.5.0-rc.2" -shuttle-service = { path = "../../../", features = ["codegen", "web-rocket"] } +shuttle-service = { path = "../../../", features = ["web-rocket"] } diff --git a/service/tests/resources/sleep/Cargo.toml b/service/tests/resources/sleep/Cargo.toml index 4bc2899dd..40b0f6d1f 100644 --- a/service/tests/resources/sleep/Cargo.toml +++ b/service/tests/resources/sleep/Cargo.toml @@ -9,4 +9,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../", features = ["codegen"] } +shuttle-service = { path = "../../../" } diff --git a/service/tests/resources/sqlx-pool/Cargo.toml b/service/tests/resources/sqlx-pool/Cargo.toml index 0f6163f37..14487f75a 100644 --- a/service/tests/resources/sqlx-pool/Cargo.toml +++ b/service/tests/resources/sqlx-pool/Cargo.toml @@ -9,6 +9,6 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../", features = ["codegen"] } +shuttle-service = { path = "../../../" } shuttle-shared-db = { path = "../../../../resources/shared-db", features = ["postgres"] } sqlx = { version = "0.6.2", features = [ "runtime-tokio-native-tls" ] } From 325b90f966d1f01122cc04d94df94f0266bd758f Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 18 Jan 2023 11:36:00 +0200 Subject: [PATCH 31/74] refactor: proto fixups (#585) * refactor: comment * refactor: restore binding to external address --- cargo-shuttle/src/lib.rs | 19 +++++++++---------- deployer/src/deployment/run.rs | 2 +- proto/runtime.proto | 5 +++-- runtime/src/axum/mod.rs | 10 +++++----- runtime/src/legacy/mod.rs | 17 +++++++---------- 5 files changed, 25 insertions(+), 28 deletions(-) diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index dd2e61a5e..3e9215dc2 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -459,10 +459,18 @@ impl Shuttle { } }); + let addr = if run_args.external { + std::net::IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)) + } else { + Ipv4Addr::LOCALHOST.into() + }; + + let addr = SocketAddr::new(addr, run_args.port); + let start_request = StartRequest { deployment_id: id.as_bytes().to_vec(), service_name, - port: run_args.port as u32, + ip: addr.to_string(), }; trace!(?start_request, "starting service"); @@ -479,15 +487,6 @@ impl Shuttle { trace!(response = ?response, "client response: "); - // TODO: move to runtime - let addr = if run_args.external { - std::net::IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)) - } else { - Ipv4Addr::LOCALHOST.into() - }; - - let addr = SocketAddr::new(addr, run_args.port); - println!( "\n{:>12} {} on http://{}", "Starting".bold().green(), diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index a9edebc1d..095943cc0 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -288,7 +288,7 @@ async fn run( let start_request = tonic::Request::new(StartRequest { deployment_id: id.as_bytes().to_vec(), service_name: service_name.clone(), - port: address.port() as u32, + ip: address.to_string(), }); info!("starting service"); diff --git a/proto/runtime.proto b/proto/runtime.proto index c9ebfa16b..8faab7589 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -13,6 +13,7 @@ service Runtime { // Stop a started service rpc Stop(StopRequest) returns (StopResponse); + // Subscribe to runtime logs rpc SubscribeLogs(SubscribeLogsRequest) returns (stream LogItem); } @@ -37,8 +38,8 @@ message StartRequest { bytes deployment_id = 1; // Name of service to start string service_name = 2; - // Port to start the service on - uint32 port = 3; + // Address and port to start the service on + string ip = 3; } message StartResponse { diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 86e5e929e..c6cb5715a 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -1,6 +1,6 @@ use std::convert::Infallible; use std::io::{BufReader, Read, Write}; -use std::net::{Ipv4Addr, SocketAddr}; +use std::net::SocketAddr; use std::ops::DerefMut; use std::os::unix::prelude::RawFd; use std::path::{Path, PathBuf}; @@ -97,12 +97,12 @@ impl Runtime for AxumWasm { request: tonic::Request, ) -> Result, Status> { let StartRequest { - deployment_id, - port, - .. + deployment_id, ip, .. } = request.into_inner(); - let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port as u16); + let address = SocketAddr::from_str(&ip) + .context("invalid socket address") + .map_err(|err| Status::invalid_argument(err.to_string()))?; let logs_tx = self.logs_tx.lock().unwrap().clone(); diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 9c2663f60..c7b19b4fc 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -1,14 +1,9 @@ use std::{ - collections::BTreeMap, - iter::FromIterator, - net::{Ipv4Addr, SocketAddr}, - ops::DerefMut, - path::PathBuf, - str::FromStr, - sync::Mutex, + collections::BTreeMap, iter::FromIterator, net::SocketAddr, ops::DerefMut, path::PathBuf, + str::FromStr, sync::Mutex, }; -use anyhow::anyhow; +use anyhow::{anyhow, Context}; use async_trait::async_trait; use shuttle_common::{storage_manager::StorageManager, LogItem}; use shuttle_proto::{ @@ -128,9 +123,11 @@ where let StartRequest { deployment_id, service_name, - port, + ip, } = request.into_inner(); - let service_address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port as u16); + let service_address = SocketAddr::from_str(&ip) + .context("invalid socket address") + .map_err(|err| Status::invalid_argument(err.to_string()))?; let service_name = ServiceName::from_str(service_name.as_str()) .map_err(|err| Status::from_error(Box::new(err)))?; From 35c06603d77265138e2f02b4420f740bbb2dfea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Wed, 18 Jan 2023 12:39:02 +0100 Subject: [PATCH 32/74] Feat: cleanup fds and tmp (#586) * feat: remove redundant body fd and /tmp * feat: update codegen * refactor: remove tmp from workspace exclude * ci: next patch and wasi target --- .circleci/config.yml | 3 +- Cargo.toml | 1 - codegen/src/next/mod.rs | 17 ++---- runtime/src/axum/mod.rs | 55 +++++++++++-------- .../resources}/axum-wasm-expanded/Cargo.toml | 4 +- .../resources}/axum-wasm-expanded/src/lib.rs | 17 ++---- tmp/axum-wasm/Cargo.toml | 15 ----- tmp/axum-wasm/src/lib.rs | 39 ------------- 8 files changed, 47 insertions(+), 104 deletions(-) rename {tmp => runtime/tests/resources}/axum-wasm-expanded/Cargo.toml (73%) rename {tmp => runtime/tests/resources}/axum-wasm-expanded/src/lib.rs (81%) delete mode 100644 tmp/axum-wasm/Cargo.toml delete mode 100644 tmp/axum-wasm/src/lib.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 894655097..8bf6b4686 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -88,6 +88,7 @@ commands: shuttle-service = { path = "$PWD/service" } shuttle-aws-rds = { path = "$PWD/resources/aws-rds" } shuttle-persist = { path = "$PWD/resources/persist" } + shuttle-next = { path = "$PWD/next" } shuttle-shared-db = { path = "$PWD/resources/shared-db" } shuttle-secrets = { path = "$PWD/resources/secrets" } shuttle-static-folder = { path = "$PWD/resources/static-folder" } @@ -97,7 +98,7 @@ commands: - run: name: Install Rust command: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --target add wasm32-wasi sudo apt update && sudo apt install -y libssl1.1 install-protoc: steps: diff --git a/Cargo.toml b/Cargo.toml index c58f1d94e..b4e3005c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,6 @@ exclude = [ "resources/persist", "resources/secrets", "resources/shared-db", - "tmp", "resources/static-folder" ] diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index 5e8ad4e88..4548652f8 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -265,8 +265,7 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { pub extern "C" fn __SHUTTLE_Axum_call( logs_fd: std::os::wasi::prelude::RawFd, parts_fd: std::os::wasi::prelude::RawFd, - body_read_fd: std::os::wasi::prelude::RawFd, - body_write_fd: std::os::wasi::prelude::RawFd, + body_fd: std::os::wasi::prelude::RawFd, ) { use shuttle_next::body::{Body, HttpBody}; use shuttle_next::tracing_prelude::*; @@ -274,8 +273,6 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; - println!("inner handler awoken; interacting with fd={},{},{},{}", logs_fd, parts_fd, body_read_fd, body_write_fd); - // file descriptor 2 for writing logs to let logs_fd = unsafe { std::fs::File::from_raw_fd(logs_fd) }; @@ -291,10 +288,10 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { // deserialize request parts from rust messagepack let wrapper: shuttle_next::RequestWrapper = shuttle_next::from_read(reader).unwrap(); - // file descriptor 4 for reading http body into wasm - let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(body_read_fd) }; + // file descriptor 4 for reading and writing http body + let mut body_stream = unsafe { std::fs::File::from_raw_fd(body_fd) }; - let mut reader = std::io::BufReader::new(&mut body_read_stream); + let mut reader = std::io::BufReader::new(&mut body_stream); let mut body_buf = Vec::new(); reader.read_to_end(&mut body_buf).unwrap(); @@ -305,7 +302,6 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { .body(shuttle_next::body::boxed(body)) .unwrap(); - println!("inner router received request: {:?}", &request); let res = shuttle_next::block_on(__app(request)); let (parts, mut body) = res.into_parts(); @@ -316,12 +312,9 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { // write response parts parts_fd.write_all(&response_parts).unwrap(); - // file descriptor 5 for writing http body to host - let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(body_write_fd) }; - // write body if there is one if let Some(body) = shuttle_next::block_on(body.data()) { - body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); + body_stream.write_all(body.unwrap().as_ref()).unwrap(); } } ) diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index c6cb5715a..74e3fd41f 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -1,6 +1,6 @@ use std::convert::Infallible; use std::io::{BufReader, Read, Write}; -use std::net::SocketAddr; +use std::net::{Shutdown, SocketAddr}; use std::ops::DerefMut; use std::os::unix::prelude::RawFd; use std::path::{Path, PathBuf}; @@ -35,8 +35,7 @@ extern crate rmp_serde as rmps; const LOGS_FD: u32 = 20; const PARTS_FD: u32 = 3; -const BODY_WRITE_FD: u32 = 4; -const BODY_READ_FD: u32 = 5; +const BODY_FD: u32 = 4; pub struct AxumWasm { router: Mutex>, @@ -244,15 +243,12 @@ impl Router { UnixStream::pair().context("failed to open logs unixstream")?; let (mut parts_stream, parts_client) = UnixStream::pair().context("failed to open parts unixstream")?; - let (mut body_write_stream, body_write_client) = + let (mut body_stream, body_client) = UnixStream::pair().context("failed to open body write unixstream")?; - let (body_read_stream, body_read_client) = - UnixStream::pair().context("failed to open body read unixstream")?; let logs_client = WasiUnixStream::from_cap_std(logs_client); let parts_client = WasiUnixStream::from_cap_std(parts_client); - let body_write_client = WasiUnixStream::from_cap_std(body_write_client); - let body_read_client = WasiUnixStream::from_cap_std(body_read_client); + let body_client = WasiUnixStream::from_cap_std(body_client); store .data_mut() @@ -263,10 +259,7 @@ impl Router { .insert_file(PARTS_FD, Box::new(parts_client), FileCaps::all()); store .data_mut() - .insert_file(BODY_WRITE_FD, Box::new(body_write_client), FileCaps::all()); - store - .data_mut() - .insert_file(BODY_READ_FD, Box::new(body_read_client), FileCaps::all()); + .insert_file(BODY_FD, Box::new(body_client), FileCaps::all()); tokio::task::spawn_blocking(move || { let mut iter = logs_stream.bytes().filter_map(Result::ok); @@ -308,12 +301,14 @@ impl Router { .context("failed to concatenate request body buffers")?; // Write body to wasm - body_write_stream + body_stream .write_all(body_bytes.as_ref()) .context("failed to write body to wasm")?; - // Drop stream to signal EOF - drop(body_write_stream); + // Shut down the write part of the stream to signal EOF + body_stream + .shutdown(Shutdown::Write) + .expect("failed to shut down body write half"); // Call our function in wasm, telling it to route the request we've written to it // and write back a response @@ -323,15 +318,10 @@ impl Router { .expect("wasm module should be loaded and the router function should be available") .into_func() .expect("router function should be a function") - .typed::<(RawFd, RawFd, RawFd, RawFd), ()>(&store)? + .typed::<(RawFd, RawFd, RawFd), ()>(&store)? .call( &mut store, - ( - LOGS_FD as i32, - PARTS_FD as i32, - BODY_WRITE_FD as i32, - BODY_READ_FD as i32, - ), + (LOGS_FD as i32, PARTS_FD as i32, BODY_FD as i32), )?; // Read response parts from wasm @@ -342,7 +332,7 @@ impl Router { rmps::from_read(reader).context("failed to deserialize response parts")?; // Read response body from wasm, convert it to a Stream and pass it to hyper - let reader = BufReader::new(body_read_stream); + let reader = BufReader::new(body_stream); let stream = futures::stream::iter(reader.bytes()).try_chunks(2); let body = hyper::Body::wrap_stream(stream); @@ -409,17 +399,36 @@ async fn run_until_stopped( #[cfg(test)] pub mod tests { + use std::process::Command; + use super::*; use hyper::{http::HeaderValue, Method, Request, StatusCode, Version}; use uuid::Uuid; + // Compile axum wasm module + fn compile_module() { + Command::new("cargo") + .arg("build") + .arg("--target") + .arg("wasm32-wasi") + .current_dir("tests/resources/axum-wasm-expanded") + .spawn() + .unwrap() + .wait() + .unwrap(); + } + #[tokio::test] async fn axum() { + compile_module(); + let router = RouterBuilder::new() .unwrap() .src("axum.wasm") + .src("tests/resources/axum-wasm-expanded/target/wasm32-wasi/debug/shuttle_axum_expanded.wasm") .build() .unwrap(); + let id = Uuid::default().as_bytes().to_vec(); let (tx, mut rx) = mpsc::channel(1); diff --git a/tmp/axum-wasm-expanded/Cargo.toml b/runtime/tests/resources/axum-wasm-expanded/Cargo.toml similarity index 73% rename from tmp/axum-wasm-expanded/Cargo.toml rename to runtime/tests/resources/axum-wasm-expanded/Cargo.toml index b0aab9207..7972f7b6c 100644 --- a/tmp/axum-wasm-expanded/Cargo.toml +++ b/runtime/tests/resources/axum-wasm-expanded/Cargo.toml @@ -1,3 +1,5 @@ +[workspace] + [package] name = "shuttle-axum-expanded" version = "0.1.0" @@ -8,5 +10,5 @@ crate-type = [ "cdylib" ] [dependencies] futures = "0.3.25" -shuttle-next = "0.8.0" +shuttle-next = { path = "../../../../next" } tracing = "0.1.37" diff --git a/tmp/axum-wasm-expanded/src/lib.rs b/runtime/tests/resources/axum-wasm-expanded/src/lib.rs similarity index 81% rename from tmp/axum-wasm-expanded/src/lib.rs rename to runtime/tests/resources/axum-wasm-expanded/src/lib.rs index 84d1b8569..b4cbe2407 100644 --- a/tmp/axum-wasm-expanded/src/lib.rs +++ b/runtime/tests/resources/axum-wasm-expanded/src/lib.rs @@ -50,8 +50,7 @@ async fn uppercase(body: BodyStream) -> impl IntoResponse { pub extern "C" fn __SHUTTLE_Axum_call( logs_fd: std::os::wasi::prelude::RawFd, parts_fd: std::os::wasi::prelude::RawFd, - body_read_fd: std::os::wasi::prelude::RawFd, - body_write_fd: std::os::wasi::prelude::RawFd, + body_fd: std::os::wasi::prelude::RawFd, ) { use shuttle_next::body::{Body, HttpBody}; use shuttle_next::tracing_prelude::*; @@ -59,8 +58,6 @@ pub extern "C" fn __SHUTTLE_Axum_call( use std::io::{Read, Write}; use std::os::wasi::io::FromRawFd; - println!("inner handler awoken; interacting with fd={logs_fd},{parts_fd},{body_read_fd},{body_write_fd}"); - // file descriptor 2 for writing logs to let logs_fd = unsafe { std::fs::File::from_raw_fd(logs_fd) }; @@ -76,10 +73,10 @@ pub extern "C" fn __SHUTTLE_Axum_call( // deserialize request parts from rust messagepack let wrapper: shuttle_next::RequestWrapper = shuttle_next::from_read(reader).unwrap(); - // file descriptor 4 for reading http body into wasm - let mut body_read_stream = unsafe { std::fs::File::from_raw_fd(body_read_fd) }; + // file descriptor 4 for reading and writing http body + let mut body_stream = unsafe { std::fs::File::from_raw_fd(body_fd) }; - let mut reader = std::io::BufReader::new(&mut body_read_stream); + let mut reader = std::io::BufReader::new(&mut body_stream); let mut body_buf = Vec::new(); reader.read_to_end(&mut body_buf).unwrap(); @@ -90,7 +87,6 @@ pub extern "C" fn __SHUTTLE_Axum_call( .body(shuttle_next::body::boxed(body)) .unwrap(); - println!("inner router received request: {:?}", &request); let res = handle_request(request); let (parts, mut body) = res.into_parts(); @@ -101,11 +97,8 @@ pub extern "C" fn __SHUTTLE_Axum_call( // write response parts parts_fd.write_all(&response_parts).unwrap(); - // file descriptor 5 for writing http body to host - let mut body_write_stream = unsafe { std::fs::File::from_raw_fd(body_write_fd) }; - // write body if there is one if let Some(body) = shuttle_next::block_on(body.data()) { - body_write_stream.write_all(body.unwrap().as_ref()).unwrap(); + body_stream.write_all(body.unwrap().as_ref()).unwrap(); } } diff --git a/tmp/axum-wasm/Cargo.toml b/tmp/axum-wasm/Cargo.toml deleted file mode 100644 index e9e38ca2c..000000000 --- a/tmp/axum-wasm/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "shuttle-axum" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = [ "cdylib" ] - -[dependencies] -shuttle-next = "0.8.0" -tracing = "0.1.37" - -[dev-dependencies] -tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } -hyper = "0.14.23" diff --git a/tmp/axum-wasm/src/lib.rs b/tmp/axum-wasm/src/lib.rs deleted file mode 100644 index 14776b925..000000000 --- a/tmp/axum-wasm/src/lib.rs +++ /dev/null @@ -1,39 +0,0 @@ -use tracing::debug; - -shuttle_next::app! { - #[shuttle_next::endpoint(method = get, route = "/hello")] - async fn hello() -> &'static str { - debug!("called hello()"); - "Hello, World!" - } - - #[shuttle_next::endpoint(method = get, route = "/goodbye")] - async fn goodbye() -> &'static str { - debug!("called goodbye()"); - "Goodbye, World!" - } -} - -#[cfg(test)] -mod tests { - use crate::__app; - use http::Request; - use hyper::Method; - - #[tokio::test] - async fn hello() { - let request = Request::builder() - .uri("http://local.test/hello") - .method(Method::GET) - .body(axum::body::boxed(axum::body::Body::empty())) - .unwrap(); - - let response = __app(request).await; - - assert!(response.status().is_success()); - - let body = &hyper::body::to_bytes(response.into_body()).await.unwrap(); - - assert_eq!(body, "Hello, World!"); - } -} From a8b616654f87427b5bb639901282b01f3b420cf4 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 18 Jan 2023 15:19:13 +0200 Subject: [PATCH 33/74] refactor: unwraps and mor (#587) * refactor: better error handling * refactor: trim mutexes * refactor: remove abstract factory * refactor: remove extension todo --- Cargo.lock | 2 + Cargo.toml | 1 + cargo-shuttle/src/lib.rs | 3 +- common/Cargo.toml | 4 +- common/src/models/mod.rs | 13 +++++++ common/src/wasm.rs | 21 +++++------ deployer/src/deployment/deploy_layer.rs | 28 ++++++++------ deployer/src/deployment/run.rs | 20 +++++++--- deployer/src/error.rs | 2 + deployer/src/runtime_manager.rs | 6 ++- proto/Cargo.toml | 2 +- proto/src/lib.rs | 20 ++++++---- runtime/src/axum/mod.rs | 18 +++++---- runtime/src/legacy/mod.rs | 20 +++++----- runtime/src/provisioner_factory.rs | 49 ------------------------- 15 files changed, 103 insertions(+), 106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db14c4599..45e8e21b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6236,12 +6236,14 @@ dependencies = [ "http-serde", "hyper", "once_cell", + "prost-types", "reqwest", "rmp-serde", "rustrict", "serde", "serde_json", "strum", + "thiserror", "tracing", "tracing-subscriber", "uuid 1.2.2", diff --git a/Cargo.toml b/Cargo.toml index b4e3005c9..fb3a9ccda 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ async-trait = "0.1.58" axum = { version = "0.6.0", default-features = false } chrono = { version = "0.4.23", default-features = false, features = ["clock"] } once_cell = "1.16.0" +prost-types = "0.11.0" uuid = "1.2.2" thiserror = "1.0.37" serde = { version = "1.0.148", default-features = false } diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 3e9215dc2..e12b43d6c 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -7,6 +7,7 @@ mod provisioner_server; use shuttle_common::project::ProjectName; use shuttle_proto::runtime::{self, LoadRequest, StartRequest, SubscribeLogsRequest}; use std::collections::HashMap; +use std::convert::TryInto; use std::ffi::OsString; use std::fs::{read_to_string, File}; use std::io::stdout; @@ -454,7 +455,7 @@ impl Shuttle { tokio::spawn(async move { while let Some(log) = stream.message().await.expect("to get log from stream") { - let log: shuttle_common::LogItem = log.into(); + let log: shuttle_common::LogItem = log.try_into().expect("to convert log"); println!("{log}"); } }); diff --git a/common/Cargo.toml b/common/Cargo.toml index 47db8aa75..776a21fbd 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -16,12 +16,14 @@ crossterm = { version = "0.25.0", optional = true } http = { version = "0.2.8", optional = true } http-serde = { version = "1.1.2", optional = true } once_cell = { workspace = true, optional = true } +prost-types = { workspace = true, optional = true } reqwest = { version = "0.11.13", optional = true } rmp-serde = { version = "1.1.1", optional = true } rustrict = { version = "0.5.5", optional = true } serde = { workspace = true } serde_json = { workspace = true, optional = true } strum = { version = "0.24.1", features = ["derive"], optional = true } +thiserror = { workspace = true, optional = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, optional = true } uuid = { workspace = true, features = ["v4", "serde"], optional = true } @@ -35,5 +37,5 @@ backend = ["async-trait", "axum"] display = ["comfy-table", "crossterm"] tracing = ["serde_json"] wasm = ["http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] -models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json", "service"] +models = ["anyhow", "async-trait", "display", "http", "prost-types", "reqwest", "serde_json", "service", "thiserror"] service = ["chrono/serde", "once_cell", "rustrict", "serde/derive", "strum", "uuid"] diff --git a/common/src/models/mod.rs b/common/src/models/mod.rs index 0236c641d..17a8cb293 100644 --- a/common/src/models/mod.rs +++ b/common/src/models/mod.rs @@ -11,8 +11,10 @@ use anyhow::{Context, Result}; use async_trait::async_trait; use http::StatusCode; use serde::de::DeserializeOwned; +use thiserror::Error; use tracing::trace; +/// A to_json wrapper for handling our error states #[async_trait] pub trait ToJson { async fn to_json(self) -> Result; @@ -48,3 +50,14 @@ impl ToJson for reqwest::Response { } } } + +/// Errors that can occur when changing types. Especially from prost +#[derive(Error, Debug)] +pub enum ParseError { + #[error("failed to parse UUID: {0}")] + Uuid(#[from] uuid::Error), + #[error("failed to parse timestamp: {0}")] + Timestamp(#[from] prost_types::TimestampError), + #[error("failed to parse serde: {0}")] + Serde(#[from] serde_json::Error), +} diff --git a/common/src/wasm.rs b/common/src/wasm.rs index 82da1d2ee..edaa8808b 100644 --- a/common/src/wasm.rs +++ b/common/src/wasm.rs @@ -15,7 +15,6 @@ use crate::tracing::JsonVisitor; extern crate rmp_serde as rmps; -// todo: add http extensions field #[derive(Serialize, Deserialize, Debug)] pub struct RequestWrapper { #[serde(with = "http_serde::method")] @@ -44,11 +43,11 @@ impl From for RequestWrapper { impl RequestWrapper { /// Serialize a RequestWrapper to the Rust MessagePack data format - pub fn into_rmp(self) -> Vec { + pub fn into_rmp(self) -> Result, rmps::encode::Error> { let mut buf = Vec::new(); - self.serialize(&mut Serializer::new(&mut buf)).unwrap(); + self.serialize(&mut Serializer::new(&mut buf))?; - buf + Ok(buf) } /// Consume the wrapper and return a request builder with `Parts` set @@ -60,7 +59,7 @@ impl RequestWrapper { request .headers_mut() - .unwrap() + .unwrap() // Safe to unwrap as we just made the builder .extend(self.headers.into_iter()); request @@ -92,11 +91,11 @@ impl From for ResponseWrapper { impl ResponseWrapper { /// Serialize a ResponseWrapper into the Rust MessagePack data format - pub fn into_rmp(self) -> Vec { + pub fn into_rmp(self) -> Result, rmps::encode::Error> { let mut buf = Vec::new(); - self.serialize(&mut Serializer::new(&mut buf)).unwrap(); + self.serialize(&mut Serializer::new(&mut buf))?; - buf + Ok(buf) } /// Consume the wrapper and return a response builder with `Parts` set @@ -107,7 +106,7 @@ impl ResponseWrapper { response .headers_mut() - .unwrap() + .unwrap() // Safe to unwrap since we just made the builder .extend(self.headers.into_iter()); response @@ -389,7 +388,7 @@ mod test { .unwrap(); let (parts, _) = request.into_parts(); - let rmp = RequestWrapper::from(parts).into_rmp(); + let rmp = RequestWrapper::from(parts).into_rmp().unwrap(); let back: RequestWrapper = rmps::from_slice(&rmp).unwrap(); @@ -415,7 +414,7 @@ mod test { .unwrap(); let (parts, _) = response.into_parts(); - let rmp = ResponseWrapper::from(parts).into_rmp(); + let rmp = ResponseWrapper::from(parts).into_rmp().unwrap(); let back: ResponseWrapper = rmps::from_slice(&rmp).unwrap(); diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index 5b56dcba0..f7d35873b 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -21,9 +21,9 @@ use chrono::{DateTime, Utc}; use serde_json::json; -use shuttle_common::{tracing::JsonVisitor, STATE_MESSAGE}; +use shuttle_common::{models::ParseError, tracing::JsonVisitor, STATE_MESSAGE}; use shuttle_proto::runtime; -use std::{str::FromStr, time::SystemTime}; +use std::{convert::TryFrom, str::FromStr, time::SystemTime}; use tracing::{field::Visit, span, warn, Metadata, Subscriber}; use tracing_subscriber::Layer; use uuid::Uuid; @@ -112,19 +112,25 @@ impl From for DeploymentState { } } -impl From for Log { - fn from(log: runtime::LogItem) -> Self { - Self { - id: Uuid::from_slice(&log.id).unwrap(), - state: runtime::LogState::from_i32(log.state).unwrap().into(), - level: runtime::LogLevel::from_i32(log.level).unwrap().into(), - timestamp: DateTime::from(SystemTime::try_from(log.timestamp.unwrap()).unwrap()), +impl TryFrom for Log { + type Error = ParseError; + + fn try_from(log: runtime::LogItem) -> Result { + Ok(Self { + id: Uuid::from_slice(&log.id)?, + state: runtime::LogState::from_i32(log.state) + .unwrap_or_default() + .into(), + level: runtime::LogLevel::from_i32(log.level) + .unwrap_or_default() + .into(), + timestamp: DateTime::from(SystemTime::try_from(log.timestamp.unwrap_or_default())?), file: log.file, line: log.line, target: log.target, - fields: serde_json::from_slice(&log.fields).unwrap(), + fields: serde_json::from_slice(&log.fields)?, r#type: LogType::Event, - } + }) } } diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index 095943cc0..b0ce1e3be 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -241,19 +241,23 @@ async fn load( ) -> Result<()> { info!( "loading project from: {}", - so_path.clone().into_os_string().into_string().unwrap() + so_path + .clone() + .into_os_string() + .into_string() + .unwrap_or_default() ); let secrets = secret_getter .get_secrets(&service_id) .await - .unwrap() + .map_err(|e| Error::SecretsGet(Box::new(e)))? .into_iter() .map(|secret| (secret.key, secret.value)); let secrets = HashMap::from_iter(secrets); let load_request = tonic::Request::new(LoadRequest { - path: so_path.into_os_string().into_string().unwrap(), + path: so_path.into_os_string().into_string().unwrap_or_default(), service_name: service_name.clone(), secrets, }); @@ -283,7 +287,10 @@ async fn run( mut kill_recv: KillReceiver, cleanup: impl FnOnce(std::result::Result, Status>) + Send + 'static, ) { - deployment_updater.set_address(&id, &address).await.unwrap(); + deployment_updater + .set_address(&id, &address) + .await + .expect("to set deployment address"); let start_request = tonic::Request::new(StartRequest { deployment_id: id.as_bytes().to_vec(), @@ -292,7 +299,10 @@ async fn run( }); info!("starting service"); - let response = runtime_client.start(start_request).await.unwrap(); + let response = runtime_client + .start(start_request) + .await + .expect("to start deployment"); info!(response = ?response.into_inner(), "start client response: "); diff --git a/deployer/src/error.rs b/deployer/src/error.rs index 0f9ad03cc..e81eae92b 100644 --- a/deployer/src/error.rs +++ b/deployer/src/error.rs @@ -24,6 +24,8 @@ pub enum Error { SecretsParse(#[from] toml::de::Error), #[error("Failed to set secrets: {0}")] SecretsSet(#[source] Box), + #[error("Failed to get secrets: {0}")] + SecretsGet(#[source] Box), #[error("Failed to cleanup old deployments: {0}")] OldCleanup(#[source] Box), #[error("Gateway client error: {0}")] diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index 089350c17..4952ba9dd 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -1,4 +1,4 @@ -use std::{path::PathBuf, sync::Arc}; +use std::{convert::TryInto, path::PathBuf, sync::Arc}; use anyhow::Context; use shuttle_proto::runtime::{self, runtime_client::RuntimeClient, SubscribeLogsRequest}; @@ -99,7 +99,9 @@ impl RuntimeManager { tokio::spawn(async move { while let Ok(Some(log)) = stream.message().await { - sender.send(log.into()).expect("to send log to persistence"); + if let Ok(log) = log.try_into() { + sender.send(log).expect("to send log to persistence"); + } } }); diff --git a/proto/Cargo.toml b/proto/Cargo.toml index 9e44fa415..aadf6f749 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -11,7 +11,7 @@ anyhow = { workspace = true } chrono = { workspace = true } home = "0.5.4" prost = "0.11.2" -prost-types = "0.11.0" +prost-types = { workspace = true } tokio = { version = "1.22.0", features = ["process"] } tonic = { workspace = true } tracing = { workspace = true } diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 122a2cb0c..3a452cac9 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -96,6 +96,7 @@ pub mod provisioner { pub mod runtime { use std::{ + convert::TryFrom, path::PathBuf, process::Command, time::{Duration, SystemTime}, @@ -104,6 +105,7 @@ pub mod runtime { use anyhow::Context; use chrono::DateTime; use prost_types::Timestamp; + use shuttle_common::models::ParseError; use tokio::process; use tonic::transport::{Channel, Endpoint}; use tracing::info; @@ -159,18 +161,20 @@ pub mod runtime { } } - impl From for shuttle_common::LogItem { - fn from(log: LogItem) -> Self { - Self { - id: Uuid::from_slice(&log.id).unwrap(), - timestamp: DateTime::from(SystemTime::try_from(log.timestamp.unwrap()).unwrap()), - state: LogState::from_i32(log.state).unwrap().into(), - level: LogLevel::from_i32(log.level).unwrap().into(), + impl TryFrom for shuttle_common::LogItem { + type Error = ParseError; + + fn try_from(log: LogItem) -> Result { + Ok(Self { + id: Uuid::from_slice(&log.id)?, + timestamp: DateTime::from(SystemTime::try_from(log.timestamp.unwrap_or_default())?), + state: LogState::from_i32(log.state).unwrap_or_default().into(), + level: LogLevel::from_i32(log.level).unwrap_or_default().into(), file: log.file, line: log.line, target: log.target, fields: log.fields, - } + }) } } diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 74e3fd41f..15b3cf0c7 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -40,7 +40,7 @@ const BODY_FD: u32 = 4; pub struct AxumWasm { router: Mutex>, logs_rx: Mutex>>>, - logs_tx: Mutex>>, + logs_tx: Sender>, kill_tx: Mutex>>, } @@ -57,7 +57,7 @@ impl AxumWasm { Self { router: Mutex::new(None), logs_rx: Mutex::new(Some(rx)), - logs_tx: Mutex::new(tx), + logs_tx: tx, kill_tx: Mutex::new(None), } } @@ -103,7 +103,7 @@ impl Runtime for AxumWasm { .context("invalid socket address") .map_err(|err| Status::invalid_argument(err.to_string()))?; - let logs_tx = self.logs_tx.lock().unwrap().clone(); + let logs_tx = self.logs_tx.clone(); let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); @@ -200,7 +200,7 @@ impl RouterBuilder { } fn build(self) -> anyhow::Result { - let file = self.src.expect("module path should be set"); + let file = self.src.context("module path should be set")?; let module = Module::from_file(&self.engine, file)?; for export in module.exports() { @@ -268,14 +268,16 @@ impl Router { let mut log: runtime::LogItem = log.into(); log.id = deployment_id.clone(); - logs_tx.blocking_send(Ok(log)).unwrap(); + logs_tx.blocking_send(Ok(log)).expect("to send log"); } }); let (parts, body) = req.into_parts(); // Serialise request parts to rmp - let request_rmp = RequestWrapper::from(parts).into_rmp(); + let request_rmp = RequestWrapper::from(parts) + .into_rmp() + .context("failed to make request wrapper")?; // Write request parts to wasm module parts_stream @@ -315,9 +317,9 @@ impl Router { trace!("calling Router"); self.linker .get(&mut store, "axum", "__SHUTTLE_Axum_call") - .expect("wasm module should be loaded and the router function should be available") + .context("wasm module should be loaded and the router function should be available")? .into_func() - .expect("router function should be a function") + .context("router function should be a function")? .typed::<(RawFd, RawFd, RawFd), ()>(&store)? .call( &mut store, diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index c7b19b4fc..137e7a369 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -24,7 +24,7 @@ use tonic::{transport::Endpoint, Request, Response, Status}; use tracing::{error, instrument, trace}; use uuid::Uuid; -use crate::provisioner_factory::{AbstractFactory, AbstractProvisionerFactory}; +use crate::provisioner_factory::ProvisionerFactory; mod error; @@ -35,7 +35,7 @@ where // Mutexes are for interior mutability so_path: Mutex>, logs_rx: Mutex>>, - logs_tx: Mutex>, + logs_tx: UnboundedSender, provisioner_address: Endpoint, kill_tx: Mutex>>, secrets: Mutex>>, @@ -52,7 +52,7 @@ where Self { so_path: Mutex::new(None), logs_rx: Mutex::new(Some(rx)), - logs_tx: Mutex::new(tx), + logs_tx: tx, kill_tx: Mutex::new(None), provisioner_address, secrets: Mutex::new(None), @@ -92,8 +92,8 @@ where let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) .await - .expect("failed to connect to provisioner"); - let abstract_factory = AbstractProvisionerFactory::new(provisioner_client); + .context("failed to connect to provisioner") + .map_err(|err| Status::internal(err.to_string()))?; let so_path = self .so_path @@ -132,9 +132,11 @@ where let service_name = ServiceName::from_str(service_name.as_str()) .map_err(|err| Status::from_error(Box::new(err)))?; - let deployment_id = Uuid::from_slice(&deployment_id).unwrap(); + let deployment_id = Uuid::from_slice(&deployment_id) + .map_err(|error| Status::invalid_argument(error.to_string()))?; - let mut factory = abstract_factory.get_factory( + let mut factory = ProvisionerFactory::new( + provisioner_client, service_name, deployment_id, secrets, @@ -142,7 +144,7 @@ where ); trace!("got factory"); - let logs_tx = self.logs_tx.lock().unwrap().clone(); + let logs_tx = self.logs_tx.clone(); let logger = Logger::new(logs_tx, deployment_id); @@ -177,7 +179,7 @@ where // Move logger items into stream to be returned tokio::spawn(async move { while let Some(log) = logs_rx.recv().await { - tx.send(Ok(log.into())).await.unwrap(); + tx.send(Ok(log.into())).await.expect("to send log"); } }); diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs index 58cd34aa2..9b017d01c 100644 --- a/runtime/src/provisioner_factory.rs +++ b/runtime/src/provisioner_factory.rs @@ -10,55 +10,6 @@ use tonic::{transport::Channel, Request}; use tracing::{debug, info, trace}; use uuid::Uuid; -/// Trait to make it easy to get a factory (service locator) for each service being started -pub trait AbstractFactory: Send + 'static { - type Output: Factory; - - /// Get a factory for a specific service - fn get_factory( - &self, - service_name: ServiceName, - deployment_id: Uuid, - secrets: BTreeMap, - storage_manager: S, - ) -> Self::Output; -} - -/// An abstract factory that makes factories which uses provisioner -#[derive(Clone)] -pub struct AbstractProvisionerFactory { - provisioner_client: ProvisionerClient, -} - -impl AbstractFactory for AbstractProvisionerFactory -where - S: StorageManager, -{ - type Output = ProvisionerFactory; - - fn get_factory( - &self, - service_name: ServiceName, - deployment_id: Uuid, - secrets: BTreeMap, - storage_manager: S, - ) -> Self::Output { - ProvisionerFactory::new( - self.provisioner_client.clone(), - service_name, - deployment_id, - secrets, - storage_manager, - ) - } -} - -impl AbstractProvisionerFactory { - pub fn new(provisioner_client: ProvisionerClient) -> Self { - Self { provisioner_client } - } -} - /// A factory (service locator) which goes through the provisioner crate pub struct ProvisionerFactory where From d191d66ac16146e4af3f401bdb917396785e2dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 23 Jan 2023 12:24:12 +0100 Subject: [PATCH 34/74] feat: build our images with the release profile (#583) * feat: build our images with the release profile Currently our containerfile builds images with the default debug profile, which means when `get_runtime_executable` is called it will try to install from a checked out local version of `shuttle-runtime`. * feat: add build arg for cargo profile * refactor: update comment * fix: broken codegen/axum test * feat: install wasm32-wasi target in deploy.sh * feat: build deps in `CARGO_PROFILE` * feat: use closure to determine shuttle-runtime path * fix: path to runtime in docker deployer, clippy * fix: incorrect function for cargo home * refactor: always use cargo_home for path to runtime in deployer --- Cargo.lock | 22 ++--- Containerfile | 9 ++- Makefile | 3 + cargo-shuttle/Cargo.toml | 1 + cargo-shuttle/src/lib.rs | 80 +++++++++++++++++++ codegen/src/next/mod.rs | 4 +- deployer/Cargo.toml | 1 + deployer/prepare.sh | 3 + deployer/src/runtime_manager.rs | 30 +++++++ proto/src/lib.rs | 39 +-------- runtime/src/args.rs | 1 + .../resources/axum-wasm-expanded/src/lib.rs | 4 +- 12 files changed, 144 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45e8e21b7..cb8b4de40 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1438,7 +1438,7 @@ dependencies = [ "percent-encoding", "rustc-workspace-hack", "rustfix", - "semver 1.0.14", + "semver 1.0.16", "serde", "serde_ignored", "serde_json", @@ -1475,7 +1475,7 @@ dependencies = [ "native-tls", "pathdiff", "regex", - "semver 1.0.14", + "semver 1.0.16", "serde", "serde_derive", "serde_json", @@ -1517,6 +1517,7 @@ dependencies = [ "futures", "git2", "headers", + "home", "ignore", "indicatif", "indoc", @@ -1581,7 +1582,7 @@ checksum = "982a0cf6a99c350d7246035613882e376d58cebe571785abc5da4f648d53ac0a" dependencies = [ "camino", "cargo-platform", - "semver 1.0.14", + "semver 1.0.16", "serde", "serde_json", "thiserror", @@ -2065,7 +2066,7 @@ dependencies = [ "num_cpus", "rayon", "rustc-hash", - "semver 1.0.14", + "semver 1.0.16", "serde", "serde_derive", "serde_json", @@ -5673,7 +5674,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.14", + "semver 1.0.16", ] [[package]] @@ -5939,9 +5940,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" +checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" dependencies = [ "serde", ] @@ -6267,6 +6268,7 @@ dependencies = [ "fqdn", "futures", "hex 0.4.3", + "home", "hyper", "hyper-reverse-proxy 0.5.2-dev (git+https://github.com/chesedo/hyper-reverse-proxy?branch=master)", "once_cell", @@ -8487,13 +8489,13 @@ dependencies = [ [[package]] name = "which" -version = "4.2.5" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ "either", - "lazy_static", "libc", + "once_cell", ] [[package]] diff --git a/Containerfile b/Containerfile index 015bfae3f..5c98301e1 100644 --- a/Containerfile +++ b/Containerfile @@ -22,10 +22,12 @@ RUN cargo chef prepare --recipe-path recipe.json FROM shuttle-build AS builder COPY --from=planner /build/recipe.json recipe.json -RUN cargo chef cook --recipe-path recipe.json +RUN cargo chef cook $(if [ "$CARGO_PROFILE" = "release" ]; then echo --${CARGO_PROFILE}; fi) --recipe-path recipe.json COPY --from=cache /build . ARG folder -RUN cargo build --bin shuttle-${folder} +ARG CARGO_PROFILE +# if CARGO_PROFILE is release, pass --release, else use default debug profile +RUN cargo build --bin shuttle-${folder} $(if [ "$CARGO_PROFILE" = "release" ]; then echo --${CARGO_PROFILE}; fi) ARG RUSTUP_TOOLCHAIN FROM rust:${RUSTUP_TOOLCHAIN}-buster as shuttle-common @@ -43,7 +45,8 @@ FROM shuttle-common ARG folder COPY ${folder}/prepare.sh /prepare.sh RUN /prepare.sh -COPY --from=builder /build/target/debug/shuttle-${folder} /usr/local/bin/service +ARG CARGO_PROFILE +COPY --from=builder /build/target/${CARGO_PROFILE}/shuttle-${folder} /usr/local/bin/service ARG RUSTUP_TOOLCHAIN ENV RUSTUP_TOOLCHAIN=${RUSTUP_TOOLCHAIN} ENTRYPOINT ["/usr/local/bin/service"] diff --git a/Makefile b/Makefile index e57ba12b4..2f1f715b6 100644 --- a/Makefile +++ b/Makefile @@ -49,6 +49,7 @@ CONTAINER_REGISTRY=public.ecr.aws/shuttle DD_ENV=production # make sure we only ever go to production with `--tls=enable` USE_TLS=enable +CARGO_PROFILE=release else DOCKER_COMPOSE_FILES=-f docker-compose.yml -f docker-compose.dev.yml STACK?=shuttle-dev @@ -57,6 +58,7 @@ DB_FQDN=db.unstable.shuttle.rs CONTAINER_REGISTRY=public.ecr.aws/shuttle-dev DD_ENV=unstable USE_TLS?=disable +CARGO_PROFILE=debug endif POSTGRES_EXTRA_PATH?=./extras/postgres @@ -112,6 +114,7 @@ shuttle-%: ${SRC} Cargo.lock docker buildx build \ --build-arg folder=$(*) \ --build-arg RUSTUP_TOOLCHAIN=$(RUSTUP_TOOLCHAIN) \ + --build-arg CARGO_PROFILE=$(CARGO_PROFILE) \ --tag $(CONTAINER_REGISTRY)/$(*):$(COMMIT_SHA) \ --tag $(CONTAINER_REGISTRY)/$(*):$(TAG) \ --tag $(CONTAINER_REGISTRY)/$(*):latest \ diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index 4d484c8e3..ce36c87dc 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -24,6 +24,7 @@ dirs = "4.0.0" flate2 = "1.0.25" futures = "0.3.25" git2 = "0.14.2" +home = "0.5.4" headers = "0.3.8" indicatif = "0.17.2" ignore = "0.4.18" diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index e12b43d6c..d09ae6d2d 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -4,6 +4,7 @@ pub mod config; mod init; mod provisioner_server; +use cargo::util::ToSemver; use shuttle_common::project::ProjectName; use shuttle_proto::runtime::{self, LoadRequest, StartRequest, SubscribeLogsRequest}; use std::collections::HashMap; @@ -40,6 +41,9 @@ use crate::args::{DeploymentCommand, ProjectCommand}; use crate::client::Client; use crate::provisioner_server::LocalProvisioner; +const VERSION: &str = env!("CARGO_PKG_VERSION"); +const MANIFEST_DIR: &str = env!("CARGO_MANIFEST_DIR"); + pub struct Shuttle { ctx: RequestContext, } @@ -410,11 +414,53 @@ impl Shuttle { Ipv4Addr::LOCALHOST.into(), run_args.port + 1, )); + + let get_runtime_executable = || { + let runtime_path = home::cargo_home() + .expect("failed to find cargo home dir") + .join("bin/shuttle-runtime"); + + if cfg!(debug_assertions) { + // Canonicalized path to shuttle-runtime for dev to work on windows + let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")) + .expect("path to shuttle-runtime does not exist or is invalid"); + + std::process::Command::new("cargo") + .arg("install") + .arg("shuttle-runtime") + .arg("--path") + .arg(path) + .output() + .expect("failed to install the shuttle runtime"); + } else { + // If the version of cargo-shuttle is different from shuttle-runtime, + // or it isn't installed, try to install shuttle-runtime from the production + // branch. + if let Err(err) = check_version(&runtime_path) { + trace!("{}", err); + + trace!("installing shuttle-runtime"); + std::process::Command::new("cargo") + .arg("install") + .arg("shuttle-runtime") + .arg("--git") + .arg("https://github.com/shuttle-hq/shuttle") + .arg("--branch") + .arg("production") + .output() + .expect("failed to install the shuttle runtime"); + }; + }; + + runtime_path + }; + let (mut runtime, mut runtime_client) = runtime::start( is_wasm, runtime::StorageManagerType::WorkingDir(working_directory.to_path_buf()), &format!("http://localhost:{}", run_args.port + 1), run_args.port + 2, + get_runtime_executable, ) .await .map_err(|err| { @@ -772,6 +818,40 @@ impl Shuttle { } } +fn check_version(runtime_path: &Path) -> Result<()> { + let valid_version = VERSION.to_semver().unwrap(); + + if !runtime_path.try_exists()? { + bail!("shuttle-runtime is not installed"); + } + + // Get runtime version from shuttle-runtime cli + let runtime_version = std::process::Command::new("cargo") + .arg("shuttle-runtime") + .arg("--version") + .output() + .context("failed to check the shuttle-runtime version")? + .stdout; + + // Parse the version, splitting the version from the name and + // and pass it to `to_semver()`. + let runtime_version = std::str::from_utf8(&runtime_version) + .expect("shuttle-runtime version should be valid utf8") + .split_once(' ') + .expect("shuttle-runtime version should be in the `name version` format") + .1 + .to_semver() + .context("failed to convert runtime version to semver")?; + + if runtime_version == valid_version { + Ok(()) + } else { + Err(anyhow!( + "shuttle-runtime and cargo-shuttle are not the same version" + )) + } +} + pub enum CommandOutcome { Ok, DeploymentFailure, diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index 4548652f8..e03cfd858 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -307,7 +307,9 @@ pub(crate) fn wasi_bindings(app: App) -> proc_macro2::TokenStream { let (parts, mut body) = res.into_parts(); // wrap and serialize response parts as rmp - let response_parts = shuttle_next::ResponseWrapper::from(parts).into_rmp(); + let response_parts = shuttle_next::ResponseWrapper::from(parts) + .into_rmp() + .expect("failed to serialize response parts"); // write response parts parts_fd.write_all(&response_parts).unwrap(); diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index 21672f357..4dad73991 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -19,6 +19,7 @@ crossbeam-channel = "0.5.6" flate2 = "1.0.25" fqdn = "0.2.3" futures = "0.3.25" +home = "0.5.4" hyper = { version = "0.14.23", features = ["client", "http1", "http2", "tcp" ] } # not great, but waiting for WebSocket changes to be merged hyper-reverse-proxy = { git = "https://github.com/chesedo/hyper-reverse-proxy", branch = "master" } diff --git a/deployer/prepare.sh b/deployer/prepare.sh index 119b2e834..571aa8cb6 100755 --- a/deployer/prepare.sh +++ b/deployer/prepare.sh @@ -15,6 +15,9 @@ shuttle-shared-db = { path = "/usr/src/shuttle/resources/shared-db" } shuttle-secrets = { path = "/usr/src/shuttle/resources/secrets" } shuttle-static-folder = { path = "/usr/src/shuttle/resources/static-folder" }' > $CARGO_HOME/config.toml +# Add the wasm32-wasi target +rustup target add wasm32-wasi + # Install the shuttle runtime cargo install shuttle-runtime --path "/usr/src/shuttle/runtime" diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index 4952ba9dd..1693fa0c9 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -8,6 +8,8 @@ use tracing::{info, instrument, trace}; use crate::deployment::deploy_layer; +const MANIFEST_DIR: &str = env!("CARGO_MANIFEST_DIR"); + #[derive(Clone)] pub struct RuntimeManager { legacy: Option>, @@ -80,11 +82,39 @@ impl RuntimeManager { Ok(runtime_client) } else { trace!("making new client"); + + let get_runtime_executable = || { + if cfg!(debug_assertions) { + // If we're running deployer natively, install shuttle-runtime using the + // version of runtime from the calling repo. + let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")); + + // The path will not be valid if we are in a deployer container, in which + // case we don't try to install and use the one installed in deploy.sh. + if let Ok(path) = path { + std::process::Command::new("cargo") + .arg("install") + .arg("shuttle-runtime") + .arg("--path") + .arg(path) + .output() + .expect("failed to install the local version of shuttle-runtime"); + } + } + + // If we're in a deployer built with the containerfile, the runtime will have + // been installed in deploy.sh. + home::cargo_home() + .expect("failed to find path to cargo home") + .join("bin/shuttle-runtime") + }; + let (process, runtime_client) = runtime::start( is_next, runtime::StorageManagerType::Artifacts(artifacts_path), provisioner_address, port, + get_runtime_executable, ) .await .context("failed to start shuttle runtime")?; diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 3a452cac9..a4d51a522 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -98,7 +98,6 @@ pub mod runtime { use std::{ convert::TryFrom, path::PathBuf, - process::Command, time::{Duration, SystemTime}, }; @@ -246,6 +245,7 @@ pub mod runtime { storage_manager_type: StorageManagerType, provisioner_address: &str, port: u16, + get_runtime_executable: impl FnOnce() -> PathBuf, ) -> anyhow::Result<(process::Child, runtime_client::RuntimeClient)> { let runtime_flag = if wasm { "--axum" } else { "--legacy" }; @@ -286,41 +286,4 @@ pub mod runtime { Ok((runtime, runtime_client)) } - - fn get_runtime_executable() -> PathBuf { - // When this library is compiled in debug mode with `cargo run --bin cargo-shuttle`, - // install the checked-out local version of `shuttle-runtime - if cfg!(debug_assertions) { - // Path to cargo-shuttle - let manifest_dir = env!("CARGO_MANIFEST_DIR"); - - // Canonicalized path to shuttle-runtime - let path = std::fs::canonicalize(format!("{manifest_dir}/../runtime")) - .expect("failed to canonicalize path to runtime"); - - Command::new("cargo") - .arg("install") - .arg("shuttle-runtime") - .arg("--path") - .arg(path) - .output() - .expect("failed to install the shuttle runtime"); - // When this library is compiled in release mode with `cargo install cargo-shuttle`, - // install the latest released `shuttle-runtime` - } else { - Command::new("cargo") - .arg("install") - .arg("shuttle-runtime") - .arg("--git") - .arg("https://github.com/shuttle-hq/shuttle") - .arg("--branch") - .arg("production") - .output() - .expect("failed to install the shuttle runtime"); - } - - let cargo_home = home::cargo_home().expect("failed to find cargo home directory"); - - cargo_home.join("bin/shuttle-runtime") - } } diff --git a/runtime/src/args.rs b/runtime/src/args.rs index 57e78eced..9f0215970 100644 --- a/runtime/src/args.rs +++ b/runtime/src/args.rs @@ -4,6 +4,7 @@ use clap::{Parser, ValueEnum}; use tonic::transport::Endpoint; #[derive(Parser, Debug)] +#[command(version)] pub struct Args { /// Port to start runtime on #[arg(long)] diff --git a/runtime/tests/resources/axum-wasm-expanded/src/lib.rs b/runtime/tests/resources/axum-wasm-expanded/src/lib.rs index b4cbe2407..017cdda38 100644 --- a/runtime/tests/resources/axum-wasm-expanded/src/lib.rs +++ b/runtime/tests/resources/axum-wasm-expanded/src/lib.rs @@ -92,7 +92,9 @@ pub extern "C" fn __SHUTTLE_Axum_call( let (parts, mut body) = res.into_parts(); // wrap and serialize response parts as rmp - let response_parts = shuttle_next::ResponseWrapper::from(parts).into_rmp(); + let response_parts = shuttle_next::ResponseWrapper::from(parts) + .into_rmp() + .expect("failed to serialize response parts"); // write response parts parts_fd.write_all(&response_parts).unwrap(); From 3dc3ac76d3fc06728416eedd932fff0da4218230 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Fri, 3 Mar 2023 08:52:15 +0000 Subject: [PATCH 35/74] Feature/eng 378 axum wasm multiple handlers per endpoint (#588) * refactor: clean up if let * feat: move method validation, add test for it * test: add test for chained endpoint handlers * feat: chain endpoints with the same address * feat: duplicate method error, handler chain bug fix chaining handlers with a full type path caused a bug where a `,` was inserted, I think the reason is that `path` types can't be followed by `.`. Importing all the routing methods in `app` works, but it is not ideal * refactor: remove some clones * refactor: remove unwrap Co-authored-by: Pieter * feat: use BTreeMap for building endpoint chains * fix: only add namespace to first handler in chain * fix: skip rustfmt for quote in app_to_token test rustfmt will add a comma to the expected output, which will also be done in the expanded macro output, but not in the stringified output * refactor: revert btreemap change * docs: document why we sort the endpoint chains --------- Co-authored-by: Pieter --- codegen/src/next/mod.rs | 215 ++++++++++++++---- codegen/tests/ui/next/duplicate-methods.rs | 16 ++ .../tests/ui/next/duplicate-methods.stderr | 14 ++ codegen/tests/ui/next/invalid-method.rs | 11 + codegen/tests/ui/next/invalid-method.stderr | 29 +++ 5 files changed, 237 insertions(+), 48 deletions(-) create mode 100644 codegen/tests/ui/next/duplicate-methods.rs create mode 100644 codegen/tests/ui/next/duplicate-methods.stderr create mode 100644 codegen/tests/ui/next/invalid-method.rs create mode 100644 codegen/tests/ui/next/invalid-method.stderr diff --git a/codegen/src/next/mod.rs b/codegen/src/next/mod.rs index e03cfd858..4f62b12e1 100644 --- a/codegen/src/next/mod.rs +++ b/codegen/src/next/mod.rs @@ -1,8 +1,10 @@ +use std::collections::HashMap; + use proc_macro_error::emit_error; use quote::{quote, ToTokens}; use syn::{ - parenthesized, parse::Parse, parse2, punctuated::Punctuated, token::Paren, Expr, File, Ident, - Item, ItemFn, Lit, LitStr, Token, + parenthesized, parse::Parse, parse2, punctuated::Punctuated, token::Paren, Expr, ExprLit, File, + Ident, Item, ItemFn, Lit, LitStr, Token, }; #[derive(Debug, Eq, PartialEq)] @@ -124,7 +126,22 @@ impl Endpoint { has_err = true; } if let Expr::Path(path) = value { - method = Some(path.path.segments[0].ident.clone()); + let method_ident = path.path.segments[0].ident.clone(); + + match method_ident.to_string().as_str() { + "get" | "post" | "delete" | "put" | "options" | "head" | "trace" + | "patch" => { + method = Some(method_ident); + } + _ => { + emit_error!( + method_ident, + "method is not supported"; + hint = "Try one of the following: `get`, `post`, `delete`, `put`, `options`, `head`, `trace` or `patch`" + ); + has_err = true; + } + }; }; } "route" => { @@ -136,10 +153,13 @@ impl Endpoint { ); has_err = true; } - if let Expr::Lit(literal) = value { - if let Some(Lit::Str(literal)) = Some(literal.lit) { - route = Some(literal); - } + + if let Expr::Lit(ExprLit { + lit: Lit::Str(literal), + .. + }) = value + { + route = Some(literal); } } _ => { @@ -184,6 +204,18 @@ impl Endpoint { } } +#[derive(Debug, Eq, PartialEq)] +pub struct EndpointChain<'a> { + route: &'a LitStr, + handlers: Vec, +} + +#[derive(Debug, Eq, PartialEq)] +struct Handler { + method: Ident, + function: Ident, +} + impl ToTokens for Endpoint { fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { let Self { @@ -192,18 +224,27 @@ impl ToTokens for Endpoint { function, } = self; - match method.to_string().as_str() { - "get" | "post" | "delete" | "put" | "options" | "head" | "trace" | "patch" => {} - _ => { - emit_error!( - method, - "method is not supported"; - hint = "Try one of the following: `get`, `post`, `delete`, `put`, `options`, `head`, `trace` or `patch`" - ) - } - }; + let route = quote!(.route(#route, #method(#function))); + + route.to_tokens(tokens); + } +} - let route = quote!(.route(#route, shuttle_next::routing::#method(#function))); +impl ToTokens for Handler { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let Self { method, function } = self; + + let handler = quote!(#method(#function)); + + handler.to_tokens(tokens); + } +} + +impl<'a> ToTokens for EndpointChain<'a> { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let Self { route, handlers } = self; + + let route = quote!(.route(#route, shuttle_next::routing::#(#handlers).*)); route.to_tokens(tokens); } @@ -237,13 +278,46 @@ impl ToTokens for App { fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { let Self { endpoints } = self; + let mut endpoint_chains = endpoints + .iter() + .fold(HashMap::new(), |mut chain, endpoint| { + let entry = chain + .entry(&endpoint.route) + .or_insert_with(Vec::::new); + + let method = endpoint.method.clone(); + let function = endpoint.function.clone(); + + if entry.iter().any(|handler| handler.method == method) { + emit_error!( + method, + "only one method of each type is allowed per route"; + hint = format!("Remove one of the {} methods on the \"{}\" route.", method, endpoint.route.value()) + ); + } else { + entry.push(Handler { method, function }); + } + + chain + }) + .into_iter() + .map(|(key, value)| EndpointChain { + route: key, + handlers: value, + }) + .collect::>(); + + // syn::LitStr does not implement Ord, so rather than using a BTreeMap to build the chains, we + // use a HashMap and then sort the endpoint chains to ensure the output is deterministic. + endpoint_chains.sort_by(|a, b| a.route.value().cmp(&b.route.value())); + let app = quote!( async fn __app(request: shuttle_next::Request,) -> shuttle_next::response::Response { use shuttle_next::Service; let mut router = shuttle_next::Router::new() - #(#endpoints)*; + #(#endpoint_chains)*; let response = router.call(request).await.unwrap(); @@ -341,46 +415,91 @@ mod tests { }; let actual = quote!(#endpoint); - let expected = quote!(.route("/hello", shuttle_next::routing::get(hello))); + let expected = quote!(.route("/hello", get(hello))); assert_eq!(actual.to_string(), expected.to_string()); } #[test] + #[rustfmt::skip::macros(quote)] fn app_to_token() { - let app = App { - endpoints: vec![ - Endpoint { - route: parse_quote!("/hello"), - method: parse_quote!(get), - function: parse_quote!(hello), - }, - Endpoint { - route: parse_quote!("/goodbye"), - method: parse_quote!(post), - function: parse_quote!(goodbye), + let cases = vec![ + ( + App { + endpoints: vec![ + Endpoint { + route: parse_quote!("/hello"), + method: parse_quote!(get), + function: parse_quote!(hello), + }, + Endpoint { + route: parse_quote!("/goodbye"), + method: parse_quote!(post), + function: parse_quote!(goodbye), + }, + ], }, - ], - }; + quote!( + async fn __app( + request: shuttle_next::Request, + ) -> shuttle_next::response::Response { + use shuttle_next::Service; - let actual = quote!(#app); - let expected = quote!( - async fn __app( - request: shuttle_next::Request, - ) -> shuttle_next::response::Response { - use shuttle_next::Service; - - let mut router = shuttle_next::Router::new() - .route("/hello", shuttle_next::routing::get(hello)) - .route("/goodbye", shuttle_next::routing::post(goodbye)); + let mut router = shuttle_next::Router::new() + .route("/goodbye", shuttle_next::routing::post(goodbye)) + .route("/hello", shuttle_next::routing::get(hello)); - let response = router.call(request).await.unwrap(); + let response = router.call(request).await.unwrap(); - response - } - ); + response + } + ), + ), + ( + App { + endpoints: vec![ + Endpoint { + route: parse_quote!("/hello"), + method: parse_quote!(get), + function: parse_quote!(hello), + }, + Endpoint { + route: parse_quote!("/goodbye"), + method: parse_quote!(get), + function: parse_quote!(get_goodbye), + }, + Endpoint { + route: parse_quote!("/goodbye"), + method: parse_quote!(post), + function: parse_quote!(post_goodbye), + }, + ], + }, + quote!( + async fn __app( + request: shuttle_next::Request, + ) -> shuttle_next::response::Response { + use shuttle_next::Service; + + let mut router = shuttle_next::Router::new() + .route( + "/goodbye", + shuttle_next::routing::get(get_goodbye).post(post_goodbye) + ) + .route("/hello", shuttle_next::routing::get(hello)); + + let response = router.call(request).await.unwrap(); + + response + } + ), + ), + ]; - assert_eq!(actual.to_string(), expected.to_string()); + for (app, expected) in cases { + let actual = quote!(#app); + assert_eq!(actual.to_string(), expected.to_string()); + } } #[test] diff --git a/codegen/tests/ui/next/duplicate-methods.rs b/codegen/tests/ui/next/duplicate-methods.rs new file mode 100644 index 000000000..6c33ac070 --- /dev/null +++ b/codegen/tests/ui/next/duplicate-methods.rs @@ -0,0 +1,16 @@ +shuttle_codegen::app! { + #[shuttle_codegen::endpoint(method = get, route = "/hello")] + async fn hello() -> &'static str { + "Hello, World!" + } + + #[shuttle_codegen::endpoint(method = post, route = "/hello")] + async fn goodbye() -> &'static str { + "Goodbye, World!" + } + + #[shuttle_codegen::endpoint(method = post, route = "/hello")] + async fn goodbye() -> &'static str { + "Goodbye, World!" + } +} diff --git a/codegen/tests/ui/next/duplicate-methods.stderr b/codegen/tests/ui/next/duplicate-methods.stderr new file mode 100644 index 000000000..562a6b32c --- /dev/null +++ b/codegen/tests/ui/next/duplicate-methods.stderr @@ -0,0 +1,14 @@ +error: only one method of each type is allowed per route + + = help: Remove one of the post methods on the "/hello" route. + + --> tests/ui/next/duplicate-methods.rs:12:42 + | +12 | #[shuttle_codegen::endpoint(method = post, route = "/hello")] + | ^^^^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> tests/ui/next/duplicate-methods.rs:16:2 + | +16 | } + | ^ consider adding a `main` function to `$DIR/tests/ui/next/duplicate-methods.rs` diff --git a/codegen/tests/ui/next/invalid-method.rs b/codegen/tests/ui/next/invalid-method.rs new file mode 100644 index 000000000..73f29bb87 --- /dev/null +++ b/codegen/tests/ui/next/invalid-method.rs @@ -0,0 +1,11 @@ +shuttle_codegen::app! { + #[shuttle_codegen::endpoint(method = pet, route = "/hello")] + async fn hello() -> &'static str { + "Hello, World!" + } + + #[shuttle_codegen::endpoint(method =, route = "/hello")] + async fn hello() -> &'static str { + "Hello, World!" + } +} diff --git a/codegen/tests/ui/next/invalid-method.stderr b/codegen/tests/ui/next/invalid-method.stderr new file mode 100644 index 000000000..fcd7acacc --- /dev/null +++ b/codegen/tests/ui/next/invalid-method.stderr @@ -0,0 +1,29 @@ +error: method is not supported + + = help: Try one of the following: `get`, `post`, `delete`, `put`, `options`, `head`, `trace` or `patch` + + --> tests/ui/next/invalid-method.rs:2:42 + | +2 | #[shuttle_codegen::endpoint(method = pet, route = "/hello")] + | ^^^ + +error: no method provided + + = help: Add a method to your endpoint: `method = get` + + --> tests/ui/next/invalid-method.rs:2:32 + | +2 | #[shuttle_codegen::endpoint(method = pet, route = "/hello")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: expected expression + --> tests/ui/next/invalid-method.rs:7:41 + | +7 | #[shuttle_codegen::endpoint(method =, route = "/hello")] + | ^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> tests/ui/next/invalid-method.rs:11:2 + | +11 | } + | ^ consider adding a `main` function to `$DIR/tests/ui/next/invalid-method.rs` From 91a9fdde5b3ba505ee2ae5642e4fa4eefce390f2 Mon Sep 17 00:00:00 2001 From: Pieter Date: Fri, 3 Mar 2023 16:47:39 +0200 Subject: [PATCH 36/74] refactor: find code to wrap legacy runtime (#675) * refactor: find code to wrap legacy runtime * misc: update README with test instructions --- Cargo.lock | 3 +- proto/runtime.proto | 9 +- resources/secrets/Cargo.toml | 1 - resources/secrets/src/lib.rs | 7 +- runtime/Cargo.toml | 10 +- runtime/README.md | 19 ++- runtime/src/axum/mod.rs | 11 +- runtime/src/bin/rocket.rs | 50 ++++++++ runtime/src/legacy/error.rs | 14 -- runtime/src/legacy/mod.rs | 241 +++++++++++++++++------------------ runtime/src/lib.rs | 5 +- service/src/lib.rs | 6 +- 12 files changed, 198 insertions(+), 178 deletions(-) create mode 100644 runtime/src/bin/rocket.rs delete mode 100644 runtime/src/legacy/error.rs diff --git a/Cargo.lock b/Cargo.lock index cb8b4de40..25def720b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6415,8 +6415,10 @@ dependencies = [ "futures", "hyper", "rmp-serde", + "rocket", "shuttle-common", "shuttle-proto", + "shuttle-secrets", "shuttle-service", "thiserror", "tokio", @@ -6436,7 +6438,6 @@ version = "0.8.0" dependencies = [ "async-trait", "shuttle-service", - "tokio", ] [[package]] diff --git a/proto/runtime.proto b/proto/runtime.proto index 8faab7589..567a3fa58 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -36,8 +36,6 @@ message LoadResponse { message StartRequest { // Id to associate with the deployment being started bytes deployment_id = 1; - // Name of service to start - string service_name = 2; // Address and port to start the service on string ip = 3; } @@ -47,12 +45,7 @@ message StartResponse { bool success = 1; } -message StopRequest { - // Id to associate with the deployment being stopped - bytes deployment_id = 1; - // Name of service to stop - string service_name = 2; -} +message StopRequest {} message StopResponse { // Was the stop successful diff --git a/resources/secrets/Cargo.toml b/resources/secrets/Cargo.toml index 13455707e..83c107c1c 100644 --- a/resources/secrets/Cargo.toml +++ b/resources/secrets/Cargo.toml @@ -10,4 +10,3 @@ keywords = ["shuttle-service", "secrets"] [dependencies] async-trait = "0.1.56" shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } -tokio = { version = "1.19.2", features = ["rt"] } diff --git a/resources/secrets/src/lib.rs b/resources/secrets/src/lib.rs index 27ab12ff8..856ea0593 100644 --- a/resources/secrets/src/lib.rs +++ b/resources/secrets/src/lib.rs @@ -3,7 +3,6 @@ use std::collections::BTreeMap; use async_trait::async_trait; use shuttle_service::{Error, Factory, ResourceBuilder}; -use tokio::runtime::Runtime; pub struct Secrets; @@ -14,11 +13,7 @@ impl ResourceBuilder for Secrets { Self {} } - async fn build( - self, - factory: &mut dyn Factory, - _runtime: &Runtime, - ) -> Result { + async fn build(self, factory: &mut dyn Factory) -> Result { let secrets = factory.get_secrets().await?; Ok(SecretStore { secrets }) diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index d57b96596..cfa96cd80 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -6,6 +6,9 @@ license.workspace = true publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[[bin]] +name = "rocket" + [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } @@ -25,6 +28,11 @@ wasmtime = "4.0.0" wasmtime-wasi = "4.0.0" futures = "0.3.25" +# For rocket.rs +# TODO: remove +shuttle-secrets = { path = "../resources/secrets" } +rocket = "0.5.0-rc.2" + [dependencies.shuttle-common] workspace = true features = ["wasm"] @@ -34,4 +42,4 @@ workspace = true [dependencies.shuttle-service] workspace = true -features = ["loader"] +features = ["loader", "web-rocket"] # TODO: remove web-rocket diff --git a/runtime/README.md b/runtime/README.md index a3b0c40fb..5e1f1d910 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -57,8 +57,8 @@ curl localhost:7002/goodbye ``` ## shuttle-legacy - -Load and run an .so library that implements `shuttle_service::Service`. +This will no loger load a `.so` will the code to start the runtime will be codegened for all services. +An example can be found in `src/bin/rocket.rs` which contains the secrets rocket example at the bottom and the codegen at the top. To test, first start a provisioner from the root directory using: @@ -66,10 +66,10 @@ To test, first start a provisioner from the root directory using: docker-compose -f docker-compose.rendered.yml up provisioner ``` -Then in another shell, start the runtime using the clap CLI: +Then in another shell, start the wrapped runtime using the clap CLI: ```bash -cargo run -- --legacy --provisioner-address http://localhost:5000 +cargo run -- --port 6001 --storage-manager-type working-dir --storage-manager-path ./ ``` Or directly (this is the path hardcoded in `deployer::start`): @@ -77,24 +77,23 @@ Or directly (this is the path hardcoded in `deployer::start`): # first, make sure the shuttle-runtime binary is built cargo build # then -/home//target/debug/shuttle-runtime --legacy --provisioner-address http://localhost:5000 +/home//target/debug/shuttle-runtime --port 6001 --storage-manager-type working-dir --storage-manager-path ./ ``` -Pass the path to `deployer::start` -Then in another shell, load a `.so` file and start it up: +Then in another shell, load the service and start it up: ``` bash # load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//examples/rocket/hello-world/target/debug/libhello_world.so"}' localhost:6001 runtime.Runtime/Load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//examples/rocket/hello-world/target/debug/libhello_world.so", "secrets": {"MY_API_KEY": "test"}}' localhost:6001 runtime.Runtime/Load # run (this deployment id is default uuid encoded as base64) -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Start +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start # subscribe to logs grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs # stop (the service started in the legacy runtime can't currently be stopped) -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic"}' localhost:6001 runtime.Runtime/Stop +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{}' localhost:6001 runtime.Runtime/Stop ``` ## Running the tests diff --git a/runtime/src/axum/mod.rs b/runtime/src/axum/mod.rs index 15b3cf0c7..5bc798964 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/axum/mod.rs @@ -20,7 +20,6 @@ use shuttle_proto::runtime::{ self, LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, SubscribeLogsRequest, }; -use shuttle_service::ServiceName; use tokio::sync::mpsc::{Receiver, Sender}; use tokio::sync::{mpsc, oneshot}; use tokio_stream::wrappers::ReceiverStream; @@ -149,18 +148,12 @@ impl Runtime for AxumWasm { &self, request: tonic::Request, ) -> Result, Status> { - let request = request.into_inner(); - - let service_name = ServiceName::from_str(request.service_name.as_str()) - .map_err(|err| Status::from_error(Box::new(err)))?; + let _request = request.into_inner(); let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); if let Some(kill_tx) = kill_tx { - if kill_tx - .send(format!("stopping deployment: {}", &service_name)) - .is_err() - { + if kill_tx.send(format!("stopping deployment")).is_err() { error!("the receiver dropped"); return Err(Status::internal("failed to stop deployment")); } diff --git a/runtime/src/bin/rocket.rs b/runtime/src/bin/rocket.rs new file mode 100644 index 000000000..8da00a54f --- /dev/null +++ b/runtime/src/bin/rocket.rs @@ -0,0 +1,50 @@ +// The few line below is what we should now codegen for legacy +#[tokio::main] +async fn main() { + shuttle_runtime::start(loader).await; +} + +async fn loader( + mut factory: shuttle_runtime::ProvisionerFactory, +) -> shuttle_service::ShuttleRocket { + use shuttle_service::ResourceBuilder; + + let secrets = shuttle_secrets::Secrets::new().build(&mut factory).await?; + + rocket(secrets).await +} + +// Everything below this is the usual code a user will write +use anyhow::anyhow; +use rocket::response::status::BadRequest; +use rocket::State; +use shuttle_secrets::SecretStore; + +#[rocket::get("/secret")] +async fn secret(state: &State) -> Result> { + Ok(state.secret.clone()) +} + +struct MyState { + secret: String, +} + +// #[shuttle_service::main] +pub async fn rocket( + // #[shuttle_secrets::Secrets] secret_store: SecretStore, + secret_store: SecretStore, +) -> shuttle_service::ShuttleRocket { + // get secret defined in `Secrets.toml` file. + let secret = if let Some(secret) = secret_store.get("MY_API_KEY") { + secret + } else { + return Err(anyhow!("secret was not found").into()); + }; + + let state = MyState { secret }; + let rocket = rocket::build() + .mount("/", rocket::routes![secret]) + .manage(state); + + Ok(rocket) +} diff --git a/runtime/src/legacy/error.rs b/runtime/src/legacy/error.rs deleted file mode 100644 index 9c57cd4e2..000000000 --- a/runtime/src/legacy/error.rs +++ /dev/null @@ -1,14 +0,0 @@ -use shuttle_service::loader::LoaderError; -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum Error { - #[error("Load error: {0}")] - Load(#[from] LoaderError), - #[error("Run error: {0}")] - Run(#[from] shuttle_service::Error), - #[error("Start error: {0}")] - Start(#[from] shuttle_service::error::CustomError), -} - -pub type Result = std::result::Result; diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 137e7a369..d5fe5ab8b 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -1,141 +1,147 @@ use std::{ - collections::BTreeMap, iter::FromIterator, net::SocketAddr, ops::DerefMut, path::PathBuf, - str::FromStr, sync::Mutex, + collections::BTreeMap, + iter::FromIterator, + net::{Ipv4Addr, SocketAddr}, + ops::DerefMut, + str::FromStr, + sync::Mutex, + time::Duration, }; -use anyhow::{anyhow, Context}; +use anyhow::Context; use async_trait::async_trait; -use shuttle_common::{storage_manager::StorageManager, LogItem}; +use clap::Parser; +use futures::Future; +use shuttle_common::{ + storage_manager::{StorageManager, WorkingDirStorageManager}, + LogItem, +}; use shuttle_proto::{ provisioner::provisioner_client::ProvisionerClient, runtime::{ - self, runtime_server::Runtime, LoadRequest, LoadResponse, StartRequest, StartResponse, - StopRequest, StopResponse, SubscribeLogsRequest, + self, + runtime_server::{Runtime, RuntimeServer}, + LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, + SubscribeLogsRequest, }, }; -use shuttle_service::{ - loader::{LoadedService, Loader}, - Factory, Logger, ServiceName, -}; +use shuttle_service::{Factory, Service, ServiceName}; use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender}; use tokio::sync::oneshot; use tokio_stream::wrappers::ReceiverStream; -use tonic::{transport::Endpoint, Request, Response, Status}; +use tonic::{ + transport::{Endpoint, Server}, + Request, Response, Status, +}; use tracing::{error, instrument, trace}; use uuid::Uuid; -use crate::provisioner_factory::ProvisionerFactory; +use crate::{provisioner_factory::ProvisionerFactory, Args}; -mod error; +pub async fn start( + loader: impl Loader> + Send + 'static, +) { + let args = Args::parse(); + let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); -pub struct Legacy -where - S: StorageManager, -{ + let provisioner_address = args.provisioner_address; + let mut server_builder = + Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); + + let router = { + let legacy = Legacy::new( + provisioner_address, + loader, + WorkingDirStorageManager::new(args.storage_manager_path), + ); + + let svc = RuntimeServer::new(legacy); + server_builder.add_service(svc) + }; + + router.serve(addr).await.unwrap(); +} + +pub struct Legacy { // Mutexes are for interior mutability - so_path: Mutex>, logs_rx: Mutex>>, logs_tx: UnboundedSender, provisioner_address: Endpoint, kill_tx: Mutex>>, - secrets: Mutex>>, - storage_manager: S, + storage_manager: M, + loader: Mutex>, + service: Mutex>, } -impl Legacy -where - S: StorageManager, -{ - pub fn new(provisioner_address: Endpoint, storage_manager: S) -> Self { +impl Legacy { + pub fn new(provisioner_address: Endpoint, loader: L, storage_manager: M) -> Self { let (tx, rx) = mpsc::unbounded_channel(); Self { - so_path: Mutex::new(None), logs_rx: Mutex::new(Some(rx)), logs_tx: tx, kill_tx: Mutex::new(None), provisioner_address, - secrets: Mutex::new(None), storage_manager, + loader: Mutex::new(Some(loader)), + service: Mutex::new(None), } } } #[async_trait] -impl Runtime for Legacy +pub trait Loader where - S: StorageManager + 'static, + Fac: Factory, { - async fn load(&self, request: Request) -> Result, Status> { - let LoadRequest { path, secrets, .. } = request.into_inner(); - trace!(path, "loading"); - - let so_path = PathBuf::from(path); - - if !so_path.exists() { - return Err(Status::not_found("'.so' to load does not exist")); - } + type Service: Service; - *self.so_path.lock().unwrap() = Some(so_path); + async fn load(self, factory: Fac) -> Result; +} - *self.secrets.lock().unwrap() = Some(BTreeMap::from_iter(secrets.into_iter())); +#[async_trait] +impl Loader for F +where + F: FnOnce(Fac) -> O + Send, + O: Future> + Send, + Fac: Factory + 'static, + S: Service, +{ + type Service = S; - let message = LoadResponse { success: true }; - Ok(Response::new(message)) + async fn load(self, factory: Fac) -> Result { + (self)(factory).await } +} - async fn start( - &self, - request: Request, - ) -> Result, Status> { - trace!("legacy starting"); +#[async_trait] +impl Runtime for Legacy +where + M: StorageManager + Send + Sync + 'static, + L: Loader, Service = S> + Send + 'static, + S: Service + Send + 'static, +{ + async fn load(&self, request: Request) -> Result, Status> { + let LoadRequest { + path, + secrets, + service_name, + } = request.into_inner(); + trace!(path, "loading"); + + let secrets = BTreeMap::from_iter(secrets.into_iter()); let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) .await .context("failed to connect to provisioner") .map_err(|err| Status::internal(err.to_string()))?; - let so_path = self - .so_path - .lock() - .unwrap() - .as_ref() - .ok_or_else(|| -> error::Error { - error::Error::Start(anyhow!("trying to start a service that was not loaded")) - }) - .map_err(|err| Status::from_error(Box::new(err)))? - .clone(); - let secrets = self - .secrets - .lock() - .unwrap() - .as_ref() - .ok_or_else(|| -> error::Error { - error::Error::Start(anyhow!( - "trying to get secrets from a service that was not loaded" - )) - }) - .map_err(|err| Status::from_error(Box::new(err)))? - .clone(); - - trace!("prepare done"); - - let StartRequest { - deployment_id, - service_name, - ip, - } = request.into_inner(); - let service_address = SocketAddr::from_str(&ip) - .context("invalid socket address") - .map_err(|err| Status::invalid_argument(err.to_string()))?; - let service_name = ServiceName::from_str(service_name.as_str()) .map_err(|err| Status::from_error(Box::new(err)))?; - let deployment_id = Uuid::from_slice(&deployment_id) - .map_err(|error| Status::invalid_argument(error.to_string()))?; + let deployment_id = Uuid::new_v4(); - let mut factory = ProvisionerFactory::new( + let factory = ProvisionerFactory::new( provisioner_client, service_name, deployment_id, @@ -144,17 +150,34 @@ where ); trace!("got factory"); - let logs_tx = self.logs_tx.clone(); + let loader = self.loader.lock().unwrap().deref_mut().take().unwrap(); - let logger = Logger::new(logs_tx, deployment_id); + let service = loader.load(factory).await.unwrap(); + + *self.service.lock().unwrap() = Some(service); + + let message = LoadResponse { success: true }; + Ok(Response::new(message)) + } + + async fn start( + &self, + request: Request, + ) -> Result, Status> { + trace!("legacy starting"); + let service = self.service.lock().unwrap().deref_mut().take(); + let service = service.unwrap(); + + let StartRequest { ip, .. } = request.into_inner(); + let service_address = SocketAddr::from_str(&ip) + .context("invalid socket address") + .map_err(|err| Status::invalid_argument(err.to_string()))?; + + let _logs_tx = self.logs_tx.clone(); trace!(%service_address, "starting"); - let service = load_service(service_address, so_path, &mut factory, logger) - .await - .map_err(|error| Status::internal(error.to_string()))?; let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); - *self.kill_tx.lock().unwrap() = Some(kill_tx); // start service as a background task with a kill receiver @@ -189,21 +212,11 @@ where } } - // todo: this doesn't currently stop the service, since we can't stop the tokio runtime it - // is started on. - async fn stop(&self, request: Request) -> Result, Status> { - let request = request.into_inner(); - - let service_name = ServiceName::from_str(request.service_name.as_str()) - .map_err(|err| Status::from_error(Box::new(err)))?; - + async fn stop(&self, _request: Request) -> Result, Status> { let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); if let Some(kill_tx) = kill_tx { - if kill_tx - .send(format!("stopping deployment: {}", &service_name)) - .is_err() - { + if kill_tx.send(format!("stopping deployment")).is_err() { error!("the receiver dropped"); return Err(Status::internal("failed to stop deployment")); } @@ -218,15 +231,14 @@ where /// Run the service until a stop signal is received #[instrument(skip(service, kill_rx))] async fn run_until_stopped( - service: LoadedService, + // service: LoadedService, + service: impl Service, addr: SocketAddr, kill_rx: tokio::sync::oneshot::Receiver, ) { - let (handle, library) = service; - trace!("starting deployment on {}", &addr); tokio::select! { - _ = handle => { + _ = service.bind(addr) => { trace!("deployment stopped on {}", &addr); }, message = kill_rx => { @@ -236,21 +248,4 @@ async fn run_until_stopped( } } } - - tokio::spawn(async move { - trace!("closing .so file"); - library.close().unwrap(); - }); -} - -#[instrument(skip(addr, so_path, factory, logger))] -async fn load_service( - addr: SocketAddr, - so_path: PathBuf, - factory: &mut dyn Factory, - logger: Logger, -) -> error::Result { - let loader = Loader::from_so_file(so_path)?; - - Ok(loader.load(factory, addr, logger).await?) } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index fc17f47c4..62fedf7f3 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,8 +1,9 @@ mod args; mod axum; mod legacy; -pub mod provisioner_factory; +mod provisioner_factory; pub use args::{Args, StorageManagerType}; pub use axum::AxumWasm; -pub use legacy::Legacy; +pub use legacy::{start, Legacy}; +pub use provisioner_factory::ProvisionerFactory; diff --git a/service/src/lib.rs b/service/src/lib.rs index 2ece4b571..b40fe8b61 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -389,7 +389,7 @@ pub trait Factory: Send + Sync { #[async_trait] pub trait ResourceBuilder { fn new() -> Self; - async fn build(self, factory: &mut dyn Factory, runtime: &Runtime) -> Result; + async fn build(self, factory: &mut dyn Factory) -> Result; } /// A tokio handle the service was started on @@ -406,7 +406,7 @@ pub trait Service: Send + Sync { /// This function is run exactly once on each instance of a deployment. /// /// The deployer expects this instance of [Service][Service] to bind to the passed [SocketAddr][SocketAddr]. - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error>; + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error>; } /// This function is generated by our codegen. It uses the factory to get other services and instantiate them on @@ -476,7 +476,7 @@ impl Drop for Bootstrapper { #[cfg(feature = "web-rocket")] #[async_trait] impl Service for rocket::Rocket { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { let shutdown = rocket::config::Shutdown { ctrlc: false, ..rocket::config::Shutdown::default() From 69b82e605d3b168f2e803767f0847799d0447dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:00:01 +0000 Subject: [PATCH 37/74] feat: remove box self from services, remove syncwrapper from axum service (#677) * feat: remove box self from all services * feat: remove syncwrapper from axum integration --- Cargo.lock | 1 - service/Cargo.toml | 3 +-- service/src/lib.rs | 32 +++++++++++++++----------------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 25def720b..7498f25b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6469,7 +6469,6 @@ dependencies = [ "shuttle-codegen", "shuttle-common", "sqlx", - "sync_wrapper", "thiserror", "thruster", "tide", diff --git a/service/Cargo.toml b/service/Cargo.toml index 261d85514..2379c1e4a 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -31,7 +31,6 @@ salvo = { version = "0.37.5", optional = true } serde_json = { workspace = true } serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"], optional = true } poise = { version = "0.5.2", optional = true } -sync_wrapper = { version = "0.1.1", optional = true } thiserror = { workspace = true } thruster = { version = "1.3.0", optional = true } tide = { version = "0.16.0", optional = true } @@ -70,7 +69,7 @@ codegen = ["shuttle-codegen/frameworks"] loader = ["cargo", "libloading"] web-actix-web = ["actix-web", "num_cpus"] -web-axum = ["axum", "sync_wrapper"] +web-axum = ["axum"] web-rocket = ["rocket"] web-thruster = ["thruster"] web-tide = ["tide", "async-std"] diff --git a/service/src/lib.rs b/service/src/lib.rs index b40fe8b61..d65961515 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -509,7 +509,7 @@ impl Service for T where T: poem::Endpoint + Sync + Send + 'static, { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { poem::Server::new(poem::listener::TcpListener::bind(addr)) .run(self) .await @@ -529,7 +529,7 @@ where T: Send + Sync + Clone + 'static + warp::Filter, T::Extract: warp::reply::Reply, { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { warp::serve(*self).run(addr).await; Ok(()) } @@ -540,12 +540,10 @@ pub type ShuttleWarp = Result, Error>; #[cfg(feature = "web-axum")] #[async_trait] -impl Service for sync_wrapper::SyncWrapper { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { - let router = self.into_inner(); - +impl Service for axum::Router { + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { axum::Server::bind(&addr) - .serve(router.into_make_service()) + .serve(self.into_make_service()) .await .map_err(error::CustomError::new)?; @@ -553,13 +551,16 @@ impl Service for sync_wrapper::SyncWrapper { } } +#[cfg(feature = "web-axum")] +pub type ShuttleAxum = Result; + #[cfg(feature = "web-actix-web")] #[async_trait] impl Service for F where F: FnOnce(&mut actix_web::web::ServiceConfig) + Sync + Send + Clone + 'static, { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), Error> { + async fn bind(mut self, addr: SocketAddr) -> Result<(), Error> { // Start a worker for each cpu, but no more than 4. let worker_count = num_cpus::get().max(4); @@ -575,13 +576,10 @@ where #[cfg(feature = "web-actix-web")] pub type ShuttleActixWeb = Result; -#[cfg(feature = "web-axum")] -pub type ShuttleAxum = Result, Error>; - #[cfg(feature = "web-salvo")] #[async_trait] impl Service for salvo::Router { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { salvo::Server::new(salvo::listener::TcpListener::bind(addr)) .serve(self) .await; @@ -599,7 +597,7 @@ impl Service for T where T: thruster::ThrusterServer + Sync + Send + 'static, { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { self.build(&addr.ip().to_string(), addr.port()).await; Ok(()) @@ -615,7 +613,7 @@ impl Service for tide::Server where T: Clone + Send + Sync + 'static, { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { self.listen(addr).await.map_err(error::CustomError::new)?; Ok(()) @@ -637,7 +635,7 @@ where T::Error: std::error::Error + Send + Sync, T::Future: std::future::Future + Send + Sync, { - async fn bind(mut self: Box, addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { let shared = tower::make::Shared::new(self); hyper::Server::bind(&addr) .serve(shared) @@ -651,7 +649,7 @@ where #[cfg(feature = "bot-serenity")] #[async_trait] impl Service for serenity::Client { - async fn bind(mut self: Box, _addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, _addr: SocketAddr) -> Result<(), error::Error> { self.start().await.map_err(error::CustomError::new)?; Ok(()) @@ -668,7 +666,7 @@ where T: std::marker::Send + std::marker::Sync + 'static, E: std::marker::Send + std::marker::Sync + 'static, { - async fn bind(mut self: Box, _addr: SocketAddr) -> Result<(), error::Error> { + async fn bind(mut self, _addr: SocketAddr) -> Result<(), error::Error> { self.start().await.map_err(error::CustomError::new)?; Ok(()) From 91f12b4e138c48b392db36c456809db2fe00c87e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:03:17 +0000 Subject: [PATCH 38/74] Fix/move docker profiles to dev (#674) * refactor: move docker profiles to dev.yml * docs: update comment in makefile --- Makefile | 4 ++-- docker-compose.dev.yml | 6 ++++++ docker-compose.yml | 4 ---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 2bed9be28..c4752a48c 100644 --- a/Makefile +++ b/Makefile @@ -124,8 +124,8 @@ test: cd e2e; POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) APPS_FQDN=$(APPS_FQDN) cargo test $(CARGO_TEST_FLAGS) -- --nocapture # Start the containers locally. This does not start panamax by default, -# to start panamax locally run this command with the COMPOSE_PROFILES=panamax -# environment variable. +# to start panamax locally run this command with an override for the profiles: +# `make COMPOSE_PROFILES=panamax up` up: docker-compose.rendered.yml CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) $(DOCKER_COMPOSE) -f $< -p $(STACK) up -d $(DOCKER_COMPOSE_FLAGS) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index ea1ac7eb2..c1f95de6b 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -23,3 +23,9 @@ services: exec /usr/local/bin/service "$${@:0}" ports: - 5000:8000 + panamax: + profiles: + - panamax + deck-chores: + profiles: + - panamax diff --git a/docker-compose.yml b/docker-compose.yml index 6fffc6dec..85ef0e204 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -173,8 +173,6 @@ services: constraints: - node.hostname==controller panamax: - profiles: - - panamax image: "${CONTAINER_REGISTRY}/panamax:${PANAMAX_TAG}" restart: always networks: @@ -191,8 +189,6 @@ services: constraints: - node.hostname==controller deck-chores: - profiles: - - panamax image: funkyfuture/deck-chores:1 restart: unless-stopped environment: From 52096fc6d895ab0146f24313d112d13d2198a582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 6 Mar 2023 08:14:09 +0000 Subject: [PATCH 39/74] feat: extract next runtime into separate binary (#679) * feat: extract next runtime into separate binary * fix: remove startrequestsservice name --- cargo-shuttle/src/lib.rs | 1 - deployer/src/deployment/run.rs | 8 +--- runtime/Cargo.toml | 6 ++- runtime/Makefile | 4 +- runtime/README.md | 21 +++++----- runtime/src/bin/next.rs | 40 +++++++++++++++++++ runtime/src/{ => legacy}/args.rs | 8 ---- runtime/src/legacy/mod.rs | 6 ++- runtime/src/lib.rs | 7 ++-- runtime/src/main.rs | 66 ------------------------------- runtime/src/next/args.rs | 9 +++++ runtime/src/{axum => next}/mod.rs | 8 ++-- 12 files changed, 82 insertions(+), 102 deletions(-) create mode 100644 runtime/src/bin/next.rs rename runtime/src/{ => legacy}/args.rs (77%) delete mode 100644 runtime/src/main.rs create mode 100644 runtime/src/next/args.rs rename runtime/src/{axum => next}/mod.rs (99%) diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index d09ae6d2d..5fcc02eab 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -516,7 +516,6 @@ impl Shuttle { let start_request = StartRequest { deployment_id: id.as_bytes().to_vec(), - service_name, ip: addr.to_string(), }; diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index b0ce1e3be..c1123005a 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -218,7 +218,6 @@ impl Built { .unwrap(); run( self.id, - self.service_name, runtime_client, address, deployment_updater, @@ -280,7 +279,6 @@ async fn load( #[instrument(skip(runtime_client, deployment_updater, kill_recv, cleanup), fields(state = %State::Running))] async fn run( id: Uuid, - service_name: String, runtime_client: &mut RuntimeClient, address: SocketAddr, deployment_updater: impl DeploymentUpdater, @@ -294,7 +292,6 @@ async fn run( let start_request = tonic::Request::new(StartRequest { deployment_id: id.as_bytes().to_vec(), - service_name: service_name.clone(), ip: address.to_string(), }); @@ -310,10 +307,7 @@ async fn run( while let Ok(kill_id) = kill_recv.recv().await { if kill_id == id { - let stop_request = tonic::Request::new(StopRequest { - deployment_id: id.as_bytes().to_vec(), - service_name: service_name.clone(), - }); + let stop_request = tonic::Request::new(StopRequest {}); response = runtime_client.stop(stop_request).await; break; diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index cfa96cd80..b1bb859ed 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -9,6 +9,9 @@ publish = false [[bin]] name = "rocket" +[[bin]] +name = "next" + [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } @@ -23,6 +26,7 @@ tonic = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } uuid = { workspace = true, features = ["v4"] } +# TODO: bump these crates to 6.0 when we bump rust to >= 1.66 wasi-common = "4.0.0" wasmtime = "4.0.0" wasmtime-wasi = "4.0.0" @@ -35,7 +39,7 @@ rocket = "0.5.0-rc.2" [dependencies.shuttle-common] workspace = true -features = ["wasm"] +features = ["wasm", "service"] [dependencies.shuttle-proto] workspace = true diff --git a/runtime/Makefile b/runtime/Makefile index 6472a425e..fd4fccbd0 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -3,8 +3,8 @@ all: axum axum: - cd ../tmp/axum-wasm-expanded; cargo build --target wasm32-wasi - cp ../tmp/axum-wasm-expanded/target/wasm32-wasi/debug/shuttle_axum_expanded.wasm axum.wasm + cd tests/resources/axum-wasm-expanded; cargo build --target wasm32-wasi + cp tests/resources/axum-wasm-expanded/target/wasm32-wasi/debug/shuttle_axum_expanded.wasm axum.wasm test: axum cargo test --all-features -- --nocapture diff --git a/runtime/README.md b/runtime/README.md index 5e1f1d910..d7caf894d 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -30,7 +30,7 @@ make test Load and run: ```bash -cargo run -- --axum --provisioner-address http://localhost:5000 +cargo run --bin next -- --port 6001 ``` In another terminal: @@ -40,24 +40,27 @@ In another terminal: grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//runtime/axum.wasm"}' localhost:6001 runtime.Runtime/Load # start -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Start +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start -# subscribe to logs (unimplemented) +# subscribe to logs grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs # stop -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw"}' localhost:6001 runtime.Runtime/Stop +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{}' localhost:6001 runtime.Runtime/Stop ``` Curl the service: ```bash -curl localhost:7002/hello +curl localhost:8000/hello -curl localhost:7002/goodbye +curl localhost:8000/goodbye ``` ## shuttle-legacy -This will no loger load a `.so` will the code to start the runtime will be codegened for all services. + +This will no longer load a `.so` file, the code to start the runtime will be +codegened for all services. + An example can be found in `src/bin/rocket.rs` which contains the secrets rocket example at the bottom and the codegen at the top. To test, first start a provisioner from the root directory using: @@ -69,7 +72,7 @@ docker-compose -f docker-compose.rendered.yml up provisioner Then in another shell, start the wrapped runtime using the clap CLI: ```bash -cargo run -- --port 6001 --storage-manager-type working-dir --storage-manager-path ./ +cargo run --bin rocket -- --port 6001 --storage-manager-type working-dir --storage-manager-path ./ ``` Or directly (this is the path hardcoded in `deployer::start`): @@ -87,7 +90,7 @@ Then in another shell, load the service and start it up: grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//examples/rocket/hello-world/target/debug/libhello_world.so", "secrets": {"MY_API_KEY": "test"}}' localhost:6001 runtime.Runtime/Load # run (this deployment id is default uuid encoded as base64) -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start # subscribe to logs grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs diff --git a/runtime/src/bin/next.rs b/runtime/src/bin/next.rs new file mode 100644 index 000000000..554cb882e --- /dev/null +++ b/runtime/src/bin/next.rs @@ -0,0 +1,40 @@ +use std::{ + net::{Ipv4Addr, SocketAddr}, + time::Duration, +}; + +use clap::Parser; +use shuttle_proto::runtime::runtime_server::RuntimeServer; +use shuttle_runtime::{AxumWasm, NextArgs}; +use tonic::transport::Server; +use tracing::trace; +use tracing_subscriber::{fmt, prelude::*, EnvFilter}; + +#[tokio::main(flavor = "multi_thread")] +async fn main() { + let args = NextArgs::parse(); + + // TODO: replace with tracing helper from main branch + let fmt_layer = fmt::layer(); + let filter_layer = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("info")) + .unwrap(); + + tracing_subscriber::registry() + .with(filter_layer) + .with(fmt_layer) + .init(); + + trace!(args = ?args, "parsed args"); + + let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); + + let mut server_builder = + Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); + + let axum = AxumWasm::default(); + let svc = RuntimeServer::new(axum); + let router = server_builder.add_service(svc); + + router.serve(addr).await.unwrap(); +} diff --git a/runtime/src/args.rs b/runtime/src/legacy/args.rs similarity index 77% rename from runtime/src/args.rs rename to runtime/src/legacy/args.rs index 9f0215970..77af08cbd 100644 --- a/runtime/src/args.rs +++ b/runtime/src/legacy/args.rs @@ -14,14 +14,6 @@ pub struct Args { #[arg(long, default_value = "http://localhost:5000")] pub provisioner_address: Endpoint, - /// Is this runtime for a legacy service - #[arg(long, conflicts_with("axum"))] - pub legacy: bool, - - /// Is this runtime for an axum-wasm service - #[arg(long, conflicts_with("legacy"))] - pub axum: bool, - /// Type of storage manager to start #[arg(long, value_enum)] pub storage_manager_type: StorageManagerType, diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index d5fe5ab8b..ea042a856 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -36,7 +36,11 @@ use tonic::{ use tracing::{error, instrument, trace}; use uuid::Uuid; -use crate::{provisioner_factory::ProvisionerFactory, Args}; +use crate::provisioner_factory::ProvisionerFactory; + +use self::args::Args; + +mod args; pub async fn start( loader: impl Loader> + Send + 'static, diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 62fedf7f3..9d241f933 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,9 +1,8 @@ -mod args; -mod axum; mod legacy; +mod next; mod provisioner_factory; -pub use args::{Args, StorageManagerType}; -pub use axum::AxumWasm; pub use legacy::{start, Legacy}; +pub use next::AxumWasm; +pub use next::NextArgs; pub use provisioner_factory::ProvisionerFactory; diff --git a/runtime/src/main.rs b/runtime/src/main.rs deleted file mode 100644 index 8a3a5f803..000000000 --- a/runtime/src/main.rs +++ /dev/null @@ -1,66 +0,0 @@ -use std::{ - net::{Ipv4Addr, SocketAddr}, - time::Duration, -}; - -use clap::Parser; -use shuttle_common::storage_manager::{ArtifactsStorageManager, WorkingDirStorageManager}; -use shuttle_proto::runtime::runtime_server::RuntimeServer; -use shuttle_runtime::{Args, AxumWasm, Legacy, StorageManagerType}; -use tonic::transport::Server; -use tracing::trace; -use tracing_subscriber::{fmt, prelude::*, EnvFilter}; - -#[tokio::main(flavor = "multi_thread")] -async fn main() { - let args = Args::parse(); - - let fmt_layer = fmt::layer(); - let filter_layer = EnvFilter::try_from_default_env() - .or_else(|_| EnvFilter::try_new("info")) - .unwrap(); - - tracing_subscriber::registry() - .with(filter_layer) - .with(fmt_layer) - .init(); - - trace!(args = ?args, "parsed args"); - - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); - - let provisioner_address = args.provisioner_address; - let mut server_builder = - Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); - - let router = if args.legacy { - match args.storage_manager_type { - StorageManagerType::Artifacts => { - let legacy = Legacy::new( - provisioner_address, - ArtifactsStorageManager::new(args.storage_manager_path), - ); - - let svc = RuntimeServer::new(legacy); - server_builder.add_service(svc) - } - StorageManagerType::WorkingDir => { - let legacy = Legacy::new( - provisioner_address, - WorkingDirStorageManager::new(args.storage_manager_path), - ); - - let svc = RuntimeServer::new(legacy); - server_builder.add_service(svc) - } - } - } else if args.axum { - let axum = AxumWasm::default(); - let svc = RuntimeServer::new(axum); - server_builder.add_service(svc) - } else { - panic!("No runtime was selected"); - }; - - router.serve(addr).await.unwrap(); -} diff --git a/runtime/src/next/args.rs b/runtime/src/next/args.rs new file mode 100644 index 000000000..ccbb3ac6e --- /dev/null +++ b/runtime/src/next/args.rs @@ -0,0 +1,9 @@ +use clap::Parser; + +#[derive(Parser, Debug)] +#[command(version)] +pub struct NextArgs { + /// Port to start runtime on + #[arg(long)] + pub port: u16, +} diff --git a/runtime/src/axum/mod.rs b/runtime/src/next/mod.rs similarity index 99% rename from runtime/src/axum/mod.rs rename to runtime/src/next/mod.rs index 5bc798964..ccd30e321 100644 --- a/runtime/src/axum/mod.rs +++ b/runtime/src/next/mod.rs @@ -30,6 +30,10 @@ use wasmtime::{Engine, Linker, Module, Store}; use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; use wasmtime_wasi::{WasiCtx, WasiCtxBuilder}; +mod args; + +pub use self::args::NextArgs; + extern crate rmp_serde as rmps; const LOGS_FD: u32 = 20; @@ -94,9 +98,7 @@ impl Runtime for AxumWasm { &self, request: tonic::Request, ) -> Result, Status> { - let StartRequest { - deployment_id, ip, .. - } = request.into_inner(); + let StartRequest { deployment_id, ip } = request.into_inner(); let address = SocketAddr::from_str(&ip) .context("invalid socket address") From 3489e83cfabd775fc6c54dbba0339c642b69be85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 6 Mar 2023 08:17:02 +0000 Subject: [PATCH 40/74] Feature: remove tokio runtime from all resources (#680) * feat: remove runtime from resources * fix: compile errors, comments * fix: remove comment --- resources/aws-rds/Cargo.toml | 1 - resources/aws-rds/src/lib.rs | 17 +++++---------- resources/persist/Cargo.toml | 1 - resources/persist/src/lib.rs | 2 -- resources/shared-db/Cargo.toml | 1 - resources/shared-db/src/lib.rs | 35 ++++++------------------------ resources/static-folder/Cargo.toml | 1 - resources/static-folder/src/lib.rs | 22 ++++--------------- service/src/lib.rs | 3 --- service/src/persist.rs | 7 +----- 10 files changed, 17 insertions(+), 73 deletions(-) diff --git a/resources/aws-rds/Cargo.toml b/resources/aws-rds/Cargo.toml index bcf5652c1..0dfec8369 100644 --- a/resources/aws-rds/Cargo.toml +++ b/resources/aws-rds/Cargo.toml @@ -12,7 +12,6 @@ async-trait = "0.1.56" paste = "1.0.7" shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"] } -tokio = { version = "1.19.2", features = ["rt"] } [features] postgres = ["sqlx/postgres"] diff --git a/resources/aws-rds/src/lib.rs b/resources/aws-rds/src/lib.rs index 6b6165228..dec92c198 100644 --- a/resources/aws-rds/src/lib.rs +++ b/resources/aws-rds/src/lib.rs @@ -7,7 +7,6 @@ use shuttle_service::{ error::CustomError, Factory, ResourceBuilder, }; -use tokio::runtime::Runtime; macro_rules! aws_engine { ($feature:expr, $pool_path:path, $options_path:path, $struct_ident:ident) => { @@ -24,22 +23,16 @@ macro_rules! aws_engine { Self {} } - async fn build(self, factory: &mut dyn Factory, runtime: &Runtime) -> Result<$pool_path, shuttle_service::Error> { + async fn build(self, factory: &mut dyn Factory) -> Result<$pool_path, shuttle_service::Error> { let connection_string = factory .get_db_connection_string(Type::AwsRds(AwsRdsEngine::$struct_ident)) .await?; - // A sqlx Pool cannot cross runtime boundaries, so make sure to create the Pool on the service end - let pool = runtime - .spawn(async move { - $options_path::new() - .min_connections(1) - .max_connections(5) - .connect(&connection_string) - .await - }) + let pool = $options_path::new() + .min_connections(1) + .max_connections(5) + .connect(&connection_string) .await - .map_err(CustomError::new)? .map_err(CustomError::new)?; Ok(pool) diff --git a/resources/persist/Cargo.toml b/resources/persist/Cargo.toml index 7686a44c1..82e0559e6 100644 --- a/resources/persist/Cargo.toml +++ b/resources/persist/Cargo.toml @@ -14,4 +14,3 @@ serde = { version = "1.0.0", features = ["derive"] } shuttle-common = { path = "../../common", version = "0.8.0", default-features = false } shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } thiserror = "1.0.32" -tokio = { version = "1.19.2", features = ["rt"] } diff --git a/resources/persist/src/lib.rs b/resources/persist/src/lib.rs index f6fd8e8a4..84d3ce458 100644 --- a/resources/persist/src/lib.rs +++ b/resources/persist/src/lib.rs @@ -10,7 +10,6 @@ use std::io::BufReader; use std::io::BufWriter; use std::path::PathBuf; use thiserror::Error; -use tokio::runtime::Runtime; #[derive(Error, Debug)] pub enum PersistError { @@ -74,7 +73,6 @@ impl ResourceBuilder for Persist { async fn build( self, factory: &mut dyn Factory, - _runtime: &Runtime, ) -> Result { Ok(PersistInstance { service_name: factory.get_service_name(), diff --git a/resources/shared-db/Cargo.toml b/resources/shared-db/Cargo.toml index 611d5126a..0cbf266eb 100644 --- a/resources/shared-db/Cargo.toml +++ b/resources/shared-db/Cargo.toml @@ -12,7 +12,6 @@ async-trait = "0.1.56" mongodb = { version = "2.3.0", optional = true } shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"], optional = true } -tokio = { version = "1.19.2", features = ["rt"] } [features] postgres = ["sqlx/postgres"] diff --git a/resources/shared-db/src/lib.rs b/resources/shared-db/src/lib.rs index c65069c75..fb3fd15a3 100644 --- a/resources/shared-db/src/lib.rs +++ b/resources/shared-db/src/lib.rs @@ -1,7 +1,5 @@ #![doc = include_str!("../README.md")] -use tokio::runtime::Runtime; - use async_trait::async_trait; use shuttle_service::{database, error::CustomError, Error, Factory, ResourceBuilder}; @@ -16,26 +14,16 @@ impl ResourceBuilder for Postgres { Self {} } - async fn build( - self, - factory: &mut dyn Factory, - runtime: &Runtime, - ) -> Result { + async fn build(self, factory: &mut dyn Factory) -> Result { let connection_string = factory .get_db_connection_string(database::Type::Shared(database::SharedEngine::Postgres)) .await?; - // A sqlx Pool cannot cross runtime boundaries, so make sure to create the Pool on the service end - let pool = runtime - .spawn(async move { - sqlx::postgres::PgPoolOptions::new() - .min_connections(1) - .max_connections(5) - .connect(&connection_string) - .await - }) + let pool = sqlx::postgres::PgPoolOptions::new() + .min_connections(1) + .max_connections(5) + .connect(&connection_string) .await - .map_err(CustomError::new)? .map_err(CustomError::new)?; Ok(pool) @@ -53,11 +41,7 @@ impl ResourceBuilder for MongoDb { Self {} } - async fn build( - self, - factory: &mut dyn Factory, - runtime: &Runtime, - ) -> Result { + async fn build(self, factory: &mut dyn Factory) -> Result { let connection_string = factory .get_db_connection_string(database::Type::Shared(database::SharedEngine::MongoDb)) .await @@ -69,12 +53,7 @@ impl ResourceBuilder for MongoDb { client_options.min_pool_size = Some(1); client_options.max_pool_size = Some(5); - // A mongodb client cannot cross runtime boundaries, so make sure to create the client on the service end - let client = runtime - .spawn(async move { mongodb::Client::with_options(client_options) }) - .await - .map_err(CustomError::new)? - .map_err(CustomError::new)?; + let client = mongodb::Client::with_options(client_options).map_err(CustomError::new)?; // Return a handle to the database defined at the end of the connection string, which is the users provisioned // database diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml index bd44daee7..cade0556f 100644 --- a/resources/static-folder/Cargo.toml +++ b/resources/static-folder/Cargo.toml @@ -10,7 +10,6 @@ keywords = ["shuttle-service", "static-folder"] [dependencies] async-trait = "0.1.56" shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } -tokio = { version = "1.19.2", features = ["rt"] } [dev-dependencies] tempdir = "0.3.7" diff --git a/resources/static-folder/src/lib.rs b/resources/static-folder/src/lib.rs index 259288dd9..524ffe80f 100644 --- a/resources/static-folder/src/lib.rs +++ b/resources/static-folder/src/lib.rs @@ -7,7 +7,6 @@ use std::{ fs::rename, path::{Path, PathBuf}, }; -use tokio::runtime::Runtime; pub struct StaticFolder<'a> { /// The folder to reach at runtime. Defaults to `static` @@ -33,11 +32,7 @@ impl<'a> ResourceBuilder for StaticFolder<'a> { Self { folder: "static" } } - async fn build( - self, - factory: &mut dyn Factory, - _runtime: &Runtime, - ) -> Result { + async fn build(self, factory: &mut dyn Factory) -> Result { let folder = Path::new(self.folder); // Prevent users from users from reading anything outside of their crate's build folder @@ -171,8 +166,7 @@ mod tests { // Call plugin let static_folder = StaticFolder::new(); - let runtime = tokio::runtime::Runtime::new().unwrap(); - let actual_folder = static_folder.build(&mut factory, &runtime).await.unwrap(); + let actual_folder = static_folder.build(&mut factory).await.unwrap(); assert_eq!( actual_folder, @@ -185,8 +179,6 @@ mod tests { "Hello, test!", "expected file content to match" ); - - runtime.shutdown_background(); } #[tokio::test] @@ -194,15 +186,12 @@ mod tests { async fn cannot_use_absolute_path() { let mut factory = MockFactory::new(); let static_folder = StaticFolder::new(); - let runtime = tokio::runtime::Runtime::new().unwrap(); let _ = static_folder .folder("/etc") - .build(&mut factory, &runtime) + .build(&mut factory) .await .unwrap(); - - runtime.shutdown_background(); } #[tokio::test] @@ -217,13 +206,10 @@ mod tests { // Call plugin let static_folder = StaticFolder::new(); - let runtime = tokio::runtime::Runtime::new().unwrap(); let _ = static_folder .folder("../escape") - .build(&mut factory, &runtime) + .build(&mut factory) .await .unwrap(); - - runtime.shutdown_background(); } } diff --git a/service/src/lib.rs b/service/src/lib.rs index d65961515..7b1b55597 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -329,8 +329,6 @@ pub trait Factory: Send + Sync { /// You may want to create your own managed resource by implementing this trait for some builder `B` to construct resource `T`. [`Factory`] can be used to provision resources /// on shuttle's servers if your resource will need any. /// -/// The biggest thing to look out for is that your resource object might panic when it crosses the boundary between the shuttle's backend runtime and the runtime -/// of services. These resources should be created on the passed in `runtime` for this trait to prevent these panics. /// /// Your resource will be available on a [shuttle_service::main][main] function as follow: /// ``` @@ -371,7 +369,6 @@ pub trait Factory: Send + Sync { /// async fn build( /// self, /// factory: &mut dyn Factory, -/// _runtime: &Runtime, /// ) -> Result { /// Ok(Resource { name: self.name }) /// } diff --git a/service/src/persist.rs b/service/src/persist.rs index 6b7510158..adeebc263 100644 --- a/service/src/persist.rs +++ b/service/src/persist.rs @@ -9,7 +9,6 @@ use std::io::BufReader; use std::io::BufWriter; use std::path::PathBuf; use thiserror::Error; -use tokio::runtime::Runtime; #[derive(Error, Debug)] pub enum PersistError { @@ -70,11 +69,7 @@ impl ResourceBuilder for Persist { Self {} } - async fn build( - self, - factory: &mut dyn Factory, - _runtime: &Runtime, - ) -> Result { + async fn build(self, factory: &mut dyn Factory) -> Result { Ok(PersistInstance { service_name: factory.get_service_name(), }) From 8be4742b1c075834364aed9c5991c3a50dabc1a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 6 Mar 2023 14:11:37 +0000 Subject: [PATCH 41/74] feat: trim the service loader, unpin tokio (#681) * feat: trim the serviceloader, unpin tokio * fix: tokio sync is needed * feat: unpin tokio in runtime as well * fix: static folder tests need tokio rt * feat: rename loader, build_crate return bin path * fix: build_Crate invalid args --- Cargo.lock | 11 -- cargo-shuttle/Cargo.toml | 2 +- cargo-shuttle/src/lib.rs | 7 +- deployer/Cargo.toml | 2 +- deployer/src/deployment/queue.rs | 9 +- deployer/src/handlers/mod.rs | 2 +- resources/static-folder/Cargo.toml | 2 +- runtime/Cargo.toml | 4 +- service/Cargo.toml | 7 +- service/src/{loader.rs => builder.rs} | 156 +------------------------- service/src/lib.rs | 82 +------------- 11 files changed, 22 insertions(+), 262 deletions(-) rename service/src/{loader.rs => builder.rs} (57%) diff --git a/Cargo.lock b/Cargo.lock index 7498f25b6..ce6076eab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3823,16 +3823,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] - [[package]] name = "libnghttp2-sys" version = "0.1.7+1.45.0" @@ -6456,7 +6446,6 @@ dependencies = [ "crossbeam-channel", "futures", "hyper", - "libloading", "num_cpus", "pipe", "poem", diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index ce36c87dc..475c5d900 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -64,7 +64,7 @@ path = "../resources/secrets" [dependencies.shuttle-service] workspace = true -features = ["loader"] +features = ["builder"] [features] vendored-openssl = ["openssl/vendored"] diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 5fcc02eab..2f5fab49f 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -30,7 +30,7 @@ use git2::{Repository, StatusOptions}; use ignore::overrides::OverrideBuilder; use ignore::WalkBuilder; use shuttle_common::models::{project, secret}; -use shuttle_service::loader::{build_crate, Runtime}; +use shuttle_service::builder::{build_crate, Runtime}; use std::fmt::Write; use strum::IntoEnumIterator; use tar::Builder; @@ -376,7 +376,6 @@ impl Shuttle { }); let working_directory = self.ctx.working_directory(); - let id = Default::default(); trace!("building project"); println!( @@ -384,7 +383,7 @@ impl Shuttle { "Building".bold().green(), working_directory.display() ); - let runtime = build_crate(id, working_directory, false, tx).await?; + let runtime = build_crate(working_directory, false, tx).await?; trace!("loading secrets"); let secrets_path = working_directory.join("Secrets.toml"); @@ -515,7 +514,7 @@ impl Shuttle { let addr = SocketAddr::new(addr, run_args.port); let start_request = StartRequest { - deployment_id: id.as_bytes().to_vec(), + deployment_id: Uuid::default().as_bytes().to_vec(), ip: addr.to_string(), }; diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index 4dad73991..73edc850f 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -54,7 +54,7 @@ workspace = true [dependencies.shuttle-service] workspace = true -features = ["loader"] +features = ["builder"] [dev-dependencies] ctor = "0.1.26" diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index 9e871986c..0d454b4bb 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -11,7 +11,7 @@ use chrono::Utc; use crossbeam_channel::Sender; use opentelemetry::global; use serde_json::json; -use shuttle_service::loader::{build_crate, get_config, Runtime}; +use shuttle_service::builder::{build_crate, get_config, Runtime}; use tokio::time::{sleep, timeout}; use tracing::{debug, debug_span, error, info, instrument, trace, warn, Instrument, Span}; use tracing_opentelemetry::OpenTelemetrySpanExt; @@ -206,7 +206,7 @@ impl Queued { }); let project_path = project_path.canonicalize()?; - let runtime = build_deployment(self.id, &project_path, tx.clone()).await?; + let runtime = build_deployment(&project_path, tx.clone()).await?; if self.will_run_tests { info!( @@ -321,11 +321,10 @@ async fn extract_tar_gz_data(data: impl Read, dest: impl AsRef) -> Result< #[instrument(skip(project_path, tx))] async fn build_deployment( - deployment_id: Uuid, project_path: &Path, tx: crossbeam_channel::Sender, ) -> Result { - build_crate(deployment_id, project_path, true, tx) + build_crate(project_path, true, tx) .await .map_err(|e| Error::Build(e.into())) } @@ -413,7 +412,7 @@ mod tests { use std::{collections::BTreeMap, fs::File, io::Write, path::Path}; use shuttle_common::storage_manager::ArtifactsStorageManager; - use shuttle_service::loader::Runtime; + use shuttle_service::builder::Runtime; use tempdir::TempDir; use tokio::fs; use uuid::Uuid; diff --git a/deployer/src/handlers/mod.rs b/deployer/src/handlers/mod.rs index f3def2080..ed034d7b8 100644 --- a/deployer/src/handlers/mod.rs +++ b/deployer/src/handlers/mod.rs @@ -18,7 +18,7 @@ use shuttle_common::models::secret; use shuttle_common::project::ProjectName; use shuttle_common::storage_manager::StorageManager; use shuttle_common::LogItem; -use shuttle_service::loader::clean_crate; +use shuttle_service::builder::clean_crate; use tower_http::auth::RequireAuthorizationLayer; use tower_http::trace::TraceLayer; use tracing::{debug, debug_span, error, field, instrument, trace, Span}; diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml index cade0556f..860c9875c 100644 --- a/resources/static-folder/Cargo.toml +++ b/resources/static-folder/Cargo.toml @@ -13,4 +13,4 @@ shuttle-service = { path = "../../service", version = "0.8.0", default-features [dev-dependencies] tempdir = "0.3.7" -tokio = { version = "1.19.2", features = ["macros"] } +tokio = { version = "1.19.2", features = ["macros", "rt"] } diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index b1bb859ed..897f97d8b 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -20,7 +20,7 @@ clap ={ version = "4.0.18", features = ["derive"] } hyper = { version = "0.14.23", features = ["server"] } rmp-serde = { version = "1.1.1" } thiserror = { workspace = true } -tokio = { version = "=1.22.0", features = ["full"] } +tokio = { version = "1.22.0", features = ["full"] } tokio-stream = "0.1.11" tonic = { workspace = true } tracing = { workspace = true } @@ -46,4 +46,4 @@ workspace = true [dependencies.shuttle-service] workspace = true -features = ["loader", "web-rocket"] # TODO: remove web-rocket +features = ["builder", "web-rocket"] # TODO: remove web-rocket diff --git a/service/Cargo.toml b/service/Cargo.toml index 2379c1e4a..ae3a29eb8 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -22,7 +22,6 @@ chrono = { workspace = true } crossbeam-channel = "0.5.6" futures = { version = "0.3.25", features = ["std"] } hyper = { version = "0.14.23", features = ["server", "tcp", "http1"], optional = true } -libloading = { version = "0.7.4", optional = true } num_cpus = { version = "1.14.0", optional = true } pipe = "0.4.0" poem = { version = "1.3.49", optional = true } @@ -34,7 +33,7 @@ poise = { version = "0.5.2", optional = true } thiserror = { workspace = true } thruster = { version = "1.3.0", optional = true } tide = { version = "0.16.0", optional = true } -tokio = { version = "=1.22.0", features = ["rt", "rt-multi-thread", "sync"] } +tokio = { version = "1.22.0", features = ["sync"] } tower = { version = "0.4.13", features = ["make"], optional = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } @@ -59,14 +58,14 @@ features = ["tracing", "service"] [dev-dependencies] portpicker = "0.1.1" sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } -tokio = { version = "1.22.0", features = ["macros"] } +tokio = { version = "1.22.0", features = ["macros", "rt"] } uuid = { workspace = true, features = ["v4"] } [features] default = ["codegen"] codegen = ["shuttle-codegen/frameworks"] -loader = ["cargo", "libloading"] +builder = ["cargo"] web-actix-web = ["actix-web", "num_cpus"] web-axum = ["axum"] diff --git a/service/src/loader.rs b/service/src/builder.rs similarity index 57% rename from service/src/loader.rs rename to service/src/builder.rs index 9f130716c..870284206 100644 --- a/service/src/loader.rs +++ b/service/src/builder.rs @@ -1,106 +1,18 @@ -use std::any::Any; -use std::ffi::OsStr; -use std::net::SocketAddr; -use std::panic::AssertUnwindSafe; use std::path::{Path, PathBuf}; use anyhow::{anyhow, Context}; use cargo::core::compiler::{CompileKind, CompileMode, CompileTarget, MessageFormat}; -use cargo::core::{Manifest, PackageId, Shell, Summary, Verbosity, Workspace}; +use cargo::core::{Shell, Summary, Verbosity, Workspace}; use cargo::ops::{clean, compile, CleanOptions, CompileOptions}; use cargo::util::interning::InternedString; use cargo::util::{homedir, ToSemver}; use cargo::Config; use cargo_metadata::Message; use crossbeam_channel::Sender; -use libloading::{Library, Symbol}; use pipe::PipeWriter; -use thiserror::Error as ThisError; use tracing::{error, trace}; -use futures::FutureExt; -use uuid::Uuid; - -use crate::error::CustomError; -use crate::{logger, Bootstrapper, NAME, NEXT_NAME, VERSION}; -use crate::{Error, Factory, ServeHandle}; - -const ENTRYPOINT_SYMBOL_NAME: &[u8] = b"_create_service\0"; - -type CreateService = unsafe extern "C" fn() -> *mut Bootstrapper; - -#[derive(Debug, ThisError)] -pub enum LoaderError { - #[error("failed to load library: {0}")] - Load(libloading::Error), - #[error("failed to find the shuttle entrypoint. Did you use the provided shuttle macros?")] - GetEntrypoint(libloading::Error), -} - -pub type LoadedService = (ServeHandle, Library); - -pub struct Loader { - bootstrapper: Bootstrapper, - so: Library, -} - -impl Loader { - /// Dynamically load from a `.so` file a value of a type implementing the - /// [`Service`][crate::Service] trait. Relies on the `.so` library having an `extern "C"` - /// function called `ENTRYPOINT_SYMBOL_NAME`, likely automatically generated - /// using the [`shuttle_service::main`][crate::main] macro. - pub fn from_so_file>(so_path: P) -> Result { - trace!(so_path = so_path.as_ref().to_str(), "loading .so path"); - unsafe { - let lib = Library::new(so_path).map_err(LoaderError::Load)?; - - let entrypoint: Symbol = lib - .get(ENTRYPOINT_SYMBOL_NAME) - .map_err(LoaderError::GetEntrypoint)?; - let raw = entrypoint(); - - Ok(Self { - bootstrapper: *Box::from_raw(raw), - so: lib, - }) - } - } - - pub async fn load( - self, - factory: &mut dyn Factory, - addr: SocketAddr, - logger: logger::Logger, - ) -> Result { - trace!("loading service"); - - let mut bootstrapper = self.bootstrapper; - - AssertUnwindSafe(bootstrapper.bootstrap(factory, logger)) - .catch_unwind() - .await - .map_err(|e| Error::BuildPanic(map_any_to_panic_string(e)))??; - - trace!("bootstrapping done"); - - // Start service on this side of the FFI - let handle = tokio::spawn(async move { - bootstrapper.into_handle(addr)?.await.map_err(|e| { - if e.is_panic() { - let mes = e.into_panic(); - - Error::BindPanic(map_any_to_panic_string(mes)) - } else { - Error::Custom(CustomError::new(e)) - } - })? - }); - - trace!("creating handle done"); - - Ok((handle, self.so)) - } -} +use crate::{NAME, NEXT_NAME, VERSION}; /// How to run/build the project pub enum Runtime { @@ -110,7 +22,6 @@ pub enum Runtime { /// Given a project directory path, builds the crate pub async fn build_crate( - deployment_id: Uuid, project_path: &Path, release_mode: bool, tx: Sender, @@ -141,11 +52,8 @@ pub async fn build_crate( let mut ws = Workspace::new(&manifest_path, &config)?; let current = ws.current_mut().map_err(|_| anyhow!("A Shuttle project cannot have a virtual manifest file - please ensure your Cargo.toml file specifies it as a library."))?; - let manifest = current.manifest_mut(); - ensure_cdylib(manifest)?; let summary = current.manifest_mut().summary_mut(); - make_name_unique(summary, deployment_id); let is_next = is_next(summary); if !is_next { @@ -156,7 +64,7 @@ pub async fn build_crate( let opts = get_compile_options(&config, release_mode, is_next)?; let compilation = compile(&ws, &opts); - let path = compilation?.cdylibs[0].path.clone(); + let path = compilation?.binaries[0].path.clone(); Ok(if is_next { Runtime::Next(path) } else { @@ -259,44 +167,6 @@ fn get_compile_options( Ok(opts) } -/// Make sure "cdylib" is set, else set it if possible -fn ensure_cdylib(manifest: &mut Manifest) -> anyhow::Result<()> { - if let Some(target) = manifest - .targets_mut() - .iter_mut() - .find(|target| target.is_lib()) - { - if !target.is_cdylib() { - *target = cargo::core::manifest::Target::lib_target( - target.name(), - vec![cargo::core::compiler::CrateType::Cdylib], - target.src_path().path().unwrap().to_path_buf(), - target.edition(), - ); - } - - Ok(()) - } else { - Err(anyhow!( - "Your Shuttle project must be a library. Please add `[lib]` to your Cargo.toml file." - )) - } -} - -/// Ensure name is unique. Without this `tracing`/`log` crashes because the global subscriber is somehow "already set" -// TODO: remove this when getting rid of the FFI -fn make_name_unique(summary: &mut Summary, deployment_id: Uuid) { - let old_package_id = summary.package_id(); - *summary = summary.clone().override_id( - PackageId::new( - format!("{}-{deployment_id}", old_package_id.name()), - old_package_id.version(), - old_package_id.source_id(), - ) - .unwrap(), - ); -} - fn is_next(summary: &Summary) -> bool { summary .dependencies() @@ -339,23 +209,3 @@ fn check_no_panic(ws: &Workspace) -> anyhow::Result<()> { Ok(()) } - -fn map_any_to_panic_string(a: Box) -> String { - a.downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "".to_string()) -} - -#[cfg(test)] -mod tests { - mod from_so_file { - use crate::loader::{Loader, LoaderError}; - - #[test] - fn invalid() { - let result = Loader::from_so_file("invalid.so"); - - assert!(matches!(result, Err(LoaderError::Load(_)))); - } - } -} diff --git a/service/src/lib.rs b/service/src/lib.rs index 7b1b55597..c7a6e189c 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -85,7 +85,6 @@ //! //! ```bash //! $ cargo shuttle project new -//! $ cargo shuttle project status // until the project is "ready" //! ``` //! //! Then, deploy the service with: @@ -211,16 +210,13 @@ //! use std::collections::BTreeMap; -use std::future::Future; use std::net::SocketAddr; use std::path::PathBuf; -use std::pin::Pin; pub use async_trait::async_trait; // Pub uses by `codegen` pub use anyhow::Context; -pub use tokio::runtime::Runtime; pub use tracing; pub use tracing_subscriber; @@ -286,10 +282,9 @@ extern crate shuttle_codegen; /// /// More [shuttle managed resources can be found here](https://github.com/shuttle-hq/shuttle/tree/main/resources) pub use shuttle_codegen::main; -use tokio::task::JoinHandle; -#[cfg(feature = "loader")] -pub mod loader; +#[cfg(feature = "builder")] +pub mod builder; pub use shuttle_common::project::ProjectName as ServiceName; @@ -329,7 +324,6 @@ pub trait Factory: Send + Sync { /// You may want to create your own managed resource by implementing this trait for some builder `B` to construct resource `T`. [`Factory`] can be used to provision resources /// on shuttle's servers if your resource will need any. /// -/// /// Your resource will be available on a [shuttle_service::main][main] function as follow: /// ``` /// #[shuttle_service::main] @@ -389,87 +383,17 @@ pub trait ResourceBuilder { async fn build(self, factory: &mut dyn Factory) -> Result; } -/// A tokio handle the service was started on -pub type ServeHandle = JoinHandle>; - /// The core trait of the shuttle platform. Every crate deployed to shuttle needs to implement this trait. /// /// Use the [main][main] macro to expose your implementation to the deployment backend. -// -// TODO: our current state machine in the api crate stores this service and can move it across -// threads (handlers) causing `Service` to need `Sync`. We should remove this restriction #[async_trait] -pub trait Service: Send + Sync { +pub trait Service: Send { /// This function is run exactly once on each instance of a deployment. /// /// The deployer expects this instance of [Service][Service] to bind to the passed [SocketAddr][SocketAddr]. async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error>; } -/// This function is generated by our codegen. It uses the factory to get other services and instantiate them on -/// the correct tokio runtime. This function also sets the runtime logger. The output is a future where `T` -/// should implement [Service]. -pub type StateBuilder = - for<'a> fn( - &'a mut dyn Factory, - &'a Runtime, - Logger, - ) -> Pin> + Send + 'a>>; - -/// This function is generated by codegen to ensure binding happens on the other side of the FFI and on the correct -/// tokio runtime. -pub type Binder = for<'a> fn(Box, SocketAddr, &'a Runtime) -> ServeHandle; - -// Make sure every crate used in this struct has its version pinned down to prevent segmentation faults when crossing the FFI. -// Your future self will thank you! -// See https://github.com/shuttle-hq/shuttle/pull/348 -#[allow(dead_code)] -pub struct Bootstrapper { - service: Option>, - builder: Option>>, - binder: Binder, - runtime: Option, -} - -impl Bootstrapper { - pub fn new(builder: StateBuilder>, binder: Binder, runtime: Runtime) -> Self { - Self { - service: None, - builder: Some(builder), - binder, - runtime: Some(runtime), - } - } - - #[cfg(feature = "loader")] - async fn bootstrap(&mut self, factory: &mut dyn Factory, logger: Logger) -> Result<(), Error> { - if let Some(builder) = self.builder.take() { - let service = builder(factory, self.runtime.as_ref().unwrap(), logger).await?; - self.service = Some(service); - } - - Ok(()) - } - - #[cfg(feature = "loader")] - fn into_handle(mut self, addr: SocketAddr) -> Result { - let service = self.service.take().expect("service has already been bound"); - - let handle = (self.binder)(service, addr, self.runtime.as_ref().unwrap()); - - Ok(handle) - } -} - -impl Drop for Bootstrapper { - fn drop(&mut self) { - if let Some(runtime) = self.runtime.take() { - // TODO: find a way to drop the runtime - std::mem::forget(runtime); - } - } -} - #[cfg(feature = "web-rocket")] #[async_trait] impl Service for rocket::Rocket { From a6279c69b873c085c017abb3b7f0798ac8d06d19 Mon Sep 17 00:00:00 2001 From: Sara Tavares <29093946+stavares843@users.noreply.github.com> Date: Mon, 6 Mar 2023 14:17:39 +0000 Subject: [PATCH 42/74] chore(typos): fix typos (#682) * chore(typos): fix typos --- CONTRIBUTING.md | 2 +- common/src/backends/auth.rs | 2 +- common/src/models/error.rs | 4 ++-- common/src/models/mod.rs | 2 +- deployer/src/deployment/deploy_layer.rs | 4 ++-- gateway/src/project.rs | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 51c8a8511..65afe74a5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -164,7 +164,7 @@ To run the unit tests for a specific crate, from the root of the repository run: cargo test --package --all-features --lib -- --nocapture ``` -To run the integration tests for a spesific crate (if it has any), from the root of the repository run: +To run the integration tests for a specific crate (if it has any), from the root of the repository run: ```bash # replace with the name of the crate to test, e.g. `cargo-shuttle` diff --git a/common/src/backends/auth.rs b/common/src/backends/auth.rs index f36029211..dc293c24b 100644 --- a/common/src/backends/auth.rs +++ b/common/src/backends/auth.rs @@ -244,7 +244,7 @@ impl Claim { } } -/// Trait to get a public key asyncronously +/// Trait to get a public key asynchronously #[async_trait] pub trait PublicKeyFn: Send + Sync + Clone { type Error: std::error::Error + Send; diff --git a/common/src/models/error.rs b/common/src/models/error.rs index 7b20d5571..05ba44669 100644 --- a/common/src/models/error.rs +++ b/common/src/models/error.rs @@ -115,7 +115,7 @@ impl From for ApiError { fn from(code: StatusCode) -> Self { let message = match code { StatusCode::OK | StatusCode::ACCEPTED | StatusCode::FOUND | StatusCode::SWITCHING_PROTOCOLS => { - unreachable!("we should not have an API error with a successfull status code") + unreachable!("we should not have an API error with a successful status code") } StatusCode::FORBIDDEN => "this request is not allowed", StatusCode::UNAUTHORIZED => { @@ -137,7 +137,7 @@ impl From for ApiError { }, _ => { error!(%code, "got an unexpected status code"); - "an unexpected error occured. Please create a ticket to report this" + "an unexpected error occurred. Please create a ticket to report this" }, }; diff --git a/common/src/models/mod.rs b/common/src/models/mod.rs index 0236c641d..acee3dbe9 100644 --- a/common/src/models/mod.rs +++ b/common/src/models/mod.rs @@ -33,7 +33,7 @@ impl ToJson for reqwest::Response { status_code, StatusCode::OK | StatusCode::SWITCHING_PROTOCOLS ) { - serde_json::from_slice(&full).context("failed to parse a successfull response") + serde_json::from_slice(&full).context("failed to parse a successful response") } else { trace!("parsing response to common error"); let res: error::ApiError = match serde_json::from_slice(&full) { diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index c49040768..a500c936d 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -807,7 +807,7 @@ mod tests { select! { _ = sleep(Duration::from_secs(180)) => { - panic!("states should go into 'Crashed' panicing in bind"); + panic!("states should go into 'Crashed' panicking in bind"); } _ = test => {} } @@ -875,7 +875,7 @@ mod tests { select! { _ = sleep(Duration::from_secs(180)) => { - panic!("states should go into 'Crashed' when panicing in main"); + panic!("states should go into 'Crashed' when panicking in main"); } _ = test => {} } diff --git a/gateway/src/project.rs b/gateway/src/project.rs index da6dc12c7..a5f3474b1 100644 --- a/gateway/src/project.rs +++ b/gateway/src/project.rs @@ -1321,7 +1321,7 @@ where // Stopping a docker containers sends a SIGTERM which will stop the tokio runtime that deployer starts up. // Killing this runtime causes the deployment to enter the `completed` state and it therefore does not // start up again when starting up the project's container. Luckily the kill command allows us to change the - // signal to prevent this from happenning. + // signal to prevent this from happening. // // In some future state when all deployers hadle `SIGTERM` correctly, this can be changed to docker stop // safely. From 0fecace65ba38af1c67ac6f29051220cc6184661 Mon Sep 17 00:00:00 2001 From: HexPandaa <47880094+HexPandaa@users.noreply.github.com> Date: Tue, 7 Mar 2023 07:10:50 +0100 Subject: [PATCH 43/74] Fix indentation for poise init example (#687) --- cargo-shuttle/src/init.rs | 78 +++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/cargo-shuttle/src/init.rs b/cargo-shuttle/src/init.rs index b36c1c52c..0ebf76822 100644 --- a/cargo-shuttle/src/init.rs +++ b/cargo-shuttle/src/init.rs @@ -504,47 +504,47 @@ impl ShuttleInit for ShuttleInitPoise { fn get_boilerplate_code_for_framework(&self) -> &'static str { indoc! {r#" use anyhow::Context as _; - use poise::serenity_prelude as serenity; - use shuttle_secrets::SecretStore; - use shuttle_service::ShuttlePoise; - - struct Data {} // User data, which is stored and accessible in all command invocations - type Error = Box; - type Context<'a> = poise::Context<'a, Data, Error>; - - /// Responds with "world!" - #[poise::command(slash_command)] - async fn hello(ctx: Context<'_>) -> Result<(), Error> { - ctx.say("world!").await?; - Ok(()) - } - - #[shuttle_service::main] - async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { - // Get the discord token set in `Secrets.toml` - let discord_token = secret_store - .get("DISCORD_TOKEN") - .context("'DISCORD_TOKEN' was not found")?; - - let framework = poise::Framework::builder() - .options(poise::FrameworkOptions { - commands: vec![hello()], - ..Default::default() + use poise::serenity_prelude as serenity; + use shuttle_secrets::SecretStore; + use shuttle_service::ShuttlePoise; + + struct Data {} // User data, which is stored and accessible in all command invocations + type Error = Box; + type Context<'a> = poise::Context<'a, Data, Error>; + + /// Responds with "world!" + #[poise::command(slash_command)] + async fn hello(ctx: Context<'_>) -> Result<(), Error> { + ctx.say("world!").await?; + Ok(()) + } + + #[shuttle_service::main] + async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { + // Get the discord token set in `Secrets.toml` + let discord_token = secret_store + .get("DISCORD_TOKEN") + .context("'DISCORD_TOKEN' was not found")?; + + let framework = poise::Framework::builder() + .options(poise::FrameworkOptions { + commands: vec![hello()], + ..Default::default() + }) + .token(discord_token) + .intents(serenity::GatewayIntents::non_privileged()) + .setup(|ctx, _ready, framework| { + Box::pin(async move { + poise::builtins::register_globally(ctx, &framework.options().commands).await?; + Ok(Data {}) }) - .token(discord_token) - .intents(serenity::GatewayIntents::non_privileged()) - .setup(|ctx, _ready, framework| { - Box::pin(async move { - poise::builtins::register_globally(ctx, &framework.options().commands).await?; - Ok(Data {}) - }) - }) - .build() - .await - .map_err(shuttle_service::error::CustomError::new)?; + }) + .build() + .await + .map_err(shuttle_service::error::CustomError::new)?; - Ok(framework) - }"#} + Ok(framework) + }"#} } } From a93ba5111700c1067a0a0a357c5ca490a5ad24a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 7 Mar 2023 09:05:14 +0000 Subject: [PATCH 44/74] Feature/eng 477 make wasm dependencies optional (#688) * feat: make wasm runtime dependencies optional * feat: feature gate next lib, update readme * ci: rename loader feature in ci * refactor: hyper with server feature in next features --- .circleci/config.yml | 6 +++--- runtime/Cargo.toml | 31 +++++++++++++++++++++++-------- runtime/README.md | 4 ++-- runtime/src/legacy/mod.rs | 2 +- runtime/src/lib.rs | 5 +++-- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8bf6b4686..c4aa359a7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -168,7 +168,7 @@ jobs: - run: | cargo clippy --tests \ --all-targets \ - --features="codegen,loader,<< parameters.framework >>" \ + --features="codegen,builder,<< parameters.framework >>" \ --no-deps -- \ --D warnings \ -A clippy::let-unit-value \ @@ -210,10 +210,10 @@ jobs: - restore-cargo-cache - run: name: Run unit tests - command: cargo test --package shuttle-service --features="codegen,loader" --lib -- --nocapture + command: cargo test --package shuttle-service --features="codegen,builder" --lib -- --nocapture - run: name: Run integration tests - command: cargo test --package shuttle-service --features="codegen,loader" --test '*' -- --nocapture + command: cargo test --package shuttle-service --features="codegen,builder" --test '*' -- --nocapture - save-cargo-cache platform-test: parameters: diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 897f97d8b..b9b1ff8df 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -11,14 +11,12 @@ name = "rocket" [[bin]] name = "next" +required-features = ["next"] [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } -cap-std = "1.0.2" clap ={ version = "4.0.18", features = ["derive"] } -hyper = { version = "0.14.23", features = ["server"] } -rmp-serde = { version = "1.1.1" } thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["full"] } tokio-stream = "0.1.11" @@ -26,11 +24,15 @@ tonic = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } uuid = { workspace = true, features = ["v4"] } + # TODO: bump these crates to 6.0 when we bump rust to >= 1.66 -wasi-common = "4.0.0" -wasmtime = "4.0.0" -wasmtime-wasi = "4.0.0" -futures = "0.3.25" +cap-std = { version = "1.0.2", optional = true } +futures = { version = "0.3.25", optional = true } +hyper = { version = "0.14.23", optional = true } +rmp-serde = { version = "1.1.1", optional = true } +wasi-common = { version = "4.0.0", optional = true } +wasmtime = { version = "4.0.0", optional = true } +wasmtime-wasi = { version = "4.0.0", optional = true } # For rocket.rs # TODO: remove @@ -39,7 +41,7 @@ rocket = "0.5.0-rc.2" [dependencies.shuttle-common] workspace = true -features = ["wasm", "service"] +features = ["service"] [dependencies.shuttle-proto] workspace = true @@ -47,3 +49,16 @@ workspace = true [dependencies.shuttle-service] workspace = true features = ["builder", "web-rocket"] # TODO: remove web-rocket + +[features] +next = [ + "cap-std", + "futures", + "hyper/server", + "rmp-serde", + "futures", + "wasi-common", + "wasmtime", + "wasmtime-wasi", + "shuttle-common/wasm" +] diff --git a/runtime/README.md b/runtime/README.md index d7caf894d..6299f996a 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -21,7 +21,7 @@ make axum Run the test: ```bash -cargo test axum -- --nocapture +cargo test --features next axum -- --nocapture # or, run tests make test @@ -30,7 +30,7 @@ make test Load and run: ```bash -cargo run --bin next -- --port 6001 +cargo run --features next --bin next -- --port 6001 ``` In another terminal: diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index ea042a856..a040a8640 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -11,7 +11,7 @@ use std::{ use anyhow::Context; use async_trait::async_trait; use clap::Parser; -use futures::Future; +use core::future::Future; use shuttle_common::{ storage_manager::{StorageManager, WorkingDirStorageManager}, LogItem, diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 9d241f933..33babf1c7 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,8 +1,9 @@ mod legacy; +#[cfg(feature = "next")] mod next; mod provisioner_factory; pub use legacy::{start, Legacy}; -pub use next::AxumWasm; -pub use next::NextArgs; +#[cfg(feature = "next")] +pub use next::{AxumWasm, NextArgs}; pub use provisioner_factory::ProvisionerFactory; From 3699f7f69e3f48d86f9c7b98b6af66c4b32a65c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 7 Mar 2023 09:35:44 +0000 Subject: [PATCH 45/74] Feature: eng 465 update all the codegens (#686) * feat: initial commit of codegen rewrite * refactor: wrapper to loader * tests: update the unit tests * fix: don't unwrap return type * feat: setup tracing in loader codegen * fix: pass inn logger to loader * feat: mvp of shuttle-next local run * refactor: move logger to runtime * refactor: move storagemanager export to runtime --- Cargo.lock | 3 +- cargo-shuttle/src/lib.rs | 77 ++-- codegen/src/shuttle_main/mod.rs | 388 ++++++------------- proto/src/lib.rs | 23 +- runtime/Cargo.toml | 4 +- runtime/src/bin/rocket.rs | 1 + runtime/src/bin/{next.rs => shuttle-next.rs} | 0 runtime/src/legacy/mod.rs | 23 +- runtime/src/lib.rs | 3 + {service => runtime}/src/logger.rs | 0 service/Cargo.toml | 1 - service/src/builder.rs | 7 +- service/src/lib.rs | 3 - 13 files changed, 210 insertions(+), 323 deletions(-) rename runtime/src/bin/{next.rs => shuttle-next.rs} (100%) rename {service => runtime}/src/logger.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index ce6076eab..c47655c27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6401,11 +6401,13 @@ dependencies = [ "anyhow", "async-trait", "cap-std", + "chrono", "clap 4.0.27", "futures", "hyper", "rmp-serde", "rocket", + "serde_json", "shuttle-common", "shuttle-proto", "shuttle-secrets", @@ -6442,7 +6444,6 @@ dependencies = [ "bincode", "cargo", "cargo_metadata", - "chrono", "crossbeam-channel", "futures", "hyper", diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 2f5fab49f..2c2466269 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -383,6 +383,7 @@ impl Shuttle { "Building".bold().green(), working_directory.display() ); + let runtime = build_crate(working_directory, false, tx).await?; trace!("loading secrets"); @@ -403,7 +404,7 @@ impl Shuttle { let service_name = self.ctx.project_name().to_string(); - let (is_wasm, so_path) = match runtime { + let (is_wasm, bin_path) = match runtime { Runtime::Next(path) => (true, path), Runtime::Legacy(path) => (false, path), }; @@ -414,44 +415,54 @@ impl Shuttle { run_args.port + 1, )); - let get_runtime_executable = || { - let runtime_path = home::cargo_home() - .expect("failed to find cargo home dir") - .join("bin/shuttle-runtime"); - - if cfg!(debug_assertions) { - // Canonicalized path to shuttle-runtime for dev to work on windows - let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")) - .expect("path to shuttle-runtime does not exist or is invalid"); - - std::process::Command::new("cargo") - .arg("install") - .arg("shuttle-runtime") - .arg("--path") - .arg(path) - .output() - .expect("failed to install the shuttle runtime"); - } else { - // If the version of cargo-shuttle is different from shuttle-runtime, - // or it isn't installed, try to install shuttle-runtime from the production - // branch. - if let Err(err) = check_version(&runtime_path) { - trace!("{}", err); + let runtime_path = || { + if is_wasm { + let runtime_path = home::cargo_home() + .expect("failed to find cargo home dir") + .join("bin/shuttle-next"); + + if cfg!(debug_assertions) { + // Canonicalized path to shuttle-runtime for dev to work on windows + let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")) + .expect("path to shuttle-runtime does not exist or is invalid"); - trace!("installing shuttle-runtime"); + // TODO: Add --features next here when https://github.com/shuttle-hq/shuttle/pull/688 is merged std::process::Command::new("cargo") .arg("install") .arg("shuttle-runtime") - .arg("--git") - .arg("https://github.com/shuttle-hq/shuttle") - .arg("--branch") - .arg("production") + .arg("--path") + .arg(path) + .arg("--bin") + .arg("shuttle-next") .output() .expect("failed to install the shuttle runtime"); + } else { + // If the version of cargo-shuttle is different from shuttle-runtime, + // or it isn't installed, try to install shuttle-runtime from the production + // branch. + if let Err(err) = check_version(&runtime_path) { + trace!("{}", err); + + trace!("installing shuttle-runtime"); + // TODO: Add --features next here when https://github.com/shuttle-hq/shuttle/pull/688 is merged + std::process::Command::new("cargo") + .arg("install") + .arg("shuttle-runtime") + .arg("--bin") + .arg("shuttle-next") + .arg("--git") + .arg("https://github.com/shuttle-hq/shuttle") + .arg("--branch") + .arg("production") + .output() + .expect("failed to install the shuttle runtime"); + }; }; - }; - runtime_path + runtime_path + } else { + bin_path.clone() + } }; let (mut runtime, mut runtime_client) = runtime::start( @@ -459,7 +470,7 @@ impl Shuttle { runtime::StorageManagerType::WorkingDir(working_directory.to_path_buf()), &format!("http://localhost:{}", run_args.port + 1), run_args.port + 2, - get_runtime_executable, + runtime_path, ) .await .map_err(|err| { @@ -469,7 +480,7 @@ impl Shuttle { })?; let load_request = tonic::Request::new(LoadRequest { - path: so_path + path: bin_path .into_os_string() .into_string() .expect("to convert path to string"), diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index c8a03d1da..3b73f82a5 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -4,50 +4,32 @@ use quote::{quote, ToTokens}; use syn::{ parenthesized, parse::Parse, parse2, parse_macro_input, parse_quote, punctuated::Punctuated, spanned::Spanned, token::Paren, Attribute, Expr, FnArg, Ident, ItemFn, Pat, PatIdent, Path, - ReturnType, Signature, Stmt, Token, Type, + ReturnType, Signature, Stmt, Token, Type, TypePath, }; pub(crate) fn r#impl(_attr: TokenStream, item: TokenStream) -> TokenStream { let mut fn_decl = parse_macro_input!(item as ItemFn); - let wrapper = Wrapper::from_item_fn(&mut fn_decl); + let loader = Loader::from_item_fn(&mut fn_decl); let expanded = quote! { - #wrapper - - fn __binder( - service: Box, - addr: std::net::SocketAddr, - runtime: &shuttle_service::Runtime, - ) -> shuttle_service::ServeHandle { - use shuttle_service::Context; - runtime.spawn(async move { service.bind(addr).await.context("failed to bind service").map_err(Into::into) }) + #[tokio::main] + async fn main() { + shuttle_runtime::start(loader).await; } - #fn_decl - - #[no_mangle] - pub extern "C" fn _create_service() -> *mut shuttle_service::Bootstrapper { - let builder: shuttle_service::StateBuilder> = - |factory, runtime, logger| Box::pin(__shuttle_wrapper(factory, runtime, logger)); + #loader - let bootstrapper = shuttle_service::Bootstrapper::new( - builder, - __binder, - shuttle_service::Runtime::new().unwrap(), - ); - - let boxed = Box::new(bootstrapper); - Box::into_raw(boxed) - } + #fn_decl }; expanded.into() } -struct Wrapper { +struct Loader { fn_ident: Ident, fn_inputs: Vec, + fn_return: TypePath, } #[derive(Debug, PartialEq)] @@ -117,8 +99,8 @@ impl Parse for BuilderOption { } } -impl Wrapper { - pub(crate) fn from_item_fn(item_fn: &mut ItemFn) -> Self { +impl Loader { + pub(crate) fn from_item_fn(item_fn: &mut ItemFn) -> Option { let inputs: Vec<_> = item_fn .sig .inputs @@ -145,31 +127,40 @@ impl Wrapper { }) .collect(); - check_return_type(&item_fn.sig); - - Self { - fn_ident: item_fn.sig.ident.clone(), - fn_inputs: inputs, + if let Some(type_path) = check_return_type(item_fn.sig.clone()) { + Some(Self { + fn_ident: item_fn.sig.ident.clone(), + fn_inputs: inputs, + fn_return: type_path, + }) + } else { + None } } } -fn check_return_type(signature: &Signature) { - match &signature.output { - ReturnType::Default => emit_error!( - signature, - "shuttle_service::main functions need to return a service"; - hint = "See the docs for services with first class support"; - doc = "https://docs.rs/shuttle-service/latest/shuttle_service/attr.main.html#shuttle-supported-services" - ), - ReturnType::Type(_, r#type) => match r#type.as_ref() { - Type::Path(_) => {} - _ => emit_error!( - r#type, - "shuttle_service::main functions need to return a first class service or 'Result"; +fn check_return_type(signature: Signature) -> Option { + match signature.output { + ReturnType::Default => { + emit_error!( + signature, + "shuttle_service::main functions need to return a service"; hint = "See the docs for services with first class support"; doc = "https://docs.rs/shuttle-service/latest/shuttle_service/attr.main.html#shuttle-supported-services" - ), + ); + None + } + ReturnType::Type(_, r#type) => match *r#type { + Type::Path(path) => Some(path), + _ => { + emit_error!( + r#type, + "shuttle_service::main functions need to return a first class service or 'Result"; + hint = "See the docs for services with first class support"; + doc = "https://docs.rs/shuttle-service/latest/shuttle_service/attr.main.html#shuttle-supported-services" + ); + None + } }, } } @@ -196,9 +187,12 @@ fn attribute_to_builder(pat_ident: &PatIdent, attrs: Vec) -> syn::Res Ok(builder) } -impl ToTokens for Wrapper { +impl ToTokens for Loader { fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { let fn_ident = &self.fn_ident; + + let return_type = &self.fn_return; + let mut fn_inputs: Vec<_> = Vec::with_capacity(self.fn_inputs.len()); let mut fn_inputs_builder: Vec<_> = Vec::with_capacity(self.fn_inputs.len()); let mut fn_inputs_builder_options: Vec<_> = Vec::with_capacity(self.fn_inputs.len()); @@ -223,67 +217,32 @@ impl ToTokens for Wrapper { )) }; - let wrapper = quote! { - async fn __shuttle_wrapper( - #factory_ident: &mut dyn shuttle_service::Factory, - runtime: &shuttle_service::Runtime, - logger: shuttle_service::Logger, - ) -> Result, shuttle_service::Error> { + let loader = quote! { + async fn loader( + mut #factory_ident: shuttle_runtime::ProvisionerFactory, + logger: shuttle_runtime::Logger, + ) -> #return_type { use shuttle_service::Context; use shuttle_service::tracing_subscriber::prelude::*; #extra_imports - runtime.spawn_blocking(move || { - let filter_layer = - shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() - .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) - .unwrap(); - - shuttle_service::tracing_subscriber::registry() - .with(filter_layer) - .with(logger) - .init(); // this sets the subscriber as the global default and also adds a compatibility layer for capturing `log::Record`s - }) - .await - .map_err(|e| { - if e.is_panic() { - let mes = e - .into_panic() - .downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "panicked setting logger".to_string()); - - shuttle_service::Error::BuildPanic(mes) - } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to set logger")) - } - })?; - - #(let #fn_inputs = #fn_inputs_builder::new()#fn_inputs_builder_options.build(#factory_ident, runtime).await.context(format!("failed to provision {}", stringify!(#fn_inputs_builder)))?;)* - - runtime.spawn(async { - #fn_ident(#(#fn_inputs),*) - .await - .map(|ok| Box::new(ok) as Box) - }) - .await - .map_err(|e| { - if e.is_panic() { - let mes = e - .into_panic() - .downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "panicked calling main".to_string()); - - shuttle_service::Error::BuildPanic(mes) - } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to call main")) - } - })? + let filter_layer = + shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() + .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) + .unwrap(); + + shuttle_service::tracing_subscriber::registry() + .with(filter_layer) + .with(logger) + .init(); + + #(let #fn_inputs = #fn_inputs_builder::new()#fn_inputs_builder_options.build(&mut #factory_ident).await.context(format!("failed to provision {}", stringify!(#fn_inputs_builder)))?;)* + + #fn_ident(#(#fn_inputs),*).await } }; - wrapper.to_tokens(tokens); + loader.to_tokens(tokens); } } @@ -293,7 +252,7 @@ mod tests { use quote::quote; use syn::{parse_quote, Ident}; - use super::{Builder, BuilderOptions, Input, Wrapper}; + use super::{Builder, BuilderOptions, Input, Loader}; #[test] fn from_with_return() { @@ -301,7 +260,7 @@ mod tests { async fn simple() -> ShuttleAxum {} ); - let actual = Wrapper::from_item_fn(&mut input); + let actual = Loader::from_item_fn(&mut input).unwrap(); let expected_ident: Ident = parse_quote!(simple); assert_eq!(actual.fn_ident, expected_ident); @@ -310,65 +269,32 @@ mod tests { #[test] fn output_with_return() { - let input = Wrapper { + let input = Loader { fn_ident: parse_quote!(simple), fn_inputs: Vec::new(), + fn_return: parse_quote!(ShuttleSimple), }; let actual = quote!(#input); let expected = quote! { - async fn __shuttle_wrapper( - _factory: &mut dyn shuttle_service::Factory, - runtime: &shuttle_service::Runtime, - logger: shuttle_service::Logger, - ) -> Result, shuttle_service::Error> { + async fn loader( + mut _factory: shuttle_runtime::ProvisionerFactory, + logger: shuttle_runtime::Logger, + ) -> ShuttleSimple { use shuttle_service::Context; use shuttle_service::tracing_subscriber::prelude::*; - runtime.spawn_blocking(move || { - let filter_layer = - shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() - .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) - .unwrap(); - - shuttle_service::tracing_subscriber::registry() - .with(filter_layer) - .with(logger) - .init(); - }) - .await - .map_err(|e| { - if e.is_panic() { - let mes = e - .into_panic() - .downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "panicked setting logger".to_string()); - - shuttle_service::Error::BuildPanic(mes) - } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to set logger")) - } - })?; - - runtime.spawn(async { - simple() - .await - .map(|ok| Box::new(ok) as Box) - }) - .await - .map_err(|e| { - if e.is_panic() { - let mes = e - .into_panic() - .downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "panicked calling main".to_string()); - - shuttle_service::Error::BuildPanic(mes) - } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to call main")) - } - })? + + let filter_layer = + shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() + .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) + .unwrap(); + + shuttle_service::tracing_subscriber::registry() + .with(filter_layer) + .with(logger) + .init(); + + simple().await } }; @@ -381,7 +307,7 @@ mod tests { async fn complex(#[shuttle_shared_db::Postgres] pool: PgPool) -> ShuttleTide {} ); - let actual = Wrapper::from_item_fn(&mut input); + let actual = Loader::from_item_fn(&mut input).unwrap(); let expected_ident: Ident = parse_quote!(complex); let expected_inputs: Vec = vec![Input { ident: parse_quote!(pool), @@ -408,7 +334,7 @@ mod tests { #[test] fn output_with_inputs() { - let input = Wrapper { + let input = Loader { fn_ident: parse_quote!(complex), fn_inputs: vec![ Input { @@ -426,67 +352,33 @@ mod tests { }, }, ], + fn_return: parse_quote!(ShuttleComplex), }; let actual = quote!(#input); let expected = quote! { - async fn __shuttle_wrapper( - factory: &mut dyn shuttle_service::Factory, - runtime: &shuttle_service::Runtime, - logger: shuttle_service::Logger, - ) -> Result, shuttle_service::Error> { + async fn loader( + mut factory: shuttle_runtime::ProvisionerFactory, + logger: shuttle_runtime::Logger, + ) -> ShuttleComplex { use shuttle_service::Context; use shuttle_service::tracing_subscriber::prelude::*; use shuttle_service::ResourceBuilder; - runtime.spawn_blocking(move || { - let filter_layer = - shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() - .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) - .unwrap(); - - shuttle_service::tracing_subscriber::registry() - .with(filter_layer) - .with(logger) - .init(); - }) - .await - .map_err(|e| { - if e.is_panic() { - let mes = e - .into_panic() - .downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "panicked setting logger".to_string()); - - shuttle_service::Error::BuildPanic(mes) - } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to set logger")) - } - })?; - - let pool = shuttle_shared_db::Postgres::new().build(factory, runtime).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; - let redis = shuttle_shared_db::Redis::new().build(factory, runtime).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Redis)))?; - - runtime.spawn(async { - complex(pool, redis) - .await - .map(|ok| Box::new(ok) as Box) - }) - .await - .map_err(|e| { - if e.is_panic() { - let mes = e - .into_panic() - .downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "panicked calling main".to_string()); - - shuttle_service::Error::BuildPanic(mes) - } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to call main")) - } - })? + let filter_layer = + shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() + .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) + .unwrap(); + + shuttle_service::tracing_subscriber::registry() + .with(filter_layer) + .with(logger) + .init(); + + let pool = shuttle_shared_db::Postgres::new().build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; + let redis = shuttle_shared_db::Redis::new().build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Redis)))?; + + complex(pool, redis).await } }; @@ -541,7 +433,7 @@ mod tests { } ); - let actual = Wrapper::from_item_fn(&mut input); + let actual = Loader::from_item_fn(&mut input).unwrap(); let expected_ident: Ident = parse_quote!(complex); let mut expected_inputs: Vec = vec![Input { ident: parse_quote!(pool), @@ -568,7 +460,7 @@ mod tests { #[test] fn output_with_input_options() { - let mut input = Wrapper { + let mut input = Loader { fn_ident: parse_quote!(complex), fn_inputs: vec![Input { ident: parse_quote!(pool), @@ -577,6 +469,7 @@ mod tests { options: Default::default(), }, }], + fn_return: parse_quote!(ShuttleComplex), }; input.fn_inputs[0] @@ -592,62 +485,27 @@ mod tests { let actual = quote!(#input); let expected = quote! { - async fn __shuttle_wrapper( - factory: &mut dyn shuttle_service::Factory, - runtime: &shuttle_service::Runtime, - logger: shuttle_service::Logger, - ) -> Result, shuttle_service::Error> { + async fn loader( + mut factory: shuttle_runtime::ProvisionerFactory, + logger: shuttle_runtime::Logger, + ) -> ShuttleComplex { use shuttle_service::Context; use shuttle_service::tracing_subscriber::prelude::*; use shuttle_service::ResourceBuilder; - runtime.spawn_blocking(move || { - let filter_layer = - shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() - .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) - .unwrap(); - - shuttle_service::tracing_subscriber::registry() - .with(filter_layer) - .with(logger) - .init(); - }) - .await - .map_err(|e| { - if e.is_panic() { - let mes = e - .into_panic() - .downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "panicked setting logger".to_string()); - - shuttle_service::Error::BuildPanic(mes) - } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to set logger")) - } - })?; - - let pool = shuttle_shared_db::Postgres::new().size("10Gb").public(false).build(factory, runtime).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; - - runtime.spawn(async { - complex(pool) - .await - .map(|ok| Box::new(ok) as Box) - }) - .await - .map_err(|e| { - if e.is_panic() { - let mes = e - .into_panic() - .downcast_ref::<&str>() - .map(|x| x.to_string()) - .unwrap_or_else(|| "panicked calling main".to_string()); - - shuttle_service::Error::BuildPanic(mes) - } else { - shuttle_service::Error::Custom(shuttle_service::error::CustomError::new(e).context("failed to call main")) - } - })? + let filter_layer = + shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() + .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) + .unwrap(); + + shuttle_service::tracing_subscriber::registry() + .with(filter_layer) + .with(logger) + .init(); + + let pool = shuttle_shared_db::Postgres::new().size("10Gb").public(false).build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; + + complex(pool).await } }; diff --git a/proto/src/lib.rs b/proto/src/lib.rs index a4d51a522..f27281d13 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -247,27 +247,32 @@ pub mod runtime { port: u16, get_runtime_executable: impl FnOnce() -> PathBuf, ) -> anyhow::Result<(process::Child, runtime_client::RuntimeClient)> { - let runtime_flag = if wasm { "--axum" } else { "--legacy" }; - let (storage_manager_type, storage_manager_path) = match storage_manager_type { StorageManagerType::Artifacts(path) => ("artifacts", path), StorageManagerType::WorkingDir(path) => ("working-dir", path), }; - let runtime_executable = get_runtime_executable(); + let port = &port.to_string(); + let storage_manager_path = &storage_manager_path.display().to_string(); + let runtime_executable_path = get_runtime_executable(); - let runtime = process::Command::new(runtime_executable) - .args([ - runtime_flag, + let args = if wasm { + vec!["--port", port] + } else { + vec![ "--port", - &port.to_string(), + port, "--provisioner-address", provisioner_address, "--storage-manager-type", storage_manager_type, "--storage-manager-path", - &storage_manager_path.display().to_string(), - ]) + storage_manager_path, + ] + }; + + let runtime = process::Command::new(runtime_executable_path) + .args(&args) .spawn() .context("spawning runtime process")?; diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index b9b1ff8df..b8ce5c235 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -10,13 +10,15 @@ publish = false name = "rocket" [[bin]] -name = "next" +name = "shuttle-next" required-features = ["next"] [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } +chrono = { workspace = true } clap ={ version = "4.0.18", features = ["derive"] } +serde_json = { workspace = true } thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["full"] } tokio-stream = "0.1.11" diff --git a/runtime/src/bin/rocket.rs b/runtime/src/bin/rocket.rs index 8da00a54f..9222f709d 100644 --- a/runtime/src/bin/rocket.rs +++ b/runtime/src/bin/rocket.rs @@ -6,6 +6,7 @@ async fn main() { async fn loader( mut factory: shuttle_runtime::ProvisionerFactory, + logger: shuttle_runtime::Logger, ) -> shuttle_service::ShuttleRocket { use shuttle_service::ResourceBuilder; diff --git a/runtime/src/bin/next.rs b/runtime/src/bin/shuttle-next.rs similarity index 100% rename from runtime/src/bin/next.rs rename to runtime/src/bin/shuttle-next.rs diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index a040a8640..9cc3fa4b3 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -36,7 +36,7 @@ use tonic::{ use tracing::{error, instrument, trace}; use uuid::Uuid; -use crate::provisioner_factory::ProvisionerFactory; +use crate::{provisioner_factory::ProvisionerFactory, Logger}; use self::args::Args; @@ -100,21 +100,29 @@ where { type Service: Service; - async fn load(self, factory: Fac) -> Result; + async fn load( + self, + factory: Fac, + logger: Logger, + ) -> Result; } #[async_trait] impl Loader for F where - F: FnOnce(Fac) -> O + Send, + F: FnOnce(Fac, Logger) -> O + Send, O: Future> + Send, Fac: Factory + 'static, S: Service, { type Service = S; - async fn load(self, factory: Fac) -> Result { - (self)(factory).await + async fn load( + self, + factory: Fac, + logger: Logger, + ) -> Result { + (self)(factory, logger).await } } @@ -154,9 +162,12 @@ where ); trace!("got factory"); + let logs_tx = self.logs_tx.clone(); + let logger = Logger::new(logs_tx, deployment_id); + let loader = self.loader.lock().unwrap().deref_mut().take().unwrap(); - let service = loader.load(factory).await.unwrap(); + let service = loader.load(factory, logger).await.unwrap(); *self.service.lock().unwrap() = Some(service); diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 33babf1c7..6e51ff0f4 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,9 +1,12 @@ mod legacy; +mod logger; #[cfg(feature = "next")] mod next; mod provisioner_factory; pub use legacy::{start, Legacy}; +pub use logger::Logger; #[cfg(feature = "next")] pub use next::{AxumWasm, NextArgs}; pub use provisioner_factory::ProvisionerFactory; +pub use shuttle_common::storage_manager::StorageManager; diff --git a/service/src/logger.rs b/runtime/src/logger.rs similarity index 100% rename from service/src/logger.rs rename to runtime/src/logger.rs diff --git a/service/Cargo.toml b/service/Cargo.toml index ae3a29eb8..f9943a4d2 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -18,7 +18,6 @@ bincode = { version = "1.3.3", optional = true } # TODO: debug the libgit2-sys conflict with cargo-edit when upgrading cargo to 0.66 cargo = { version = "0.65.0", optional = true } cargo_metadata = "0.15.2" -chrono = { workspace = true } crossbeam-channel = "0.5.6" futures = { version = "0.3.25", features = ["std"] } hyper = { version = "0.14.23", features = ["server", "tcp", "http1"], optional = true } diff --git a/service/src/builder.rs b/service/src/builder.rs index 870284206..3fcd8c67f 100644 --- a/service/src/builder.rs +++ b/service/src/builder.rs @@ -62,13 +62,12 @@ pub async fn build_crate( check_no_panic(&ws)?; let opts = get_compile_options(&config, release_mode, is_next)?; - let compilation = compile(&ws, &opts); + let compilation = compile(&ws, &opts)?; - let path = compilation?.binaries[0].path.clone(); Ok(if is_next { - Runtime::Next(path) + Runtime::Next(compilation.cdylibs[0].path.clone()) } else { - Runtime::Legacy(path) + Runtime::Legacy(compilation.binaries[0].path.clone()) }) } diff --git a/service/src/lib.rs b/service/src/lib.rs index c7a6e189c..de58ad046 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -223,9 +223,6 @@ pub use tracing_subscriber; pub mod error; pub use error::Error; -mod logger; -pub use logger::Logger; - pub use shuttle_common::database; #[cfg(feature = "codegen")] From 67cf6bd91d9aa0df0a4e2b5a8752f71510fb5f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 7 Mar 2023 10:45:22 +0000 Subject: [PATCH 46/74] docs: add note about git tags in contrib (#691) --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 65afe74a5..c60695da7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,6 +24,9 @@ git clone git@github.com:shuttle-hq/shuttle.git cd shuttle ``` +> Note: We need the git tags for the local development workflow, but they may not be included when you clone the repository. +To make sure you have them, run `git fetch upstream --tags`, where upstream is the name of the shuttle remote repository. + You should now be ready to setup a local environment to test code changes to core `shuttle` packages as follows: From the root of the shuttle repo, build the required images with: From 9fa862ea1be5b3298d351c25c53f4c0c591fedbc Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 8 Mar 2023 11:56:26 +0200 Subject: [PATCH 47/74] bug: idle static folder (#692) * misc: add more logs * bug: copy static folder * bug: extra subdirectory --- resources/static-folder/Cargo.toml | 2 ++ resources/static-folder/src/lib.rs | 45 +++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml index d42d2a032..6cd93225a 100644 --- a/resources/static-folder/Cargo.toml +++ b/resources/static-folder/Cargo.toml @@ -9,8 +9,10 @@ keywords = ["shuttle-service", "static-folder"] [dependencies] async-trait = "0.1.56" +fs_extra = "1.3.0" shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } tokio = { version = "1.19.2", features = ["rt"] } +tracing = "0.1.37" [dev-dependencies] tempfile = "3.3.0" diff --git a/resources/static-folder/src/lib.rs b/resources/static-folder/src/lib.rs index 8b08e7e72..77982eb6c 100644 --- a/resources/static-folder/src/lib.rs +++ b/resources/static-folder/src/lib.rs @@ -1,13 +1,12 @@ use async_trait::async_trait; +use fs_extra::dir::{copy, CopyOptions}; use shuttle_service::{ error::{CustomError, Error as ShuttleError}, Factory, ResourceBuilder, }; -use std::{ - fs::rename, - path::{Path, PathBuf}, -}; +use std::path::{Path, PathBuf}; use tokio::runtime::Runtime; +use tracing::{error, trace}; pub struct StaticFolder<'a> { /// The folder to reach at runtime. Defaults to `static` @@ -17,6 +16,7 @@ pub struct StaticFolder<'a> { pub enum Error { AbsolutePath, TransversedUp, + Copy(fs_extra::error::Error), } impl<'a> StaticFolder<'a> { @@ -40,34 +40,59 @@ impl<'a> ResourceBuilder for StaticFolder<'a> { ) -> Result { let folder = Path::new(self.folder); + trace!(?folder, "building static folder"); + // Prevent users from users from reading anything outside of their crate's build folder if folder.is_absolute() { + error!("the static folder cannot be an absolute path"); return Err(Error::AbsolutePath)?; } let input_dir = factory.get_build_path()?.join(self.folder); + trace!(input_directory = ?input_dir, "got input directory"); + match input_dir.canonicalize() { Ok(canonical_path) if canonical_path != input_dir => return Err(Error::TransversedUp)?, Ok(_) => { // The path did not change to outside the crate's build folder } - Err(err) => return Err(err)?, + Err(err) => { + error!( + error = &err as &dyn std::error::Error, + "failed to get static folder" + ); + return Err(err)?; + } } - let output_dir = factory.get_storage_path()?.join(self.folder); + let output_dir = factory.get_storage_path()?; - rename(input_dir, output_dir.clone())?; + trace!(output_directory = ?output_dir, "got output directory"); - Ok(output_dir) + let copy_options = CopyOptions::new().overwrite(true); + match copy(&input_dir, &output_dir, ©_options) { + Ok(_) => Ok(output_dir.join(self.folder)), + Err(error) => { + error!( + error = &error as &dyn std::error::Error, + "failed to copy static folder" + ); + + Err(Error::Copy(error))? + } + } } } impl From for shuttle_service::Error { fn from(error: Error) -> Self { let msg = match error { - Error::AbsolutePath => "Cannot use an absolute path for a static folder", - Error::TransversedUp => "Cannot transverse out of crate for a static folder", + Error::AbsolutePath => "Cannot use an absolute path for a static folder".to_string(), + Error::TransversedUp => { + "Cannot transverse out of crate for a static folder".to_string() + } + Error::Copy(error) => format!("Cannot copy static folder: {}", error), }; ShuttleError::Custom(CustomError::msg(msg)) From 349f57859b4805a18f2b99f12612e9787eae44f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Wed, 8 Mar 2023 10:12:00 +0000 Subject: [PATCH 48/74] chore: v0.11.3 (#695) --- resources/static-folder/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml index 6cd93225a..388d1045b 100644 --- a/resources/static-folder/Cargo.toml +++ b/resources/static-folder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-static-folder" -version = "0.11.0" +version = "0.11.3" edition = "2021" license = "Apache-2.0" description = "Plugin to get a static folder at runtime on shuttle" From 4e1690d8cc5da7986513014d7bbd382303e741a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Thu, 9 Mar 2023 13:34:16 +0000 Subject: [PATCH 49/74] Feature: eng 483 trim and fix the tests in shuttle-service (#693) * tests: update build_crate tests * tests: remove loader tests * feat: cleanup service deps * feat: setup integration tests in runtime * feat: expected panic message for not_shuttle * refactor: simplify dummy provisioner * feat: re-export main and service from runtime --- Cargo.lock | 6 +- runtime/Cargo.toml | 5 + runtime/src/bin/rocket.rs | 2 +- runtime/src/legacy/mod.rs | 2 +- runtime/src/lib.rs | 1 + runtime/src/next/mod.rs | 2 +- runtime/tests/integration/helpers.rs | 95 +++++++++ runtime/tests/integration/loader.rs | 48 +++++ runtime/tests/integration/main.rs | 2 + .../tests/resources/bind-panic/Cargo.toml | 5 +- .../tests/resources/bind-panic/src/main.rs | 13 ++ service/Cargo.toml | 5 - service/src/builder.rs | 43 +++- service/tests/integration/build_crate.rs | 61 ++---- service/tests/integration/helpers/loader.rs | 28 --- service/tests/integration/helpers/mod.rs | 4 - service/tests/integration/helpers/sqlx.rs | 134 ------------ service/tests/integration/loader.rs | 192 ------------------ service/tests/integration/main.rs | 7 +- service/tests/resources/bind-panic/src/lib.rs | 18 -- .../tests/resources/build-panic/Cargo.toml | 12 -- .../tests/resources/build-panic/src/lib.rs | 18 -- service/tests/resources/is-bin/Cargo.toml | 12 ++ service/tests/resources/is-bin/src/main.rs | 6 + service/tests/resources/is-cdylib/src/lib.rs | 5 - .../{is-cdylib => not-bin}/Cargo.toml | 3 +- .../{not-cdylib => not-bin}/src/lib.rs | 2 + service/tests/resources/not-cdylib/Cargo.toml | 13 -- service/tests/resources/not-lib/Cargo.toml | 6 - service/tests/resources/not-lib/src/main.rs | 5 - .../tests/resources/not-shuttle/Cargo.toml | 8 +- .../tests/resources/not-shuttle/src/lib.rs | 1 - .../tests/resources/not-shuttle/src/main.rs | 6 + .../tests/resources/sleep-async/Cargo.toml | 13 -- .../tests/resources/sleep-async/src/lib.rs | 26 --- service/tests/resources/sleep/Cargo.toml | 12 -- service/tests/resources/sleep/src/lib.rs | 25 --- service/tests/resources/sqlx-pool/Cargo.toml | 14 -- service/tests/resources/sqlx-pool/src/lib.rs | 39 ---- 39 files changed, 261 insertions(+), 638 deletions(-) create mode 100644 runtime/tests/integration/helpers.rs create mode 100644 runtime/tests/integration/loader.rs create mode 100644 runtime/tests/integration/main.rs rename {service => runtime}/tests/resources/bind-panic/Cargo.toml (56%) create mode 100644 runtime/tests/resources/bind-panic/src/main.rs delete mode 100644 service/tests/integration/helpers/loader.rs delete mode 100644 service/tests/integration/helpers/mod.rs delete mode 100644 service/tests/integration/helpers/sqlx.rs delete mode 100644 service/tests/integration/loader.rs delete mode 100644 service/tests/resources/bind-panic/src/lib.rs delete mode 100644 service/tests/resources/build-panic/Cargo.toml delete mode 100644 service/tests/resources/build-panic/src/lib.rs create mode 100644 service/tests/resources/is-bin/Cargo.toml create mode 100644 service/tests/resources/is-bin/src/main.rs delete mode 100644 service/tests/resources/is-cdylib/src/lib.rs rename service/tests/resources/{is-cdylib => not-bin}/Cargo.toml (75%) rename service/tests/resources/{not-cdylib => not-bin}/src/lib.rs (71%) delete mode 100644 service/tests/resources/not-cdylib/Cargo.toml delete mode 100644 service/tests/resources/not-lib/Cargo.toml delete mode 100644 service/tests/resources/not-lib/src/main.rs delete mode 100644 service/tests/resources/not-shuttle/src/lib.rs create mode 100644 service/tests/resources/not-shuttle/src/main.rs delete mode 100644 service/tests/resources/sleep-async/Cargo.toml delete mode 100644 service/tests/resources/sleep-async/src/lib.rs delete mode 100644 service/tests/resources/sleep/Cargo.toml delete mode 100644 service/tests/resources/sleep/src/lib.rs delete mode 100644 service/tests/resources/sqlx-pool/Cargo.toml delete mode 100644 service/tests/resources/sqlx-pool/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index c47655c27..5bfd7393d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6403,8 +6403,10 @@ dependencies = [ "cap-std", "chrono", "clap 4.0.27", + "crossbeam-channel", "futures", "hyper", + "portpicker", "rmp-serde", "rocket", "serde_json", @@ -6445,20 +6447,17 @@ dependencies = [ "cargo", "cargo_metadata", "crossbeam-channel", - "futures", "hyper", "num_cpus", "pipe", "poem", "poise", - "portpicker", "rocket", "salvo", "serde_json", "serenity", "shuttle-codegen", "shuttle-common", - "sqlx", "thiserror", "thruster", "tide", @@ -6466,7 +6465,6 @@ dependencies = [ "tower", "tracing", "tracing-subscriber", - "uuid 1.2.2", "warp", ] diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index b8ce5c235..36f83ee99 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -52,6 +52,11 @@ workspace = true workspace = true features = ["builder", "web-rocket"] # TODO: remove web-rocket +[dev-dependencies] +crossbeam-channel = "0.5.6" +portpicker = "0.1.1" +futures = { version = "0.3.25" } + [features] next = [ "cap-std", diff --git a/runtime/src/bin/rocket.rs b/runtime/src/bin/rocket.rs index 9222f709d..db3836826 100644 --- a/runtime/src/bin/rocket.rs +++ b/runtime/src/bin/rocket.rs @@ -6,7 +6,7 @@ async fn main() { async fn loader( mut factory: shuttle_runtime::ProvisionerFactory, - logger: shuttle_runtime::Logger, + _logger: shuttle_runtime::Logger, ) -> shuttle_service::ShuttleRocket { use shuttle_service::ResourceBuilder; diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 9cc3fa4b3..cad51259c 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -231,7 +231,7 @@ where let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); if let Some(kill_tx) = kill_tx { - if kill_tx.send(format!("stopping deployment")).is_err() { + if kill_tx.send("stopping deployment".to_owned()).is_err() { error!("the receiver dropped"); return Err(Status::internal("failed to stop deployment")); } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 6e51ff0f4..233616493 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -10,3 +10,4 @@ pub use logger::Logger; pub use next::{AxumWasm, NextArgs}; pub use provisioner_factory::ProvisionerFactory; pub use shuttle_common::storage_manager::StorageManager; +pub use shuttle_service::{main, Error, Service}; diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index ccd30e321..41f50eaac 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -155,7 +155,7 @@ impl Runtime for AxumWasm { let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); if let Some(kill_tx) = kill_tx { - if kill_tx.send(format!("stopping deployment")).is_err() { + if kill_tx.send("stopping deployment".to_owned()).is_err() { error!("the receiver dropped"); return Err(Status::internal("failed to stop deployment")); } diff --git a/runtime/tests/integration/helpers.rs b/runtime/tests/integration/helpers.rs new file mode 100644 index 000000000..afa093f82 --- /dev/null +++ b/runtime/tests/integration/helpers.rs @@ -0,0 +1,95 @@ +use std::{ + collections::HashMap, + net::{Ipv4Addr, SocketAddr}, + path::{Path, PathBuf}, +}; + +use anyhow::Result; +use async_trait::async_trait; +use shuttle_proto::{ + provisioner::{ + provisioner_server::{Provisioner, ProvisionerServer}, + DatabaseRequest, DatabaseResponse, + }, + runtime::{self, runtime_client::RuntimeClient}, +}; +use shuttle_service::builder::{build_crate, Runtime}; +use tonic::{ + transport::{Channel, Server}, + Request, Response, Status, +}; + +pub struct TestRuntime { + pub runtime_client: RuntimeClient, + pub bin_path: String, + pub service_name: String, + pub runtime_address: SocketAddr, + pub secrets: HashMap, +} + +pub async fn spawn_runtime(project_path: String, service_name: &str) -> Result { + let provisioner_address = SocketAddr::new( + Ipv4Addr::LOCALHOST.into(), + portpicker::pick_unused_port().unwrap(), + ); + let runtime_port = portpicker::pick_unused_port().unwrap(); + let runtime_address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), runtime_port); + + let (tx, _) = crossbeam_channel::unbounded(); + let runtime = build_crate(Path::new(&project_path), false, tx).await?; + + let secrets: HashMap = Default::default(); + + let (is_wasm, bin_path) = match runtime { + Runtime::Next(path) => (true, path), + Runtime::Legacy(path) => (false, path), + }; + + start_provisioner(DummyProvisioner, provisioner_address); + + // TODO: update this to work with shuttle-next projects, see cargo-shuttle local run + let runtime_path = || bin_path.clone(); + + let (_, runtime_client) = runtime::start( + is_wasm, + runtime::StorageManagerType::WorkingDir(PathBuf::from(project_path.clone())), + &format!("http://{}", provisioner_address), + runtime_port, + runtime_path, + ) + .await?; + + Ok(TestRuntime { + runtime_client, + bin_path: bin_path + .into_os_string() + .into_string() + .expect("to convert path to string"), + service_name: service_name.to_string(), + runtime_address, + secrets, + }) +} + +/// A dummy provisioner for tests, a provisioner connection is required +/// to start a project runtime. +pub struct DummyProvisioner; + +fn start_provisioner(provisioner: DummyProvisioner, address: SocketAddr) { + tokio::spawn(async move { + Server::builder() + .add_service(ProvisionerServer::new(provisioner)) + .serve(address) + .await + }); +} + +#[async_trait] +impl Provisioner for DummyProvisioner { + async fn provision_database( + &self, + _request: Request, + ) -> Result, Status> { + panic!("did not expect any runtime test to use dbs") + } +} diff --git a/runtime/tests/integration/loader.rs b/runtime/tests/integration/loader.rs new file mode 100644 index 000000000..d4051818a --- /dev/null +++ b/runtime/tests/integration/loader.rs @@ -0,0 +1,48 @@ +use std::time::Duration; + +use shuttle_proto::runtime::{LoadRequest, StartRequest}; +use uuid::Uuid; + +use crate::helpers::{spawn_runtime, TestRuntime}; + +/// This test does panic, but the panic happens in a spawned task inside the project runtime, +/// so we get this output: `thread 'tokio-runtime-worker' panicked at 'panic in bind', src/main.rs:6:9`, +/// but `should_panic(expected = "panic in bind")` doesn't catch it. +#[tokio::test] +#[should_panic(expected = "panic in bind")] +async fn bind_panic() { + let project_path = format!("{}/tests/resources/bind-panic", env!("CARGO_MANIFEST_DIR")); + + let TestRuntime { + bin_path, + service_name, + secrets, + mut runtime_client, + runtime_address, + } = spawn_runtime(project_path, "bind-panic").await.unwrap(); + + let load_request = tonic::Request::new(LoadRequest { + path: bin_path, + service_name, + secrets, + }); + + let _ = runtime_client.load(load_request).await.unwrap(); + + let start_request = StartRequest { + deployment_id: Uuid::default().as_bytes().to_vec(), + ip: runtime_address.to_string(), + }; + + // I also tried this without spawning, but it gave the same result. Panic but it isn't caught. + tokio::spawn(async move { + runtime_client + .start(tonic::Request::new(start_request)) + .await + .unwrap(); + // Give it a second to panic. + tokio::time::sleep(Duration::from_secs(1)).await; + }) + .await + .unwrap(); +} diff --git a/runtime/tests/integration/main.rs b/runtime/tests/integration/main.rs new file mode 100644 index 000000000..e52d9c483 --- /dev/null +++ b/runtime/tests/integration/main.rs @@ -0,0 +1,2 @@ +pub mod helpers; +pub mod loader; diff --git a/service/tests/resources/bind-panic/Cargo.toml b/runtime/tests/resources/bind-panic/Cargo.toml similarity index 56% rename from service/tests/resources/bind-panic/Cargo.toml rename to runtime/tests/resources/bind-panic/Cargo.toml index eb3331848..05c792584 100644 --- a/service/tests/resources/bind-panic/Cargo.toml +++ b/runtime/tests/resources/bind-panic/Cargo.toml @@ -3,10 +3,9 @@ name = "bind-panic" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = { path = "../../../" } +shuttle-runtime = { path = "../../../" } +tokio = { version = "1.22.0" } diff --git a/runtime/tests/resources/bind-panic/src/main.rs b/runtime/tests/resources/bind-panic/src/main.rs new file mode 100644 index 000000000..d7badcd69 --- /dev/null +++ b/runtime/tests/resources/bind-panic/src/main.rs @@ -0,0 +1,13 @@ +struct MyService; + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for MyService { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { + panic!("panic in bind"); + } +} + +#[shuttle_runtime::main] +async fn bind_panic() -> Result { + Ok(MyService) +} diff --git a/service/Cargo.toml b/service/Cargo.toml index f9943a4d2..ceb48a7ef 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -19,7 +19,6 @@ bincode = { version = "1.3.3", optional = true } cargo = { version = "0.65.0", optional = true } cargo_metadata = "0.15.2" crossbeam-channel = "0.5.6" -futures = { version = "0.3.25", features = ["std"] } hyper = { version = "0.14.23", features = ["server", "tcp", "http1"], optional = true } num_cpus = { version = "1.14.0", optional = true } pipe = "0.4.0" @@ -36,7 +35,6 @@ tokio = { version = "1.22.0", features = ["sync"] } tower = { version = "0.4.13", features = ["make"], optional = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } -uuid = { workspace = true, features = ["v4"] } warp = { version = "0.3.3", optional = true } # Tide does not have tokio support. So make sure async-std is compatible with tokio @@ -55,10 +53,7 @@ workspace = true features = ["tracing", "service"] [dev-dependencies] -portpicker = "0.1.1" -sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } tokio = { version = "1.22.0", features = ["macros", "rt"] } -uuid = { workspace = true, features = ["v4"] } [features] default = ["codegen"] diff --git a/service/src/builder.rs b/service/src/builder.rs index 3fcd8c67f..1d1358a8b 100644 --- a/service/src/builder.rs +++ b/service/src/builder.rs @@ -1,8 +1,8 @@ use std::path::{Path, PathBuf}; -use anyhow::{anyhow, Context}; +use anyhow::{anyhow, bail, Context}; use cargo::core::compiler::{CompileKind, CompileMode, CompileTarget, MessageFormat}; -use cargo::core::{Shell, Summary, Verbosity, Workspace}; +use cargo::core::{Manifest, Shell, Summary, Verbosity, Workspace}; use cargo::ops::{clean, compile, CleanOptions, CompileOptions}; use cargo::util::interning::InternedString; use cargo::util::{homedir, ToSemver}; @@ -51,14 +51,18 @@ pub async fn build_crate( let manifest_path = project_path.join("Cargo.toml"); let mut ws = Workspace::new(&manifest_path, &config)?; - let current = ws.current_mut().map_err(|_| anyhow!("A Shuttle project cannot have a virtual manifest file - please ensure your Cargo.toml file specifies it as a library."))?; + let current = ws.current_mut().map_err(|_| anyhow!("A Shuttle project cannot have a virtual manifest file - please ensure the `package` table is present in your Cargo.toml file."))?; let summary = current.manifest_mut().summary_mut(); - let is_next = is_next(summary); + if !is_next { check_version(summary)?; + ensure_binary(current.manifest())?; + } else { + ensure_cdylib(current.manifest_mut())?; } + check_no_panic(&ws)?; let opts = get_compile_options(&config, release_mode, is_next)?; @@ -173,6 +177,37 @@ fn is_next(summary: &Summary) -> bool { .any(|dependency| dependency.package_name() == NEXT_NAME) } +/// Make sure the project is a binary for legacy projects. +fn ensure_binary(manifest: &Manifest) -> anyhow::Result<()> { + if manifest.targets().iter().any(|target| target.is_bin()) { + Ok(()) + } else { + bail!("Your Shuttle project must be a binary.") + } +} + +/// Make sure "cdylib" is set for shuttle-next projects, else set it if possible. +fn ensure_cdylib(manifest: &mut Manifest) -> anyhow::Result<()> { + if let Some(target) = manifest + .targets_mut() + .iter_mut() + .find(|target| target.is_lib()) + { + if !target.is_cdylib() { + *target = cargo::core::manifest::Target::lib_target( + target.name(), + vec![cargo::core::compiler::CrateType::Cdylib], + target.src_path().path().unwrap().to_path_buf(), + target.edition(), + ); + } + + Ok(()) + } else { + bail!("Your Shuttle project must be a library. Please add `[lib]` to your Cargo.toml file.") + } +} + /// Check that the crate being build is compatible with this version of loader fn check_version(summary: &Summary) -> anyhow::Result<()> { let valid_version = VERSION.to_semver().unwrap(); diff --git a/service/tests/integration/build_crate.rs b/service/tests/integration/build_crate.rs index 6c7e289eb..f36a46d5a 100644 --- a/service/tests/integration/build_crate.rs +++ b/service/tests/integration/build_crate.rs @@ -1,64 +1,39 @@ use std::path::{Path, PathBuf}; -use shuttle_service::loader::{build_crate, Runtime}; +use shuttle_service::builder::{build_crate, Runtime}; -#[tokio::test(flavor = "multi_thread")] +#[tokio::test] +#[should_panic(expected = "1 job failed")] async fn not_shuttle() { let (tx, _) = crossbeam_channel::unbounded(); let project_path = format!("{}/tests/resources/not-shuttle", env!("CARGO_MANIFEST_DIR")); - let so_path = match build_crate(Default::default(), Path::new(&project_path), false, tx) + build_crate(Path::new(&project_path), false, tx) .await - .unwrap() - { - Runtime::Legacy(path) => path, - _ => unreachable!(), - }; - - assert!( - so_path - .display() - .to_string() - .ends_with("tests/resources/not-shuttle/target/debug/libnot_shuttle.so"), - "did not get expected so_path: {}", - so_path.display() - ); + .unwrap(); } #[tokio::test] -#[should_panic( - expected = "Your Shuttle project must be a library. Please add `[lib]` to your Cargo.toml file." -)] -async fn not_lib() { +#[should_panic(expected = "Your Shuttle project must be a binary.")] +async fn not_bin() { let (tx, _) = crossbeam_channel::unbounded(); - let project_path = format!("{}/tests/resources/not-lib", env!("CARGO_MANIFEST_DIR")); - build_crate(Default::default(), Path::new(&project_path), false, tx) - .await - .unwrap(); + let project_path = format!("{}/tests/resources/not-bin", env!("CARGO_MANIFEST_DIR")); + match build_crate(Path::new(&project_path), false, tx).await { + Ok(_) => {} + Err(e) => panic!("{}", e.to_string()), + } } -#[tokio::test(flavor = "multi_thread")] -async fn not_cdylib() { +#[tokio::test] +async fn is_bin() { let (tx, _) = crossbeam_channel::unbounded(); - let project_path = format!("{}/tests/resources/not-cdylib", env!("CARGO_MANIFEST_DIR")); - assert!(matches!( - build_crate(Default::default(), Path::new(&project_path), false, tx).await, - Ok(Runtime::Legacy(_)) - )); - assert!(PathBuf::from(project_path) - .join("target/debug/libnot_cdylib.so") - .exists()); -} + let project_path = format!("{}/tests/resources/is-bin", env!("CARGO_MANIFEST_DIR")); -#[tokio::test(flavor = "multi_thread")] -async fn is_cdylib() { - let (tx, _) = crossbeam_channel::unbounded(); - let project_path = format!("{}/tests/resources/is-cdylib", env!("CARGO_MANIFEST_DIR")); assert!(matches!( - build_crate(Default::default(), Path::new(&project_path), false, tx).await, + build_crate(Path::new(&project_path), false, tx).await, Ok(Runtime::Legacy(_)) )); assert!(PathBuf::from(project_path) - .join("target/debug/libis_cdylib.so") + .join("target/debug/is-bin") .exists()); } @@ -70,7 +45,7 @@ async fn not_found() { "{}/tests/resources/non-existing", env!("CARGO_MANIFEST_DIR") ); - build_crate(Default::default(), Path::new(&project_path), false, tx) + build_crate(Path::new(&project_path), false, tx) .await .unwrap(); } diff --git a/service/tests/integration/helpers/loader.rs b/service/tests/integration/helpers/loader.rs deleted file mode 100644 index 2d09238c2..000000000 --- a/service/tests/integration/helpers/loader.rs +++ /dev/null @@ -1,28 +0,0 @@ -use std::path::PathBuf; -use std::process::Command; - -use shuttle_service::loader::{Loader, LoaderError}; - -pub fn build_so_create_loader(resources: &str, crate_name: &str) -> Result { - let crate_dir: PathBuf = [resources, crate_name].iter().collect(); - - Command::new("cargo") - .args(["build", "--release"]) - .current_dir(&crate_dir) - .spawn() - .unwrap() - .wait() - .unwrap(); - - let dashes_replaced = crate_name.replace('-', "_"); - - let lib_name = if cfg!(target_os = "windows") { - format!("{}.dll", dashes_replaced) - } else { - format!("lib{}.so", dashes_replaced) - }; - - let so_path = crate_dir.join("target/release").join(lib_name); - - Loader::from_so_file(so_path) -} diff --git a/service/tests/integration/helpers/mod.rs b/service/tests/integration/helpers/mod.rs deleted file mode 100644 index e9b2e29f0..000000000 --- a/service/tests/integration/helpers/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod sqlx; - -#[cfg(feature = "loader")] -pub mod loader; diff --git a/service/tests/integration/helpers/sqlx.rs b/service/tests/integration/helpers/sqlx.rs deleted file mode 100644 index 79632e967..000000000 --- a/service/tests/integration/helpers/sqlx.rs +++ /dev/null @@ -1,134 +0,0 @@ -use std::future::Future; -use std::process::Command; -use std::thread::sleep; -use std::time::Duration; - -use portpicker::pick_unused_port; -use sqlx::Connection; - -pub struct PostgresInstance { - port: u16, - container: String, - password: String, -} - -impl Default for PostgresInstance { - fn default() -> Self { - Self::new() - } -} - -impl PostgresInstance { - /// Creates a new [`PostgresInstance`] using the official postgres:11 docker image - /// - /// Does not wait for the container to be ready. Use [`PostgresInstance::wait_for_ready`] and - /// [`PostgresInstance::wait_for_connectable`] for that. - pub fn new() -> Self { - let port = pick_unused_port().expect("could not find a free port for postgres"); - let container = "postgres-shuttle-service-integration-test".to_string(); - let password = "password".to_string(); - - Command::new("docker") - .args([ - "run", - "--name", - &container, - "-e", - &format!("POSTGRES_PASSWORD={}", password), - "-p", - &format!("{}:5432", port), - "postgres:11", // Our Containerfile image is based on buster which has postgres version 11 - ]) - .spawn() - .expect("failed to start a postgres instance"); - - Self { - port, - container, - password, - } - } - - pub fn get_uri(&self) -> String { - format!( - "postgres://postgres:{}@localhost:{}", - self.password, self.port - ) - } - - pub fn wait_for_connectable(&self) -> impl Future + '_ { - self.async_wait_for(|instance| { - let uri = instance.get_uri().as_str().to_string(); - async move { sqlx::PgConnection::connect(uri.as_str()).await.is_ok() } - }) - } - - pub async fn async_wait_for(&self, f: F) - where - F: Fn(&Self) -> Fut, - Fut: Future, - { - let mut timeout = 20 * 10; - - while timeout > 0 { - timeout -= 1; - - if f(self).await { - return; - } - - sleep(Duration::from_millis(100)); - } - - panic!("timed out waiting for PostgresInstance"); - } - - pub fn wait_for_ready(&self) { - self.wait_for(|instance| { - let status = Command::new("docker") - .args(["exec", &instance.container, "pg_isready"]) - .output() - .expect("failed to get postgres ready status") - .status; - - status.success() - }) - } - - pub fn wait_for(&self, f: F) - where - F: Fn(&Self) -> bool, - { - let mut timeout = 20 * 10; - - while timeout > 0 { - timeout -= 1; - - if f(self) { - return; - } - - sleep(Duration::from_millis(100)); - } - - panic!("timed out waiting for PostgresInstance"); - } -} - -impl Drop for PostgresInstance { - fn drop(&mut self) { - Command::new("docker") - .args(["stop", &self.container]) - .spawn() - .expect("failed to spawn stop for postgres container") - .wait() - .expect("postgres container stop failed"); - - Command::new("docker") - .args(["rm", &self.container]) - .spawn() - .expect("failed to spawn stop for remove container") - .wait() - .expect("postgres container remove failed"); - } -} diff --git a/service/tests/integration/loader.rs b/service/tests/integration/loader.rs deleted file mode 100644 index ba42c3807..000000000 --- a/service/tests/integration/loader.rs +++ /dev/null @@ -1,192 +0,0 @@ -use crate::helpers::{loader::build_so_create_loader, sqlx::PostgresInstance}; - -use shuttle_common::log::Level; -use shuttle_common::LogItem; -use shuttle_service::loader::LoaderError; -use shuttle_service::{database, Error, Factory, Logger, ServiceName}; -use std::collections::BTreeMap; -use std::net::{Ipv4Addr, SocketAddr}; -use std::process::exit; -use std::str::FromStr; -use std::time::Duration; -use tokio::sync::mpsc::{self, UnboundedReceiver}; - -use async_trait::async_trait; - -const RESOURCES_PATH: &str = "tests/resources"; - -struct DummyFactory { - postgres_instance: Option, - service_name: ServiceName, -} - -impl DummyFactory { - fn new() -> Self { - Self { - postgres_instance: None, - service_name: ServiceName::from_str("test").unwrap(), - } - } -} - -fn get_logger() -> (Logger, UnboundedReceiver) { - let (tx, rx) = mpsc::unbounded_channel(); - let logger = Logger::new(tx, Default::default()); - - (logger, rx) -} - -#[async_trait] -impl Factory for DummyFactory { - fn get_service_name(&self) -> ServiceName { - self.service_name.clone() - } - - async fn get_db_connection_string(&mut self, _: database::Type) -> Result { - let uri = if let Some(postgres_instance) = &self.postgres_instance { - postgres_instance.get_uri() - } else { - let postgres_instance = PostgresInstance::new(); - postgres_instance.wait_for_ready(); - postgres_instance.wait_for_connectable().await; - let uri = postgres_instance.get_uri(); - self.postgres_instance = Some(postgres_instance); - uri - }; - - Ok(uri) - } - - async fn get_secrets(&mut self) -> Result, Error> { - panic!("did not expect any loader test to get secrets") - } - - fn get_build_path(&self) -> Result { - panic!("did not expect any loader test to get the build path") - } - - fn get_storage_path(&self) -> Result { - panic!("did not expect any loader test to get the storage path") - } -} - -#[test] -fn not_shuttle() { - let result = build_so_create_loader(RESOURCES_PATH, "not-shuttle"); - assert!(matches!(result, Err(LoaderError::GetEntrypoint(_)))); -} - -#[tokio::test] -async fn sleep_async() { - let loader = build_so_create_loader(RESOURCES_PATH, "sleep-async").unwrap(); - - let mut factory = DummyFactory::new(); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let (logger, _rx) = get_logger(); - let (handler, _) = loader.load(&mut factory, addr, logger).await.unwrap(); - - // Give service some time to start up - tokio::time::sleep(Duration::from_secs(1)).await; - - tokio::spawn(async { - // Time is less than sleep in service - tokio::time::sleep(Duration::from_secs(5)).await; - println!("Test failed as async service was not aborted"); - exit(1); - }); - - handler.abort(); - assert!(handler.await.unwrap_err().is_cancelled()); -} - -#[tokio::test] -async fn sleep() { - let loader = build_so_create_loader(RESOURCES_PATH, "sleep").unwrap(); - - let mut factory = DummyFactory::new(); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let (logger, _rx) = get_logger(); - let (handler, _) = loader.load(&mut factory, addr, logger).await.unwrap(); - - // Give service some time to start up - tokio::time::sleep(Duration::from_secs(1)).await; - - tokio::spawn(async { - // Time is less than sleep in service - tokio::time::sleep(Duration::from_secs(5)).await; - println!("Test failed as blocking service was not aborted"); - exit(1); - }); - - handler.abort(); - assert!(handler.await.unwrap_err().is_cancelled()); -} - -#[tokio::test] -async fn sqlx_pool() { - let loader = build_so_create_loader(RESOURCES_PATH, "sqlx-pool").unwrap(); - - // Make sure we'll get a log entry - std::env::set_var("RUST_LOG", "info"); - - // Don't initialize a pre-existing PostgresInstance here because the `PostgresInstance::wait_for_connectable()` - // code has `awaits` and we want to make sure they do not block inside `Service::build()`. - // At the same time we also want to test the PgPool is created on the correct runtime (ie does not cause a - // "has to run on a tokio runtime" error) - let mut factory = DummyFactory::new(); - - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let (logger, mut rx) = get_logger(); - let (handler, _) = loader.load(&mut factory, addr, logger).await.unwrap(); - - handler.await.unwrap().unwrap(); - - let log = rx.recv().await.unwrap(); - let value = serde_json::from_slice::(&log.fields).unwrap(); - let message = value - .as_object() - .unwrap() - .get("message") - .unwrap() - .as_str() - .unwrap(); - assert!( - message.starts_with("SELECT 'Hello world';"), - "got: {}", - message - ); - assert_eq!(log.target, "sqlx::query"); - assert_eq!(log.level, Level::Info); -} - -#[tokio::test] -async fn build_panic() { - let loader = build_so_create_loader(RESOURCES_PATH, "build-panic").unwrap(); - - let mut factory = DummyFactory::new(); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let (logger, _rx) = get_logger(); - - if let Err(Error::BuildPanic(msg)) = loader.load(&mut factory, addr, logger).await { - assert_eq!(&msg, "panic in build"); - } else { - panic!("expected `Err(Error::BuildPanic(_))`"); - } -} - -#[tokio::test] -async fn bind_panic() { - let loader = build_so_create_loader(RESOURCES_PATH, "bind-panic").unwrap(); - - let mut factory = DummyFactory::new(); - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 8001); - let (logger, _rx) = get_logger(); - - let (handle, _) = loader.load(&mut factory, addr, logger).await.unwrap(); - - if let Err(Error::BindPanic(msg)) = handle.await.unwrap() { - assert_eq!(&msg, "panic in bind"); - } else { - panic!("expected `Err(Error::BindPanic(_))`"); - } -} diff --git a/service/tests/integration/main.rs b/service/tests/integration/main.rs index b09409f82..f8f5ab1f1 100644 --- a/service/tests/integration/main.rs +++ b/service/tests/integration/main.rs @@ -1,7 +1,2 @@ -pub mod helpers; - -#[cfg(feature = "loader")] -mod loader; - -#[cfg(feature = "loader")] +#[cfg(feature = "builder")] mod build_crate; diff --git a/service/tests/resources/bind-panic/src/lib.rs b/service/tests/resources/bind-panic/src/lib.rs deleted file mode 100644 index 1ecd700bf..000000000 --- a/service/tests/resources/bind-panic/src/lib.rs +++ /dev/null @@ -1,18 +0,0 @@ -use shuttle_service::Service; - -struct MyService; - -#[shuttle_service::async_trait] -impl Service for MyService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::Error> { - panic!("panic in bind"); - } -} - -#[shuttle_service::main] -async fn bind_panic() -> Result { - Ok(MyService) -} diff --git a/service/tests/resources/build-panic/Cargo.toml b/service/tests/resources/build-panic/Cargo.toml deleted file mode 100644 index 93a0b14e8..000000000 --- a/service/tests/resources/build-panic/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "build-panic" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[workspace] - -[dependencies] -shuttle-service = { path = "../../../" } diff --git a/service/tests/resources/build-panic/src/lib.rs b/service/tests/resources/build-panic/src/lib.rs deleted file mode 100644 index 084e5c802..000000000 --- a/service/tests/resources/build-panic/src/lib.rs +++ /dev/null @@ -1,18 +0,0 @@ -use shuttle_service::Service; - -struct MyService; - -#[shuttle_service::async_trait] -impl Service for MyService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::Error> { - Ok(()) - } -} - -#[shuttle_service::main] -async fn build_panic() -> Result { - panic!("panic in build"); -} diff --git a/service/tests/resources/is-bin/Cargo.toml b/service/tests/resources/is-bin/Cargo.toml new file mode 100644 index 000000000..52abbeab9 --- /dev/null +++ b/service/tests/resources/is-bin/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "is-bin" +version = "0.1.0" +edition = "2021" + +[workspace] + +[dependencies] +axum = "0.6.0" +shuttle-runtime = { path = "../../../../runtime" } +shuttle-service = { path = "../../../", features = ["web-axum"] } +tokio = { version = "1.22.0" } diff --git a/service/tests/resources/is-bin/src/main.rs b/service/tests/resources/is-bin/src/main.rs new file mode 100644 index 000000000..21ffd2090 --- /dev/null +++ b/service/tests/resources/is-bin/src/main.rs @@ -0,0 +1,6 @@ +#[shuttle_service::main] +async fn axum() -> shuttle_service::ShuttleAxum { + let router = axum::Router::new(); + + Ok(router) +} diff --git a/service/tests/resources/is-cdylib/src/lib.rs b/service/tests/resources/is-cdylib/src/lib.rs deleted file mode 100644 index 80a1cf666..000000000 --- a/service/tests/resources/is-cdylib/src/lib.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[shuttle_service::main] -async fn rocket() -> shuttle_service::ShuttleRocket { - let rocket = rocket::build(); - Ok(rocket) -} diff --git a/service/tests/resources/is-cdylib/Cargo.toml b/service/tests/resources/not-bin/Cargo.toml similarity index 75% rename from service/tests/resources/is-cdylib/Cargo.toml rename to service/tests/resources/not-bin/Cargo.toml index 99083de80..8d34c0b74 100644 --- a/service/tests/resources/is-cdylib/Cargo.toml +++ b/service/tests/resources/not-bin/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "is-cdylib" +name = "not-bin" version = "0.1.0" edition = "2021" @@ -11,3 +11,4 @@ crate-type = ["cdylib", "staticlib"] [dependencies] rocket = "0.5.0-rc.2" shuttle-service = { path = "../../../", features = ["web-rocket"] } +shuttle-runtime = { path = "../../../../runtime" } diff --git a/service/tests/resources/not-cdylib/src/lib.rs b/service/tests/resources/not-bin/src/lib.rs similarity index 71% rename from service/tests/resources/not-cdylib/src/lib.rs rename to service/tests/resources/not-bin/src/lib.rs index 80a1cf666..329aed72c 100644 --- a/service/tests/resources/not-cdylib/src/lib.rs +++ b/service/tests/resources/not-bin/src/lib.rs @@ -1,3 +1,5 @@ +// This will fail to compile since it's a library. + #[shuttle_service::main] async fn rocket() -> shuttle_service::ShuttleRocket { let rocket = rocket::build(); diff --git a/service/tests/resources/not-cdylib/Cargo.toml b/service/tests/resources/not-cdylib/Cargo.toml deleted file mode 100644 index 47a2afa53..000000000 --- a/service/tests/resources/not-cdylib/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "not-cdylib" -version = "0.1.0" -edition = "2021" - -[workspace] - -[lib] -crate-type = ["staticlib"] - -[dependencies] -rocket = "0.5.0-rc.2" -shuttle-service = { path = "../../../", features = ["web-rocket"] } diff --git a/service/tests/resources/not-lib/Cargo.toml b/service/tests/resources/not-lib/Cargo.toml deleted file mode 100644 index 3c2b2f01c..000000000 --- a/service/tests/resources/not-lib/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "not-lib" -version = "0.1.0" -edition = "2021" - -[workspace] diff --git a/service/tests/resources/not-lib/src/main.rs b/service/tests/resources/not-lib/src/main.rs deleted file mode 100644 index 2fc1633f9..000000000 --- a/service/tests/resources/not-lib/src/main.rs +++ /dev/null @@ -1,5 +0,0 @@ -// This will fail to compile since it is missing a `[lib]` section in its Cargo.toml file. - -fn main() { - println!("this is not valid as it is not a library!"); -} diff --git a/service/tests/resources/not-shuttle/Cargo.toml b/service/tests/resources/not-shuttle/Cargo.toml index b7fe25901..86af40f54 100644 --- a/service/tests/resources/not-shuttle/Cargo.toml +++ b/service/tests/resources/not-shuttle/Cargo.toml @@ -3,10 +3,10 @@ name = "not-shuttle" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - [workspace] [dependencies] -shuttle-service = "0.8.0" +axum = "0.6.0" +shuttle-runtime = { path = "../../../../runtime" } +shuttle-service = { path = "../../../", features = ["web-axum"] } +tokio = { version = "1.22.0" } diff --git a/service/tests/resources/not-shuttle/src/lib.rs b/service/tests/resources/not-shuttle/src/lib.rs deleted file mode 100644 index b25ff369e..000000000 --- a/service/tests/resources/not-shuttle/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -// This service cannot be hosted on shuttle since it is missing the entrypoint the shutlle macros would have added!!! diff --git a/service/tests/resources/not-shuttle/src/main.rs b/service/tests/resources/not-shuttle/src/main.rs new file mode 100644 index 000000000..9cf9d865b --- /dev/null +++ b/service/tests/resources/not-shuttle/src/main.rs @@ -0,0 +1,6 @@ +// This service cannot be hosted on shuttle since it is missing the runtime the shuttle main macro would have added!!! +async fn axum() -> shuttle_service::ShuttleAxum { + let router = axum::Router::new(); + + Ok(router) +} diff --git a/service/tests/resources/sleep-async/Cargo.toml b/service/tests/resources/sleep-async/Cargo.toml deleted file mode 100644 index e9fa47aae..000000000 --- a/service/tests/resources/sleep-async/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "sleep-async" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[workspace] - -[dependencies] -tokio = { version = "1.22.0", features = ["time"] } -shuttle-service = { path = "../../../" } diff --git a/service/tests/resources/sleep-async/src/lib.rs b/service/tests/resources/sleep-async/src/lib.rs deleted file mode 100644 index 585537560..000000000 --- a/service/tests/resources/sleep-async/src/lib.rs +++ /dev/null @@ -1,26 +0,0 @@ -use std::time::Duration; - -use shuttle_service::Service; -use tokio::time::sleep; - -struct SleepService { - duration: u64, -} - -#[shuttle_service::main] -async fn simple() -> Result { - Ok(SleepService { duration: 10 }) -} - -#[shuttle_service::async_trait] -impl Service for SleepService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::error::Error> { - let duration = Duration::from_secs(self.duration); - - sleep(duration).await; - Ok(()) - } -} diff --git a/service/tests/resources/sleep/Cargo.toml b/service/tests/resources/sleep/Cargo.toml deleted file mode 100644 index 40b0f6d1f..000000000 --- a/service/tests/resources/sleep/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "sleep" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[workspace] - -[dependencies] -shuttle-service = { path = "../../../" } diff --git a/service/tests/resources/sleep/src/lib.rs b/service/tests/resources/sleep/src/lib.rs deleted file mode 100644 index ac67c50ae..000000000 --- a/service/tests/resources/sleep/src/lib.rs +++ /dev/null @@ -1,25 +0,0 @@ -use std::{thread::sleep, time::Duration}; - -use shuttle_service::Service; - -struct SleepService { - duration: u64, -} - -#[shuttle_service::main] -async fn simple() -> Result { - Ok(SleepService { duration: 10 }) -} - -#[shuttle_service::async_trait] -impl Service for SleepService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::error::Error> { - let duration = Duration::from_secs(self.duration); - - sleep(duration); - Ok(()) - } -} diff --git a/service/tests/resources/sqlx-pool/Cargo.toml b/service/tests/resources/sqlx-pool/Cargo.toml deleted file mode 100644 index 14487f75a..000000000 --- a/service/tests/resources/sqlx-pool/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "sqlx-pool" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[workspace] - -[dependencies] -shuttle-service = { path = "../../../" } -shuttle-shared-db = { path = "../../../../resources/shared-db", features = ["postgres"] } -sqlx = { version = "0.6.2", features = [ "runtime-tokio-native-tls" ] } diff --git a/service/tests/resources/sqlx-pool/src/lib.rs b/service/tests/resources/sqlx-pool/src/lib.rs deleted file mode 100644 index a3ae35690..000000000 --- a/service/tests/resources/sqlx-pool/src/lib.rs +++ /dev/null @@ -1,39 +0,0 @@ -use shuttle_service::error::CustomError; -use shuttle_service::Service; -use sqlx::PgPool; - -struct PoolService { - pool: PgPool, -} - -#[shuttle_service::main] -async fn init( - #[shuttle_shared_db::Postgres] pool: PgPool, -) -> Result { - Ok(PoolService { pool }) -} - -impl PoolService { - async fn start(&self) -> Result<(), shuttle_service::error::CustomError> { - let (rec,): (String,) = sqlx::query_as("SELECT 'Hello world'") - .fetch_one(&self.pool) - .await - .map_err(CustomError::new)?; - - assert_eq!(rec, "Hello world"); - - Ok(()) - } -} - -#[shuttle_service::async_trait] -impl Service for PoolService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::error::Error> { - self.start().await?; - - Ok(()) - } -} From 9f7a48287ea452c578e98d72d4267c62a5208807 Mon Sep 17 00:00:00 2001 From: Kieren Davies Date: Fri, 10 Mar 2023 11:23:51 +0100 Subject: [PATCH 50/74] fix: Respect `Cargo.lock` when building containers (#700) Building the shuttle containers was failing during the `cargo chef cook` step because of a cyclic dependency introduced by an upstream crate. This did not happen when building outside of a container, because the versions pinned by `Cargo.lock` did not contain any cycles. See https://github.com/tkaitchuck/aHash/issues/95 --- Containerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Containerfile b/Containerfile index 0765cba36..cf7fa997d 100644 --- a/Containerfile +++ b/Containerfile @@ -14,7 +14,7 @@ WORKDIR /build FROM shuttle-build as cache WORKDIR /src COPY . . -RUN find ${SRC_CRATES} \( -name "*.proto" -or -name "*.rs" -or -name "*.toml" -or -name "README.md" -or -name "*.sql" \) -type f -exec install -D \{\} /build/\{\} \; +RUN find ${SRC_CRATES} \( -name "*.proto" -or -name "*.rs" -or -name "*.toml" -or -name "Cargo.lock" -or -name "README.md" -or -name "*.sql" \) -type f -exec install -D \{\} /build/\{\} \; FROM shuttle-build AS planner COPY --from=cache /build . From adf89267e44874022fc20ab7f8038d131d7578b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Fri, 10 Mar 2023 16:57:14 +0000 Subject: [PATCH 51/74] ci: resolve CI errors in shuttle-next (#580) * test: compile wasm module in axum runtime test setup * ci: add next patch override to CI * ci: include wasm32-wasi target in rust install * fix: deployer tests where runtime fails to start * fix: incorrect provisioner address * feat: log service state changes in runtime * feat: don't send stop req on startup failure * refactor: unused imports * refactor: handling legacy panics * tests: deadlock less * refactor: fixups * refactor: clippy suggestions * tests: mock provisioner * refactor: restore capture from 'log' and colors * refactor: clippy suggestions * tests: longer wait * tests: don't panic while holding lock * tests: don't panic on stream closed * tests: don't filter out state logs * tests: bigger timeout * ci: remove duplicate patch * refactor: comments --------- Co-authored-by: chesedo --- admin/Cargo.toml | 4 +- cargo-shuttle/Cargo.toml | 4 +- cargo-shuttle/src/lib.rs | 2 +- deployer/Cargo.toml | 4 +- deployer/src/deployment/deploy_layer.rs | 444 ++++++++++++------------ deployer/src/deployment/mod.rs | 18 +- deployer/src/deployment/queue.rs | 2 +- deployer/src/deployment/run.rs | 282 +++++++++------ deployer/src/error.rs | 2 + deployer/src/runtime_manager.rs | 53 ++- gateway/Cargo.toml | 4 +- proto/runtime.proto | 24 ++ provisioner/Cargo.toml | 4 +- runtime/Cargo.toml | 4 +- runtime/src/legacy/mod.rs | 65 +++- runtime/src/next/mod.rs | 17 +- 16 files changed, 549 insertions(+), 384 deletions(-) diff --git a/admin/Cargo.toml b/admin/Cargo.toml index 00bcefa0e..d2fda7879 100644 --- a/admin/Cargo.toml +++ b/admin/Cargo.toml @@ -12,8 +12,8 @@ serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } toml = "0.5.9" -tracing = { workspace = true } -tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing = { workspace = true, features = ["default"] } +tracing-subscriber = { workspace = true, features = ["default", "env-filter"] } [dependencies.shuttle-common] workspace = true diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index 475c5d900..ad2036b91 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -45,8 +45,8 @@ tokio-tungstenite = { version = "0.17.2", features = ["native-tls"] } toml = "0.5.9" toml_edit = "0.15.0" tonic = { workspace = true } -tracing = { workspace = true } -tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } +tracing = { workspace = true, features = ["default"] } +tracing-subscriber = { workspace = true, features = ["default", "env-filter", "fmt"] } url = "2.3.1" uuid = { workspace = true, features = ["v4"] } webbrowser = "0.8.2" diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 2c2466269..d487d72ab 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -510,7 +510,7 @@ impl Shuttle { .into_inner(); tokio::spawn(async move { - while let Some(log) = stream.message().await.expect("to get log from stream") { + while let Ok(Some(log)) = stream.message().await { let log: shuttle_common::LogItem = log.try_into().expect("to convert log"); println!("{log}"); } diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index 73edc850f..ef0527920 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -40,9 +40,9 @@ toml = "0.5.9" tonic = { workspace = true } tower = { version = "0.4.13", features = ["make"] } tower-http = { version = "0.3.4", features = ["auth", "trace"] } -tracing = { workspace = true } +tracing = { workspace = true, features = ["default"] } tracing-opentelemetry = "0.18.0" -tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } +tracing-subscriber = { workspace = true, features = ["default", "env-filter", "fmt"] } uuid = { workspace = true, features = ["v4"] } [dependencies.shuttle-common] diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index f7d35873b..94e8be3f0 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -322,19 +322,26 @@ impl Visit for NewStateVisitor { mod tests { use std::{ fs::read_dir, - net::SocketAddr, + net::{Ipv4Addr, SocketAddr}, path::PathBuf, sync::{Arc, Mutex}, time::Duration, }; use crate::{persistence::DeploymentUpdater, RuntimeManager}; + use async_trait::async_trait; use axum::body::Bytes; use ctor::ctor; use flate2::{write::GzEncoder, Compression}; + use portpicker::pick_unused_port; + use shuttle_proto::provisioner::{ + provisioner_server::{Provisioner, ProvisionerServer}, + DatabaseRequest, DatabaseResponse, + }; use tempdir::TempDir; use tokio::{select, time::sleep}; - use tracing_subscriber::prelude::*; + use tonic::transport::Server; + use tracing_subscriber::{fmt, prelude::*, EnvFilter}; use uuid::Uuid; use crate::{ @@ -350,8 +357,46 @@ mod tests { #[ctor] static RECORDER: Arc> = { let recorder = RecorderMock::new(); + + // Copied from the test-log crate + let event_filter = { + use ::tracing_subscriber::fmt::format::FmtSpan; + + match ::std::env::var("RUST_LOG_SPAN_EVENTS") { + Ok(value) => { + value + .to_ascii_lowercase() + .split(',') + .map(|filter| match filter.trim() { + "new" => FmtSpan::NEW, + "enter" => FmtSpan::ENTER, + "exit" => FmtSpan::EXIT, + "close" => FmtSpan::CLOSE, + "active" => FmtSpan::ACTIVE, + "full" => FmtSpan::FULL, + _ => panic!("test-log: RUST_LOG_SPAN_EVENTS must contain filters separated by `,`.\n\t\ + For example: `active` or `new,close`\n\t\ + Supported filters: new, enter, exit, close, active, full\n\t\ + Got: {}", value), + }) + .fold(FmtSpan::NONE, |acc, filter| filter | acc) + }, + Err(::std::env::VarError::NotUnicode(_)) => + panic!("test-log: RUST_LOG_SPAN_EVENTS must contain a valid UTF-8 string"), + Err(::std::env::VarError::NotPresent) => FmtSpan::NONE, + } + }; + let fmt_layer = fmt::layer() + .with_test_writer() + .with_span_events(event_filter); + let filter_layer = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("shuttle_deployer")) + .unwrap(); + tracing_subscriber::registry() .with(DeployLayer::new(Arc::clone(&recorder))) + .with(filter_layer) + .with(fmt_layer) .init(); recorder @@ -404,12 +449,36 @@ mod tests { } } + struct ProvisionerMock; + + #[async_trait] + impl Provisioner for ProvisionerMock { + async fn provision_database( + &self, + _request: tonic::Request, + ) -> Result, tonic::Status> { + panic!("no deploy layer tests should request a db"); + } + } + fn get_runtime_manager() -> Arc> { + let provisioner_addr = + SocketAddr::new(Ipv4Addr::LOCALHOST.into(), pick_unused_port().unwrap()); + let mock = ProvisionerMock; + + tokio::spawn(async move { + Server::builder() + .add_service(ProvisionerServer::new(mock)) + .serve(provisioner_addr) + .await + .unwrap(); + }); + let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); let path = tmp_dir.into_path(); let (tx, _rx) = crossbeam_channel::unbounded(); - RuntimeManager::new(path, "http://provisioner:8000".to_string(), tx) + RuntimeManager::new(path, format!("http://{}", provisioner_addr), tx) } #[async_trait::async_trait] @@ -495,6 +564,18 @@ mod tests { } } + async fn test_states(id: &Uuid, expected_states: Vec) { + loop { + let states = RECORDER.lock().unwrap().get_deployment_states(id); + + if *states == expected_states { + break; + } + + sleep(Duration::from_millis(250)).await; + } + } + #[tokio::test(flavor = "multi_thread")] async fn deployment_to_be_queued() { let deployment_manager = get_deployment_manager().await; @@ -503,67 +584,46 @@ mod tests { let id = queued.id; deployment_manager.queue_push(queued).await; - let test = async { - loop { - let recorder = RECORDER.lock().unwrap(); - let states = recorder.get_deployment_states(&id); - - if states.len() < 5 { - drop(recorder); // Don't block - sleep(Duration::from_millis(350)).await; - continue; - } - - assert_eq!( - states.len(), - 5, - "did not expect these states:\n\t{states:#?}" - ); - - assert_eq!( - *states, - vec![ - StateLog { - id, - state: State::Queued, - }, - StateLog { - id, - state: State::Building, - }, - StateLog { - id, - state: State::Built, - }, - StateLog { - id, - state: State::Loading, - }, - StateLog { - id, - state: State::Running, - }, - ] - ); - - break; - } - }; + let test = test_states( + &id, + vec![ + StateLog { + id, + state: State::Queued, + }, + StateLog { + id, + state: State::Building, + }, + StateLog { + id, + state: State::Built, + }, + StateLog { + id, + state: State::Loading, + }, + StateLog { + id, + state: State::Running, + }, + ], + ); select! { - _ = sleep(Duration::from_secs(180)) => { - panic!("states should go into 'Running' for a valid service"); - } + _ = sleep(Duration::from_secs(240)) => { + let states = RECORDER.lock().unwrap().get_deployment_states(&id); + panic!("states should go into 'Running' for a valid service: {:#?}", states); + }, _ = test => {} - } + }; // Send kill signal deployment_manager.kill(id).await; sleep(Duration::from_secs(1)).await; - let recorder = RECORDER.lock().unwrap(); - let states = recorder.get_deployment_states(&id); + let states = RECORDER.lock().unwrap().get_deployment_states(&id); assert_eq!( *states, @@ -604,60 +664,40 @@ mod tests { let id = queued.id; deployment_manager.queue_push(queued).await; - let test = async { - loop { - let recorder = RECORDER.lock().unwrap(); - let states = recorder.get_deployment_states(&id); - - if states.len() < 6 { - drop(recorder); // Don't block - sleep(Duration::from_millis(350)).await; - continue; - } - - assert_eq!( - states.len(), - 6, - "did not expect these states:\n\t{states:#?}" - ); - - assert_eq!( - *states, - vec![ - StateLog { - id, - state: State::Queued, - }, - StateLog { - id, - state: State::Building, - }, - StateLog { - id, - state: State::Built, - }, - StateLog { - id, - state: State::Loading, - }, - StateLog { - id, - state: State::Running, - }, - StateLog { - id, - state: State::Completed, - }, - ] - ); - - break; - } - }; + let test = test_states( + &id, + vec![ + StateLog { + id, + state: State::Queued, + }, + StateLog { + id, + state: State::Building, + }, + StateLog { + id, + state: State::Built, + }, + StateLog { + id, + state: State::Loading, + }, + StateLog { + id, + state: State::Running, + }, + StateLog { + id, + state: State::Completed, + }, + ], + ); select! { - _ = sleep(Duration::from_secs(180)) => { - panic!("states should go into 'Completed' when a service stops by itself"); + _ = sleep(Duration::from_secs(240)) => { + let states = RECORDER.lock().unwrap().get_deployment_states(&id); + panic!("states should go into 'Completed' when a service stops by itself: {:#?}", states); } _ = test => {} } @@ -671,60 +711,40 @@ mod tests { let id = queued.id; deployment_manager.queue_push(queued).await; - let test = async { - loop { - let recorder = RECORDER.lock().unwrap(); - let states = recorder.get_deployment_states(&id); - - if states.len() < 6 { - drop(recorder); // Don't block - sleep(Duration::from_millis(350)).await; - continue; - } - - assert_eq!( - states.len(), - 6, - "did not expect these states:\n\t{states:#?}" - ); - - assert_eq!( - *states, - vec![ - StateLog { - id, - state: State::Queued, - }, - StateLog { - id, - state: State::Building, - }, - StateLog { - id, - state: State::Built, - }, - StateLog { - id, - state: State::Loading, - }, - StateLog { - id, - state: State::Running, - }, - StateLog { - id, - state: State::Crashed, - }, - ] - ); - - break; - } - }; + let test = test_states( + &id, + vec![ + StateLog { + id, + state: State::Queued, + }, + StateLog { + id, + state: State::Building, + }, + StateLog { + id, + state: State::Built, + }, + StateLog { + id, + state: State::Loading, + }, + StateLog { + id, + state: State::Running, + }, + StateLog { + id, + state: State::Crashed, + }, + ], + ); select! { - _ = sleep(Duration::from_secs(180)) => { - panic!("states should go into 'Crashed' panicing in bind"); + _ = sleep(Duration::from_secs(240)) => { + let states = RECORDER.lock().unwrap().get_deployment_states(&id); + panic!("states should go into 'Crashed' panicing in bind: {:#?}", states); } _ = test => {} } @@ -738,56 +758,40 @@ mod tests { let id = queued.id; deployment_manager.queue_push(queued).await; - let test = async { - loop { - let recorder = RECORDER.lock().unwrap(); - let states = recorder.get_deployment_states(&id); - - if states.len() < 5 { - drop(recorder); // Don't block - sleep(Duration::from_millis(350)).await; - continue; - } - - assert_eq!( - states.len(), - 5, - "did not expect these states:\n\t{states:#?}" - ); - - assert_eq!( - *states, - vec![ - StateLog { - id, - state: State::Queued, - }, - StateLog { - id, - state: State::Building, - }, - StateLog { - id, - state: State::Built, - }, - StateLog { - id, - state: State::Loading, - }, - StateLog { - id, - state: State::Crashed, - }, - ] - ); - - break; - } - }; + let test = test_states( + &id, + vec![ + StateLog { + id, + state: State::Queued, + }, + StateLog { + id, + state: State::Building, + }, + StateLog { + id, + state: State::Built, + }, + StateLog { + id, + state: State::Loading, + }, + StateLog { + id, + state: State::Running, + }, + StateLog { + id, + state: State::Crashed, + }, + ], + ); select! { - _ = sleep(Duration::from_secs(180)) => { - panic!("states should go into 'Crashed' when panicing in main"); + _ = sleep(Duration::from_secs(240)) => { + let states = RECORDER.lock().unwrap().get_deployment_states(&id); + panic!("states should go into 'Crashed' when panicing in main: {:#?}", states); } _ = test => {} } @@ -808,20 +812,8 @@ mod tests { }) .await; - // Give it a small time to start up - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - - let recorder = RECORDER.lock().unwrap(); - let states = recorder.get_deployment_states(&id); - - assert_eq!( - states.len(), - 3, - "did not expect these states:\n\t{states:#?}" - ); - - assert_eq!( - *states, + let test = test_states( + &id, vec![ StateLog { id, @@ -835,8 +827,16 @@ mod tests { id, state: State::Crashed, }, - ] + ], ); + + select! { + _ = sleep(Duration::from_secs(50)) => { + let states = RECORDER.lock().unwrap().get_deployment_states(&id); + panic!("from running should start in built and end in crash for invalid: {:#?}", states) + }, + _ = test => {} + }; } #[tokio::test] diff --git a/deployer/src/deployment/mod.rs b/deployer/src/deployment/mod.rs index 121a4c926..09ceeaba2 100644 --- a/deployer/src/deployment/mod.rs +++ b/deployer/src/deployment/mod.rs @@ -15,14 +15,13 @@ use crate::{ persistence::{DeploymentUpdater, SecretGetter, SecretRecorder, State}, RuntimeManager, }; -use tokio::sync::{broadcast, mpsc, Mutex}; +use tokio::sync::{mpsc, Mutex}; use uuid::Uuid; use self::{deploy_layer::LogRecorder, gateway_client::BuildQueueClient}; const QUEUE_BUFFER_SIZE: usize = 100; const RUN_BUFFER_SIZE: usize = 100; -const KILL_BUFFER_SIZE: usize = 10; pub struct DeploymentManagerBuilder { build_log_recorder: Option, @@ -114,7 +113,6 @@ where let (queue_send, queue_recv) = mpsc::channel(QUEUE_BUFFER_SIZE); let (run_send, run_recv) = mpsc::channel(RUN_BUFFER_SIZE); - let (kill_send, _) = broadcast::channel(KILL_BUFFER_SIZE); let storage_manager = ArtifactsStorageManager::new(artifacts_path); let run_send_clone = run_send.clone(); @@ -130,9 +128,8 @@ where )); tokio::spawn(run::task( run_recv, - runtime_manager, + runtime_manager.clone(), deployment_updater, - kill_send.clone(), active_deployment_getter, secret_getter, storage_manager.clone(), @@ -141,7 +138,7 @@ where DeploymentManager { queue_send, run_send, - kill_send, + runtime_manager, storage_manager, } } @@ -151,7 +148,7 @@ where pub struct DeploymentManager { queue_send: QueueSender, run_send: RunSender, - kill_send: KillSender, + runtime_manager: Arc>, storage_manager: ArtifactsStorageManager, } @@ -201,9 +198,7 @@ impl DeploymentManager { } pub async fn kill(&self, id: Uuid) { - if self.kill_send.receiver_count() > 0 { - self.kill_send.send(id).unwrap(); - } + self.runtime_manager.lock().await.kill(&id).await; } pub fn storage_manager(&self) -> ArtifactsStorageManager { @@ -216,6 +211,3 @@ type QueueReceiver = mpsc::Receiver; type RunSender = mpsc::Sender; type RunReceiver = mpsc::Receiver; - -type KillSender = broadcast::Sender; -type KillReceiver = broadcast::Receiver; diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index 0d454b4bb..6bf0675f2 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -128,7 +128,7 @@ async fn remove_from_queue(queue_client: impl BuildQueueClient, id: Uuid) { } } -#[instrument(fields(id = %built.id, state = %State::Built))] +#[instrument(skip(run_send), fields(id = %built.id, state = %State::Built))] async fn promote_to_run(mut built: Built, run_send: RunSender) { let cx = Span::current().context(); diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index c1123005a..e536ab0ea 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -10,16 +10,17 @@ use opentelemetry::global; use portpicker::pick_unused_port; use shuttle_common::storage_manager::ArtifactsStorageManager; use shuttle_proto::runtime::{ - runtime_client::RuntimeClient, LoadRequest, StartRequest, StopRequest, StopResponse, + runtime_client::RuntimeClient, LoadRequest, StartRequest, StopReason, SubscribeStopRequest, + SubscribeStopResponse, }; use tokio::sync::Mutex; -use tonic::{transport::Channel, Response, Status}; -use tracing::{debug, debug_span, error, info, instrument, trace, Instrument}; +use tonic::{transport::Channel, Code}; +use tracing::{debug, debug_span, error, info, instrument, trace, warn, Instrument}; use tracing_opentelemetry::OpenTelemetrySpanExt; use uuid::Uuid; -use super::{KillReceiver, KillSender, RunReceiver, State}; +use super::{RunReceiver, State}; use crate::{ error::{Error, Result}, persistence::{DeploymentUpdater, SecretGetter}, @@ -32,7 +33,6 @@ pub async fn task( mut recv: RunReceiver, runtime_manager: Arc>, deployment_updater: impl DeploymentUpdater, - kill_send: KillSender, active_deployment_getter: impl ActiveDeploymentsGetter, secret_getter: impl SecretGetter, storage_manager: ArtifactsStorageManager, @@ -45,8 +45,6 @@ pub async fn task( info!("Built deployment at the front of run queue: {id}"); let deployment_updater = deployment_updater.clone(); - let kill_send = kill_send.clone(); - let kill_recv = kill_send.subscribe(); let secret_getter = secret_getter.clone(); let storage_manager = storage_manager.clone(); @@ -54,14 +52,17 @@ pub async fn task( built.service_id, id, active_deployment_getter.clone(), - kill_send, + runtime_manager.clone(), ); - let cleanup = move |result: std::result::Result, Status>| { - info!(response = ?result, "stop client response: "); - - match result { - Ok(_) => completed_cleanup(&id), - Err(err) => crashed_cleanup(&id, err), + let cleanup = move |response: SubscribeStopResponse| { + debug!(response = ?response, "stop client response: "); + + match StopReason::from_i32(response.reason).unwrap_or_default() { + StopReason::Request => stopped_cleanup(&id), + StopReason::End => completed_cleanup(&id), + StopReason::Crash => { + crashed_cleanup(&id, Error::Run(anyhow::Error::msg(response.message).into())) + } } }; let runtime_manager = runtime_manager.clone(); @@ -80,7 +81,6 @@ pub async fn task( secret_getter, runtime_manager, deployment_updater, - kill_recv, old_deployments_killer, cleanup, ) @@ -97,13 +97,15 @@ pub async fn task( } } -#[instrument(skip(active_deployment_getter, kill_send))] +#[instrument(skip(active_deployment_getter, runtime_manager))] async fn kill_old_deployments( service_id: Uuid, deployment_id: Uuid, active_deployment_getter: impl ActiveDeploymentsGetter, - kill_send: KillSender, + runtime_manager: Arc>, ) -> Result<()> { + let mut guard = runtime_manager.lock().await; + for old_id in active_deployment_getter .clone() .get_active_deployments(&service_id) @@ -113,9 +115,10 @@ async fn kill_old_deployments( .filter(|old_id| old_id != &deployment_id) { trace!(%old_id, "stopping old deployment"); - kill_send - .send(old_id) - .map_err(|e| Error::OldCleanup(Box::new(e)))?; + + if !guard.kill(&old_id).await { + warn!(id = %old_id, "failed to kill old deployment"); + } } Ok(()) @@ -167,7 +170,7 @@ pub struct Built { } impl Built { - #[instrument(skip(self, storage_manager, secret_getter, runtime_manager, deployment_updater, kill_recv, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] + #[instrument(skip(self, storage_manager, secret_getter, runtime_manager, deployment_updater, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] #[allow(clippy::too_many_arguments)] async fn handle( self, @@ -175,9 +178,8 @@ impl Built { secret_getter: impl SecretGetter, runtime_manager: Arc>, deployment_updater: impl DeploymentUpdater, - kill_recv: KillReceiver, kill_old_deployments: impl futures::Future>, - cleanup: impl FnOnce(std::result::Result, Status>) + Send + 'static, + cleanup: impl FnOnce(SubscribeStopResponse) + Send + 'static, ) -> Result<()> { let so_path = storage_manager.deployment_library_path(&self.id)?; @@ -191,8 +193,9 @@ impl Built { }; let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); - let mut runtime_manager = runtime_manager.lock().await.clone(); let runtime_client = runtime_manager + .lock() + .await .get_runtime_client(self.is_next) .await .map_err(Error::Runtime)?; @@ -206,26 +209,18 @@ impl Built { self.service_id, so_path, secret_getter, - runtime_client, + runtime_client.clone(), ) .await?; - // Move runtime manager to this thread so that the runtime lives long enough - tokio::spawn(async move { - let runtime_client = runtime_manager - .get_runtime_client(self.is_next) - .await - .unwrap(); - run( - self.id, - runtime_client, - address, - deployment_updater, - kill_recv, - cleanup, - ) - .await - }); + tokio::spawn(run( + self.id, + self.service_name, + runtime_client, + address, + deployment_updater, + cleanup, + )); Ok(()) } @@ -236,7 +231,7 @@ async fn load( service_id: Uuid, so_path: PathBuf, secret_getter: impl SecretGetter, - runtime_client: &mut RuntimeClient, + mut runtime_client: RuntimeClient, ) -> Result<()> { info!( "loading project from: {}", @@ -276,14 +271,14 @@ async fn load( } } -#[instrument(skip(runtime_client, deployment_updater, kill_recv, cleanup), fields(state = %State::Running))] +#[instrument(skip(runtime_client, deployment_updater, cleanup), fields(state = %State::Running))] async fn run( id: Uuid, - runtime_client: &mut RuntimeClient, + service_name: String, + mut runtime_client: RuntimeClient, address: SocketAddr, deployment_updater: impl DeploymentUpdater, - mut kill_recv: KillReceiver, - cleanup: impl FnOnce(std::result::Result, Status>) + Send + 'static, + cleanup: impl FnOnce(SubscribeStopResponse) + Send + 'static, ) { deployment_updater .set_address(&id, &address) @@ -295,41 +290,68 @@ async fn run( ip: address.to_string(), }); - info!("starting service"); - let response = runtime_client - .start(start_request) + // Subscribe to stop before starting to catch immediate errors + let mut stream = runtime_client + .subscribe_stop(tonic::Request::new(SubscribeStopRequest {})) .await - .expect("to start deployment"); + .unwrap() + .into_inner(); - info!(response = ?response.into_inner(), "start client response: "); + info!("starting service"); + let response = runtime_client.start(start_request).await; - let mut response = Err(Status::unknown("not stopped yet")); + match response { + Ok(response) => { + info!(response = ?response.into_inner(), "start client response: "); - while let Ok(kill_id) = kill_recv.recv().await { - if kill_id == id { - let stop_request = tonic::Request::new(StopRequest {}); - response = runtime_client.stop(stop_request).await; + // Wait for stop reason + let reason = stream.message().await.unwrap().unwrap(); - break; + cleanup(reason); } - } + Err(ref status) if status.code() == Code::InvalidArgument => { + cleanup(SubscribeStopResponse { + reason: StopReason::Crash as i32, + message: status.to_string(), + }); + } + Err(ref status) => { + start_crashed_cleanup( + &id, + Error::Start("runtime failed to start deployment".to_string()), + ); - cleanup(response); + error!(%status, "failed to start service"); + } + } } #[cfg(test)] mod tests { - use std::{net::SocketAddr, path::PathBuf, process::Command, sync::Arc, time::Duration}; + use std::{ + net::{Ipv4Addr, SocketAddr}, + path::PathBuf, + process::Command, + sync::Arc, + time::Duration, + }; use async_trait::async_trait; + use portpicker::pick_unused_port; use shuttle_common::storage_manager::ArtifactsStorageManager; - use shuttle_proto::runtime::StopResponse; + use shuttle_proto::{ + provisioner::{ + provisioner_server::{Provisioner, ProvisionerServer}, + DatabaseRequest, DatabaseResponse, + }, + runtime::{StopReason, SubscribeStopResponse}, + }; use tempdir::TempDir; use tokio::{ - sync::{broadcast, oneshot, Mutex}, + sync::{oneshot, Mutex}, time::sleep, }; - use tonic::{Response, Status}; + use tonic::transport::Server; use uuid::Uuid; use crate::{ @@ -353,12 +375,36 @@ mod tests { Ok(()) } + struct ProvisionerMock; + + #[async_trait] + impl Provisioner for ProvisionerMock { + async fn provision_database( + &self, + _request: tonic::Request, + ) -> Result, tonic::Status> { + panic!("no run tests should request a db"); + } + } + fn get_runtime_manager() -> Arc> { + let provisioner_addr = + SocketAddr::new(Ipv4Addr::LOCALHOST.into(), pick_unused_port().unwrap()); + let mock = ProvisionerMock; + + tokio::spawn(async move { + Server::builder() + .add_service(ProvisionerServer::new(mock)) + .serve(provisioner_addr) + .await + .unwrap(); + }); + let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); let path = tmp_dir.into_path(); let (tx, _rx) = crossbeam_channel::unbounded(); - RuntimeManager::new(path, "http://localhost:5000".to_string(), tx) + RuntimeManager::new(path, format!("http://{}", provisioner_addr), tx) } #[derive(Clone)] @@ -398,25 +444,25 @@ mod tests { async fn can_be_killed() { let (built, storage_manager) = make_so_and_built("sleep-async"); let id = built.id; - let (kill_send, kill_recv) = broadcast::channel(1); + let runtime_manager = get_runtime_manager(); let (cleanup_send, cleanup_recv) = oneshot::channel(); - let handle_cleanup = |result: std::result::Result, Status>| { - assert!( - result.unwrap().into_inner().success, - "handle should have been cancelled", - ); - cleanup_send.send(()).unwrap(); + let handle_cleanup = |response: SubscribeStopResponse| match ( + StopReason::from_i32(response.reason).unwrap(), + response.message, + ) { + (StopReason::Request, mes) if mes.is_empty() => cleanup_send.send(()).unwrap(), + _ => panic!("expected stop due to request"), }; + let secret_getter = get_secret_getter(); built .handle( storage_manager, secret_getter, - get_runtime_manager(), + runtime_manager.clone(), StubDeploymentUpdater, - kill_recv, kill_old_deployments(), handle_cleanup, ) @@ -427,7 +473,7 @@ mod tests { sleep(Duration::from_secs(1)).await; // Send kill signal - kill_send.send(id).unwrap(); + assert!(runtime_manager.lock().await.kill(&id).await); tokio::select! { _ = sleep(Duration::from_secs(1)) => panic!("cleanup should have been called"), @@ -439,27 +485,25 @@ mod tests { #[tokio::test] async fn self_stop() { let (built, storage_manager) = make_so_and_built("sleep-async"); - let (_kill_send, kill_recv) = broadcast::channel(1); + let runtime_manager = get_runtime_manager(); let (cleanup_send, cleanup_recv) = oneshot::channel(); - let handle_cleanup = |_result: std::result::Result, Status>| { - // let result = result.unwrap(); - // assert!( - // result.is_ok(), - // "did not expect error from self stopping service: {}", - // result.unwrap_err() - // ); - cleanup_send.send(()).unwrap(); + let handle_cleanup = |response: SubscribeStopResponse| match ( + StopReason::from_i32(response.reason).unwrap(), + response.message, + ) { + (StopReason::End, mes) if mes.is_empty() => cleanup_send.send(()).unwrap(), + _ => panic!("expected stop due to self end"), }; + let secret_getter = get_secret_getter(); built .handle( storage_manager, secret_getter, - get_runtime_manager(), + runtime_manager.clone(), StubDeploymentUpdater, - kill_recv, kill_old_deployments(), handle_cleanup, ) @@ -470,33 +514,36 @@ mod tests { _ = sleep(Duration::from_secs(5)) => panic!("cleanup should have been called as service stopped on its own"), Ok(()) = cleanup_recv => {}, } + + // Prevent the runtime manager from dropping earlier, which will kill the processes it manages + drop(runtime_manager); } // Test for panics in Service::bind #[tokio::test] async fn panic_in_bind() { let (built, storage_manager) = make_so_and_built("bind-panic"); - let (_kill_send, kill_recv) = broadcast::channel(1); - let (cleanup_send, cleanup_recv): (oneshot::Sender<()>, _) = oneshot::channel(); - - let handle_cleanup = |_result: std::result::Result, Status>| { - // let result = result.unwrap(); - // assert!( - // matches!(result, Err(shuttle_service::Error::BindPanic(ref msg)) if msg == "panic in bind"), - // "expected inner error from handle: {:?}", - // result - // ); - cleanup_send.send(()).unwrap(); + let runtime_manager = get_runtime_manager(); + let (cleanup_send, cleanup_recv) = oneshot::channel(); + + let handle_cleanup = |response: SubscribeStopResponse| match ( + StopReason::from_i32(response.reason).unwrap(), + response.message, + ) { + (StopReason::Crash, mes) if mes.contains("Panic occurred in `Service::bind`") => { + cleanup_send.send(()).unwrap() + } + (_, mes) => panic!("expected stop due to crash: {mes}"), }; + let secret_getter = get_secret_getter(); built .handle( storage_manager, secret_getter, - get_runtime_manager(), + runtime_manager.clone(), StubDeploymentUpdater, - kill_recv, kill_old_deployments(), handle_cleanup, ) @@ -507,34 +554,49 @@ mod tests { _ = sleep(Duration::from_secs(5)) => panic!("cleanup should have been called as service handle stopped after panic"), Ok(()) = cleanup_recv => {} } + + // Prevent the runtime manager from dropping earlier, which will kill the processes it manages + drop(runtime_manager); } // Test for panics in the main function #[tokio::test] async fn panic_in_main() { let (built, storage_manager) = make_so_and_built("main-panic"); - let (_kill_send, kill_recv) = broadcast::channel(1); + let runtime_manager = get_runtime_manager(); + let (cleanup_send, cleanup_recv) = oneshot::channel(); + + let handle_cleanup = |response: SubscribeStopResponse| match ( + StopReason::from_i32(response.reason).unwrap(), + response.message, + ) { + (StopReason::Crash, mes) if mes.contains("Panic occurred in shuttle_service::main") => { + cleanup_send.send(()).unwrap() + } + (_, mes) => panic!("expected stop due to crash: {mes}"), + }; - let handle_cleanup = |_result| panic!("the service shouldn't even start"); let secret_getter = get_secret_getter(); - let result = built + built .handle( storage_manager, secret_getter, - get_runtime_manager(), + runtime_manager.clone(), StubDeploymentUpdater, - kill_recv, kill_old_deployments(), handle_cleanup, ) - .await; + .await + .unwrap(); - assert!( - matches!(result, Err(Error::Run(shuttle_service::Error::BuildPanic(ref msg))) if msg == "main panic"), - "expected inner error from main: {:?}", - result - ); + tokio::select! { + _ = sleep(Duration::from_secs(5)) => panic!("cleanup should have been called"), + Ok(()) = cleanup_recv => {} + } + + // Prevent the runtime manager from dropping earlier, which will kill the processes it manages + drop(runtime_manager); } #[tokio::test] @@ -546,7 +608,6 @@ mod tests { tracing_context: Default::default(), is_next: false, }; - let (_kill_send, kill_recv) = broadcast::channel(1); let handle_cleanup = |_result| panic!("no service means no cleanup"); let secret_getter = get_secret_getter(); @@ -558,7 +619,6 @@ mod tests { secret_getter, get_runtime_manager(), StubDeploymentUpdater, - kill_recv, kill_old_deployments(), handle_cleanup, ) diff --git a/deployer/src/error.rs b/deployer/src/error.rs index e81eae92b..e5e407276 100644 --- a/deployer/src/error.rs +++ b/deployer/src/error.rs @@ -32,6 +32,8 @@ pub enum Error { GatewayClient(#[from] gateway_client::Error), #[error("Failed to get runtime: {0}")] Runtime(#[source] anyhow::Error), + #[error("Failed to call start on runtime: {0}")] + Start(String), } #[derive(Error, Debug)] diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index 1693fa0c9..c416556b2 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -1,10 +1,13 @@ use std::{convert::TryInto, path::PathBuf, sync::Arc}; use anyhow::Context; -use shuttle_proto::runtime::{self, runtime_client::RuntimeClient, SubscribeLogsRequest}; +use shuttle_proto::runtime::{ + self, runtime_client::RuntimeClient, StopRequest, SubscribeLogsRequest, +}; use tokio::{process, sync::Mutex}; use tonic::transport::Channel; use tracing::{info, instrument, trace}; +use uuid::Uuid; use crate::deployment::deploy_layer; @@ -41,13 +44,12 @@ impl RuntimeManager { pub async fn get_runtime_client( &mut self, is_next: bool, - ) -> anyhow::Result<&mut RuntimeClient> { + ) -> anyhow::Result> { if is_next { Self::get_runtime_client_helper( &mut self.next, &mut self.next_process, is_next, - 6002, self.artifacts_path.clone(), &self.provisioner_address, self.log_sender.clone(), @@ -58,7 +60,6 @@ impl RuntimeManager { &mut self.legacy, &mut self.legacy_process, is_next, - 6001, self.artifacts_path.clone(), &self.provisioner_address, self.log_sender.clone(), @@ -67,22 +68,52 @@ impl RuntimeManager { } } + /// Send a kill / stop signal for a deployment to any runtimes currently running + pub async fn kill(&mut self, id: &Uuid) -> bool { + let success_legacy = if let Some(legacy_client) = &mut self.legacy { + trace!(%id, "sending stop signal to legacy for deployment"); + + let stop_request = tonic::Request::new(StopRequest {}); + let response = legacy_client.stop(stop_request).await.unwrap(); + + response.into_inner().success + } else { + trace!("no legacy client running"); + true + }; + + let success_next = if let Some(next_client) = &mut self.next { + trace!(%id, "sending stop signal to next for deployment"); + + let stop_request = tonic::Request::new(StopRequest {}); + let response = next_client.stop(stop_request).await.unwrap(); + + response.into_inner().success + } else { + trace!("no next client running"); + true + }; + + success_legacy && success_next + } + #[instrument(skip(runtime_option, process_option, log_sender))] - async fn get_runtime_client_helper<'a>( - runtime_option: &'a mut Option>, + async fn get_runtime_client_helper( + runtime_option: &mut Option>, process_option: &mut Option>>, is_next: bool, - port: u16, artifacts_path: PathBuf, provisioner_address: &str, log_sender: crossbeam_channel::Sender, - ) -> anyhow::Result<&'a mut RuntimeClient> { + ) -> anyhow::Result> { if let Some(runtime_client) = runtime_option { trace!("returning previous client"); - Ok(runtime_client) + Ok(runtime_client.clone()) } else { trace!("making new client"); + let port = portpicker::pick_unused_port().context("failed to find available port")?; + let get_runtime_executable = || { if cfg!(debug_assertions) { // If we're running deployer natively, install shuttle-runtime using the @@ -135,11 +166,11 @@ impl RuntimeManager { } }); - *runtime_option = Some(runtime_client); + *runtime_option = Some(runtime_client.clone()); *process_option = Some(Arc::new(std::sync::Mutex::new(process))); // Safe to unwrap as it was just set - Ok(runtime_option.as_mut().unwrap()) + Ok(runtime_client) } } } diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 46623e80f..3fde2914a 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -39,9 +39,9 @@ strum = { version = "0.24.1", features = ["derive"] } tokio = { version = "1.22.0", features = [ "full" ] } tower = { version = "0.4.13", features = [ "steer" ] } tower-http = { version = "0.3.4", features = ["trace"] } -tracing = { workspace = true } +tracing = { workspace = true, features = ["default"] } tracing-opentelemetry = "0.18.0" -tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing-subscriber = { workspace = true, features = ["default", "env-filter"] } ttl_cache = "0.5.1" uuid = { workspace = true, features = [ "v4" ] } diff --git a/proto/runtime.proto b/proto/runtime.proto index 567a3fa58..d75505419 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -13,6 +13,9 @@ service Runtime { // Stop a started service rpc Stop(StopRequest) returns (StopResponse); + // Channel to notify a service has been stopped + rpc SubscribeStop(SubscribeStopRequest) returns (stream SubscribeStopResponse); + // Subscribe to runtime logs rpc SubscribeLogs(SubscribeLogsRequest) returns (stream LogItem); } @@ -52,6 +55,27 @@ message StopResponse { bool success = 1; } +message SubscribeStopRequest {} + +message SubscribeStopResponse { + // Reason the service has stopped + StopReason reason = 1; + + // Any extra message to go with the reason. If there are any + string message = 2; +} + +enum StopReason { + // User requested this stop + Request = 0; + + // Service stopped by itself + End = 1; + + // Service crashed + Crash = 2; +} + message SubscribeLogsRequest {} message LogItem { diff --git a/provisioner/Cargo.toml b/provisioner/Cargo.toml index 02b1b8f50..89ced2ac6 100644 --- a/provisioner/Cargo.toml +++ b/provisioner/Cargo.toml @@ -19,8 +19,8 @@ sqlx = { version = "0.6.2", features = ["postgres", "runtime-tokio-native-tls"] thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } tonic = { workspace = true } -tracing = { workspace = true } -tracing-subscriber = { workspace = true, features = ["fmt"] } +tracing = { workspace = true, features = ["default"] } +tracing-subscriber = { workspace = true, features = ["default", "fmt"] } [dependencies.shuttle-proto] workspace = true diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 36f83ee99..4fdfe7d73 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -23,8 +23,8 @@ thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["full"] } tokio-stream = "0.1.11" tonic = { workspace = true } -tracing = { workspace = true } -tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } +tracing = { workspace = true, features = ["default"] } +tracing-subscriber = { workspace = true, features = ["default", "env-filter", "fmt"] } uuid = { workspace = true, features = ["v4"] } # TODO: bump these crates to 6.0 when we bump rust to >= 1.66 diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index cad51259c..e87ad02e3 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -21,13 +21,16 @@ use shuttle_proto::{ runtime::{ self, runtime_server::{Runtime, RuntimeServer}, - LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, - SubscribeLogsRequest, + LoadRequest, LoadResponse, StartRequest, StartResponse, StopReason, StopRequest, + StopResponse, SubscribeLogsRequest, SubscribeStopRequest, SubscribeStopResponse, }, }; use shuttle_service::{Factory, Service, ServiceName}; -use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender}; -use tokio::sync::oneshot; +use tokio::sync::{broadcast, oneshot}; +use tokio::sync::{ + broadcast::Sender, + mpsc::{self, UnboundedReceiver, UnboundedSender}, +}; use tokio_stream::wrappers::ReceiverStream; use tonic::{ transport::{Endpoint, Server}, @@ -70,6 +73,7 @@ pub struct Legacy { // Mutexes are for interior mutability logs_rx: Mutex>>, logs_tx: UnboundedSender, + stopped_tx: Sender<(StopReason, String)>, provisioner_address: Endpoint, kill_tx: Mutex>>, storage_manager: M, @@ -80,10 +84,12 @@ pub struct Legacy { impl Legacy { pub fn new(provisioner_address: Endpoint, loader: L, storage_manager: M) -> Self { let (tx, rx) = mpsc::unbounded_channel(); + let (stopped_tx, _stopped_rx) = broadcast::channel(10); Self { logs_rx: Mutex::new(Some(rx)), logs_tx: tx, + stopped_tx, kill_tx: Mutex::new(None), provisioner_address, storage_manager, @@ -196,7 +202,12 @@ where *self.kill_tx.lock().unwrap() = Some(kill_tx); // start service as a background task with a kill receiver - tokio::spawn(run_until_stopped(service, service_address, kill_rx)); + tokio::spawn(run_until_stopped( + service, + service_address, + self.stopped_tx.clone(), + kill_rx, + )); let message = StartResponse { success: true }; @@ -241,26 +252,60 @@ where Err(Status::internal("failed to stop deployment")) } } + + type SubscribeStopStream = ReceiverStream>; + + async fn subscribe_stop( + &self, + _request: Request, + ) -> Result, Status> { + let mut stopped_rx = self.stopped_tx.subscribe(); + let (tx, rx) = mpsc::channel(1); + + // Move the stop channel into a stream to be returned + tokio::spawn(async move { + while let Ok((reason, message)) = stopped_rx.recv().await { + tx.send(Ok(SubscribeStopResponse { + reason: reason as i32, + message, + })) + .await + .unwrap(); + } + }); + + Ok(Response::new(ReceiverStream::new(rx))) + } } /// Run the service until a stop signal is received -#[instrument(skip(service, kill_rx))] +#[instrument(skip(service, stopped_tx, kill_rx))] async fn run_until_stopped( // service: LoadedService, service: impl Service, addr: SocketAddr, + stopped_tx: tokio::sync::broadcast::Sender<(StopReason, String)>, kill_rx: tokio::sync::oneshot::Receiver, ) { trace!("starting deployment on {}", &addr); tokio::select! { - _ = service.bind(addr) => { - trace!("deployment stopped on {}", &addr); + res = service.bind(addr) => { + match res { + Ok(_) => { + stopped_tx.send((StopReason::End, String::new())).unwrap(); + } + Err(error) => { + stopped_tx.send((StopReason::Crash, error.to_string())).unwrap(); + } + } }, message = kill_rx => { match message { - Ok(msg) => trace!("{msg}"), + Ok(_) => { + stopped_tx.send((StopReason::Request, String::new())).unwrap(); + } Err(_) => trace!("the sender dropped") - } + }; } } } diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index 41f50eaac..e22d0a9f0 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -18,13 +18,14 @@ use shuttle_common::wasm::{Bytesable, Log, RequestWrapper, ResponseWrapper}; use shuttle_proto::runtime::runtime_server::Runtime; use shuttle_proto::runtime::{ self, LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, - SubscribeLogsRequest, + SubscribeLogsRequest, SubscribeStopRequest, SubscribeStopResponse, }; use tokio::sync::mpsc::{Receiver, Sender}; use tokio::sync::{mpsc, oneshot}; use tokio_stream::wrappers::ReceiverStream; use tonic::Status; use tracing::{error, trace}; +use uuid::Uuid; use wasi_common::file::FileCaps; use wasmtime::{Engine, Linker, Module, Store}; use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; @@ -167,8 +168,19 @@ impl Runtime for AxumWasm { )) } } -} + type SubscribeStopStream = ReceiverStream>; + + async fn subscribe_stop( + &self, + _request: tonic::Request, + ) -> Result, Status> { + // Next does not really have a stopped state. Endpoints are loaded if and when needed until a request is done + let (_tx, rx) = mpsc::channel(1); + + Ok(tonic::Response::new(ReceiverStream::new(rx))) + } +} struct RouterBuilder { engine: Engine, linker: Linker, @@ -421,7 +433,6 @@ pub mod tests { let router = RouterBuilder::new() .unwrap() - .src("axum.wasm") .src("tests/resources/axum-wasm-expanded/target/wasm32-wasi/debug/shuttle_axum_expanded.wasm") .build() .unwrap(); From 60be73da5509d8114e983032b86fba83639f31ac Mon Sep 17 00:00:00 2001 From: chesedo Date: Mon, 13 Mar 2023 09:37:52 +0200 Subject: [PATCH 52/74] Merge remote-tracking branch 'upstream/main' into shuttle-next --- .circleci/config.yml | 191 ++-- .github/ISSUE_TEMPLATE/BUG-REPORT.yml | 61 ++ .github/ISSUE_TEMPLATE/config.yml | 5 + .github/pull_request_template.md | 9 + .gitignore | 4 +- CONTRIBUTING.md | 72 +- Cargo.lock | 400 ++++++--- Cargo.toml | 32 +- Containerfile | 7 +- Makefile | 41 +- README.md | 19 +- admin/Cargo.toml | 4 +- admin/README.md | 8 +- auth/Cargo.toml | 37 + auth/migrations/0000_init.sql | 5 + auth/prepare.sh | 8 + auth/src/api/builder.rs | 134 +++ auth/src/api/handlers.rs | 117 +++ auth/src/api/mod.rs | 4 + auth/src/args.rs | 36 + auth/src/error.rs | 61 ++ auth/src/lib.rs | 77 ++ auth/src/main.rs | 37 + auth/src/secrets.rs | 40 + auth/src/user.rs | 270 ++++++ auth/tests/api/auth.rs | 49 ++ auth/tests/api/helpers.rs | 63 ++ auth/tests/api/main.rs | 4 + auth/tests/api/session.rs | 94 ++ auth/tests/api/users.rs | 105 +++ cargo-shuttle/Cargo.toml | 22 +- cargo-shuttle/README.md | 123 +-- cargo-shuttle/src/args.rs | 126 +-- cargo-shuttle/src/client.rs | 45 +- cargo-shuttle/src/config.rs | 9 + cargo-shuttle/src/init.rs | 78 +- cargo-shuttle/src/lib.rs | 169 +++- cargo-shuttle/src/provisioner_server.rs | 9 +- cargo-shuttle/tests/integration/run.rs | 6 +- codegen/Cargo.toml | 3 +- codegen/src/shuttle_main/mod.rs | 74 +- common/Cargo.toml | 45 +- common/src/backends/auth.rs | 821 ++++++++++++++++++ common/src/backends/cache.rs | 51 ++ common/src/backends/future.rs | 55 ++ common/src/backends/headers.rs | 98 +++ common/src/backends/metrics.rs | 284 +++++- common/src/backends/mod.rs | 5 + common/src/backends/tracing.rs | 187 ++++ common/src/deployment.rs | 7 + common/src/models/error.rs | 4 +- common/src/models/mod.rs | 2 +- common/src/models/project.rs | 145 +++- common/src/models/user.rs | 2 +- common/src/project.rs | 3 +- deployer/Cargo.toml | 34 +- deployer/prepare.sh | 16 +- deployer/src/args.rs | 4 + deployer/src/deployment/deploy_layer.rs | 20 +- deployer/src/deployment/gateway_client.rs | 13 +- deployer/src/deployment/queue.rs | 29 +- deployer/src/deployment/run.rs | 22 +- deployer/src/handlers/error.rs | 3 + deployer/src/handlers/mod.rs | 149 ++-- deployer/src/lib.rs | 5 +- deployer/src/main.rs | 26 +- deployer/src/persistence/mod.rs | 98 +-- deployer/src/persistence/resource/mod.rs | 4 +- deployer/src/proxy.rs | 6 +- .../tests/deploy_layer/bind-panic/Cargo.toml | 2 +- .../tests/deploy_layer/main-panic/Cargo.toml | 2 +- .../tests/deploy_layer/self-stop/Cargo.toml | 2 +- .../tests/deploy_layer/sleep-async/Cargo.toml | 2 +- docker-compose.dev.yml | 9 +- docker-compose.yml | 48 +- e2e/Cargo.toml | 2 +- e2e/README.md | 6 +- e2e/tests/integration/helpers/mod.rs | 4 +- examples | 2 +- extras/otel/Containerfile | 10 + extras/otel/otel-collector-config.yaml | 70 ++ gateway/Cargo.toml | 28 +- gateway/README.md | 3 +- gateway/migrations/0003_drop_accounts.sql | 1 + gateway/src/api/auth_layer.rs | 352 ++++++++ gateway/src/api/latest.rs | 360 ++++---- gateway/src/api/mod.rs | 2 + gateway/src/args.rs | 17 +- gateway/src/auth.rs | 237 +---- gateway/src/lib.rs | 195 +++-- gateway/src/main.rs | 64 +- gateway/src/project.rs | 768 ++++++++++++---- gateway/src/proxy.rs | 64 +- gateway/src/service.rs | 454 +++++----- gateway/src/task.rs | 19 +- proto/provisioner.proto | 7 +- provisioner/Cargo.toml | 17 +- provisioner/src/args.rs | 21 +- provisioner/src/error.rs | 6 + provisioner/src/lib.rs | 150 +++- provisioner/src/main.rs | 9 +- resources/README.md | 10 +- resources/aws-rds/Cargo.toml | 4 +- resources/aws-rds/README.md | 10 + resources/aws-rds/src/lib.rs | 35 +- resources/persist/Cargo.toml | 6 +- resources/persist/README.md | 3 +- resources/secrets/Cargo.toml | 4 +- resources/secrets/README.md | 2 + resources/shared-db/Cargo.toml | 4 +- resources/shared-db/README.md | 17 + resources/shared-db/src/lib.rs | 77 +- resources/static-folder/Cargo.toml | 8 +- resources/static-folder/README.md | 4 + resources/static-folder/src/lib.rs | 55 +- runtime/Cargo.toml | 1 + runtime/src/legacy/mod.rs | 74 +- runtime/src/next/mod.rs | 1 - runtime/src/provisioner_factory.rs | 20 +- runtime/tests/integration/helpers.rs | 9 +- service/Cargo.toml | 27 +- service/src/error.rs | 2 + service/src/lib.rs | 10 +- .../tests/resources/not-shuttle/Cargo.toml | 1 - 124 files changed, 6223 insertions(+), 1890 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/BUG-REPORT.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/pull_request_template.md create mode 100644 auth/Cargo.toml create mode 100644 auth/migrations/0000_init.sql create mode 100755 auth/prepare.sh create mode 100644 auth/src/api/builder.rs create mode 100644 auth/src/api/handlers.rs create mode 100644 auth/src/api/mod.rs create mode 100644 auth/src/args.rs create mode 100644 auth/src/error.rs create mode 100644 auth/src/lib.rs create mode 100644 auth/src/main.rs create mode 100644 auth/src/secrets.rs create mode 100644 auth/src/user.rs create mode 100644 auth/tests/api/auth.rs create mode 100644 auth/tests/api/helpers.rs create mode 100644 auth/tests/api/main.rs create mode 100644 auth/tests/api/session.rs create mode 100644 auth/tests/api/users.rs create mode 100644 common/src/backends/auth.rs create mode 100644 common/src/backends/cache.rs create mode 100644 common/src/backends/future.rs create mode 100644 common/src/backends/headers.rs create mode 100644 common/src/backends/tracing.rs create mode 100644 extras/otel/Containerfile create mode 100644 extras/otel/otel-collector-config.yaml create mode 100644 gateway/migrations/0003_drop_accounts.sql create mode 100644 gateway/src/api/auth_layer.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index c4aa359a7..9211a8b86 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,6 +1,6 @@ version: 2.1 -orbs: +orbs: docker-buildx: sensu/docker-buildx@1.1.1 aws-ecr: circleci/aws-ecr@8.1.2 win: circleci/windows@5.0 @@ -120,26 +120,31 @@ commands: default: "" steps: - run: - name: Set git tag in the environment" + name: Set git tag in the environment command: | - echo TAG=$(git describe --tags) >> $BASH_ENV + echo TAG=$(git describe --tags --abbrev=0) >> $BASH_ENV + - run: + name: Set binary directory in the environment + command: | + echo BIN_DIR=cargo-shuttle-<< parameters.target >>-$TAG >> $BASH_ENV - run: name: Make artifact command: | - mkdir shuttle - mv target/<< parameters.target >>/release/cargo-shuttle<< parameters.suffix >> shuttle/cargo-shuttle<< parameters.suffix >> - mv LICENSE shuttle/ - mv README.md shuttle/ + mkdir $BIN_DIR + mv target/<< parameters.target >>/release/cargo-shuttle<< parameters.suffix >> $BIN_DIR/cargo-shuttle<< parameters.suffix >> + mv LICENSE $BIN_DIR/ + mv README.md $BIN_DIR/ mkdir -p artifacts/<< parameters.target >> - cp $BASH_ENV artifacts/bash.env - tar -cvzf artifacts/<< parameters.target >>/cargo-shuttle-$TAG-<< parameters.target >>.tar.gz shuttle + cp $BASH_ENV artifacts/<< parameters.target >>.env + tar -cvzf artifacts/<< parameters.target >>/cargo-shuttle-$TAG-<< parameters.target >>.tar.gz $BIN_DIR # Persist the bash environment to the workspace as well, we need it for the release job. + # Make sure the name is unique, since the binaries will be built in parallel. # https://discuss.circleci.com/t/share-environment-variable-between-different-job/45647/4 - persist_to_workspace: root: artifacts paths: - << parameters.target >>/* - - bash.env + - << parameters.target >>.env jobs: workspace-fmt: @@ -320,6 +325,7 @@ jobs: executor: name: win/server-2022 size: medium + shell: bash.exe environment: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: @@ -330,6 +336,7 @@ jobs: command: | wget -OutFile "C:\rustup-init.exe" https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe C:\rustup-init.exe -y --default-toolchain 1.65.0 --target x86_64-pc-windows-msvc + shell: powershell.exe - run: name: Build command: | @@ -338,6 +345,7 @@ jobs: $env:OPENSSL_SRC_PERL="C:\Strawberry\perl\bin\perl.exe" # "vendored-openssl" is from https://github.com/cross-rs/cross/issues/229#issuecomment-597898074 ..\.cargo\bin\cargo.exe build --release --package cargo-shuttle --features vendored-openssl --target x86_64-pc-windows-msvc + shell: powershell.exe - make-artifact: target: x86_64-pc-windows-msvc suffix: ".exe" @@ -366,8 +374,10 @@ jobs: - run: name: "Set tag in environment" command: | - cat artifacts/bash.env >> "$BASH_ENV" - rm artifacts/bash.env + for file in artifacts/*.env; do + cat artifacts/${file##*/} >> "$BASH_ENV"; + rm artifacts/${file##*/}; + done - run: name: "Publish Release on GitHub" # Since each binary is in a sub directory named after its target, we flatten @@ -378,79 +388,110 @@ jobs: ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete -draft ${TAG} ./artifacts/ workflows: - version: 2 ci: jobs: - - workspace-fmt - - workspace-clippy: - name: workspace-clippy-<< matrix.framework >> - requires: - - workspace-fmt - matrix: - parameters: - framework: ["web-actix-web", "web-axum", "web-rocket", "web-poem", "web-thruster", "web-tide", "web-tower","web-warp", "web-salvo", "bot-serenity", "bot-poise"] - - check-standalone: - matrix: - parameters: - path: - - resources/aws-rds - - resources/persist - - resources/secrets - - resources/shared-db - - resources/static-folder - - service-test: - requires: - - workspace-clippy - - platform-test: - requires: - - workspace-clippy - matrix: - parameters: - crate: ["shuttle-deployer", "cargo-shuttle", "shuttle-codegen", "shuttle-common", "shuttle-proto", "shuttle-provisioner", "shuttle-runtime"] - - e2e-test: - requires: - - service-test - - platform-test - - check-standalone - filters: - branches: - only: production - - build-and-push: - requires: - - e2e-test - filters: - branches: - only: production - - build-binaries-linux: - name: build-binaries-x86_64 - image: ubuntu-2204:2022.04.1 - target: x86_64-unknown-linux-musl - resource_class: medium - filters: - branches: - only: production - - build-binaries-linux: - name: build-binaries-aarch64 - image: ubuntu-2004:202101-01 - target: aarch64-unknown-linux-musl - resource_class: arm.medium - filters: - branches: - only: production - - build-binaries-windows: + - workspace-fmt + - workspace-clippy: + name: workspace-clippy-<< matrix.framework >> + requires: + - workspace-fmt + matrix: + parameters: + framework: + [ + "web-actix-web", + "web-axum", + "web-rocket", + "web-poem", + "web-thruster", + "web-tide", + "web-tower", + "web-warp", + "web-salvo", + "bot-serenity", + "bot-poise", + ] + - check-standalone: + matrix: + parameters: + path: + - resources/aws-rds + - resources/persist + - resources/secrets + - resources/shared-db + - resources/static-folder + - service-test: + requires: + - workspace-clippy + - platform-test: + requires: + - workspace-clippy + matrix: + parameters: + crate: + [ + "shuttle-auth", + "shuttle-deployer", + "cargo-shuttle", + "shuttle-codegen", + "shuttle-common", + "shuttle-proto", + "shuttle-provisioner", + "shuttle-runtime" + ] + - e2e-test: + requires: + - service-test + - platform-test + - check-standalone + filters: + branches: + only: production + - build-and-push: + requires: + - e2e-test + filters: + branches: + only: production + - build-binaries-linux: + name: build-binaries-x86_64-gnu + image: ubuntu-2204:2022.04.1 + target: x86_64-unknown-linux-gnu + resource_class: medium + filters: + branches: + only: production + - build-binaries-linux: + name: build-binaries-x86_64-musl + image: ubuntu-2204:2022.04.1 + target: x86_64-unknown-linux-musl + resource_class: medium + filters: + branches: + only: production + - build-binaries-linux: + name: build-binaries-aarch64 + image: ubuntu-2004:202101-01 + target: aarch64-unknown-linux-musl + resource_class: arm.medium + filters: + branches: + only: production + - build-binaries-windows: filters: branches: only: production - - build-binaries-mac: + - build-binaries-mac: filters: branches: - only: production - - publish-github-release: + only: production + - publish-github-release: requires: - - build-binaries-x86_64 + - build-binaries-x86_64-gnu + - build-binaries-x86_64-musl - build-binaries-aarch64 - build-binaries-windows - build-binaries-mac filters: branches: - only: production + only: production diff --git a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml new file mode 100644 index 000000000..69bfdb13b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml @@ -0,0 +1,61 @@ +name: Bug Report +description: File a bug report +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + - type: textarea + id: what-happened + attributes: + label: What happened? + description: Also tell us, what did you expect to happen? + placeholder: Tell us what you see! + value: "A bug happened!" + validations: + required: true + - type: input + id: version + attributes: + label: Version + description: What version of `cargo-shuttle` are you running (`cargo shuttle --version`)? + placeholder: "v0.11.0" + validations: + required: true + - type: dropdown + id: os + attributes: + label: Which operating systems are you seeing the problem on? + multiple: true + options: + - macOS + - Windows + - Linux + validations: + required: true + - type: dropdown + id: architecture + attributes: + label: Which CPU architectures are you seeing the problem on? + multiple: true + options: + - x86_64 + - ARM64 + - Other + - type: textarea + id: logs + attributes: + label: Relevant log output + description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + render: sh + - type: checkboxes + id: duplicate + attributes: + label: Duplicate declaration + description: Please confirm that you are not creating a duplicate issue. + options: + - label: I have searched the issues and there are none like this. + required: true + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..3455e4136 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Discord + url: https://discord.gg/shuttle + about: Feel free to reach out on our Discord should you have any questions! diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..86bbe92d9 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,9 @@ +## Description of change + +Please write a summary of your changes and why you made them. + +Be sure to reference any related issues by adding `closes issue #`. + +## How Has This Been Tested (if applicable)? + +Please describe the tests that you ran to verify your changes. diff --git a/.gitignore b/.gitignore index bb3141ba0..4b9ed654c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,8 @@ # Generated by Cargo # will have compiled files and executables **/target/ -Cargo.lock +# Ignore the cargo lockfiles not in the workspace root +*/**/Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk @@ -36,3 +37,4 @@ package.json yarn.lock *.wasm +*.sqlite* diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f4842765a..c60695da7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,7 @@ ## Raise an Issue -Raising [issues](https://github.com/shuttle-hq/shuttle/issues) is encouraged. We have some templates to help you get started. +Raising [issues](https://github.com/shuttle-hq/shuttle/issues) is encouraged. ## Docs @@ -10,23 +10,32 @@ If you found an error in our docs, or you simply want to make them better, contr are always appreciated! ## Running Locally + You can use Docker and docker-compose to test shuttle locally during development. See the [Docker install](https://docs.docker.com/get-docker/) and [docker-compose install](https://docs.docker.com/compose/install/) instructions if you do not have them installed already. +> Note for Windows: The current [Makefile](https://github.com/shuttle-hq/shuttle/blob/main/Makefile) does not work on Windows systems by itself - if you want to build the local environment on Windows you could use [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install). Additional Windows considerations are listed at the bottom of this page. +> Note for Linux: When building on Linux systems, if the error unknown flag: --build-arg is received, install the docker-buildx package using the package management tool for your particular system. + +Clone the shuttle repository (or your fork): + ```bash git clone git@github.com:shuttle-hq/shuttle.git cd shuttle ``` +> Note: We need the git tags for the local development workflow, but they may not be included when you clone the repository. +To make sure you have them, run `git fetch upstream --tags`, where upstream is the name of the shuttle remote repository. + You should now be ready to setup a local environment to test code changes to core `shuttle` packages as follows: -Build the required images with: +From the root of the shuttle repo, build the required images with: ```bash -make images +USE_PANAMAX=disable make images ``` -> Note: The current [Makefile](https://github.com/shuttle-hq/shuttle/blob/main/Makefile) does not work on Windows systems by itself - if you want to build the local environment on Windows you could use [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install). Additional Windows considerations are listed at the bottom of this page. +> Note: The stack uses [panamax](https://github.com/panamax-rs/panamax) by default to mirror crates.io content. We do this in order to avoid overloading upstream mirrors and hitting rate limits. After syncing the cache, expect to see the panamax volume take about 100GiB of space. This may not be desirable for local testing. To avoid using panamax, run `USE_PANAMAX=disable make images` instead. The images get built with [cargo-chef](https://github.com/LukeMathWalker/cargo-chef) and therefore support incremental builds (most of the time). So they will be much faster to re-build after an incremental change in your code - should you wish to deploy it locally straight away. @@ -36,15 +45,19 @@ You can now start a local deployment of shuttle and the required containers with make up ``` +> Note: `make up` does not start [panamax](https://github.com/panamax-rs/panamax) by default, if you do need to start panamax for local development, run this command with `make COMPOSE_PROFILES=panamax up`. + > Note: Other useful commands can be found within the [Makefile](https://github.com/shuttle-hq/shuttle/blob/main/Makefile). The API is now accessible on `localhost:8000` (for app proxies) and `localhost:8001` (for the control plane). When running `cargo run --bin cargo-shuttle` (in a debug build), the CLI will point itself to `localhost` for its API calls. -In order to test local changes to the `shuttle-service` crate, you may want to add the below to a `.cargo/config.toml` file. (See [Overriding Dependencies](https://doc.rust-lang.org/cargo/reference/overriding-dependencies.html) for more) +In order to test local changes to the library crates, you may want to add the below to a `.cargo/config.toml` file. (See [Overriding Dependencies](https://doc.rust-lang.org/cargo/reference/overriding-dependencies.html) for more) -``` toml +```toml [patch.crates-io] shuttle-service = { path = "[base]/shuttle/service" } +shuttle-common = { path = "[base]/shuttle/common" } +shuttle-proto = { path = "[base]/shuttle/proto" } shuttle-aws-rds = { path = "[base]/shuttle/resources/aws-rds" } shuttle-persist = { path = "[base]/shuttle/resources/persist" } shuttle-shared-db = { path = "[base]/shuttle/resources/shared-db" } @@ -52,37 +65,38 @@ shuttle-secrets = { path = "[base]/shuttle/resources/secrets" } shuttle-static-folder = { path = "[base]/shuttle/resources/static-folder" } ``` -Prime gateway database with an admin user: +Before we can login to our local instance of shuttle, we need to create a user. +The following command inserts a user into the `auth` state with admin privileges: ```bash -docker compose --file docker-compose.rendered.yml --project-name shuttle-dev exec gateway /usr/local/bin/service --state=/var/lib/shuttle init --name admin --key test-key +docker compose --file docker-compose.rendered.yml --project-name shuttle-dev exec auth /usr/local/bin/service --state=/var/lib/shuttle-auth init --name admin --key test-key ``` -Login to shuttle service in a new terminal window from the main shuttle directory: +Login to shuttle service in a new terminal window from the root of the shuttle directory: ```bash cargo run --bin cargo-shuttle -- login --api-key "test-key" ``` -cd into one of the examples: +The [shuttle examples](https://github.com/shuttle-hq/examples) are linked to the main repo as a [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules), to initialize it run the following commands: ```bash git submodule init git submodule update -cd examples/rocket/hello-world/ ``` -Create a new project, this will start a deployer container: +Then `cd` into any example: ```bash -# the --manifest-path is used to locate the root of the shuttle workspace -cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- project new +cd examples/rocket/hello-world/ ``` -Verify that the deployer is healthy and in the ready state: +Create a new project, this will prompt your local instance of the gateway to +start a deployer container: ```bash -cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- project status +# the --manifest-path is used to locate the root of the shuttle workspace +cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- project new ``` Deploy the example: @@ -91,7 +105,7 @@ Deploy the example: cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- deploy ``` -Test if the deploy is working: +Test if the deployment is working: ```bash # the Host header should match the Host from the deploy output @@ -106,6 +120,7 @@ cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- logs ``` ### Testing deployer only + The steps outlined above starts all the services used by shuttle locally (ie. both `gateway` and `deployer`). However, sometimes you will want to quickly test changes to `deployer` only. To do this replace `make up` with the following: ```bash @@ -122,6 +137,7 @@ cargo run -p shuttle-deployer -- --provisioner-address $provisioner_address --pr The `--admin-secret` can safely be changed to your api-key to make testing easier. While `` needs to match the name of the project that will be deployed to this deployer. This is the `Cargo.toml` or `Shuttle.toml` name for the project. ### Using Podman instead of Docker + If you are using Podman over Docker, then expose a rootless socket of Podman using the following command: ```bash @@ -142,16 +158,16 @@ shuttle can now be run locally using the steps shown earlier. shuttle has reasonable test coverage - and we are working on improving this every day. We encourage PRs to come with tests. If you're not sure about -what a test should look like, feel free to [get in touch](https://discord.gg/H33rRDTm3p). +what a test should look like, feel free to [get in touch](https://discord.gg/shuttle). -To run the unit tests for a spesific crate, from the root of the repository run: +To run the unit tests for a specific crate, from the root of the repository run: ```bash # replace with the name of the crate to test, e.g. `shuttle-common` cargo test --package --all-features --lib -- --nocapture ``` -To run the integration tests for a spesific crate (if it has any), from the root of the repository run: +To run the integration tests for a specific crate (if it has any), from the root of the repository run: ```bash # replace with the name of the crate to test, e.g. `cargo-shuttle` @@ -165,19 +181,23 @@ make test ``` > Note: Running all the end-to-end tests may take a long time, so it is recommended to run individual tests shipped as part of each crate in the workspace first. + ## Committing We use the [Angular Commit Guidelines](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit). We expect all commits to conform to these guidelines. -Furthermore, commits should be squashed before being merged to master. +We will squash commits before merging to main. If you do want to squash commits, please do not do so +after the review process has started, the commit history can be useful for reviewers. Before committing: + - Make sure your commits don't trigger any warnings from Clippy by running: `cargo clippy --tests --all-targets`. If you have a good reason to contradict Clippy, insert an `#[allow(clippy::)]` macro, so that it won't complain. - Make sure your code is correctly formatted: `cargo fmt --all --check`. -- Make sure your `Cargo.toml`'s are sorted: `cargo sort --workspace`. This command uses the [cargo-sort crate](https://crates.io/crates/cargo-sort) to sort the `Cargo.toml` dependencies alphabetically. +- Make sure your `Cargo.toml`'s are sorted: `cargo +nightly sort --workspace`. This command uses the [cargo-sort crate](https://crates.io/crates/cargo-sort) to sort the `Cargo.toml` dependencies alphabetically. - If you've made changes to examples, make sure the above commands are ran there as well. ## Project Layout + The folders in this repository relate to each other as follow: ```mermaid @@ -216,6 +236,7 @@ graph BT First, `provisioner`, `gateway`, `deployer`, and `cargo-shuttle` are binary crates with `provisioner`, `gateway` and `deployer` being backend services. The `cargo-shuttle` binary is the `cargo shuttle` command used by users. The rest are the following libraries: + - `common` contains shared models and functions used by the other libraries and binaries. - `codegen` contains our proc-macro code which gets exposed to user services from `service` by the `codegen` feature flag. The redirect through `service` is to make it available under the prettier name of `shuttle_service::main`. - `service` is where our special `Service` trait is defined. Anything implementing this `Service` can be loaded by the `deployer` and the local runner in `cargo-shuttle`. @@ -226,20 +247,23 @@ The rest are the following libraries: Lastly, the `user service` is not a folder in this repository, but is the user service that will be deployed by `deployer`. ## Windows Considerations + Currently, if you try to use 'make images' on Windows, you may find that the shell files cannot be read by Bash/WSL. This is due to the fact that Windows may have pulled the files in CRLF format rather than LF[^1], which causes problems with Bash as to run the commands, Linux needs the file in LF format. Thankfully, we can fix this problem by simply using the `git config core.autocrlf` command to change how Git handles line endings. It takes a single argument: -``` +```bash git config --global core.autocrlf input ``` This should allow you to run `make images` and other Make commands with no issues. If you need to change it back for whatever reason, you can just change the last argument from 'input' to 'true' like so: -``` + +```bash git config --global core.autocrlf true ``` + After you run this command, you should be able to checkout projects that are maintained using CRLF (Windows) again. [^1]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_autocrlf diff --git a/Cargo.lock b/Cargo.lock index 5bfd7393d..5b9fd1397 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -545,6 +545,27 @@ dependencies = [ "sha2 0.9.9", ] +[[package]] +name = "async-session" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da4ce523b4e2ebaaf330746761df23a465b951a83d84bbce4233dabedae630" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "base64 0.13.1", + "bincode", + "blake3", + "chrono", + "hmac 0.11.0", + "log", + "rand 0.8.5", + "serde", + "serde_json", + "sha2 0.9.9", +] + [[package]] name = "async-sse" version = "4.1.0" @@ -1008,7 +1029,7 @@ dependencies = [ "tokio", "tokio-tungstenite", "tower", - "tower-http 0.3.4", + "tower-http 0.3.5", "tower-layer", "tower-service", ] @@ -1030,6 +1051,46 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-extra" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a320103719de37b7b4da4c8eb629d4573f6bcfd3dfe80d3208806895ccf81d" +dependencies = [ + "axum", + "bytes 1.3.0", + "cookie 0.16.0", + "futures-util", + "http 0.2.8", + "mime", + "pin-project-lite 0.2.9", + "tokio", + "tower", + "tower-http 0.3.5", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-extra" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51227033e4d3acad15c879092ac8a228532707b5db5ff2628f638334f63e1b7a" +dependencies = [ + "axum", + "bytes 1.3.0", + "cookie 0.17.0", + "futures-util", + "http 0.2.8", + "mime", + "pin-project-lite 0.2.9", + "tokio", + "tower", + "tower-http 0.3.5", + "tower-layer", + "tower-service", +] + [[package]] name = "axum-server" version = "0.4.4" @@ -1050,6 +1111,22 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-sessions" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b114309d293dd8a6fedebf09d5b8bbb0f7647b3d204ca0dd333b5f797aed5c8" +dependencies = [ + "async-session 3.0.0", + "axum", + "axum-extra 0.4.2", + "futures", + "http-body", + "tokio", + "tower", + "tracing", +] + [[package]] name = "base-x" version = "0.2.11" @@ -1206,9 +1283,9 @@ dependencies = [ [[package]] name = "bson" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d76085681585d39016f4d3841eb019201fc54d2dd0d92ad1e4fab3bfb32754" +checksum = "8746d07211bb12a7c34d995539b4a2acd4e0b0e757de98ce2ab99bcf17443fad" dependencies = [ "ahash", "base64 0.13.1", @@ -1497,7 +1574,7 @@ dependencies = [ [[package]] name = "cargo-shuttle" -version = "0.8.1" +version = "0.11.2" dependencies = [ "anyhow", "assert_cmd", @@ -1507,7 +1584,7 @@ dependencies = [ "cargo-edit", "cargo_metadata", "chrono", - "clap 3.2.23", + "clap 4.0.27", "clap_complete", "crossbeam-channel", "crossterm", @@ -1690,11 +1767,11 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.2.5" +version = "4.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f7a2e0a962c45ce25afce14220bc24f9dade0a1787f185cecf96bfba7847cd8" +checksum = "10861370d2ba66b0f5989f83ebf35db6421713fd92351790e7fdd6c36774c56b" dependencies = [ - "clap 3.2.23", + "clap 4.0.27", ] [[package]] @@ -1900,6 +1977,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "cookie" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" +dependencies = [ + "percent-encoding", + "time 0.3.11", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -2243,6 +2331,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array", + "subtle", +] + [[package]] name = "ctor" version = "0.1.26" @@ -2380,13 +2478,14 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.3.4" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3495912c9c1ccf2e18976439f4443f3fee0fd61f424ff99fde6a66b15ecb448f" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ "cfg-if 1.0.0", "hashbrown", "lock_api", + "once_cell", "parking_lot_core 0.9.3", "serde", ] @@ -3257,6 +3356,16 @@ dependencies = [ "digest 0.9.0", ] +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest 0.9.0", +] + [[package]] name = "hmac" version = "0.12.1" @@ -3761,6 +3870,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f4f04699947111ec1733e71778d763555737579e44b85844cae8e1940a1828" +dependencies = [ + "base64 0.13.1", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "kstring" version = "2.0.0" @@ -3823,6 +3946,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + [[package]] name = "libnghttp2-sys" version = "0.1.7+1.45.0" @@ -3902,9 +4035,9 @@ checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg 1.1.0", "scopeguard", @@ -4092,9 +4225,9 @@ dependencies = [ [[package]] name = "mongodb" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a1df476ac9541b0e4fdc8e2cc48884e66c92c933cd17a1fd75e68caf75752e" +checksum = "a37fe10c1485a0cd603468e284a1a8535b4ecf46808f5f7de3639a1e1252dbf8" dependencies = [ "async-trait", "base64 0.13.1", @@ -4102,20 +4235,21 @@ dependencies = [ "bson", "chrono", "derivative", + "derive_more", "futures-core", "futures-executor", + "futures-io", "futures-util", "hex 0.4.3", "hmac 0.12.1", "lazy_static", "md-5", - "os_info", "pbkdf2", "percent-encoding", "rand 0.8.5", "rustc_version_runtime", "rustls", - "rustls-pemfile 0.3.0", + "rustls-pemfile 1.0.1", "serde", "serde_bytes", "serde_with", @@ -4132,7 +4266,7 @@ dependencies = [ "trust-dns-proto", "trust-dns-resolver", "typed-builder", - "uuid 0.8.2", + "uuid 1.2.2", "webpki-roots", ] @@ -4252,6 +4386,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg 1.1.0", + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -4405,46 +4550,47 @@ dependencies = [ ] [[package]] -name = "opentelemetry-datadog" -version = "0.6.0" +name = "opentelemetry-http" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171770efa142d2a19455b7e985037f560b2e75461f822dd1688bfd83c14856f6" +checksum = "1edc79add46364183ece1a4542592ca593e6421c60807232f5b8f7a31703825d" dependencies = [ "async-trait", - "futures-core", + "bytes 1.3.0", "http 0.2.8", - "indexmap", - "itertools", - "once_cell", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-semantic-conventions", - "reqwest", - "rmp", - "thiserror", - "url", + "opentelemetry_api", ] [[package]] -name = "opentelemetry-http" -version = "0.7.0" +name = "opentelemetry-otlp" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc79add46364183ece1a4542592ca593e6421c60807232f5b8f7a31703825d" +checksum = "d1c928609d087790fc936a1067bdc310ae702bdf3b090c3f281b713622c8bbde" dependencies = [ "async-trait", - "bytes 1.3.0", + "futures", + "futures-util", "http 0.2.8", - "opentelemetry_api", - "reqwest", + "opentelemetry", + "opentelemetry-proto", + "prost", + "thiserror", + "tokio", + "tonic", ] [[package]] -name = "opentelemetry-semantic-conventions" -version = "0.10.0" +name = "opentelemetry-proto" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b02e0230abb0ab6636d18e2ba8fa02903ea63772281340ccac18e0af3ec9eeb" +checksum = "d61a2f56df5574508dd86aaca016c917489e589ece4141df1b5e349af8d66c28" dependencies = [ + "futures", + "futures-util", "opentelemetry", + "prost", + "tonic", + "tonic-build", ] [[package]] @@ -4594,9 +4740,9 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pbkdf2" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.3", ] @@ -5046,19 +5192,6 @@ dependencies = [ "proc-macro2 1.0.47", ] -[[package]] -name = "rand" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi", -] - [[package]] name = "rand" version = "0.6.5" @@ -5738,15 +5871,6 @@ dependencies = [ "base64 0.13.1", ] -[[package]] -name = "rustls-pemfile" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" -dependencies = [ - "base64 0.13.1", -] - [[package]] name = "rustls-pemfile" version = "1.0.1" @@ -6185,7 +6309,7 @@ dependencies = [ [[package]] name = "shuttle-admin" -version = "0.8.0" +version = "0.11.0" dependencies = [ "anyhow", "clap 4.0.27", @@ -6200,9 +6324,38 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "shuttle-auth" +version = "0.11.0" +dependencies = [ + "anyhow", + "async-trait", + "axum", + "axum-extra 0.5.0", + "axum-sessions", + "clap 4.0.27", + "http 0.2.8", + "hyper", + "jsonwebtoken", + "opentelemetry", + "rand 0.8.5", + "ring", + "serde", + "serde_json", + "shuttle-common", + "sqlx", + "strum", + "thiserror", + "tokio", + "tower", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber", +] + [[package]] name = "shuttle-codegen" -version = "0.8.0" +version = "0.11.0" dependencies = [ "pretty_assertions", "proc-macro-error", @@ -6214,35 +6367,52 @@ dependencies = [ [[package]] name = "shuttle-common" -version = "0.8.0" +version = "0.11.2" dependencies = [ "anyhow", "async-trait", "axum", + "base64 0.13.1", + "bytes 1.3.0", "cap-std", "chrono", "comfy-table", "crossterm", + "headers", "http 0.2.8", + "http-body", "http-serde", "hyper", + "jsonwebtoken", "once_cell", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-otlp", + "pin-project", "prost-types", "reqwest", + "ring", "rmp-serde", "rustrict", "serde", "serde_json", "strum", "thiserror", + "tokio", + "tonic", + "tower", + "tower-http 0.3.5", "tracing", + "tracing-fluent-assertions", + "tracing-opentelemetry", "tracing-subscriber", + "ttl_cache", "uuid 1.2.2", ] [[package]] name = "shuttle-deployer" -version = "0.8.0" +version = "0.11.1" dependencies = [ "anyhow", "async-trait", @@ -6263,7 +6433,6 @@ dependencies = [ "hyper-reverse-proxy 0.5.2-dev (git+https://github.com/chesedo/hyper-reverse-proxy?branch=master)", "once_cell", "opentelemetry", - "opentelemetry-datadog", "opentelemetry-http", "pipe", "portpicker", @@ -6276,13 +6445,13 @@ dependencies = [ "sqlx", "strum", "tar", - "tempdir", + "tempfile", "thiserror", "tokio", "toml", "tonic", "tower", - "tower-http 0.3.4", + "tower-http 0.3.5", "tracing", "tracing-opentelemetry", "tracing-subscriber", @@ -6291,7 +6460,7 @@ dependencies = [ [[package]] name = "shuttle-gateway" -version = "0.8.0" +version = "0.11.2" dependencies = [ "acme2", "anyhow", @@ -6309,16 +6478,18 @@ dependencies = [ "hyper", "hyper-reverse-proxy 0.5.2-dev (git+https://github.com/chesedo/hyper-reverse-proxy?branch=bug/host_header)", "instant-acme", + "jsonwebtoken", "lazy_static", "num_cpus", "once_cell", "opentelemetry", - "opentelemetry-datadog", "opentelemetry-http", "pem", + "pin-project", "portpicker", "rand 0.8.5", "rcgen", + "ring", "rustls", "rustls-pemfile 1.0.1", "serde", @@ -6330,7 +6501,7 @@ dependencies = [ "tempfile", "tokio", "tower", - "tower-http 0.3.4", + "tower-http 0.3.5", "tracing", "tracing-opentelemetry", "tracing-subscriber", @@ -6354,7 +6525,7 @@ dependencies = [ [[package]] name = "shuttle-proto" -version = "0.8.0" +version = "0.11.0" dependencies = [ "anyhow", "chrono", @@ -6371,11 +6542,11 @@ dependencies = [ [[package]] name = "shuttle-provisioner" -version = "0.8.0" +version = "0.11.0" dependencies = [ "aws-config", "aws-sdk-rds", - "clap 3.2.23", + "clap 4.0.27", "ctor", "fqdn", "mongodb", @@ -6384,6 +6555,7 @@ dependencies = [ "prost", "rand 0.8.5", "serde_json", + "shuttle-common", "shuttle-proto", "sqlx", "thiserror", @@ -6418,6 +6590,7 @@ dependencies = [ "tokio", "tokio-stream", "tonic", + "tower", "tracing", "tracing-subscriber", "uuid 1.2.2", @@ -6428,7 +6601,7 @@ dependencies = [ [[package]] name = "shuttle-secrets" -version = "0.8.0" +version = "0.11.0" dependencies = [ "async-trait", "shuttle-service", @@ -6436,7 +6609,7 @@ dependencies = [ [[package]] name = "shuttle-service" -version = "0.8.0" +version = "0.11.0" dependencies = [ "actix-web", "anyhow", @@ -6447,17 +6620,22 @@ dependencies = [ "cargo", "cargo_metadata", "crossbeam-channel", + "futures", "hyper", + "libloading", "num_cpus", "pipe", "poem", "poise", + "portpicker", "rocket", "salvo", "serde_json", "serenity", "shuttle-codegen", "shuttle-common", + "sqlx", + "strfmt", "thiserror", "thruster", "tide", @@ -6465,6 +6643,7 @@ dependencies = [ "tower", "tracing", "tracing-subscriber", + "uuid 1.2.2", "warp", ] @@ -6507,6 +6686,18 @@ dependencies = [ "event-listener", ] +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time 0.3.11", +] + [[package]] name = "sized-chunks" version = "0.6.5" @@ -6789,6 +6980,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" +[[package]] +name = "strfmt" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26cdabcdab6da7e8c2ac1160e917ec83e78bbe3e10325e17d532718c67a4828f" + [[package]] name = "stringprep" version = "0.1.2" @@ -6936,16 +7133,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tempdir" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -dependencies = [ - "rand 0.4.6", - "remove_dir_all", -] - [[package]] name = "tempfile" version = "3.3.0" @@ -7122,7 +7309,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c459573f0dd2cc734b539047f57489ea875af8ee950860ded20cf93a79a1dee0" dependencies = [ "async-h1", - "async-session", + "async-session 2.0.1", "async-sse", "async-std", "async-trait", @@ -7345,6 +7532,7 @@ checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ "bytes 1.3.0", "futures-core", + "futures-io", "futures-sink", "pin-project-lite 0.2.9", "tokio", @@ -7493,9 +7681,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba" +checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" dependencies = [ "base64 0.13.1", "bitflags", @@ -7558,6 +7746,17 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-fluent-assertions" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12de1a8c6bcfee614305e836308b596bbac831137a04c61f7e5b0b0bf2cfeaf6" +dependencies = [ + "tracing", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "tracing-futures" version = "0.2.5" @@ -7894,15 +8093,6 @@ dependencies = [ "rand 0.6.5", ] -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.7", -] - [[package]] name = "uuid" version = "1.2.2" @@ -8459,9 +8649,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.22.3" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" dependencies = [ "webpki", ] @@ -8748,9 +8938,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.5.5" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" [[package]] name = "zstd" diff --git a/Cargo.toml b/Cargo.toml index fb3a9ccda..a0e9be6ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] members = [ "admin", + "auth", "cargo-shuttle", "codegen", "common", @@ -24,27 +25,44 @@ exclude = [ ] [workspace.package] -version = "0.8.0" +version = "0.11.0" edition = "2021" license = "Apache-2.0" +repository = "https://github.com/shuttle-hq/shuttle" # https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacedependencies-table [workspace.dependencies] -shuttle-codegen = { path = "codegen", version = "0.8.0" } -shuttle-common = { path = "common", version = "0.8.0" } -shuttle-proto = { path = "proto", version = "0.8.0" } -shuttle-service = { path = "service", version = "0.8.0" } +shuttle-codegen = { path = "codegen", version = "0.11.0" } +shuttle-common = { path = "common", version = "0.11.2" } +shuttle-proto = { path = "proto", version = "0.11.0" } +shuttle-service = { path = "service", version = "0.11.0" } anyhow = "1.0.66" async-trait = "0.1.58" axum = { version = "0.6.0", default-features = false } chrono = { version = "0.4.23", default-features = false, features = ["clock"] } +clap = { version = "4.0.27", features = [ "derive" ] } +headers = "0.3.8" +http = "0.2.8" +hyper = "0.14.23" +jsonwebtoken = { version = "8.2.0" } once_cell = "1.16.0" +opentelemetry = { version = "0.18.0", features = ["rt-tokio"] } +opentelemetry-http = "0.7.0" +pin-project = "1.0.12" +portpicker = "0.1.1" prost-types = "0.11.0" -uuid = "1.2.2" -thiserror = "1.0.37" +rand = "0.8.5" +ring = "0.16.20" serde = { version = "1.0.148", default-features = false } serde_json = "1.0.89" +strum = { version = "0.24.1", features = ["derive"] } +thiserror = "1.0.37" tonic = "0.8.3" +tower = "0.4.13" +tower-http = { version = "0.3.4", features = ["trace"] } tracing = { version = "0.1.37", default-features = false } +tracing-opentelemetry = "0.18.0" tracing-subscriber = { version = "0.3.16", default-features = false, features = ["registry", "std"] } +ttl_cache = "0.5.1" +uuid = "1.2.2" diff --git a/Containerfile b/Containerfile index 5c98301e1..6dce75316 100644 --- a/Containerfile +++ b/Containerfile @@ -14,7 +14,7 @@ WORKDIR /build FROM shuttle-build as cache WORKDIR /src COPY . . -RUN find ${SRC_CRATES} \( -name "*.proto" -or -name "*.rs" -or -name "*.toml" -or -name "README.md" -or -name "*.sql" \) -type f -exec install -D \{\} /build/\{\} \; +RUN find ${SRC_CRATES} \( -name "*.proto" -or -name "*.rs" -or -name "*.toml" -or -name "Cargo.lock" -or -name "README.md" -or -name "*.sql" \) -type f -exec install -D \{\} /build/\{\} \; FROM shuttle-build AS planner COPY --from=cache /build . @@ -22,10 +22,10 @@ RUN cargo chef prepare --recipe-path recipe.json FROM shuttle-build AS builder COPY --from=planner /build/recipe.json recipe.json +ARG CARGO_PROFILE RUN cargo chef cook $(if [ "$CARGO_PROFILE" = "release" ]; then echo --${CARGO_PROFILE}; fi) --recipe-path recipe.json COPY --from=cache /build . ARG folder -ARG CARGO_PROFILE # if CARGO_PROFILE is release, pass --release, else use default debug profile RUN cargo build --bin shuttle-${folder} $(if [ "$CARGO_PROFILE" = "release" ]; then echo --${CARGO_PROFILE}; fi) @@ -43,8 +43,9 @@ COPY --from=cache /build/ /usr/src/shuttle/ FROM shuttle-common ARG folder +ARG prepare_args COPY ${folder}/prepare.sh /prepare.sh -RUN /prepare.sh +RUN /prepare.sh "${prepare_args}" ARG CARGO_PROFILE COPY --from=builder /build/target/${CARGO_PROFILE}/shuttle-${folder} /usr/local/bin/service ARG RUSTUP_TOOLCHAIN diff --git a/Makefile b/Makefile index 2f1f715b6..c4752a48c 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,7 @@ DD_ENV=production # make sure we only ever go to production with `--tls=enable` USE_TLS=enable CARGO_PROFILE=release +RUST_LOG=debug else DOCKER_COMPOSE_FILES=-f docker-compose.yml -f docker-compose.dev.yml STACK?=shuttle-dev @@ -59,17 +60,25 @@ CONTAINER_REGISTRY=public.ecr.aws/shuttle-dev DD_ENV=unstable USE_TLS?=disable CARGO_PROFILE=debug +RUST_LOG?=shuttle=trace,debug endif POSTGRES_EXTRA_PATH?=./extras/postgres POSTGRES_TAG?=14 PANAMAX_EXTRA_PATH?=./extras/panamax -PANAMAX_TAG?=1.0.6 +PANAMAX_TAG?=1.0.12 -RUST_LOG?=debug +OTEL_EXTRA_PATH?=./extras/otel +OTEL_TAG?=0.72.0 -DOCKER_COMPOSE_ENV=STACK=$(STACK) BACKEND_TAG=$(BACKEND_TAG) DEPLOYER_TAG=$(DEPLOYER_TAG) PROVISIONER_TAG=$(PROVISIONER_TAG) POSTGRES_TAG=${POSTGRES_TAG} PANAMAX_TAG=${PANAMAX_TAG} APPS_FQDN=$(APPS_FQDN) DB_FQDN=$(DB_FQDN) POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) RUST_LOG=$(RUST_LOG) CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) MONGO_INITDB_ROOT_USERNAME=$(MONGO_INITDB_ROOT_USERNAME) MONGO_INITDB_ROOT_PASSWORD=$(MONGO_INITDB_ROOT_PASSWORD) DD_ENV=$(DD_ENV) USE_TLS=$(USE_TLS) +USE_PANAMAX?=enable +ifeq ($(USE_PANAMAX), enable) +PREPARE_ARGS+=-p +COMPOSE_PROFILES+=panamax +endif + +DOCKER_COMPOSE_ENV=STACK=$(STACK) BACKEND_TAG=$(BACKEND_TAG) DEPLOYER_TAG=$(DEPLOYER_TAG) PROVISIONER_TAG=$(PROVISIONER_TAG) POSTGRES_TAG=${POSTGRES_TAG} PANAMAX_TAG=${PANAMAX_TAG} OTEL_TAG=${OTEL_TAG} APPS_FQDN=$(APPS_FQDN) DB_FQDN=$(DB_FQDN) POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) RUST_LOG=$(RUST_LOG) CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) MONGO_INITDB_ROOT_USERNAME=$(MONGO_INITDB_ROOT_USERNAME) MONGO_INITDB_ROOT_PASSWORD=$(MONGO_INITDB_ROOT_PASSWORD) DD_ENV=$(DD_ENV) USE_TLS=$(USE_TLS) COMPOSE_PROFILES=$(COMPOSE_PROFILES) .PHONY: images clean src up down deploy shuttle-% postgres docker-compose.rendered.yml test bump-% deploy-examples publish publish-% --validate-version @@ -77,7 +86,7 @@ clean: rm .shuttle-* rm docker-compose.rendered.yml -images: shuttle-provisioner shuttle-deployer shuttle-gateway postgres panamax +images: shuttle-provisioner shuttle-deployer shuttle-gateway shuttle-auth postgres panamax otel postgres: docker buildx build \ @@ -88,12 +97,22 @@ postgres: $(POSTGRES_EXTRA_PATH) panamax: + if [ $(USE_PANAMAX) = "enable" ]; then \ + docker buildx build \ + --build-arg PANAMAX_TAG=$(PANAMAX_TAG) \ + --tag $(CONTAINER_REGISTRY)/panamax:$(PANAMAX_TAG) \ + $(BUILDX_FLAGS) \ + -f $(PANAMAX_EXTRA_PATH)/Containerfile \ + $(PANAMAX_EXTRA_PATH); \ + fi + +otel: docker buildx build \ - --build-arg PANAMAX_TAG=$(PANAMAX_TAG) \ - --tag $(CONTAINER_REGISTRY)/panamax:$(PANAMAX_TAG) \ + --build-arg OTEL_TAG=$(OTEL_TAG) \ + --tag $(CONTAINER_REGISTRY)/otel:$(OTEL_TAG) \ $(BUILDX_FLAGS) \ - -f $(PANAMAX_EXTRA_PATH)/Containerfile \ - $(PANAMAX_EXTRA_PATH) + -f $(OTEL_EXTRA_PATH)/Containerfile \ + $(OTEL_EXTRA_PATH) docker-compose.rendered.yml: docker-compose.yml docker-compose.dev.yml $(DOCKER_COMPOSE_ENV) $(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) $(DOCKER_COMPOSE_CONFIG_FLAGS) -p $(STACK) config > $@ @@ -104,6 +123,9 @@ deploy: docker-compose.yml test: cd e2e; POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) APPS_FQDN=$(APPS_FQDN) cargo test $(CARGO_TEST_FLAGS) -- --nocapture +# Start the containers locally. This does not start panamax by default, +# to start panamax locally run this command with an override for the profiles: +# `make COMPOSE_PROFILES=panamax up` up: docker-compose.rendered.yml CONTAINER_REGISTRY=$(CONTAINER_REGISTRY) $(DOCKER_COMPOSE) -f $< -p $(STACK) up -d $(DOCKER_COMPOSE_FLAGS) @@ -113,7 +135,8 @@ down: docker-compose.rendered.yml shuttle-%: ${SRC} Cargo.lock docker buildx build \ --build-arg folder=$(*) \ - --build-arg RUSTUP_TOOLCHAIN=$(RUSTUP_TOOLCHAIN) \ + --build-arg prepare_args=$(PREPARE_ARGS) \ + --build-arg RUSTUP_TOOLCHAIN=$(RUSTUP_TOOLCHAIN) \ --build-arg CARGO_PROFILE=$(CARGO_PROFILE) \ --tag $(CONTAINER_REGISTRY)/$(*):$(COMMIT_SHA) \ --tag $(CONTAINER_REGISTRY)/$(*):$(TAG) \ diff --git a/README.md b/README.md index 5349720f0..03b30c12b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ +


    - docs + docs language @@ -16,6 +17,7 @@ discord

    + --- @@ -24,9 +26,10 @@ [Shuttle](https://www.shuttle.rs/) is a Rust-native cloud development platform that lets you deploy your Rust apps for free. Shuttle is built for productivity, reliability and performance: + - Zero-Configuration support for Rust using annotations - Automatic resource provisioning (databases, caches, subdomains, etc.) via [Infrastructure-From-Code](https://www.shuttle.rs/blog/2022/05/09/ifc) -- First-class support for popular Rust frameworks ([Rocket](https://docs.shuttle.rs/examples/rocket), [Axum](https://docs.shuttle.rs/examples/axum), +- First-class support for popular Rust frameworks ([Actix](https://docs.shuttle.rs/examples/actix), [Rocket](https://docs.shuttle.rs/examples/rocket), [Axum](https://docs.shuttle.rs/examples/axum), [Tide](https://docs.shuttle.rs/examples/tide), [Poem](https://docs.shuttle.rs/examples/poem) and [Tower](https://docs.shuttle.rs/examples/tower)) - Support for deploying Discord bots using [Serenity](https://docs.shuttle.rs/examples/serenity) - Scalable hosting (with optional self-hosting) @@ -52,10 +55,13 @@ cargo shuttle login ``` To initialize your project, simply write: + ```bash cargo shuttle init --axum hello-world ``` + And to deploy it, write: + ```bash cargo shuttle project new cargo shuttle project status // until the project is "ready" @@ -75,14 +81,15 @@ $ cargo shuttle deploy Created At: 2022-04-01 08:32:34.412602556 UTC ``` -Feel free to build on-top of the generated `hello-world` boilerplate or take a stab at one of our [examples](https://docs.shuttle.rs/guide/axum-examples.html#hello-world). +Feel free to build on-top of the generated `hello-world` boilerplate or take a stab at one of our [examples](https://docs.shuttle.rs/examples/axum). For the full documentation, visit [our docs](https://docs.shuttle.rs). + ## Contributing to shuttle Contributing to shuttle is highly encouraged! -If you want to setup a local environment to test code changes to core `shuttle` packages, or want to contribute to the project check out [our docs](https://docs.shuttle.rs/community/contribute). +If you want to setup a local environment to test code changes to core `shuttle` packages, or want to contribute to the project check out [our docs](https://docs.shuttle.rs/community/contribute). Even if you are not planning to submit any code; joining our [Discord server](https://discord.gg/shuttle) and providing feedback helps us a lot! @@ -102,12 +109,12 @@ If you have any requests or suggestions feel free to open an issue. ## Status - [x] Alpha: We are testing Shuttle, API and deployments may be unstable -- [x] Public Alpha: Anyone can sign up, but go easy on us, +- [x] Public Alpha: Anyone can sign up, but go easy on us, there are a few kinks - [ ] Public Beta: Stable enough for most non-enterprise use-cases - [ ] Public: Production-ready! -We are currently in Public Alpha. Watch "releases" of this repo to get +We are currently in Public Alpha. Watch "releases" of this repo to get notified of major updates! ## Contributors ✨ diff --git a/admin/Cargo.toml b/admin/Cargo.toml index d2fda7879..20b4127a7 100644 --- a/admin/Cargo.toml +++ b/admin/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "shuttle-admin" -version = "0.8.0" +version = "0.11.0" edition = "2021" [dependencies] anyhow = { workspace = true } -clap = { version = "4.0.27", features = [ "derive", "env" ] } +clap = { workspace = true, features = ["env"] } dirs = "4.0.0" reqwest = { version = "0.11.13", features = ["json"] } serde = { workspace = true, features = ["derive"] } diff --git a/admin/README.md b/admin/README.md index 6d56d6266..12e6e0ccc 100644 --- a/admin/README.md +++ b/admin/README.md @@ -1,6 +1,10 @@ -_Small utility used by the shuttle admin for common tasks_ +# Admin + + +*Small utility used by the shuttle admin for common tasks* ## How to test custom domain certificates locally + For local testing it is easiest to use the [Pebble](https://github.com/letsencrypt/pebble) server. So install it using whatever method works for your system. It is included in the nix environment if you use it though. @@ -31,4 +35,4 @@ cargo run -p shuttle-admin -- --api-url http://localhost:8001 acme create-accoun Safe the account JSON in a local file and use it to test creating new certificate. However, you'll the FQDN you're using for testnig to resolve to your local machine. So create an `A` record for it on your DNS with the value -`127.0.0.1`. And Bob's your uncle 🎉 +`127.0.0.1`. And Bob's your uncle 🎉 diff --git a/auth/Cargo.toml b/auth/Cargo.toml new file mode 100644 index 000000000..256434b09 --- /dev/null +++ b/auth/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "shuttle-auth" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = { workspace = true } +async-trait = { workspace = true } +axum = { workspace = true, features = ["headers"] } +axum-sessions = "0.4.1" +clap = { workspace = true } +http = { workspace = true } +jsonwebtoken = { workspace = true } +opentelemetry = { workspace = true } +rand = { workspace = true } +ring = { workspace = true } +serde = { workspace = true, features = ["derive"] } +sqlx = { version = "0.6.2", features = ["sqlite", "json", "runtime-tokio-native-tls", "migrate"] } +strum = { workspace = true } +thiserror = { workspace = true } +tokio = { version = "1.22.0", features = ["full"] } +tracing = { workspace = true } +tracing-opentelemetry = { workspace = true } +tracing-subscriber = { workspace = true } + +[dependencies.shuttle-common] +workspace = true +features = ["backend", "models"] + +[dev-dependencies] +axum-extra = { version = "0.5.0", features = ["cookie"] } +hyper = { workspace = true } +serde_json = { workspace = true } +tower = { workspace = true, features = ["util"] } diff --git a/auth/migrations/0000_init.sql b/auth/migrations/0000_init.sql new file mode 100644 index 000000000..9dea15725 --- /dev/null +++ b/auth/migrations/0000_init.sql @@ -0,0 +1,5 @@ +CREATE TABLE IF NOT EXISTS users ( + account_name TEXT PRIMARY KEY, + key TEXT UNIQUE, + account_tier TEXT DEFAULT "basic" NOT NULL +); diff --git a/auth/prepare.sh b/auth/prepare.sh new file mode 100755 index 000000000..6a52d3030 --- /dev/null +++ b/auth/prepare.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +############################################################################### +# This file is used by our common Containerfile incase the container for this # +# service might need some extra preparation steps for its final image # +############################################################################### + +# Nothing to prepare in container image here diff --git a/auth/src/api/builder.rs b/auth/src/api/builder.rs new file mode 100644 index 000000000..d46062846 --- /dev/null +++ b/auth/src/api/builder.rs @@ -0,0 +1,134 @@ +use std::{net::SocketAddr, sync::Arc}; + +use axum::{ + extract::FromRef, + middleware::from_extractor, + routing::{get, post}, + Router, Server, +}; +use axum_sessions::{async_session::MemoryStore, SessionLayer}; +use rand::RngCore; +use shuttle_common::{ + backends::metrics::{Metrics, TraceLayer}, + request_span, +}; +use sqlx::SqlitePool; +use tracing::field; + +use crate::{ + secrets::{EdDsaManager, KeyManager}, + user::{UserManagement, UserManager}, + COOKIE_EXPIRATION, +}; + +use super::handlers::{ + convert_cookie, convert_key, get_public_key, get_user, login, logout, post_user, refresh_token, +}; + +pub type UserManagerState = Arc>; +pub type KeyManagerState = Arc>; + +#[derive(Clone)] +pub struct RouterState { + pub user_manager: UserManagerState, + pub key_manager: KeyManagerState, +} + +// Allow getting a user management state directly +impl FromRef for UserManagerState { + fn from_ref(router_state: &RouterState) -> Self { + router_state.user_manager.clone() + } +} + +// Allow getting a key manager state directly +impl FromRef for KeyManagerState { + fn from_ref(router_state: &RouterState) -> Self { + router_state.key_manager.clone() + } +} + +pub struct ApiBuilder { + router: Router, + pool: Option, + session_layer: Option>, +} + +impl Default for ApiBuilder { + fn default() -> Self { + Self::new() + } +} + +impl ApiBuilder { + pub fn new() -> Self { + let router = Router::new() + .route("/login", post(login)) + .route("/logout", post(logout)) + .route("/auth/session", get(convert_cookie)) + .route("/auth/key", get(convert_key)) + .route("/auth/refresh", post(refresh_token)) + .route("/public-key", get(get_public_key)) + .route("/users/:account_name", get(get_user)) + .route("/users/:account_name/:account_tier", post(post_user)) + .route_layer(from_extractor::()) + .layer( + TraceLayer::new(|request| { + request_span!( + request, + request.params.account_name = field::Empty, + request.params.account_tier = field::Empty + ) + }) + .with_propagation() + .build(), + ); + + Self { + router, + pool: None, + session_layer: None, + } + } + + pub fn with_sqlite_pool(mut self, pool: SqlitePool) -> Self { + self.pool = Some(pool); + self + } + + pub fn with_sessions(mut self) -> Self { + let store = MemoryStore::new(); + let mut secret = [0u8; 128]; + rand::thread_rng().fill_bytes(&mut secret[..]); + self.session_layer = Some( + SessionLayer::new(store, &secret) + .with_cookie_name("shuttle.sid") + .with_session_ttl(Some(COOKIE_EXPIRATION)) + .with_secure(true), + ); + + self + } + + pub fn into_router(self) -> Router { + let pool = self.pool.expect("an sqlite pool is required"); + let session_layer = self.session_layer.expect("a session layer is required"); + + let user_manager = UserManager { pool }; + let key_manager = EdDsaManager::new(); + + let state = RouterState { + user_manager: Arc::new(Box::new(user_manager)), + key_manager: Arc::new(Box::new(key_manager)), + }; + + self.router.layer(session_layer).with_state(state) + } +} + +pub async fn serve(router: Router, address: SocketAddr) { + Server::bind(&address) + .serve(router.into_make_service()) + .await + .unwrap_or_else(|_| panic!("Failed to bind to address: {}", address)); +} diff --git a/auth/src/api/handlers.rs b/auth/src/api/handlers.rs new file mode 100644 index 000000000..2d08221ce --- /dev/null +++ b/auth/src/api/handlers.rs @@ -0,0 +1,117 @@ +use crate::{ + error::Error, + user::{AccountName, AccountTier, Admin, Key, User}, +}; +use axum::{ + extract::{Path, State}, + Json, +}; +use axum_sessions::extractors::{ReadableSession, WritableSession}; +use http::StatusCode; +use serde::{Deserialize, Serialize}; +use shuttle_common::{backends::auth::Claim, models::user}; +use tracing::instrument; + +use super::{ + builder::{KeyManagerState, UserManagerState}, + RouterState, +}; + +#[instrument(skip(user_manager))] +pub(crate) async fn get_user( + _: Admin, + State(user_manager): State, + Path(account_name): Path, +) -> Result, Error> { + let user = user_manager.get_user(account_name).await?; + + Ok(Json(user.into())) +} + +#[instrument(skip(user_manager))] +pub(crate) async fn post_user( + _: Admin, + State(user_manager): State, + Path((account_name, account_tier)): Path<(AccountName, AccountTier)>, +) -> Result, Error> { + let user = user_manager.create_user(account_name, account_tier).await?; + + Ok(Json(user.into())) +} + +pub(crate) async fn login( + mut session: WritableSession, + State(user_manager): State, + Json(request): Json, +) -> Result, Error> { + let user = user_manager.get_user(request.account_name).await?; + + session + .insert("account_name", user.name.clone()) + .expect("to set account name"); + session + .insert("account_tier", user.account_tier) + .expect("to set account tier"); + + Ok(Json(user.into())) +} + +pub(crate) async fn logout(mut session: WritableSession) { + session.destroy(); +} + +pub(crate) async fn convert_cookie( + session: ReadableSession, + State(key_manager): State, +) -> Result, StatusCode> { + let account_name: String = session + .get("account_name") + .ok_or(StatusCode::UNAUTHORIZED)?; + + let account_tier: AccountTier = session + .get("account_tier") + .ok_or(StatusCode::UNAUTHORIZED)?; + + let claim = Claim::new(account_name, account_tier.into()); + + let token = claim.into_token(key_manager.private_key())?; + + let response = shuttle_common::backends::auth::ConvertResponse { token }; + + Ok(Json(response)) +} + +/// Convert a valid API-key bearer token to a JWT. +pub(crate) async fn convert_key( + State(RouterState { + key_manager, + user_manager, + }): State, + key: Key, +) -> Result, StatusCode> { + let User { + name, account_tier, .. + } = user_manager + .get_user_by_key(key.clone()) + .await + .map_err(|_| StatusCode::UNAUTHORIZED)?; + + let claim = Claim::new(name.to_string(), account_tier.into()); + + let token = claim.into_token(key_manager.private_key())?; + + let response = shuttle_common::backends::auth::ConvertResponse { token }; + + Ok(Json(response)) +} + +pub(crate) async fn refresh_token() {} + +pub(crate) async fn get_public_key(State(key_manager): State) -> Vec { + key_manager.public_key().to_vec() +} + +#[derive(Deserialize, Serialize)] +pub struct LoginRequest { + account_name: AccountName, +} diff --git a/auth/src/api/mod.rs b/auth/src/api/mod.rs new file mode 100644 index 000000000..18e1c3f91 --- /dev/null +++ b/auth/src/api/mod.rs @@ -0,0 +1,4 @@ +mod builder; +mod handlers; + +pub use builder::{serve, ApiBuilder, RouterState, UserManagerState}; diff --git a/auth/src/args.rs b/auth/src/args.rs new file mode 100644 index 000000000..ec1db63e3 --- /dev/null +++ b/auth/src/args.rs @@ -0,0 +1,36 @@ +use std::{net::SocketAddr, path::PathBuf}; + +use clap::{Parser, Subcommand}; + +#[derive(Parser, Debug)] +pub struct Args { + /// Where to store auth state (such as users) + #[arg(long, default_value = "./")] + pub state: PathBuf, + + #[command(subcommand)] + pub command: Commands, +} + +#[derive(Subcommand, Debug)] +pub enum Commands { + Start(StartArgs), + Init(InitArgs), +} + +#[derive(clap::Args, Debug, Clone)] +pub struct StartArgs { + /// Address to bind to + #[arg(long, default_value = "127.0.0.1:8000")] + pub address: SocketAddr, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct InitArgs { + /// Name of initial account to create + #[arg(long)] + pub name: String, + /// Key to assign to initial account + #[arg(long)] + pub key: Option, +} diff --git a/auth/src/error.rs b/auth/src/error.rs new file mode 100644 index 000000000..617c33f3e --- /dev/null +++ b/auth/src/error.rs @@ -0,0 +1,61 @@ +use std::error::Error as StdError; + +use axum::http::{header, HeaderValue, StatusCode}; +use axum::response::{IntoResponse, Response}; +use axum::Json; + +use serde::{ser::SerializeMap, Serialize}; +use shuttle_common::models::error::ApiError; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("User could not be found")] + UserNotFound, + #[error("API key is missing.")] + KeyMissing, + #[error("Unauthorized.")] + Unauthorized, + #[error("Forbidden.")] + Forbidden, + #[error("Database error: {0}")] + Database(#[from] sqlx::Error), + #[error(transparent)] + UnexpectedError(#[from] anyhow::Error), +} + +impl Serialize for Error { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let mut map = serializer.serialize_map(Some(2))?; + map.serialize_entry("type", &format!("{:?}", self))?; + // use the error source if available, if not use display implementation + map.serialize_entry("msg", &self.source().unwrap_or(self).to_string())?; + map.end() + } +} + +impl IntoResponse for Error { + fn into_response(self) -> Response { + let code = match self { + Error::Forbidden => StatusCode::FORBIDDEN, + Error::Unauthorized | Error::KeyMissing => StatusCode::UNAUTHORIZED, + Error::Database(_) | Error::UserNotFound => StatusCode::NOT_FOUND, + _ => StatusCode::INTERNAL_SERVER_ERROR, + }; + + ( + code, + [( + header::CONTENT_TYPE, + HeaderValue::from_static("application/json"), + )], + Json(ApiError { + message: self.to_string(), + status_code: code.as_u16(), + }), + ) + .into_response() + } +} diff --git a/auth/src/lib.rs b/auth/src/lib.rs new file mode 100644 index 000000000..67067f52e --- /dev/null +++ b/auth/src/lib.rs @@ -0,0 +1,77 @@ +mod api; +mod args; +mod error; +mod secrets; +mod user; + +use std::{io, str::FromStr, time::Duration}; + +use args::StartArgs; +use sqlx::{ + migrate::Migrator, + query, + sqlite::{SqliteConnectOptions, SqliteJournalMode, SqliteSynchronous}, + SqlitePool, +}; +use tracing::info; + +use crate::{ + api::serve, + user::{AccountTier, Key}, +}; +pub use api::ApiBuilder; +pub use args::{Args, Commands, InitArgs}; + +pub const COOKIE_EXPIRATION: Duration = Duration::from_secs(60 * 60 * 24); // One day + +pub static MIGRATIONS: Migrator = sqlx::migrate!("./migrations"); + +pub async fn start(pool: SqlitePool, args: StartArgs) -> io::Result<()> { + let router = api::ApiBuilder::new() + .with_sqlite_pool(pool) + .with_sessions() + .into_router(); + + info!(address=%args.address, "Binding to and listening at address"); + + serve(router, args.address).await; + + Ok(()) +} + +pub async fn init(pool: SqlitePool, args: InitArgs) -> io::Result<()> { + let key = match args.key { + Some(ref key) => Key::from_str(key).unwrap(), + None => Key::new_random(), + }; + + query("INSERT INTO users (account_name, key, account_tier) VALUES (?1, ?2, ?3)") + .bind(&args.name) + .bind(&key) + .bind(AccountTier::Admin) + .execute(&pool) + .await + .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; + + println!("`{}` created as super user with key: {key}", args.name); + Ok(()) +} + +/// Initialize an SQLite database at the given URI, creating it if it does not +/// already exist. To create an in-memory database for tests, simply pass in +/// `sqlite::memory:` for the `db_uri`. +pub async fn sqlite_init(db_uri: &str) -> SqlitePool { + let sqlite_options = SqliteConnectOptions::from_str(db_uri) + .unwrap() + .create_if_missing(true) + // To see the sources for choosing these settings, see: + // https://github.com/shuttle-hq/shuttle/pull/623 + .journal_mode(SqliteJournalMode::Wal) + .synchronous(SqliteSynchronous::Normal); + + let pool = SqlitePool::connect_with(sqlite_options).await.unwrap(); + + MIGRATIONS.run(&pool).await.unwrap(); + + pool +} diff --git a/auth/src/main.rs b/auth/src/main.rs new file mode 100644 index 000000000..4a9136563 --- /dev/null +++ b/auth/src/main.rs @@ -0,0 +1,37 @@ +use std::io; + +use clap::Parser; +use shuttle_common::backends::tracing::setup_tracing; +use sqlx::migrate::Migrator; +use tracing::{info, trace}; + +use shuttle_auth::{init, sqlite_init, start, Args, Commands}; + +pub static MIGRATIONS: Migrator = sqlx::migrate!("./migrations"); + +#[tokio::main] +async fn main() -> io::Result<()> { + let args = Args::parse(); + + trace!(args = ?args, "parsed args"); + + setup_tracing(tracing_subscriber::registry(), "auth"); + + let db_path = args.state.join("authentication.sqlite"); + + let db_uri = db_path.to_str().unwrap(); + + let pool = sqlite_init(db_uri).await; + + info!( + "state db: {}", + std::fs::canonicalize(&args.state) + .unwrap() + .to_string_lossy() + ); + + match args.command { + Commands::Start(args) => start(pool, args).await, + Commands::Init(args) => init(pool, args).await, + } +} diff --git a/auth/src/secrets.rs b/auth/src/secrets.rs new file mode 100644 index 000000000..6ddfc3917 --- /dev/null +++ b/auth/src/secrets.rs @@ -0,0 +1,40 @@ +use jsonwebtoken::EncodingKey; +use ring::signature::{Ed25519KeyPair, KeyPair}; + +pub trait KeyManager: Send + Sync { + /// Get a private key for signing secrets + fn private_key(&self) -> &EncodingKey; + + /// Get a public key to verify signed secrets + fn public_key(&self) -> &[u8]; +} + +pub struct EdDsaManager { + encoding_key: EncodingKey, + public_key: Vec, +} + +impl EdDsaManager { + pub fn new() -> Self { + let doc = Ed25519KeyPair::generate_pkcs8(&ring::rand::SystemRandom::new()) + .expect("to create a PKCS8 for edDSA"); + let encoding_key = EncodingKey::from_ed_der(doc.as_ref()); + let pair = Ed25519KeyPair::from_pkcs8(doc.as_ref()).expect("to create a key pair"); + let public_key = pair.public_key(); + + Self { + encoding_key, + public_key: public_key.as_ref().to_vec(), + } + } +} + +impl KeyManager for EdDsaManager { + fn private_key(&self) -> &EncodingKey { + &self.encoding_key + } + + fn public_key(&self) -> &[u8] { + &self.public_key + } +} diff --git a/auth/src/user.rs b/auth/src/user.rs new file mode 100644 index 000000000..264adfb60 --- /dev/null +++ b/auth/src/user.rs @@ -0,0 +1,270 @@ +use std::{fmt::Formatter, str::FromStr}; + +use async_trait::async_trait; +use axum::{ + extract::{FromRef, FromRequestParts}, + headers::{authorization::Bearer, Authorization}, + http::request::Parts, + TypedHeader, +}; +use rand::distributions::{Alphanumeric, DistString}; +use serde::{Deserialize, Deserializer, Serialize}; +use shuttle_common::backends::auth::Scope; +use sqlx::{query, Row, SqlitePool}; +use tracing::{trace, Span}; + +use crate::{api::UserManagerState, error::Error}; + +#[async_trait] +pub trait UserManagement: Send + Sync { + async fn create_user(&self, name: AccountName, tier: AccountTier) -> Result; + async fn get_user(&self, name: AccountName) -> Result; + async fn get_user_by_key(&self, key: Key) -> Result; +} + +#[derive(Clone)] +pub struct UserManager { + pub pool: SqlitePool, +} + +#[async_trait] +impl UserManagement for UserManager { + async fn create_user(&self, name: AccountName, tier: AccountTier) -> Result { + let key = Key::new_random(); + + query("INSERT INTO users (account_name, key, account_tier) VALUES (?1, ?2, ?3)") + .bind(&name) + .bind(&key) + .bind(tier) + .execute(&self.pool) + .await?; + + Ok(User::new(name, key, tier)) + } + + async fn get_user(&self, name: AccountName) -> Result { + query("SELECT account_name, key, account_tier FROM users WHERE account_name = ?1") + .bind(&name) + .fetch_optional(&self.pool) + .await? + .map(|row| User { + name, + key: row.try_get("key").unwrap(), + account_tier: row.try_get("account_tier").unwrap(), + }) + .ok_or(Error::UserNotFound) + } + + async fn get_user_by_key(&self, key: Key) -> Result { + query("SELECT account_name, key, account_tier FROM users WHERE key = ?1") + .bind(&key) + .fetch_optional(&self.pool) + .await? + .map(|row| User { + name: row.try_get("account_name").unwrap(), + key, + account_tier: row.try_get("account_tier").unwrap(), + }) + .ok_or(Error::UserNotFound) + } +} + +#[derive(Clone, Deserialize, PartialEq, Eq, Serialize, Debug)] +pub struct User { + pub name: AccountName, + pub key: Key, + pub account_tier: AccountTier, +} + +impl User { + pub fn is_admin(&self) -> bool { + self.account_tier == AccountTier::Admin + } + + pub fn new(name: AccountName, key: Key, account_tier: AccountTier) -> Self { + Self { + name, + key, + account_tier, + } + } +} + +#[async_trait] +impl FromRequestParts for User +where + S: Send + Sync, + UserManagerState: FromRef, +{ + type Rejection = Error; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let key = Key::from_request_parts(parts, state).await?; + + let user_manager: UserManagerState = UserManagerState::from_ref(state); + + let user = user_manager + .get_user_by_key(key) + .await + // Absord any error into `Unauthorized` + .map_err(|_| Error::Unauthorized)?; + + // Record current account name for tracing purposes + Span::current().record("account.name", &user.name.to_string()); + + Ok(user) + } +} + +impl From for shuttle_common::models::user::Response { + fn from(user: User) -> Self { + Self { + name: user.name.to_string(), + key: user.key.to_string(), + account_tier: user.account_tier.to_string(), + } + } +} + +#[derive(Clone, Debug, sqlx::Type, PartialEq, Hash, Eq, Serialize, Deserialize)] +#[serde(transparent)] +#[sqlx(transparent)] +pub struct Key(String); + +#[async_trait] +impl FromRequestParts for Key +where + S: Send + Sync, +{ + type Rejection = Error; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let key = TypedHeader::>::from_request_parts(parts, state) + .await + .map_err(|_| Error::KeyMissing) + .and_then(|TypedHeader(Authorization(bearer))| bearer.token().trim().parse())?; + + trace!(%key, "got bearer key"); + + Ok(key) + } +} + +impl std::fmt::Display for Key { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl FromStr for Key { + type Err = Error; + + fn from_str(s: &str) -> Result { + Ok(Self(s.to_string())) + } +} + +impl Key { + pub fn new_random() -> Self { + Self(Alphanumeric.sample_string(&mut rand::thread_rng(), 16)) + } +} + +#[derive(Clone, Copy, Deserialize, PartialEq, Eq, Serialize, Debug, sqlx::Type, strum::Display)] +#[sqlx(rename_all = "lowercase")] +#[serde(rename_all = "lowercase")] +#[strum(serialize_all = "lowercase")] +pub enum AccountTier { + Basic, + Pro, + Team, + Admin, +} + +impl Default for AccountTier { + fn default() -> Self { + AccountTier::Basic + } +} + +impl From for Vec { + fn from(tier: AccountTier) -> Self { + let mut base = vec![ + Scope::Deployment, + Scope::DeploymentPush, + Scope::Logs, + Scope::Service, + Scope::ServiceCreate, + Scope::Project, + Scope::ProjectCreate, + Scope::Resources, + Scope::ResourcesWrite, + Scope::Secret, + Scope::SecretWrite, + ]; + + if tier == AccountTier::Admin { + base.append(&mut vec![ + Scope::User, + Scope::UserCreate, + Scope::AcmeCreate, + Scope::CustomDomainCreate, + Scope::Admin, + ]); + } + + base + } +} + +#[derive(Debug, Clone, PartialEq, Eq, sqlx::Type, Serialize)] +#[sqlx(transparent)] +pub struct AccountName(String); + +impl FromStr for AccountName { + type Err = Error; + + fn from_str(s: &str) -> Result { + Ok(Self(s.to_string())) + } +} + +impl std::fmt::Display for AccountName { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl<'de> Deserialize<'de> for AccountName { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + String::deserialize(deserializer)? + .parse() + .map_err(serde::de::Error::custom) + } +} + +pub struct Admin { + pub user: User, +} + +#[async_trait] +impl FromRequestParts for Admin +where + S: Send + Sync, + UserManagerState: FromRef, +{ + type Rejection = Error; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let user = User::from_request_parts(parts, state).await?; + + if user.is_admin() { + Ok(Self { user }) + } else { + Err(Error::Forbidden) + } + } +} diff --git a/auth/tests/api/auth.rs b/auth/tests/api/auth.rs new file mode 100644 index 000000000..e8a4091fd --- /dev/null +++ b/auth/tests/api/auth.rs @@ -0,0 +1,49 @@ +use http::header::AUTHORIZATION; +use http::{Request, StatusCode}; +use hyper::Body; + +use crate::helpers::{app, ADMIN_KEY}; + +#[tokio::test] +async fn convert_api_key_to_jwt() { + let app = app().await; + + // Create test user + let response = app.post_user("test-user", "basic").await; + + assert_eq!(response.status(), StatusCode::OK); + + // GET /auth/key without bearer token. + let request = Request::builder() + .uri("/auth/key") + .body(Body::empty()) + .unwrap(); + + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + + // GET /auth/key with invalid bearer token. + let request = Request::builder() + .uri("/auth/key") + .header(AUTHORIZATION, "Bearer notadmin") + .body(Body::empty()) + .unwrap(); + + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + + // GET /auth/key with valid bearer token. + let request = Request::builder() + .uri("/auth/key") + .header(AUTHORIZATION, format!("Bearer {ADMIN_KEY}")) + .body(Body::empty()) + .unwrap(); + + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::OK); + + // TODO: decode the JWT? +} diff --git a/auth/tests/api/helpers.rs b/auth/tests/api/helpers.rs new file mode 100644 index 000000000..0d3a7b2f1 --- /dev/null +++ b/auth/tests/api/helpers.rs @@ -0,0 +1,63 @@ +use axum::{body::Body, response::Response, Router}; +use hyper::http::{header::AUTHORIZATION, Request}; +use shuttle_auth::{sqlite_init, ApiBuilder}; +use sqlx::query; +use tower::ServiceExt; + +pub(crate) const ADMIN_KEY: &str = "my-api-key"; + +pub(crate) struct TestApp { + pub router: Router, +} + +/// Initialize a router with an in-memory sqlite database for each test. +pub(crate) async fn app() -> TestApp { + let sqlite_pool = sqlite_init("sqlite::memory:").await; + + // Insert an admin user for the tests. + query("INSERT INTO users (account_name, key, account_tier) VALUES (?1, ?2, ?3)") + .bind("admin") + .bind(ADMIN_KEY) + .bind("admin") + .execute(&sqlite_pool) + .await + .unwrap(); + + let router = ApiBuilder::new() + .with_sqlite_pool(sqlite_pool) + .with_sessions() + .into_router(); + + TestApp { router } +} + +impl TestApp { + pub async fn send_request(&self, request: Request) -> Response { + self.router + .clone() + .oneshot(request) + .await + .expect("Failed to execute request.") + } + + pub async fn post_user(&self, name: &str, tier: &str) -> Response { + let request = Request::builder() + .uri(format!("/users/{name}/{tier}")) + .method("POST") + .header(AUTHORIZATION, format!("Bearer {ADMIN_KEY}")) + .body(Body::empty()) + .unwrap(); + + self.send_request(request).await + } + + pub async fn get_user(&self, name: &str) -> Response { + let request = Request::builder() + .uri(format!("/users/{name}")) + .header(AUTHORIZATION, format!("Bearer {ADMIN_KEY}")) + .body(Body::empty()) + .unwrap(); + + self.send_request(request).await + } +} diff --git a/auth/tests/api/main.rs b/auth/tests/api/main.rs new file mode 100644 index 000000000..826562c2d --- /dev/null +++ b/auth/tests/api/main.rs @@ -0,0 +1,4 @@ +mod auth; +mod helpers; +mod session; +mod users; diff --git a/auth/tests/api/session.rs b/auth/tests/api/session.rs new file mode 100644 index 000000000..aa07e8bdd --- /dev/null +++ b/auth/tests/api/session.rs @@ -0,0 +1,94 @@ +use axum_extra::extract::cookie::{self, Cookie}; +use http::{Request, StatusCode}; +use hyper::Body; +use serde_json::{json, Value}; +use shuttle_common::backends::auth::Claim; + +use crate::helpers::app; + +#[tokio::test] +async fn session_flow() { + let app = app().await; + + // Create test user + let response = app.post_user("session-user", "basic").await; + + assert_eq!(response.status(), StatusCode::OK); + + // POST user login + let body = serde_json::to_vec(&json! ({"account_name": "session-user"})).unwrap(); + let request = Request::builder() + .uri("/login") + .method("POST") + .header("Content-Type", "application/json") + .body(Body::from(body)) + .unwrap(); + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::OK); + + let cookie = response + .headers() + .get("set-cookie") + .unwrap() + .to_str() + .unwrap(); + + let cookie = Cookie::parse(cookie).unwrap(); + + assert_eq!(cookie.http_only(), Some(true)); + assert_eq!(cookie.same_site(), Some(cookie::SameSite::Strict)); + assert_eq!(cookie.secure(), Some(true)); + + // Test converting the cookie to a JWT + let request = Request::builder() + .uri("/auth/session") + .method("GET") + .header("Cookie", cookie.stripped().to_string()) + .body(Body::empty()) + .unwrap(); + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::OK); + + let body = hyper::body::to_bytes(response.into_body()).await.unwrap(); + let convert: Value = serde_json::from_slice(&body).unwrap(); + let token = convert["token"].as_str().unwrap(); + + let request = Request::builder() + .uri("/public-key") + .method("GET") + .body(Body::empty()) + .unwrap(); + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::OK); + + let public_key = hyper::body::to_bytes(response.into_body()).await.unwrap(); + + let claim = Claim::from_token(token, &public_key).unwrap(); + + assert_eq!(claim.sub, "session-user"); + + // POST user logout + let request = Request::builder() + .uri("/logout") + .method("POST") + .header("Cookie", cookie.stripped().to_string()) + .body(Body::empty()) + .unwrap(); + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::OK); + + // Test cookie can no longer be converted to JWT + let request = Request::builder() + .uri("/auth/session") + .method("GET") + .header("Cookie", cookie.stripped().to_string()) + .body(Body::empty()) + .unwrap(); + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); +} diff --git a/auth/tests/api/users.rs b/auth/tests/api/users.rs new file mode 100644 index 000000000..13853a930 --- /dev/null +++ b/auth/tests/api/users.rs @@ -0,0 +1,105 @@ +use crate::helpers::app; +use axum::body::Body; +use hyper::http::{header::AUTHORIZATION, Request, StatusCode}; +use serde_json::{self, Value}; + +#[tokio::test] +async fn post_user() { + let app = app().await; + + // POST user without bearer token. + let request = Request::builder() + .uri("/users/test-user/basic") + .method("POST") + .body(Body::empty()) + .unwrap(); + + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + + // POST user with invalid bearer token. + let request = Request::builder() + .uri("/users/test-user/basic") + .method("POST") + .header(AUTHORIZATION, "Bearer notadmin") + .body(Body::empty()) + .unwrap(); + + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + + // POST user with valid bearer token and basic tier. + let response = app.post_user("test-user", "basic").await; + + assert_eq!(response.status(), StatusCode::OK); + + let body = hyper::body::to_bytes(response.into_body()).await.unwrap(); + let user: Value = serde_json::from_slice(&body).unwrap(); + + assert_eq!(user["name"], "test-user"); + assert_eq!(user["account_tier"], "basic"); + assert!(user["key"].to_string().is_ascii()); + + // POST user with valid bearer token and pro tier. + let response = app.post_user("pro-user", "pro").await; + + assert_eq!(response.status(), StatusCode::OK); + + let body = hyper::body::to_bytes(response.into_body()).await.unwrap(); + let user: Value = serde_json::from_slice(&body).unwrap(); + + assert_eq!(user["name"], "pro-user"); + assert_eq!(user["account_tier"], "pro"); + assert!(user["key"].to_string().is_ascii()); +} + +#[tokio::test] +async fn get_user() { + let app = app().await; + + // POST user first so one exists in the database. + let response = app.post_user("test-user", "basic").await; + + assert_eq!(response.status(), StatusCode::OK); + + let body = hyper::body::to_bytes(response.into_body()).await.unwrap(); + let user: Value = serde_json::from_slice(&body).unwrap(); + + // GET user without bearer token. + let request = Request::builder() + .uri("/users/test-user") + .body(Body::empty()) + .unwrap(); + + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + + // GET user with invalid bearer token. + let request = Request::builder() + .uri("/users/test-user") + .header(AUTHORIZATION, "Bearer notadmin") + .body(Body::empty()) + .unwrap(); + + let response = app.send_request(request).await; + + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + + // GET user that doesn't exist with valid bearer token. + let response = app.get_user("not-test-user").await; + + assert_eq!(response.status(), StatusCode::NOT_FOUND); + + // GET user with valid bearer token. + let response = app.get_user("test-user").await; + + assert_eq!(response.status(), StatusCode::OK); + + let body = hyper::body::to_bytes(response.into_body()).await.unwrap(); + let persisted_user: Value = serde_json::from_slice(&body).unwrap(); + + assert_eq!(user, persisted_user); +} diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index ad2036b91..d053b2860 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -1,8 +1,9 @@ [package] name = "cargo-shuttle" -version = "0.8.1" +version = "0.11.2" edition.workspace = true license.workspace = true +repository.workspace = true description = "A cargo command for the shuttle platform (https://www.shuttle.rs/)" homepage = "https://www.shuttle.rs" @@ -15,8 +16,8 @@ cargo = "0.65.0" cargo-edit = { version = "0.11.6", features = ["cli"] } cargo_metadata = "0.15.2" chrono = { workspace = true } -clap = { version = "3.2.17", features = ["derive", "env"] } -clap_complete = "3.2.5" +clap = { workspace = true, features = ["env"] } +clap_complete = "4.0.7" crossbeam-channel = "0.5.6" crossterm = "0.25.0" dialoguer = { version = "0.10.2", features = ["fuzzy-select"] } @@ -25,20 +26,23 @@ flate2 = "1.0.25" futures = "0.3.25" git2 = "0.14.2" home = "0.5.4" -headers = "0.3.8" +headers = { workspace = true } indicatif = "0.17.2" ignore = "0.4.18" indoc = "1.0.7" log = "0.4.17" openssl = { version = '0.10', optional = true } -portpicker = "0.1.1" +portpicker = { workspace = true } reqwest = { version = "0.11.13", features = ["json"] } reqwest-middleware = "0.2.0" reqwest-retry = "0.2.0" serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } -sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } -strum = { version = "0.24.1", features = ["derive"] } +sqlx = { version = "0.6.2", features = [ + "runtime-tokio-native-tls", + "postgres", +] } +strum = { workspace = true } tar = "0.4.38" tokio = { version = "1.22.0", features = ["macros"] } tokio-tungstenite = { version = "0.17.2", features = ["native-tls"] } @@ -53,13 +57,13 @@ webbrowser = "0.8.2" [dependencies.shuttle-common] workspace = true -features= ["models"] +features = ["models"] [dependencies.shuttle-proto] workspace = true [dependencies.shuttle-secrets] -version = "0.8.0" +version = "0.11.0" path = "../resources/secrets" [dependencies.shuttle-service] diff --git a/cargo-shuttle/README.md b/cargo-shuttle/README.md index 8a4d3ff2c..ae1da5f10 100644 --- a/cargo-shuttle/README.md +++ b/cargo-shuttle/README.md @@ -1,18 +1,24 @@ +
    # cargo-shuttle

    + + docs + language - - build status + + build status discord

    + + `cargo-shuttle` is your commandline tool for deploying web apps on [shuttle](https://www.shuttle.rs/), the stateful serverless web platform for Rust. @@ -26,62 +32,65 @@ --- - -

    Installation

    -
    + +

    Installation

    `cargo-shuttle` is available for macOS, Linux, and Windows. To install the commandline tool, run: -```sh -$ cargo install cargo-shuttle +```bash +cargo install cargo-shuttle ``` --- - -

    Subcommands

    -
    + +

    Subcommands

    `cargo-shuttle`'s subcommands help you build and deploy web apps from start to finish. -Run `cargo-shuttle --help` to see the basic usage: - -``` -USAGE: - cargo-shuttle [OPTIONS] - -OPTIONS: - --api-url run this command against the api at the supplied url (allows targeting a custom deployed instance for this command only) [env: SHUTTLE_API=] - -h, --help Print help information - --name Specify the name of the project (overrides crate name) - -V, --version Print version information - --working-directory Specify the working directory [default: .] - -SUBCOMMANDS: - auth create user credentials for the shuttle platform - delete delete this shuttle service - deploy deploy a shuttle service - deployment manage deployments of a shuttle service - help Print this message or the help of the given subcommand(s) - init create a new shuttle service - login login to the shuttle platform - logs view the logs of a deployment in this shuttle service - run run a shuttle service locally - status view the status of a shuttle service +Run `cargo shuttle help` to see the basic usage: + +```text +Usage: cargo-shuttle [OPTIONS] + +Commands: + deploy deploy a shuttle service + deployment manage deployments of a shuttle service + init create a new shuttle service + generate generate shell completions + status view the status of a shuttle service + logs view the logs of a deployment in this shuttle service + clean remove artifacts that were generated by cargo + stop stop this shuttle service + secrets manage secrets for this shuttle service + login login to the shuttle platform + logout log out of the shuttle platform + run run a shuttle service locally + feedback Open an issue on github and provide feedback + project manage a project on shuttle + help Print this message or the help of the given subcommand(s) + +Options: + --api-url run this command against the api at the supplied url (allows targeting a custom deployed instance for this command only) [env: SHUTTLE_API=] + --working-directory Specify the working directory [default: .] + --name Specify the name of the project (overrides crate name) + -h, --help Print help + -V, --version Print version ``` ### Subcommand: `init` -To initialize a shuttle project with boilerplates, run `cargo shuttle init [OPTIONS] [PATH]`. +To initialize a shuttle project with boilerplates, run `cargo shuttle init [OPTIONS] [PATH]`. Currently, `cargo shuttle init` supports the following frameworks: -- `--axum`: for [axum](https://github.com/tokio-rs/axum) framework - `--actix-web`: for [actix web](https://actix.rs/) framework +- `--axum`: for [axum](https://github.com/tokio-rs/axum) framework - `--poem`: for [poem](https://github.com/poem-web/poem) framework +- `--poise`: for [poise](https://github.com/serenity-rs/poise) discord bot framework - `--rocket`: for [rocket](https://rocket.rs/) framework - `--salvo`: for [salvo](https://salvo.rs/) framework -- `--serenity`: for [serenity](https://serenity.rs/) discord bot framework +- `--serenity`: for [serenity](https://github.com/serenity-rs/serenity) discord bot framework - `--thruster`: for [thruster](https://github.com/thruster-rs/Thruster) framework - `--tide`: for [tide](https://github.com/http-rs/tide) framework - `--tower`: for [tower](https://github.com/tower-rs/tower) library @@ -90,12 +99,13 @@ Currently, `cargo shuttle init` supports the following frameworks: For example, running the following command will initialize a project for [rocket](https://rocket.rs/): ```sh -$ cargo shuttle init --rocket my-rocket-app +cargo shuttle init --rocket my-rocket-app ``` This should generate the following dependency in `Cargo.toml`: + ```toml -shuttle-service = { version = "0.8.0", features = ["web-rocket"] } +shuttle-service = { version = "0.11.0", features = ["web-rocket"] } ``` The following boilerplate code should be generated into `src/lib.rs`: @@ -104,16 +114,14 @@ The following boilerplate code should be generated into `src/lib.rs`: #[macro_use] extern crate rocket; -use shuttle_service::ShuttleRocket; - -#[get("/hello")] -fn hello() -> &'static str { +#[get("/")] +fn index() -> &'static str { "Hello, world!" } #[shuttle_service::main] -async fn init() -> ShuttleRocket { - let rocket = rocket::build().mount("/", routes![hello]); +async fn rocket() -> shuttle_service::ShuttleRocket { + let rocket = rocket::build().mount("/hello", routes![index]); Ok(rocket) } @@ -125,7 +133,7 @@ To run the shuttle project locally, use the following command: ```sh # Inside your shuttle project -$ cargo shuttle run +cargo shuttle run ``` This will compile your shuttle project and start it on the default port `8000`. Test it by: @@ -141,13 +149,13 @@ Use `cargo shuttle login` inside your shuttle project to generate an API key for ```sh # Inside a shuttle project -$ cargo shuttle login +cargo shuttle login ``` This should automatically open a browser window with an auto-generated API key for your project. Simply copy-paste the API key back in your terminal or run the following command to complete login: ```sh -$ cargo shuttle login --api-key your-api-key-from-browser +cargo shuttle login --api-key ``` ### Subcommand: `deploy` @@ -155,8 +163,8 @@ $ cargo shuttle login --api-key your-api-key-from-browser To deploy your shuttle project to the cloud, run: ```sh -$ cargo shuttle project new -$ cargo shuttle deploy +cargo shuttle project new +cargo shuttle deploy ``` Your service will immediately be available at `{crate_name}.shuttleapp.rs`. For instance: @@ -171,7 +179,7 @@ Hello, world! Check the status of your deployed shuttle project with: ```sh -$ cargo shuttle status +cargo shuttle status ``` ### Subcommand: `logs` @@ -179,22 +187,21 @@ $ cargo shuttle status Check the logs of your deployed shuttle project with: ```sh -$ cargo shuttle logs +cargo shuttle logs ``` -### Subcommand: `delete` +### Subcommand: `stop` -Once you are done with a deployment, you can delete it by running: +Once you are done with a deployment, you can stop it by running: ```sh -$ cargo shuttle delete +cargo shuttle stop ``` --- - -

    Development

    -
    + +

    Development

    Thanks for using `cargo-shuttle`! We’re very happy to have you with us! diff --git a/cargo-shuttle/src/args.rs b/cargo-shuttle/src/args.rs index e7f0d8d59..fb1347198 100644 --- a/cargo-shuttle/src/args.rs +++ b/cargo-shuttle/src/args.rs @@ -1,36 +1,37 @@ use std::{ - ffi::OsStr, + ffi::OsString, fs::{canonicalize, create_dir_all}, io::{self, ErrorKind}, path::PathBuf, }; +use clap::builder::{OsStringValueParser, PossibleValue, TypedValueParser}; use clap::Parser; use clap_complete::Shell; -use shuttle_common::project::ProjectName; +use shuttle_common::{models::project::IDLE_MINUTES, project::ProjectName}; use uuid::Uuid; use crate::init::Framework; #[derive(Parser)] -#[clap( +#[command( version, about, // Cargo passes in the subcommand name to the invoked executable. Use a // hidden, optional positional argument to deal with it. - arg(clap::Arg::with_name("dummy") - .possible_value("shuttle") + arg(clap::Arg::new("dummy") + .value_parser([PossibleValue::new("shuttle")]) .required(false) - .hidden(true)) + .hide(true)) )] pub struct Args { /// run this command against the api at the supplied url /// (allows targeting a custom deployed instance for this command only) - #[clap(long, env = "SHUTTLE_API")] + #[arg(long, env = "SHUTTLE_API")] pub api_url: Option, - #[clap(flatten)] + #[command(flatten)] pub project_args: ProjectArgs, - #[clap(subcommand)] + #[command(subcommand)] pub cmd: Command, } @@ -38,15 +39,10 @@ pub struct Args { #[derive(Parser, Debug)] pub struct ProjectArgs { /// Specify the working directory - #[clap( - global = true, - long, - parse(try_from_os_str = parse_path), - default_value = ".", - )] + #[arg(global = true, long, default_value = ".", value_parser = OsStringValueParser::new().try_map(parse_path))] pub working_directory: PathBuf, /// Specify the name of the project (overrides crate name) - #[clap(global = true, long)] + #[arg(global = true, long)] pub name: Option, } @@ -55,17 +51,17 @@ pub enum Command { /// deploy a shuttle service Deploy(DeployArgs), /// manage deployments of a shuttle service - #[clap(subcommand)] + #[command(subcommand)] Deployment(DeploymentCommand), /// create a new shuttle service Init(InitArgs), /// generate shell completions Generate { /// which shell - #[clap(short, long, env, default_value_t = Shell::Bash)] + #[arg(short, long, env, default_value_t = Shell::Bash)] shell: Shell, /// output to file or stdout by default - #[clap(short, long, env)] + #[arg(short, long, env)] output: Option, }, /// view the status of a shuttle service @@ -75,22 +71,26 @@ pub enum Command { /// Deployment ID to get logs for. Defaults to currently running deployment id: Option, - #[clap(short, long)] + #[arg(short, long)] /// Follow log output follow: bool, }, /// remove artifacts that were generated by cargo Clean, - /// delete this shuttle service - Delete, + /// stop this shuttle service + Stop, /// manage secrets for this shuttle service Secrets, /// login to the shuttle platform Login(LoginArgs), + /// log out of the shuttle platform + Logout, /// run a shuttle service locally Run(RunArgs), + /// Open an issue on github and provide feedback. + Feedback, /// manage a project on shuttle - #[clap(subcommand)] + #[command(subcommand)] Project(ProjectCommand), } @@ -108,14 +108,22 @@ pub enum DeploymentCommand { #[derive(Parser)] pub enum ProjectCommand { /// create an environment for this project on shuttle - New, + New { + #[arg(long, default_value_t = IDLE_MINUTES)] + /// How long to wait before putting the project in an idle state due to inactivity. 0 means the project will never idle + idle_minutes: u64, + }, /// list all projects belonging to the calling account - List, + List { + #[arg(long)] + /// Return projects filtered by a given project status + filter: Option, + }, /// remove this project environment from shuttle Rm, /// show the status of this project's environment on shuttle Status { - #[clap(short, long)] + #[arg(short, long)] /// Follow status of project command follow: bool, }, @@ -124,78 +132,78 @@ pub enum ProjectCommand { #[derive(Parser, Clone, Debug)] pub struct LoginArgs { /// api key for the shuttle platform - #[clap(long)] + #[arg(long)] pub api_key: Option, } #[derive(Parser)] pub struct DeployArgs { /// allow dirty working directories to be packaged - #[clap(long)] + #[arg(long)] pub allow_dirty: bool, /// allows pre-deploy tests to be skipped - #[clap(long)] + #[arg(long)] pub no_test: bool, } #[derive(Parser, Debug)] pub struct RunArgs { /// port to start service on - #[clap(long, default_value = "8000")] + #[arg(long, env, default_value = "8000")] pub port: u16, /// use 0.0.0.0 instead of localhost (for usage with local external devices) - #[clap(long)] + #[arg(long)] pub external: bool, + /// Use release mode for building the project. + #[arg(long, short = 'r')] + pub release: bool, } #[derive(Parser, Debug)] pub struct InitArgs { /// Initialize with actix-web framework - #[clap(long="actix-web", conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] + #[arg(long="actix_web", conflicts_with_all = &["axum", "rocket", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no_framework"])] pub actix_web: bool, /// Initialize with axum framework - #[clap(long, conflicts_with_all = &["actix-web","rocket", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","rocket", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no_framework"])] pub axum: bool, /// Initialize with rocket framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "tide", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no_framework"])] pub rocket: bool, /// Initialize with tide framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "rocket", "tower", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no_framework"])] pub tide: bool, /// Initialize with tower framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "rocket", "tide", "poem", "serenity", "poise", "warp", "salvo", "thruster", "no_framework"])] pub tower: bool, /// Initialize with poem framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "serenity", "poise", "warp", "salvo", "thruster", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "rocket", "tide", "tower", "serenity", "poise", "warp", "salvo", "thruster", "no_framework"])] pub poem: bool, /// Initialize with salvo framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "poise", "thruster", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "poise", "thruster", "no_framework"])] pub salvo: bool, /// Initialize with serenity framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "poise", "salvo", "thruster", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "rocket", "tide", "tower", "poem", "warp", "poise", "salvo", "thruster", "no_framework"])] pub serenity: bool, /// Initialize with poise framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "salvo", "thruster", "no-framework"])] + #[clap(long, conflicts_with_all = &["actix_web","axum", "rocket", "tide", "tower", "poem", "warp", "serenity", "salvo", "thruster", "no_framework"])] pub poise: bool, /// Initialize with warp framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "serenity", "poise", "salvo", "thruster", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "rocket", "tide", "tower", "poem", "serenity", "poise", "salvo", "thruster", "no_framework"])] pub warp: bool, /// Initialize with thruster framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "poise", "no-framework"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "poise", "no_framework"])] pub thruster: bool, /// Initialize without a framework - #[clap(long, conflicts_with_all = &["actix-web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "poise", "thruster"])] + #[arg(long, conflicts_with_all = &["actix_web","axum", "rocket", "tide", "tower", "poem", "warp", "salvo", "serenity", "poise", "thruster"])] pub no_framework: bool, /// Whether to create the environment for this project on Shuttle - #[clap(long)] + #[arg(long)] pub new: bool, - #[clap(flatten)] + #[command(flatten)] pub login_args: LoginArgs, /// Path to initialize a new shuttle project - #[clap( - parse(try_from_os_str = parse_init_path), - default_value = ".", - )] + #[arg(default_value = ".", value_parser = OsStringValueParser::new().try_map(parse_path) )] pub path: PathBuf, } @@ -232,21 +240,21 @@ impl InitArgs { } // Helper function to parse and return the absolute path -fn parse_path(path: &OsStr) -> Result { - canonicalize(path).map_err(|e| { - io::Error::new( - ErrorKind::InvalidInput, - format!("could not turn {path:?} into a real path: {e}"), - ) - }) +fn parse_path(path: OsString) -> Result { + canonicalize(&path).map_err(|e| format!("could not turn {path:?} into a real path: {e}")) } // Helper function to parse, create if not exists, and return the absolute path -pub(crate) fn parse_init_path(path: &OsStr) -> Result { +pub(crate) fn parse_init_path(path: OsString) -> Result { // Create the directory if does not exist - create_dir_all(path)?; + create_dir_all(&path)?; - parse_path(path) + parse_path(path.clone()).map_err(|e| { + io::Error::new( + ErrorKind::InvalidInput, + format!("could not turn {path:?} into a real path: {e}"), + ) + }) } #[cfg(test)] diff --git a/cargo-shuttle/src/client.rs b/cargo-shuttle/src/client.rs index 3a7e98263..28ded40ee 100644 --- a/cargo-shuttle/src/client.rs +++ b/cargo-shuttle/src/client.rs @@ -2,11 +2,11 @@ use std::fmt::Write; use anyhow::{Context, Result}; use headers::{Authorization, HeaderMapExt}; -use reqwest::{Body, Response}; +use reqwest::Response; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware, RequestBuilder}; use reqwest_retry::policies::ExponentialBackoff; use reqwest_retry::RetryTransientMiddleware; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use shuttle_common::models::{deployment, project, secret, service, ToJson}; use shuttle_common::project::ProjectName; use shuttle_common::{ApiKey, ApiUrl, LogItem}; @@ -49,14 +49,23 @@ impl Client { let _ = write!(path, "?no-test"); } - self.post(path, Some(data)) + let url = format!("{}{}", self.api_url, path); + + let mut builder = Self::get_retry_client().post(url); + + builder = self.set_builder_auth(builder); + + builder + .body(data) + .header("Transfer-Encoding", "chunked") + .send() .await .context("failed to send deployment to the Shuttle server")? .to_json() .await } - pub async fn delete_service(&self, project: &ProjectName) -> Result { + pub async fn stop_service(&self, project: &ProjectName) -> Result { let path = format!( "/projects/{}/services/{}", project.as_str(), @@ -86,10 +95,14 @@ impl Client { self.get(path).await } - pub async fn create_project(&self, project: &ProjectName) -> Result { + pub async fn create_project( + &self, + project: &ProjectName, + config: project::Config, + ) -> Result { let path = format!("/projects/{}", project.as_str()); - self.post(path, Option::::None) + self.post(path, Some(config)) .await .context("failed to make create project request")? .to_json() @@ -118,6 +131,15 @@ impl Client { self.get(path).await } + pub async fn get_projects_list_filtered( + &self, + filter: String, + ) -> Result> { + let path = format!("/projects/{filter}"); + + self.get(path).await + } + pub async fn delete_project(&self, project: &ProjectName) -> Result { let path = format!("/projects/{}", project.as_str()); @@ -212,11 +234,7 @@ impl Client { .await } - async fn post>( - &self, - path: String, - body: Option, - ) -> Result { + async fn post(&self, path: String, body: Option) -> Result { let url = format!("{}{}", self.api_url, path); let mut builder = Self::get_retry_client().post(url); @@ -224,11 +242,12 @@ impl Client { builder = self.set_builder_auth(builder); if let Some(body) = body { + let body = serde_json::to_string(&body)?; builder = builder.body(body); - builder = builder.header("Transfer-Encoding", "chunked"); + builder = builder.header("Content-Type", "application/json"); } - builder.send().await + Ok(builder.send().await?) } async fn delete(&self, path: String) -> Result diff --git a/cargo-shuttle/src/config.rs b/cargo-shuttle/src/config.rs index a364455b3..74488eebf 100644 --- a/cargo-shuttle/src/config.rs +++ b/cargo-shuttle/src/config.rs @@ -136,6 +136,10 @@ impl GlobalConfig { self.api_key.replace(api_key) } + pub fn clear_api_key(&mut self) { + self.api_key = None; + } + pub fn api_url(&self) -> Option { self.api_url.clone() } @@ -375,6 +379,11 @@ impl RequestContext { Ok(res) } + pub fn clear_api_key(&mut self) -> Result<()> { + self.global.as_mut().unwrap().clear_api_key(); + self.global.save()?; + Ok(()) + } /// Get the current project name. /// /// # Panics diff --git a/cargo-shuttle/src/init.rs b/cargo-shuttle/src/init.rs index b36c1c52c..0ebf76822 100644 --- a/cargo-shuttle/src/init.rs +++ b/cargo-shuttle/src/init.rs @@ -504,47 +504,47 @@ impl ShuttleInit for ShuttleInitPoise { fn get_boilerplate_code_for_framework(&self) -> &'static str { indoc! {r#" use anyhow::Context as _; - use poise::serenity_prelude as serenity; - use shuttle_secrets::SecretStore; - use shuttle_service::ShuttlePoise; - - struct Data {} // User data, which is stored and accessible in all command invocations - type Error = Box; - type Context<'a> = poise::Context<'a, Data, Error>; - - /// Responds with "world!" - #[poise::command(slash_command)] - async fn hello(ctx: Context<'_>) -> Result<(), Error> { - ctx.say("world!").await?; - Ok(()) - } - - #[shuttle_service::main] - async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { - // Get the discord token set in `Secrets.toml` - let discord_token = secret_store - .get("DISCORD_TOKEN") - .context("'DISCORD_TOKEN' was not found")?; - - let framework = poise::Framework::builder() - .options(poise::FrameworkOptions { - commands: vec![hello()], - ..Default::default() + use poise::serenity_prelude as serenity; + use shuttle_secrets::SecretStore; + use shuttle_service::ShuttlePoise; + + struct Data {} // User data, which is stored and accessible in all command invocations + type Error = Box; + type Context<'a> = poise::Context<'a, Data, Error>; + + /// Responds with "world!" + #[poise::command(slash_command)] + async fn hello(ctx: Context<'_>) -> Result<(), Error> { + ctx.say("world!").await?; + Ok(()) + } + + #[shuttle_service::main] + async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { + // Get the discord token set in `Secrets.toml` + let discord_token = secret_store + .get("DISCORD_TOKEN") + .context("'DISCORD_TOKEN' was not found")?; + + let framework = poise::Framework::builder() + .options(poise::FrameworkOptions { + commands: vec![hello()], + ..Default::default() + }) + .token(discord_token) + .intents(serenity::GatewayIntents::non_privileged()) + .setup(|ctx, _ready, framework| { + Box::pin(async move { + poise::builtins::register_globally(ctx, &framework.options().commands).await?; + Ok(Data {}) }) - .token(discord_token) - .intents(serenity::GatewayIntents::non_privileged()) - .setup(|ctx, _ready, framework| { - Box::pin(async move { - poise::builtins::register_globally(ctx, &framework.options().commands).await?; - Ok(Data {}) - }) - }) - .build() - .await - .map_err(shuttle_service::error::CustomError::new)?; + }) + .build() + .await + .map_err(shuttle_service::error::CustomError::new)?; - Ok(framework) - }"#} + Ok(framework) + }"#} } } diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index d487d72ab..4890433cd 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -5,15 +5,18 @@ mod init; mod provisioner_server; use cargo::util::ToSemver; +use indicatif::ProgressBar; +use shuttle_common::models::project::{State, IDLE_MINUTES}; use shuttle_common::project::ProjectName; use shuttle_proto::runtime::{self, LoadRequest, StartRequest, SubscribeLogsRequest}; + use std::collections::HashMap; -use std::convert::TryInto; use std::ffi::OsString; use std::fs::{read_to_string, File}; use std::io::stdout; use std::net::{Ipv4Addr, SocketAddr}; use std::path::{Path, PathBuf}; +use std::str::FromStr; use anyhow::{anyhow, bail, Context, Result}; pub use args::{Args, Command, DeployArgs, InitArgs, LoginArgs, ProjectArgs, RunArgs}; @@ -61,7 +64,7 @@ impl Shuttle { Command::Deploy(..) | Command::Deployment(..) | Command::Project(..) - | Command::Delete + | Command::Stop | Command::Clean | Command::Secrets | Command::Status @@ -77,6 +80,8 @@ impl Shuttle { Command::Init(init_args) => self.init(init_args, args.project_args).await, Command::Generate { shell, output } => self.complete(shell, output).await, Command::Login(login_args) => self.login(login_args).await, + Command::Logout => self.logout().await, + Command::Feedback => self.feedback().await, Command::Run(run_args) => self.local_run(run_args).await, need_client => { let mut client = Client::new(self.ctx.api_url()); @@ -94,14 +99,18 @@ impl Shuttle { Command::Deployment(DeploymentCommand::Status { id }) => { self.deployment_get(&client, id).await } - Command::Delete => self.delete(&client).await, + Command::Stop => self.stop(&client).await, Command::Clean => self.clean(&client).await, Command::Secrets => self.secrets(&client).await, - Command::Project(ProjectCommand::New) => self.project_create(&client).await, + Command::Project(ProjectCommand::New { idle_minutes }) => { + self.project_create(&client, idle_minutes).await + } Command::Project(ProjectCommand::Status { follow }) => { self.project_status(&client, follow).await } - Command::Project(ProjectCommand::List) => self.projects_list(&client).await, + Command::Project(ProjectCommand::List { filter }) => { + self.projects_list(&client, filter).await + } Command::Project(ProjectCommand::Rm) => self.project_delete(&client).await, _ => { unreachable!("commands that don't need a client have already been matched") @@ -154,7 +163,7 @@ impl Shuttle { .default(".".to_owned()) .interact()?; println!(); - args::parse_init_path(&OsString::from(directory_str))? + args::parse_init_path(OsString::from(directory_str))? } else { args.path.clone() }; @@ -204,7 +213,7 @@ impl Shuttle { self.load_project(&mut project_args)?; let mut client = Client::new(self.ctx.api_url()); client.set_api_key(self.ctx.api_key()?); - self.project_create(&client).await?; + self.project_create(&client, IDLE_MINUTES).await?; } Ok(()) @@ -229,6 +238,15 @@ impl Shuttle { self.ctx.load_local(project_args) } + /// Provide feedback on GitHub. + async fn feedback(&self) -> Result<()> { + let url = "https://github.com/shuttle-hq/shuttle/issues/new"; + let _ = webbrowser::open(url); + + println!("\nIf your browser did not open automatically, go to {url}"); + Ok(()) + } + /// Log in with the given API key or after prompting the user for one. async fn login(&mut self, login_args: LoginArgs) -> Result<()> { let api_key_str = match login_args.api_key { @@ -252,13 +270,35 @@ impl Shuttle { Ok(()) } - async fn delete(&self, client: &Client) -> Result<()> { - let service = client.delete_service(self.ctx.project_name()).await?; + async fn logout(&mut self) -> Result<()> { + self.ctx.clear_api_key()?; + + println!("Successfully logged out of shuttle."); + Ok(()) + } + + async fn stop(&self, client: &Client) -> Result<()> { + let mut service = client.stop_service(self.ctx.project_name()).await?; + + let progress_bar = create_spinner(); + loop { + let Some(ref deployment) = service.deployment else { + break; + }; + + if let shuttle_common::deployment::State::Stopped = deployment.state { + break; + } + + progress_bar.set_message(format!("Stopping {}", deployment.id)); + service = client.get_service_summary(self.ctx.project_name()).await?; + } + progress_bar.finish_and_clear(); println!( r#"{} {}"#, - "Successfully deleted service".bold(), + "Successfully stopped service".bold(), service ); @@ -384,10 +424,15 @@ impl Shuttle { working_directory.display() ); - let runtime = build_crate(working_directory, false, tx).await?; + let runtime = build_crate(working_directory, run_args.release, tx).await?; trace!("loading secrets"); - let secrets_path = working_directory.join("Secrets.toml"); + + let secrets_path = if working_directory.join("Secrets.dev.toml").exists() { + working_directory.join("Secrets.dev.toml") + } else { + working_directory.join("Secrets.toml") + }; let secrets: HashMap = if let Ok(secrets_str) = read_to_string(secrets_path) { @@ -617,10 +662,17 @@ impl Shuttle { } } - async fn project_create(&self, client: &Client) -> Result<()> { + async fn project_create(&self, client: &Client, idle_minutes: u64) -> Result<()> { + let config = project::Config { idle_minutes }; + self.wait_with_spinner( - &[project::State::Ready, project::State::Errored], - Client::create_project, + &[ + project::State::Ready, + project::State::Errored { + message: Default::default(), + }, + ], + client.create_project(self.ctx.project_name(), config), self.ctx.project_name(), client, ) @@ -629,8 +681,20 @@ impl Shuttle { Ok(()) } - async fn projects_list(&self, client: &Client) -> Result<()> { - let projects = client.get_projects_list().await?; + async fn projects_list(&self, client: &Client, filter: Option) -> Result<()> { + let projects = match filter { + Some(filter) => { + if let Ok(filter) = State::from_str(filter.trim()) { + client + .get_projects_list_filtered(filter.to_string()) + .await? + } else { + return Err(anyhow!("That's not a valid project status!")); + } + } + None => client.get_projects_list().await?, + }; + let projects_table = project::get_table(&projects); println!("{projects_table}"); @@ -645,9 +709,11 @@ impl Shuttle { &[ project::State::Ready, project::State::Destroyed, - project::State::Errored, + project::State::Errored { + message: Default::default(), + }, ], - Client::get_project, + client.get_project(self.ctx.project_name()), self.ctx.project_name(), client, ) @@ -662,54 +728,41 @@ impl Shuttle { Ok(()) } - async fn wait_with_spinner<'a, F, Fut>( + async fn wait_with_spinner<'a, Fut>( &self, states_to_check: &[project::State], - f: F, + fut: Fut, project_name: &'a ProjectName, client: &'a Client, ) -> Result<(), anyhow::Error> where - F: Fn(&'a Client, &'a ProjectName) -> Fut, Fut: std::future::Future> + 'a, { - let mut project = f(client, project_name).await?; - let pb = indicatif::ProgressBar::new_spinner(); - pb.enable_steady_tick(std::time::Duration::from_millis(350)); - pb.set_style( - indicatif::ProgressStyle::with_template("{spinner:.orange} {msg}") - .unwrap() - .tick_strings(&[ - "( ● )", - "( ● )", - "( ● )", - "( ● )", - "( ●)", - "( ● )", - "( ● )", - "( ● )", - "( ● )", - "(● )", - "(●●●●●●)", - ]), - ); + let mut project = fut.await?; + + let progress_bar = create_spinner(); loop { if states_to_check.contains(&project.state) { break; } - pb.set_message(format!("{project}")); + progress_bar.set_message(format!("{project}")); project = client.get_project(project_name).await?; } - pb.finish_and_clear(); + progress_bar.finish_and_clear(); println!("{project}"); Ok(()) } async fn project_delete(&self, client: &Client) -> Result<()> { self.wait_with_spinner( - &[project::State::Destroyed, project::State::Errored], - Client::delete_project, + &[ + project::State::Destroyed, + project::State::Errored { + message: Default::default(), + }, + ], + client.delete_project(self.ctx.project_name()), self.ctx.project_name(), client, ) @@ -861,6 +914,30 @@ fn check_version(runtime_path: &Path) -> Result<()> { } } +fn create_spinner() -> ProgressBar { + let pb = indicatif::ProgressBar::new_spinner(); + pb.enable_steady_tick(std::time::Duration::from_millis(350)); + pb.set_style( + indicatif::ProgressStyle::with_template("{spinner:.orange} {msg}") + .unwrap() + .tick_strings(&[ + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "( ●)", + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "(● )", + "(●●●●●●)", + ]), + ); + + pb +} + pub enum CommandOutcome { Ok, DeploymentFailure, diff --git a/cargo-shuttle/src/provisioner_server.rs b/cargo-shuttle/src/provisioner_server.rs index e3640255f..960f6621a 100644 --- a/cargo-shuttle/src/provisioner_server.rs +++ b/cargo-shuttle/src/provisioner_server.rs @@ -17,7 +17,7 @@ use portpicker::pick_unused_port; use shuttle_common::database::{AwsRdsEngine, SharedEngine}; use shuttle_proto::provisioner::{ provisioner_server::{Provisioner, ProvisionerServer}, - DatabaseRequest, DatabaseResponse, + DatabaseDeletionResponse, DatabaseRequest, DatabaseResponse, }; use shuttle_service::database::Type; use std::{collections::HashMap, io::stdout, net::SocketAddr, time::Duration}; @@ -265,6 +265,13 @@ impl Provisioner for LocalProvisioner { Ok(Response::new(res)) } + + async fn delete_database( + &self, + _request: Request, + ) -> Result, Status> { + panic!("local runner should not try to delete databases"); + } } fn print_layers(layers: &Vec) { diff --git a/cargo-shuttle/tests/integration/run.rs b/cargo-shuttle/tests/integration/run.rs index 3207d019c..e11dbe3dd 100644 --- a/cargo-shuttle/tests/integration/run.rs +++ b/cargo-shuttle/tests/integration/run.rs @@ -16,7 +16,11 @@ async fn cargo_shuttle_run(working_directory: &str, external: bool) -> String { format!("http://0.0.0.0:{port}") }; - let run_args = RunArgs { port, external }; + let run_args = RunArgs { + port, + external, + release: false, + }; let runner = Shuttle::new().unwrap().run(Args { api_url: Some("http://shuttle.invalid:80".to_string()), diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index 407b53b5b..faff07977 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -1,8 +1,9 @@ [package] name = "shuttle-codegen" -version = "0.8.0" +version = "0.11.0" edition.workspace = true license.workspace = true +repository.workspace = true description = "Proc-macro code generator for the shuttle.rs service" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 3b73f82a5..771e751cc 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -3,8 +3,8 @@ use proc_macro_error::emit_error; use quote::{quote, ToTokens}; use syn::{ parenthesized, parse::Parse, parse2, parse_macro_input, parse_quote, punctuated::Punctuated, - spanned::Spanned, token::Paren, Attribute, Expr, FnArg, Ident, ItemFn, Pat, PatIdent, Path, - ReturnType, Signature, Stmt, Token, Type, TypePath, + spanned::Spanned, token::Paren, Attribute, Expr, ExprLit, FnArg, Ident, ItemFn, Lit, Pat, + PatIdent, Path, ReturnType, Signature, Stmt, Token, Type, TypePath, }; pub(crate) fn r#impl(_attr: TokenStream, item: TokenStream) -> TokenStream { @@ -79,16 +79,6 @@ impl Parse for BuilderOptions { } } -impl ToTokens for BuilderOptions { - fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { - let (methods, values): (Vec<_>, Vec<_>) = - self.options.iter().map(|o| (&o.ident, &o.value)).unzip(); - let chain = quote!(#(.#methods(#values))*); - - chain.to_tokens(tokens); - } -} - impl Parse for BuilderOption { fn parse(input: syn::parse::ParseStream) -> syn::Result { let ident = input.parse()?; @@ -197,10 +187,33 @@ impl ToTokens for Loader { let mut fn_inputs_builder: Vec<_> = Vec::with_capacity(self.fn_inputs.len()); let mut fn_inputs_builder_options: Vec<_> = Vec::with_capacity(self.fn_inputs.len()); + let mut needs_vars = false; + for input in self.fn_inputs.iter() { fn_inputs.push(&input.ident); fn_inputs_builder.push(&input.builder.path); - fn_inputs_builder_options.push(&input.builder.options); + + let (methods, values): (Vec<_>, Vec<_>) = input + .builder + .options + .options + .iter() + .map(|o| { + let value = match &o.value { + Expr::Lit(ExprLit { + lit: Lit::Str(str), .. + }) => { + needs_vars = true; + quote!(&shuttle_service::strfmt(#str, &vars)?) + } + other => quote!(#other), + }; + + (&o.ident, value) + }) + .unzip(); + let chain = quote!(#(.#methods(#values))*); + fn_inputs_builder_options.push(chain); } let factory_ident: Ident = if self.fn_inputs.is_empty() { @@ -217,6 +230,14 @@ impl ToTokens for Loader { )) }; + let vars: Option = if needs_vars { + Some(parse_quote!( + let vars = std::collections::HashMap::from_iter(factory.get_secrets().await?.into_iter().map(|(key, value)| (format!("secrets.{}", key), value))); + )) + } else { + None + }; + let loader = quote! { async fn loader( mut #factory_ident: shuttle_runtime::ProvisionerFactory, @@ -236,6 +257,7 @@ impl ToTokens for Loader { .with(logger) .init(); + #vars #(let #fn_inputs = #fn_inputs_builder::new()#fn_inputs_builder_options.build(&mut #factory_ident).await.context(format!("failed to provision {}", stringify!(#fn_inputs_builder)))?;)* #fn_ident(#(#fn_inputs),*).await @@ -392,7 +414,8 @@ mod tests { boolean = true, integer = 5, float = 2.65, - enum_variant = SomeEnum::Variant1 + enum_variant = SomeEnum::Variant1, + sensitive = "user:{secrets.password}" )); let mut expected: BuilderOptions = Default::default(); @@ -403,25 +426,11 @@ mod tests { expected .options .push(parse_quote!(enum_variant = SomeEnum::Variant1)); - - assert_eq!(input, expected); - } - - #[test] - fn tokenize_builder_options() { - let mut input: BuilderOptions = Default::default(); - input.options.push(parse_quote!(string = "string_val")); - input.options.push(parse_quote!(boolean = true)); - input.options.push(parse_quote!(integer = 5)); - input.options.push(parse_quote!(float = 2.65)); - input + expected .options - .push(parse_quote!(enum_variant = SomeEnum::Variant1)); - - let actual = quote!(#input); - let expected = quote!(.string("string_val").boolean(true).integer(5).float(2.65).enum_variant(SomeEnum::Variant1)); + .push(parse_quote!(sensitive = "user:{secrets.password}")); - assert_eq!(actual.to_string(), expected.to_string()); + assert_eq!(input, expected); } #[test] @@ -503,7 +512,8 @@ mod tests { .with(logger) .init(); - let pool = shuttle_shared_db::Postgres::new().size("10Gb").public(false).build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; + let vars = std::collections::HashMap::from_iter(factory.get_secrets().await?.into_iter().map(|(key, value)| (format!("secrets.{}", key), value))); + let pool = shuttle_shared_db::Postgres::new().size(&shuttle_service::strfmt("10Gb", &vars)?).public(false).build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; complex(pool).await } diff --git a/common/Cargo.toml b/common/Cargo.toml index 776a21fbd..05b0494b5 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,8 +1,9 @@ [package] name = "shuttle-common" -version.workspace = true +version = "0.11.2" edition.workspace = true license.workspace = true +repository.workspace = true description = "Common library for the shuttle platform (https://www.shuttle.rs/)" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -10,32 +11,54 @@ description = "Common library for the shuttle platform (https://www.shuttle.rs/) anyhow = { workspace = true, optional = true } async-trait = { workspace = true , optional = true } axum = { workspace = true, optional = true } -chrono = { workspace = true } +bytes = { version = "1.3.0", optional = true } +chrono = { workspace = true, features = ["serde"] } comfy-table = { version = "6.1.3", optional = true } crossterm = { version = "0.25.0", optional = true } -http = { version = "0.2.8", optional = true } +headers = { workspace = true } +http = { workspace = true, optional = true } +http-body = { version = "0.4.5", optional = true } http-serde = { version = "1.1.2", optional = true } +hyper = { workspace = true, optional = true } +jsonwebtoken = { workspace = true, optional = true } once_cell = { workspace = true, optional = true } +opentelemetry = { workspace = true, optional = true } +opentelemetry-http = { workspace = true, optional = true } +opentelemetry-otlp = { version = "0.11.0", optional = true } +pin-project = { workspace = true } prost-types = { workspace = true, optional = true } reqwest = { version = "0.11.13", optional = true } rmp-serde = { version = "1.1.1", optional = true } rustrict = { version = "0.5.5", optional = true } serde = { workspace = true } serde_json = { workspace = true, optional = true } -strum = { version = "0.24.1", features = ["derive"], optional = true } +strum = { workspace = true, features = ["derive"], optional = true } thiserror = { workspace = true, optional = true } +tonic = { version = "0.8.3", optional = true } +tower = { workspace = true, optional = true } +tower-http = { workspace = true, optional = true } tracing = { workspace = true } +tracing-opentelemetry = { workspace = true, optional = true } tracing-subscriber = { workspace = true, optional = true } +ttl_cache = { workspace = true, optional = true } uuid = { workspace = true, features = ["v4", "serde"], optional = true } -[dev-dependencies] -cap-std = "1.0.2" -hyper = "0.14.3" - [features] -backend = ["async-trait", "axum"] +backend = ["async-trait", "axum/matched-path", "bytes", "http", "http-body", "hyper/client", "jsonwebtoken", "opentelemetry", "opentelemetry-http", "opentelemetry-otlp", "thiserror", "tower", "tower-http", "tracing-opentelemetry", "tracing-subscriber/env-filter", "tracing-subscriber/fmt", "ttl_cache"] display = ["comfy-table", "crossterm"] -tracing = ["serde_json"] -wasm = ["http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] models = ["anyhow", "async-trait", "display", "http", "prost-types", "reqwest", "serde_json", "service", "thiserror"] service = ["chrono/serde", "once_cell", "rustrict", "serde/derive", "strum", "uuid"] +tracing = ["serde_json"] +wasm = ["http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] + +[dev-dependencies] +axum = { workspace = true } +base64 = "0.13.1" +cap-std = "1.0.2" +hyper = { workspace = true } +ring = { workspace = true } +serde_json = { workspace = true } +tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } +tower = { workspace = true, features = ["util"] } +tracing-fluent-assertions = "0.3.0" +tracing-subscriber = { version = "0.3", default-features = false } diff --git a/common/src/backends/auth.rs b/common/src/backends/auth.rs new file mode 100644 index 000000000..dc293c24b --- /dev/null +++ b/common/src/backends/auth.rs @@ -0,0 +1,821 @@ +use std::{convert::Infallible, future::Future, ops::Add, pin::Pin, sync::Arc}; + +use async_trait::async_trait; +use bytes::Bytes; +use chrono::{Duration, Utc}; +use headers::{authorization::Bearer, Authorization, HeaderMapExt}; +use http::{Request, Response, StatusCode, Uri}; +use http_body::combinators::UnsyncBoxBody; +use hyper::{body, Body, Client}; +use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header as JwtHeader, Validation}; +use opentelemetry::global; +use opentelemetry_http::HeaderInjector; +use serde::{Deserialize, Serialize}; +use thiserror::Error; +use tower::{Layer, Service}; +use tracing::{error, trace, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; + +use super::{ + cache::{CacheManagement, CacheManager}, + future::{ResponseFuture, StatusCodeFuture}, + headers::XShuttleAdminSecret, +}; + +pub const EXP_MINUTES: i64 = 5; +const ISS: &str = "shuttle"; +const PUBLIC_KEY_CACHE_KEY: &str = "shuttle.public-key"; + +/// Layer to check the admin secret set by deployer is correct +#[derive(Clone)] +pub struct AdminSecretLayer { + secret: String, +} + +impl AdminSecretLayer { + pub fn new(secret: String) -> Self { + Self { secret } + } +} + +impl Layer for AdminSecretLayer { + type Service = AdminSecret; + + fn layer(&self, inner: S) -> Self::Service { + AdminSecret { + inner, + secret: self.secret.clone(), + } + } +} + +#[derive(Clone)] +pub struct AdminSecret { + inner: S, + secret: String, +} + +impl Service> for AdminSecret +where + S: Service, Response = Response>> + + Send + + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = StatusCodeFuture; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, req: Request) -> Self::Future { + match req.headers().typed_try_get::() { + Ok(Some(secret)) if secret.0 == self.secret => { + let future = self.inner.call(req); + + StatusCodeFuture::Poll(future) + } + Ok(_) => StatusCodeFuture::Code(StatusCode::UNAUTHORIZED), + Err(_) => StatusCodeFuture::Code(StatusCode::BAD_REQUEST), + } + } +} + +/// The scope of operations that can be performed on shuttle +/// Every scope defaults to read and will use a suffix for updating tasks +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum Scope { + /// Read the details, such as status and address, of a deployment + Deployment, + + /// Push a new deployment + DeploymentPush, + + /// Read the logs of a deployment + Logs, + + /// Read the details of a service + Service, + + /// Create a new service + ServiceCreate, + + /// Read the status of a project + Project, + + /// Create a new project + ProjectCreate, + + /// Get the resources for a project + Resources, + + /// Provision new resources for a project or update existing ones + ResourcesWrite, + + /// List the secrets of a project + Secret, + + /// Add or update secrets of a project + SecretWrite, + + /// Get list of users + User, + + /// Add or update users + UserCreate, + + /// Create an ACME account + AcmeCreate, + + /// Create a custom domain, + CustomDomainCreate, + + /// Admin level scope to internals + Admin, +} + +#[derive(Deserialize, Serialize)] +/// Response used internally to pass around JWT token +pub struct ConvertResponse { + pub token: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] +pub struct Claim { + /// Expiration time (as UTC timestamp). + pub exp: usize, + /// Issued at (as UTC timestamp). + iat: usize, + /// Issuer. + iss: String, + /// Not Before (as UTC timestamp). + nbf: usize, + /// Subject (whom token refers to). + pub sub: String, + /// Scopes this token can access + pub scopes: Vec, + /// The original token that was parsed + token: Option, +} + +impl Claim { + /// Create a new claim for a user with the given scopes + pub fn new(sub: String, scopes: Vec) -> Self { + let iat = Utc::now(); + let exp = iat.add(Duration::minutes(EXP_MINUTES)); + + Self { + exp: exp.timestamp() as usize, + iat: iat.timestamp() as usize, + iss: ISS.to_string(), + nbf: iat.timestamp() as usize, + sub, + scopes, + token: None, + } + } + + pub fn into_token(self, encoding_key: &EncodingKey) -> Result { + if let Some(token) = self.token { + Ok(token) + } else { + encode( + &JwtHeader::new(jsonwebtoken::Algorithm::EdDSA), + &self, + encoding_key, + ) + .map_err(|err| { + error!( + error = &err as &dyn std::error::Error, + "failed to convert claim to token" + ); + match err.kind() { + jsonwebtoken::errors::ErrorKind::Json(_) => StatusCode::INTERNAL_SERVER_ERROR, + jsonwebtoken::errors::ErrorKind::Crypto(_) => StatusCode::SERVICE_UNAVAILABLE, + _ => StatusCode::INTERNAL_SERVER_ERROR, + } + }) + } + } + + pub fn from_token(token: &str, public_key: &[u8]) -> Result { + let decoding_key = DecodingKey::from_ed_der(public_key); + let mut validation = Validation::new(jsonwebtoken::Algorithm::EdDSA); + validation.set_issuer(&[ISS]); + + trace!(token, "converting token to claim"); + let mut claim: Self = decode(token, &decoding_key, &validation) + .map_err(|err| { + error!( + error = &err as &dyn std::error::Error, + "failed to convert token to claim" + ); + match err.kind() { + jsonwebtoken::errors::ErrorKind::InvalidSignature + | jsonwebtoken::errors::ErrorKind::InvalidAlgorithmName + | jsonwebtoken::errors::ErrorKind::ExpiredSignature + | jsonwebtoken::errors::ErrorKind::InvalidIssuer + | jsonwebtoken::errors::ErrorKind::ImmatureSignature => { + StatusCode::UNAUTHORIZED + } + jsonwebtoken::errors::ErrorKind::InvalidToken + | jsonwebtoken::errors::ErrorKind::InvalidAlgorithm + | jsonwebtoken::errors::ErrorKind::Base64(_) + | jsonwebtoken::errors::ErrorKind::Json(_) + | jsonwebtoken::errors::ErrorKind::Utf8(_) => StatusCode::BAD_REQUEST, + jsonwebtoken::errors::ErrorKind::MissingAlgorithm => { + StatusCode::INTERNAL_SERVER_ERROR + } + jsonwebtoken::errors::ErrorKind::Crypto(_) => StatusCode::SERVICE_UNAVAILABLE, + _ => StatusCode::INTERNAL_SERVER_ERROR, + } + })? + .claims; + + claim.token = Some(token.to_string()); + + Ok(claim) + } +} + +/// Trait to get a public key asynchronously +#[async_trait] +pub trait PublicKeyFn: Send + Sync + Clone { + type Error: std::error::Error + Send; + + async fn public_key(&self) -> Result, Self::Error>; +} + +#[async_trait] +impl PublicKeyFn for F +where + F: Fn() -> O + Sync + Send + Clone, + O: Future> + Send, +{ + type Error = Infallible; + + async fn public_key(&self) -> Result, Self::Error> { + Ok((self)().await) + } +} + +#[derive(Clone)] +pub struct AuthPublicKey { + auth_uri: Uri, + cache_manager: Arc>>>, +} + +impl AuthPublicKey { + pub fn new(auth_uri: Uri) -> Self { + let public_key_cache_manager = CacheManager::new(1); + Self { + auth_uri, + cache_manager: Arc::new(Box::new(public_key_cache_manager)), + } + } +} + +#[async_trait] +impl PublicKeyFn for AuthPublicKey { + type Error = PublicKeyFnError; + + async fn public_key(&self) -> Result, Self::Error> { + if let Some(public_key) = self.cache_manager.get(PUBLIC_KEY_CACHE_KEY) { + trace!("found public key in the cache, returning it"); + + Ok(public_key) + } else { + let client = Client::new(); + let uri: Uri = format!("{}public-key", self.auth_uri).parse()?; + let mut request = Request::builder().uri(uri); + + // Safe to unwrap since we just build it + let headers = request.headers_mut().unwrap(); + + let cx = Span::current().context(); + global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut HeaderInjector(headers)) + }); + + let res = client.request(request.body(Body::empty())?).await?; + let buf = body::to_bytes(res).await?; + + trace!("inserting public key from auth service into cache"); + self.cache_manager.insert( + PUBLIC_KEY_CACHE_KEY, + buf.to_vec(), + std::time::Duration::from_secs(60), + ); + + Ok(buf.to_vec()) + } + } +} + +#[derive(Debug, Error)] +pub enum PublicKeyFnError { + #[error("invalid uri: {0}")] + InvalidUri(#[from] http::uri::InvalidUri), + + #[error("hyper error: {0}")] + Hyper(#[from] hyper::Error), + + #[error("http error: {0}")] + Http(#[from] http::Error), +} + +/// Layer to validate JWT tokens with a public key. Valid claims are added to the request extension +/// +/// It can also be used with tonic. See: +/// https://github.com/hyperium/tonic/blob/master/examples/src/tower/server.rs +#[derive(Clone)] +pub struct JwtAuthenticationLayer { + /// User provided function to get the public key from + public_key_fn: F, +} + +impl JwtAuthenticationLayer { + /// Create a new layer to validate JWT tokens with the given public key + pub fn new(public_key_fn: F) -> Self { + Self { public_key_fn } + } +} + +impl Layer for JwtAuthenticationLayer { + type Service = JwtAuthentication; + + fn layer(&self, inner: S) -> Self::Service { + JwtAuthentication { + inner, + public_key_fn: self.public_key_fn.clone(), + } + } +} + +/// Middleware for validating a valid JWT token is present on "authorization: bearer " +#[derive(Clone)] +pub struct JwtAuthentication { + inner: S, + public_key_fn: F, +} + +impl Service> for JwtAuthentication +where + S: Service, Response = Response>> + + Send + + Clone + + 'static, + S::Future: Send + 'static, + F: PublicKeyFn + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = + Pin> + Send + 'static>>; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, mut req: Request) -> Self::Future { + match req.headers().typed_try_get::>() { + Ok(Some(bearer)) => { + let mut this = self.clone(); + + Box::pin(async move { + match this.public_key_fn.public_key().await { + Ok(public_key) => { + match Claim::from_token(bearer.token().trim(), &public_key) { + Ok(claim) => { + req.extensions_mut().insert(claim); + + this.inner.call(req).await + } + Err(code) => { + error!(code = %code, "failed to decode JWT"); + + Ok(Response::builder() + .status(code) + .body(Default::default()) + .unwrap()) + } + } + } + Err(error) => { + error!( + error = &error as &dyn std::error::Error, + "failed to get public key from auth service" + ); + + Ok(Response::builder() + .status(StatusCode::SERVICE_UNAVAILABLE) + .body(Default::default()) + .unwrap()) + } + } + }) + } + Ok(None) => { + let future = self.inner.call(req); + + Box::pin(async move { future.await }) + } + Err(_) => Box::pin(async move { + Ok(Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Default::default()) + .unwrap()) + }), + } + } +} + +/// This layer takes a claim on a request extension and uses it's internal token to set the Authorization Bearer +#[derive(Clone)] +pub struct ClaimLayer; + +impl Layer for ClaimLayer { + type Service = ClaimService; + + fn layer(&self, inner: S) -> Self::Service { + ClaimService { inner } + } +} + +#[derive(Clone)] +pub struct ClaimService { + inner: S, +} + +impl Service>> for ClaimService +where + S: Service>> + Send + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = ResponseFuture; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, mut req: Request>) -> Self::Future { + if let Some(claim) = req.extensions().get::() { + if let Some(token) = claim.token.clone() { + req.headers_mut() + .typed_insert(Authorization::bearer(&token).expect("to set JWT token")); + } + } + + let future = self.inner.call(req); + + ResponseFuture(future) + } +} + +/// Check that the required scopes are set on the [Claim] extension on a [Request] +#[derive(Clone)] +pub struct ScopedLayer { + required: Vec, +} + +impl ScopedLayer { + /// Scopes required to authenticate a request + pub fn new(required: Vec) -> Self { + Self { required } + } +} + +impl Layer for ScopedLayer { + type Service = Scoped; + + fn layer(&self, inner: S) -> Self::Service { + Scoped { + inner, + required: self.required.clone(), + } + } +} + +#[derive(Clone)] +pub struct Scoped { + inner: S, + required: Vec, +} + +impl Service> for Scoped +where + S: Service, Response = http::Response>> + + Send + + Clone + + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = StatusCodeFuture; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, req: Request) -> Self::Future { + let Some(claim) = req.extensions().get::() else { + error!("claim extension is not set"); + + return StatusCodeFuture::Code(StatusCode::UNAUTHORIZED); + }; + + if self + .required + .iter() + .all(|scope| claim.scopes.contains(scope)) + { + let response_future = self.inner.call(req); + StatusCodeFuture::Poll(response_future) + } else { + StatusCodeFuture::Code(StatusCode::FORBIDDEN) + } + } +} + +#[cfg(test)] +mod tests { + use axum::{routing::get, Extension, Router}; + use http::{Request, StatusCode}; + use hyper::{body, Body}; + use jsonwebtoken::EncodingKey; + use ring::{ + hmac, rand, + signature::{self, Ed25519KeyPair, KeyPair}, + }; + use serde_json::json; + use tower::{ServiceBuilder, ServiceExt}; + + use super::{Claim, JwtAuthenticationLayer, Scope, ScopedLayer}; + + #[test] + fn to_token_and_back() { + let mut claim = Claim::new( + "ferries".to_string(), + vec![Scope::Deployment, Scope::Project], + ); + + let doc = signature::Ed25519KeyPair::generate_pkcs8(&rand::SystemRandom::new()).unwrap(); + let encoding_key = EncodingKey::from_ed_der(doc.as_ref()); + let token = claim.clone().into_token(&encoding_key).unwrap(); + + // Make sure the token is set + claim.token = Some(token.clone()); + + let pair = Ed25519KeyPair::from_pkcs8(doc.as_ref()).unwrap(); + let public_key = pair.public_key().as_ref(); + + let new = Claim::from_token(&token, public_key).unwrap(); + + assert_eq!(claim, new); + } + + #[tokio::test] + async fn authorization_layer() { + let claim = Claim::new( + "ferries".to_string(), + vec![Scope::Deployment, Scope::Project], + ); + + let doc = signature::Ed25519KeyPair::generate_pkcs8(&rand::SystemRandom::new()).unwrap(); + let encoding_key = EncodingKey::from_ed_der(doc.as_ref()); + let pair = Ed25519KeyPair::from_pkcs8(doc.as_ref()).unwrap(); + let public_key = pair.public_key().as_ref().to_vec(); + + let router = + Router::new() + .route( + "/", + get(|Extension(claim): Extension| async move { + format!("Hello, {}", claim.sub) + }), + ) + .layer( + ServiceBuilder::new() + .layer(JwtAuthenticationLayer::new(move || { + let public_key = public_key.clone(); + async move { public_key.clone() } + })) + .layer(ScopedLayer::new(vec![Scope::Project])), + ); + + ////////////////////////////////////////////////////////////////////////// + // Test token missing + ////////////////////////////////////////////////////////////////////////// + let response = router + .clone() + .oneshot(Request::builder().uri("/").body(Body::empty()).unwrap()) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + + ////////////////////////////////////////////////////////////////////////// + // Test bearer missing + ////////////////////////////////////////////////////////////////////////// + let token = claim.clone().into_token(&encoding_key).unwrap(); + let response = router + .clone() + .oneshot( + Request::builder() + .uri("/") + .header("authorization", token.clone()) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + + ////////////////////////////////////////////////////////////////////////// + // Test valid + ////////////////////////////////////////////////////////////////////////// + let response = router + .clone() + .oneshot( + Request::builder() + .uri("/") + .header("authorization", format!("Bearer {token}")) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + + ////////////////////////////////////////////////////////////////////////// + // Test valid extra padding + ////////////////////////////////////////////////////////////////////////// + let response = router + .clone() + .oneshot( + Request::builder() + .uri("/") + .header("Authorization", format!("Bearer {token} ")) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let body = body::to_bytes(response.into_body()).await.unwrap(); + + assert_eq!(&body[..], b"Hello, ferries"); + } + + // Test changing to a symmetric key is not possible + #[test] + #[should_panic(expected = "value: 400")] + fn hack_symmetric_alg() { + let claim = Claim::new( + "hacker-hs256".to_string(), + vec![Scope::Deployment, Scope::Project], + ); + + let doc = signature::Ed25519KeyPair::generate_pkcs8(&rand::SystemRandom::new()).unwrap(); + let encoding_key = EncodingKey::from_ed_der(doc.as_ref()); + let token = claim.into_token(&encoding_key).unwrap(); + + let (header, rest) = token.split_once('.').unwrap(); + let header = base64::decode_config(header, base64::URL_SAFE_NO_PAD).unwrap(); + let mut header: serde_json::Map = + serde_json::from_slice(&header).unwrap(); + + header["alg"] = json!("HS256"); + + let header = serde_json::to_vec(&header).unwrap(); + let header = base64::encode_config(header, base64::URL_SAFE_NO_PAD); + + let (claim, _sig) = rest.split_once('.').unwrap(); + + let msg = format!("{header}.{claim}"); + + let pair = Ed25519KeyPair::from_pkcs8(doc.as_ref()).unwrap(); + let public_key = pair.public_key().as_ref(); + + let sig = hmac::sign( + &hmac::Key::new(hmac::HMAC_SHA256, pair.public_key().as_ref()), + msg.as_bytes(), + ); + let sig = base64::encode_config(sig, base64::URL_SAFE_NO_PAD); + let token = format!("{msg}.{sig}"); + + Claim::from_token(&token, public_key).unwrap(); + } + + // Test removing the alg is not possible + #[test] + #[should_panic(expected = "value: 400")] + fn hack_no_alg() { + let claim = Claim::new( + "hacker-no-alg".to_string(), + vec![Scope::Deployment, Scope::Project], + ); + + let doc = signature::Ed25519KeyPair::generate_pkcs8(&rand::SystemRandom::new()).unwrap(); + let encoding_key = EncodingKey::from_ed_der(doc.as_ref()); + let token = claim.into_token(&encoding_key).unwrap(); + + let (header, rest) = token.split_once('.').unwrap(); + let header = base64::decode_config(header, base64::URL_SAFE_NO_PAD).unwrap(); + let (claim, _sig) = rest.split_once('.').unwrap(); + let mut header: serde_json::Map = + serde_json::from_slice(&header).unwrap(); + + header["alg"] = json!("none"); + + let header = serde_json::to_vec(&header).unwrap(); + let header = base64::encode_config(header, base64::URL_SAFE_NO_PAD); + + let token = format!("{header}.{claim}."); + + let pair = Ed25519KeyPair::from_pkcs8(doc.as_ref()).unwrap(); + let public_key = pair.public_key().as_ref(); + + Claim::from_token(&token, public_key).unwrap(); + } + + // Test removing the signature is not possible + #[test] + #[should_panic(expected = "value: 401")] + fn hack_no_sig() { + let claim = Claim::new( + "hacker-no-sig".to_string(), + vec![Scope::Deployment, Scope::Project], + ); + + let doc = signature::Ed25519KeyPair::generate_pkcs8(&rand::SystemRandom::new()).unwrap(); + let encoding_key = EncodingKey::from_ed_der(doc.as_ref()); + let token = claim.into_token(&encoding_key).unwrap(); + + let (rest, _sig) = token.rsplit_once('.').unwrap(); + + let token = format!("{rest}."); + + let pair = Ed25519KeyPair::from_pkcs8(doc.as_ref()).unwrap(); + let public_key = pair.public_key().as_ref(); + + Claim::from_token(&token, public_key).unwrap(); + } + + // Test changing the issuer is not possible + #[test] + #[should_panic(expected = "value: 401")] + fn hack_bad_iss() { + let claim = Claim::new( + "hacker-iss".to_string(), + vec![Scope::Deployment, Scope::Project], + ); + + let doc = signature::Ed25519KeyPair::generate_pkcs8(&rand::SystemRandom::new()).unwrap(); + let encoding_key = EncodingKey::from_ed_der(doc.as_ref()); + let token = claim.into_token(&encoding_key).unwrap(); + + let (header, rest) = token.split_once('.').unwrap(); + let (claim, _sig) = rest.split_once('.').unwrap(); + let claim = base64::decode_config(claim, base64::URL_SAFE_NO_PAD).unwrap(); + let mut claim: serde_json::Map = + serde_json::from_slice(&claim).unwrap(); + + claim["iss"] = json!("clone"); + + let claim = serde_json::to_vec(&claim).unwrap(); + let claim = base64::encode_config(claim, base64::URL_SAFE_NO_PAD); + + let msg = format!("{header}.{claim}"); + + let pair = Ed25519KeyPair::from_pkcs8(doc.as_ref()).unwrap(); + let public_key = pair.public_key().as_ref(); + + let sig = pair.sign(msg.as_bytes()); + let sig = base64::encode_config(sig, base64::URL_SAFE_NO_PAD); + let token = format!("{msg}.{sig}"); + + Claim::from_token(&token, public_key).unwrap(); + } +} diff --git a/common/src/backends/cache.rs b/common/src/backends/cache.rs new file mode 100644 index 000000000..39256347d --- /dev/null +++ b/common/src/backends/cache.rs @@ -0,0 +1,51 @@ +use std::{ + sync::{Arc, RwLock}, + time::Duration, +}; +use ttl_cache::TtlCache; + +pub trait CacheManagement: Send + Sync { + type Value; + + fn get(&self, key: &str) -> Option; + fn insert(&self, key: &str, value: Self::Value, ttl: Duration) -> Option; + fn invalidate(&self, key: &str) -> Option; +} + +pub struct CacheManager { + pub cache: Arc>>, +} + +impl CacheManager { + pub fn new(capacity: usize) -> Self { + let cache = Arc::new(RwLock::new(TtlCache::new(capacity))); + + Self { cache } + } +} + +impl CacheManagement for CacheManager { + type Value = T; + + fn get(&self, key: &str) -> Option { + self.cache + .read() + .expect("cache lock should not be poisoned") + .get(key) + .cloned() + } + + fn insert(&self, key: &str, value: T, ttl: Duration) -> Option { + self.cache + .write() + .expect("cache lock should not be poisoned") + .insert(key.to_string(), value, ttl) + } + + fn invalidate(&self, key: &str) -> Option { + self.cache + .write() + .expect("cache lock should not be poisoned") + .remove(key) + } +} diff --git a/common/src/backends/future.rs b/common/src/backends/future.rs new file mode 100644 index 000000000..5603fdaa0 --- /dev/null +++ b/common/src/backends/future.rs @@ -0,0 +1,55 @@ +use std::{ + future::Future, + pin::Pin, + task::{Context, Poll}, +}; + +use axum::response::Response; +use http::StatusCode; +use pin_project::pin_project; + +// Future for layers that just return the inner response +#[pin_project] +pub struct ResponseFuture(#[pin] pub F); + +impl Future for ResponseFuture +where + F: Future>, +{ + type Output = Result; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let this = self.project(); + + this.0.poll(cx) + } +} + +/// Future for layers that might return a different status code +#[pin_project(project = StatusCodeProj)] +pub enum StatusCodeFuture { + // A future that should be polled + Poll(#[pin] F), + + // A status code to return + Code(StatusCode), +} + +impl Future for StatusCodeFuture +where + F: Future>, +{ + type Output = Result; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let this = self.project(); + + match this { + StatusCodeProj::Poll(inner) => inner.poll(cx), + StatusCodeProj::Code(status_code) => Poll::Ready(Ok(Response::builder() + .status(*status_code) + .body(Default::default()) + .unwrap())), + } + } +} diff --git a/common/src/backends/headers.rs b/common/src/backends/headers.rs new file mode 100644 index 000000000..bfe07e760 --- /dev/null +++ b/common/src/backends/headers.rs @@ -0,0 +1,98 @@ +use headers::{Header, HeaderName}; +use http::HeaderValue; + +pub static X_SHUTTLE_ADMIN_SECRET: HeaderName = HeaderName::from_static("x-shuttle-admin-secret"); + +/// Typed header for sending admin secrets to deployers +pub struct XShuttleAdminSecret(pub String); + +impl Header for XShuttleAdminSecret { + fn name() -> &'static HeaderName { + &X_SHUTTLE_ADMIN_SECRET + } + + fn decode<'i, I>(values: &mut I) -> Result + where + Self: Sized, + I: Iterator, + { + let value = values + .next() + .ok_or_else(headers::Error::invalid)? + .to_str() + .map_err(|_| headers::Error::invalid())? + .to_string(); + + Ok(Self(value)) + } + + fn encode>(&self, values: &mut E) { + if let Ok(value) = HeaderValue::from_str(&self.0) { + values.extend(std::iter::once(value)); + } + } +} + +pub static X_SHUTTLE_ACCOUNT_NAME: HeaderName = HeaderName::from_static("x-shuttle-account-name"); + +/// Typed header for sending account names around +#[derive(Default)] +pub struct XShuttleAccountName(pub String); + +impl Header for XShuttleAccountName { + fn name() -> &'static HeaderName { + &X_SHUTTLE_ACCOUNT_NAME + } + + fn decode<'i, I>(values: &mut I) -> Result + where + Self: Sized, + I: Iterator, + { + let value = values + .next() + .ok_or_else(headers::Error::invalid)? + .to_str() + .map_err(|_| headers::Error::invalid())? + .to_string(); + + Ok(Self(value)) + } + + fn encode>(&self, values: &mut E) { + if let Ok(value) = HeaderValue::from_str(&self.0) { + values.extend(std::iter::once(value)); + } + } +} + +pub static X_SHUTTLE_PROJECT: HeaderName = HeaderName::from_static("x-shuttle-project"); + +pub struct XShuttleProject(pub String); + +impl Header for XShuttleProject { + fn name() -> &'static HeaderName { + &X_SHUTTLE_PROJECT + } + + fn decode<'i, I>(values: &mut I) -> Result + where + Self: Sized, + I: Iterator, + { + let value = values + .next() + .ok_or_else(headers::Error::invalid)? + .to_str() + .map_err(|_| headers::Error::invalid())? + .to_string(); + + Ok(Self(value)) + } + + fn encode>(&self, values: &mut E) { + if let Ok(value) = HeaderValue::from_str(self.0.as_str()) { + values.extend(std::iter::once(value)); + } + } +} diff --git a/common/src/backends/metrics.rs b/common/src/backends/metrics.rs index 9dabc5a1c..9d7fc2b77 100644 --- a/common/src/backends/metrics.rs +++ b/common/src/backends/metrics.rs @@ -1,13 +1,21 @@ +use std::marker::PhantomData; +use std::time::Duration; use std::{collections::HashMap, convert::Infallible}; use async_trait::async_trait; +use axum::body::{Body, BoxBody}; use axum::extract::{FromRequestParts, Path}; -use axum::http::request::Parts; -use tracing::Span; +use axum::http::{request::Parts, Request, Response}; +use opentelemetry::global; +use opentelemetry_http::HeaderExtractor; +use tower_http::classify::{ServerErrorsAsFailures, SharedClassifier}; +use tower_http::trace::DefaultOnRequest; +use tracing::{debug, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; /// Used to record a bunch of metrics info /// The tracing layer on the server should record a `request.params.` field for each parameter -/// that should be recorded +/// that should be recorded. And the [TraceLayer] can be used to record the default `request.params.` pub struct Metrics; #[async_trait] @@ -33,3 +41,273 @@ where Ok(Metrics) } } + +type FnSpan = fn(&Request) -> Span; + +/// Record the tracing information for each request as given by the function to create a span +pub struct TraceLayer { + fn_span: FnSpan, + make_span_type: PhantomData, +} +impl TraceLayer { + /// Create a trace layer using the give function to create spans. The span fields might be set by [Metrics] later. + /// + /// # Example + /// ``` + /// TraceLayer::new(|request| { + /// request_span!( + /// request, + /// request.params.param = field::Empty + /// ) + /// }) + /// .without_propagation() + /// .build(); + /// ``` + pub fn new(fn_span: FnSpan) -> Self { + Self { + fn_span, + make_span_type: PhantomData, + } + } +} + +impl + MakeSpanBuilder> TraceLayer { + /// Build the configured tracing layer + pub fn build( + self, + ) -> tower_http::trace::TraceLayer< + SharedClassifier, + MakeSpan, + DefaultOnRequest, + OnResponseStatusCode, + > { + tower_http::trace::TraceLayer::new_for_http() + .make_span_with(MakeSpan::new(self.fn_span)) + .on_response(OnResponseStatusCode) + } +} + +impl TraceLayer { + /// Switch to the span maker which does not add propagation details from the request headers + pub fn without_propagation(self) -> Self { + self + } +} + +impl TraceLayer { + /// Switch to the span maker which adds propagation details from the request headers + pub fn with_propagation(self) -> Self { + self + } +} + +/// Helper trait to make a new span maker +pub trait MakeSpanBuilder { + fn new(fn_span: FnSpan) -> Self; +} + +/// Simple span maker which records the span given by the user +#[derive(Clone)] +pub struct MakeSpanSimple { + fn_span: FnSpan, +} + +impl MakeSpanBuilder for MakeSpanSimple { + fn new(fn_span: FnSpan) -> Self { + Self { fn_span } + } +} + +impl tower_http::trace::MakeSpan for MakeSpanSimple { + fn make_span(&mut self, request: &Request) -> Span { + (self.fn_span)(request) + } +} + +/// Span maker which records the span given by the user and extracts a propagation context +/// from the request headers. +#[derive(Clone)] +pub struct MakeSpanPropagation { + fn_span: FnSpan, +} + +impl MakeSpanBuilder for MakeSpanPropagation { + fn new(fn_span: FnSpan) -> Self { + Self { fn_span } + } +} + +impl tower_http::trace::MakeSpan for MakeSpanPropagation { + fn make_span(&mut self, request: &Request) -> Span { + let span = (self.fn_span)(request); + + let parent_context = global::get_text_map_propagator(|propagator| { + propagator.extract(&HeaderExtractor(request.headers())) + }); + span.set_parent(parent_context); + + span + } +} + +/// Extract and records the status code from the response. And logs out timing info +#[derive(Clone)] +pub struct OnResponseStatusCode; + +impl tower_http::trace::OnResponse for OnResponseStatusCode { + fn on_response(self, response: &Response, latency: Duration, span: &Span) { + span.record("http.status_code", response.status().as_u16()); + debug!( + latency = format_args!("{} ns", latency.as_nanos()), + "finished processing request" + ); + } +} + +/// Simple macro to record the following defaults for each request: +/// - The URI +/// - The method +/// - The status code +/// - The request path +#[macro_export] +macro_rules! request_span { + ($request:expr, $($field:tt)*) => { + { + let path = if let Some(path) = $request.extensions().get::() { + path.as_str() + } else { + "" + }; + + tracing::debug_span!( + "request", + http.uri = %$request.uri(), + http.method = %$request.method(), + http.status_code = tracing::field::Empty, + // A bunch of extra things for metrics + // Should be able to make this clearer once `Valuable` support lands in tracing + request.path = path, + $($field)* + ) + } + }; + ($request:expr) => { + $crate::request_span!($request, ) + } +} + +#[cfg(test)] +mod tests { + use axum::{ + body::Body, extract::Path, http::Request, http::StatusCode, middleware::from_extractor, + response::IntoResponse, routing::get, Router, + }; + use hyper::body; + use tower::ServiceExt; + use tracing::field; + use tracing_fluent_assertions::{AssertionRegistry, AssertionsLayer}; + use tracing_subscriber::{layer::SubscriberExt, Registry}; + + use super::{Metrics, TraceLayer}; + + async fn hello() -> impl IntoResponse { + "hello" + } + + async fn hello_user(Path(user_name): Path) -> impl IntoResponse { + format!("hello {user_name}") + } + + #[tokio::test] + async fn trace_layer() { + let assertion_registry = AssertionRegistry::default(); + let base_subscriber = Registry::default(); + let subscriber = base_subscriber.with(AssertionsLayer::new(&assertion_registry)); + tracing::subscriber::set_global_default(subscriber).unwrap(); + + // Put in own block to make sure assertion to not interfere with the next test + { + let router: Router<()> = Router::new() + .route("/hello", get(hello)) + .route_layer(from_extractor::()) + .layer( + TraceLayer::new(|request| request_span!(request)) + .without_propagation() + .build(), + ); + + let request_span = assertion_registry + .build() + .with_name("request") + .with_span_field("http.uri") + .with_span_field("http.method") + .with_span_field("http.status_code") + .with_span_field("request.path") + .was_closed() + .finalize(); + + let response = router + .oneshot( + Request::builder() + .uri("/hello") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + + let body = body::to_bytes(response.into_body()).await.unwrap(); + + assert_eq!(&body[..], b"hello"); + request_span.assert(); + } + + { + let router: Router<()> = Router::new() + .route("/hello/:user_name", get(hello_user)) + .route_layer(from_extractor::()) + .layer( + TraceLayer::new(|request| { + request_span!( + request, + request.params.user_name = field::Empty, + extra = "value" + ) + }) + .without_propagation() + .build(), + ); + + let request_span = assertion_registry + .build() + .with_name("request") + .with_span_field("http.uri") + .with_span_field("http.method") + .with_span_field("http.status_code") + .with_span_field("request.path") + .with_span_field("request.params.user_name") + .with_span_field("extra") + .was_closed() + .finalize(); + + let response = router + .oneshot( + Request::builder() + .uri("/hello/ferries") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + + let body = body::to_bytes(response.into_body()).await.unwrap(); + + assert_eq!(&body[..], b"hello ferries"); + request_span.assert(); + } + } +} diff --git a/common/src/backends/mod.rs b/common/src/backends/mod.rs index e14488328..091d671b0 100644 --- a/common/src/backends/mod.rs +++ b/common/src/backends/mod.rs @@ -1 +1,6 @@ +pub mod auth; +pub mod cache; +mod future; +pub mod headers; pub mod metrics; +pub mod tracing; diff --git a/common/src/backends/tracing.rs b/common/src/backends/tracing.rs new file mode 100644 index 000000000..64a95cb8f --- /dev/null +++ b/common/src/backends/tracing.rs @@ -0,0 +1,187 @@ +use std::{ + future::Future, + pin::Pin, + task::{Context, Poll}, +}; + +use http::{Request, Response}; +use opentelemetry::{ + global, + runtime::Tokio, + sdk::{propagation::TraceContextPropagator, trace, Resource}, + KeyValue, +}; +use opentelemetry_http::{HeaderExtractor, HeaderInjector}; +use opentelemetry_otlp::WithExportConfig; +use pin_project::pin_project; +use tower::{Layer, Service}; +use tracing::{debug_span, instrument::Instrumented, Instrument, Span, Subscriber}; +use tracing_opentelemetry::OpenTelemetrySpanExt; +use tracing_subscriber::{fmt, prelude::*, registry::LookupSpan, EnvFilter}; + +use super::future::ResponseFuture; + +pub fn setup_tracing(subscriber: S, service_name: &str) +where + S: Subscriber + for<'a> LookupSpan<'a> + Send + Sync, +{ + global::set_text_map_propagator(TraceContextPropagator::new()); + + let filter_layer = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("info")) + .unwrap(); + let fmt_layer = fmt::layer(); + + let tracer = opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter( + opentelemetry_otlp::new_exporter() + .tonic() + .with_endpoint("http://otel-collector:4317"), + ) + .with_trace_config( + trace::config().with_resource(Resource::new(vec![KeyValue::new( + "service.name", + service_name.to_string(), + )])), + ) + .install_batch(Tokio) + .unwrap(); + let otel_layer = tracing_opentelemetry::layer().with_tracer(tracer); + + subscriber + .with(filter_layer) + .with(fmt_layer) + .with(otel_layer) + .init(); +} + +/// Layer to extract tracing from headers and set the context on the current span +#[derive(Clone)] +pub struct ExtractPropagationLayer; + +impl Layer for ExtractPropagationLayer { + type Service = ExtractPropagation; + + fn layer(&self, inner: S) -> Self::Service { + ExtractPropagation { inner } + } +} + +/// Middleware for extracting tracing propagation info and setting them on the currently active span +#[derive(Clone)] +pub struct ExtractPropagation { + inner: S, +} + +#[pin_project] +pub struct ExtractPropagationFuture { + #[pin] + response_future: F, +} + +impl Future for ExtractPropagationFuture +where + F: Future, Error>>, +{ + type Output = Result, Error>; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let this = self.project(); + + match this.response_future.poll(cx) { + Poll::Ready(result) => match result { + Ok(response) => { + Span::current().record("http.status_code", response.status().as_u16()); + + Poll::Ready(Ok(response)) + } + other => Poll::Ready(other), + }, + + Poll::Pending => Poll::Pending, + } + } +} + +impl Service> for ExtractPropagation +where + S: Service, Response = Response> + Send + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = ExtractPropagationFuture>; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, req: Request) -> Self::Future { + let span = debug_span!( + "request", + http.uri = %req.uri(), + http.method = %req.method(), + http.status_code = tracing::field::Empty, + ); + + let parent_context = global::get_text_map_propagator(|propagator| { + propagator.extract(&HeaderExtractor(req.headers())) + }); + + span.set_parent(parent_context); + + let response_future = self.inner.call(req).instrument(span); + + ExtractPropagationFuture { response_future } + } +} + +/// This layer adds the current tracing span to any outgoing request +#[derive(Clone)] +pub struct InjectPropagationLayer; + +impl Layer for InjectPropagationLayer { + type Service = InjectPropagation; + + fn layer(&self, inner: S) -> Self::Service { + InjectPropagation { inner } + } +} + +#[derive(Clone)] +pub struct InjectPropagation { + inner: S, +} + +impl Service> for InjectPropagation +where + S: Service> + Send + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = ResponseFuture; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, mut req: Request) -> Self::Future { + let cx = Span::current().context(); + + global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut HeaderInjector(req.headers_mut())) + }); + + let future = self.inner.call(req); + + ResponseFuture(future) + } +} diff --git a/common/src/deployment.rs b/common/src/deployment.rs index 2a15b97eb..9b924709e 100644 --- a/common/src/deployment.rs +++ b/common/src/deployment.rs @@ -15,3 +15,10 @@ pub enum State { Crashed, Unknown, } + +/// This which environment is this deployment taking place +#[derive(Clone, Copy)] +pub enum Environment { + Local, + Production, +} diff --git a/common/src/models/error.rs b/common/src/models/error.rs index 7b20d5571..05ba44669 100644 --- a/common/src/models/error.rs +++ b/common/src/models/error.rs @@ -115,7 +115,7 @@ impl From for ApiError { fn from(code: StatusCode) -> Self { let message = match code { StatusCode::OK | StatusCode::ACCEPTED | StatusCode::FOUND | StatusCode::SWITCHING_PROTOCOLS => { - unreachable!("we should not have an API error with a successfull status code") + unreachable!("we should not have an API error with a successful status code") } StatusCode::FORBIDDEN => "this request is not allowed", StatusCode::UNAUTHORIZED => { @@ -137,7 +137,7 @@ impl From for ApiError { }, _ => { error!(%code, "got an unexpected status code"); - "an unexpected error occured. Please create a ticket to report this" + "an unexpected error occurred. Please create a ticket to report this" }, }; diff --git a/common/src/models/mod.rs b/common/src/models/mod.rs index 17a8cb293..2d8042501 100644 --- a/common/src/models/mod.rs +++ b/common/src/models/mod.rs @@ -35,7 +35,7 @@ impl ToJson for reqwest::Response { status_code, StatusCode::OK | StatusCode::SWITCHING_PROTOCOLS ) { - serde_json::from_slice(&full).context("failed to parse a successfull response") + serde_json::from_slice(&full).context("failed to parse a successful response") } else { trace!("parsing response to common error"); let res: error::ApiError = match serde_json::from_slice(&full) { diff --git a/common/src/models/project.rs b/common/src/models/project.rs index 82ba3f927..eac73b113 100644 --- a/common/src/models/project.rs +++ b/common/src/models/project.rs @@ -5,52 +5,165 @@ use comfy_table::{ use crossterm::style::Stylize; use serde::{Deserialize, Serialize}; use std::fmt::{Display, Formatter}; -use strum::Display; +use strum::EnumString; -#[derive(Deserialize, Serialize)] +// Timeframe before a project is considered idle +pub const IDLE_MINUTES: u64 = 30; + +#[derive(Deserialize, Serialize, Clone)] pub struct Response { pub name: String, pub state: State, } -#[derive(Clone, Debug, Deserialize, Display, Serialize, Eq, PartialEq)] +#[derive(Clone, Debug, Deserialize, Serialize, EnumString)] #[serde(rename_all = "lowercase")] -#[strum(serialize_all = "lowercase")] pub enum State { - Creating, - Attaching, - Starting, + Creating { recreate_count: usize }, + Attaching { recreate_count: usize }, + Recreating { recreate_count: usize }, + Starting { restart_count: usize }, + Restarting { restart_count: usize }, Started, Ready, Stopping, Stopped, + Rebooting, Destroying, Destroyed, - Errored, + Errored { message: String }, } +impl PartialEq for State { + fn eq(&self, other: &Self) -> bool { + matches!( + (self, other), + (Self::Creating { .. }, Self::Creating { .. }) + | (Self::Attaching { .. }, Self::Attaching { .. }) + | (Self::Recreating { .. }, Self::Recreating { .. }) + | (Self::Starting { .. }, Self::Starting { .. }) + | (Self::Restarting { .. }, Self::Restarting { .. }) + | (Self::Started, Self::Started) + | (Self::Ready, Self::Ready) + | (Self::Stopping, Self::Stopping) + | (Self::Stopped, Self::Stopped) + | (Self::Rebooting, Self::Rebooting) + | (Self::Destroying, Self::Destroying) + | (Self::Destroyed, Self::Destroyed) + | (Self::Errored { .. }, Self::Errored { .. }) + ) + } +} + +impl Eq for State {} + impl Display for Response { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!( - f, - "project '{}' is {}", - self.name, - self.state.to_string().with(self.state.get_color()) - ) + write!(f, "project '{}' is {}", self.name, self.state) + } +} + +impl Display for State { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + State::Creating { recreate_count } => { + if *recreate_count > 0 { + write!( + f, + "{} (attempt {})", + "creating".dark_yellow(), + recreate_count + ) + } else { + write!(f, "{}", "creating".cyan()) + } + } + State::Attaching { recreate_count } => { + if *recreate_count > 0 { + write!( + f, + "{} (attempt {})", + "attaching".dark_yellow(), + recreate_count + ) + } else { + write!(f, "{}", "attaching".cyan()) + } + } + State::Recreating { recreate_count } => { + if *recreate_count > 0 { + write!( + f, + "{} (attempt {})", + "recreating".dark_yellow(), + recreate_count + ) + } else { + write!(f, "{}", "recreating".dark_yellow()) + } + } + State::Starting { restart_count } => { + if *restart_count > 0 { + write!( + f, + "{} (attempt {})", + "starting".dark_yellow(), + restart_count + ) + } else { + write!(f, "{}", "starting".cyan()) + } + } + State::Restarting { restart_count } => { + if *restart_count > 0 { + write!( + f, + "{} (attempt {})", + "restarting".dark_yellow(), + restart_count + ) + } else { + write!(f, "{}", "restarting".dark_yellow()) + } + } + State::Started => write!(f, "{}", "started".cyan()), + State::Ready => write!(f, "{}", "ready".green()), + State::Stopping => write!(f, "{}", "stopping".blue()), + State::Stopped => write!(f, "{}", "stopped".blue()), + State::Rebooting => write!(f, "{}", "rebooting".dark_yellow()), + State::Destroying => write!(f, "{}", "destroying".blue()), + State::Destroyed => write!(f, "{}", "destroyed".blue()), + State::Errored { message } => { + writeln!(f, "{}", "errored".red())?; + write!(f, "\tmessage: {}", message) + } + } } } impl State { pub fn get_color(&self) -> Color { match self { - Self::Creating | Self::Attaching | Self::Starting | Self::Started => Color::Cyan, + Self::Creating { .. } + | Self::Attaching { .. } + | Self::Recreating { .. } + | Self::Starting { .. } + | Self::Restarting { .. } + | Self::Started + | Self::Rebooting => Color::Cyan, Self::Ready => Color::Green, Self::Stopped | Self::Stopping | Self::Destroying | Self::Destroyed => Color::Blue, - Self::Errored => Color::Red, + Self::Errored { .. } => Color::Red, } } } +/// Config when creating a new project +#[derive(Deserialize, Serialize)] +pub struct Config { + pub idle_minutes: u64, +} + #[derive(Deserialize, Serialize)] pub struct AdminResponse { pub project_name: String, diff --git a/common/src/models/user.rs b/common/src/models/user.rs index d51b60389..c9f093ac3 100644 --- a/common/src/models/user.rs +++ b/common/src/models/user.rs @@ -4,5 +4,5 @@ use serde::{Deserialize, Serialize}; pub struct Response { pub name: String, pub key: String, - pub projects: Vec, + pub account_tier: String, } diff --git a/common/src/project.rs b/common/src/project.rs index f3c69afd2..d4816c50b 100644 --- a/common/src/project.rs +++ b/common/src/project.rs @@ -1,4 +1,5 @@ use once_cell::sync::OnceCell; +use rustrict::{Censor, Type}; use serde::de::Error as DeError; use serde::{Deserialize, Deserializer, Serialize}; use std::collections::HashSet; @@ -15,8 +16,6 @@ use std::str::FromStr; /// - It does not contain profanity. /// - It is not a reserved word. /// -use rustrict::{Censor, Type}; - #[derive(Clone, Serialize, Debug, Eq, PartialEq)] pub struct ProjectName(String); diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index ef0527920..9c6f7ab23 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-deployer" -version.workspace = true +version = "0.11.1" edition.workspace = true license.workspace = true description = "Service with instances created per project for handling the compilation, loading, and execution of Shuttle services" @@ -8,7 +8,7 @@ description = "Service with instances created per project for handling the compi [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } -axum = { workspace = true, features = ["default", "ws"] } +axum = { workspace = true, features = ["headers", "json", "query", "ws"] } bytes = "1.3.0" # TODO: debug the libgit2-sys conflict with cargo-edit when upgrading cargo to 0.66 cargo = "0.65.0" @@ -20,34 +20,40 @@ flate2 = "1.0.25" fqdn = "0.2.3" futures = "0.3.25" home = "0.5.4" -hyper = { version = "0.14.23", features = ["client", "http1", "http2", "tcp" ] } +hyper = { workspace = true, features = ["client", "http1", "http2", "tcp"] } # not great, but waiting for WebSocket changes to be merged hyper-reverse-proxy = { git = "https://github.com/chesedo/hyper-reverse-proxy", branch = "master" } once_cell = { workspace = true } -opentelemetry = { version = "0.18.0", features = ["rt-tokio"] } -opentelemetry-datadog = { version = "0.6.0", features = ["reqwest-client"] } -opentelemetry-http = "0.7.0" +opentelemetry = { workspace = true } +opentelemetry-http = { workspace = true } pipe = "0.4.0" -portpicker = "0.1.1" +portpicker = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "sqlite", "chrono", "json", "migrate", "uuid"] } -strum = { version = "0.24.1", features = ["derive"] } +sqlx = { version = "0.6.2", features = [ + "runtime-tokio-native-tls", + "sqlite", + "chrono", + "json", + "migrate", + "uuid", +] } +strum = { workspace = true } tar = "0.4.38" thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["fs", "process"] } toml = "0.5.9" tonic = { workspace = true } -tower = { version = "0.4.13", features = ["make"] } +tower = { workspace = true, features = ["make"] } tower-http = { version = "0.3.4", features = ["auth", "trace"] } tracing = { workspace = true, features = ["default"] } -tracing-opentelemetry = "0.18.0" +tracing-opentelemetry = { workspace = true } tracing-subscriber = { workspace = true, features = ["default", "env-filter", "fmt"] } uuid = { workspace = true, features = ["v4"] } [dependencies.shuttle-common] workspace = true -features= ["backend", "models"] +features = ["backend", "models"] [dependencies.shuttle-proto] workspace = true @@ -59,5 +65,5 @@ features = ["builder"] [dev-dependencies] ctor = "0.1.26" hex = "0.4.3" -rand = "0.8.5" -tempdir = "0.3.7" +rand = { workspace = true } +tempfile = "3.3.0" diff --git a/deployer/prepare.sh b/deployer/prepare.sh index 571aa8cb6..6fc385470 100755 --- a/deployer/prepare.sh +++ b/deployer/prepare.sh @@ -14,19 +14,27 @@ shuttle-persist = { path = "/usr/src/shuttle/resources/persist" } shuttle-shared-db = { path = "/usr/src/shuttle/resources/shared-db" } shuttle-secrets = { path = "/usr/src/shuttle/resources/secrets" } shuttle-static-folder = { path = "/usr/src/shuttle/resources/static-folder" }' > $CARGO_HOME/config.toml - +# # Add the wasm32-wasi target rustup target add wasm32-wasi # Install the shuttle runtime -cargo install shuttle-runtime --path "/usr/src/shuttle/runtime" +cargo install shuttle-runtime --path "/usr/src/shuttle/runtime" -# Make future crates requests to our own mirror -echo ' +while getopts "p," o; do + case $o in + "p") + # Make future crates requests to our own mirror + echo ' [source.shuttle-crates-io-mirror] registry = "http://panamax:8080/git/crates.io-index" [source.crates-io] replace-with = "shuttle-crates-io-mirror"' >> $CARGO_HOME/config.toml + ;; + *) + ;; + esac +done # Prefetch crates.io index from our mirror # TODO: restore when we know how to prefetch from our mirror diff --git a/deployer/src/args.rs b/deployer/src/args.rs index 75b417384..73211faa8 100644 --- a/deployer/src/args.rs +++ b/deployer/src/args.rs @@ -43,6 +43,10 @@ pub struct Args { #[clap(long)] pub admin_secret: String, + /// Address to reach the authentication service at + #[clap(long, default_value = "http://127.0.0.1:8008")] + pub auth_uri: Uri, + /// Uri to folder to store all artifacts #[clap(long, default_value = "/tmp")] pub artifacts_path: PathBuf, diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index 94e8be3f0..ad0877360 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -336,9 +336,9 @@ mod tests { use portpicker::pick_unused_port; use shuttle_proto::provisioner::{ provisioner_server::{Provisioner, ProvisionerServer}, - DatabaseRequest, DatabaseResponse, + DatabaseDeletionResponse, DatabaseRequest, DatabaseResponse, }; - use tempdir::TempDir; + use tempfile::Builder; use tokio::{select, time::sleep}; use tonic::transport::Server; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; @@ -459,6 +459,13 @@ mod tests { ) -> Result, tonic::Status> { panic!("no deploy layer tests should request a db"); } + + async fn delete_database( + &self, + _request: tonic::Request, + ) -> Result, tonic::Status> { + panic!("no deploy layer tests should request delete a db"); + } } fn get_runtime_manager() -> Arc> { @@ -474,7 +481,7 @@ mod tests { .unwrap(); }); - let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); + let tmp_dir = Builder::new().prefix("shuttle_run_test").tempdir().unwrap(); let path = tmp_dir.into_path(); let (tx, _rx) = crossbeam_channel::unbounded(); @@ -744,7 +751,7 @@ mod tests { select! { _ = sleep(Duration::from_secs(240)) => { let states = RECORDER.lock().unwrap().get_deployment_states(&id); - panic!("states should go into 'Crashed' panicing in bind: {:#?}", states); + panic!("states should go into 'Crashed' panicking in bind: {:#?}", states); } _ = test => {} } @@ -791,7 +798,7 @@ mod tests { select! { _ = sleep(Duration::from_secs(240)) => { let states = RECORDER.lock().unwrap().get_deployment_states(&id); - panic!("states should go into 'Crashed' when panicing in main: {:#?}", states); + panic!("states should go into 'Crashed' when panicking in main: {:#?}", states); } _ = test => {} } @@ -809,6 +816,7 @@ mod tests { service_id: Uuid::new_v4(), tracing_context: Default::default(), is_next: false, + claim: None, }) .await; @@ -852,6 +860,7 @@ mod tests { data: Bytes::from("violets are red").to_vec(), will_run_tests: false, tracing_context: Default::default(), + claim: None, }) .await; @@ -909,6 +918,7 @@ mod tests { data: bytes, will_run_tests: false, tracing_context: Default::default(), + claim: None, } } } diff --git a/deployer/src/deployment/gateway_client.rs b/deployer/src/deployment/gateway_client.rs index 61846e4a6..b58f16609 100644 --- a/deployer/src/deployment/gateway_client.rs +++ b/deployer/src/deployment/gateway_client.rs @@ -1,8 +1,11 @@ use hyper::{body, client::HttpConnector, Body, Client, Method, Request, Uri}; +use opentelemetry::global; +use opentelemetry_http::HeaderInjector; use serde::{de::DeserializeOwned, Serialize}; use shuttle_common::models::stats; use thiserror::Error; -use tracing::trace; +use tracing::{trace, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; use uuid::Uuid; #[derive(Error, Debug)] @@ -67,11 +70,17 @@ impl GatewayClient { let uri = format!("{}{path}", self.base); trace!(uri, "calling gateway"); - let req = Request::builder() + let mut req = Request::builder() .method(method) .uri(uri) .header("Content-Type", "application/json"); + let cx = Span::current().context(); + + global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut HeaderInjector(req.headers_mut().unwrap())) + }); + let req = if let Some(body) = body { req.body(Body::from(serde_json::to_vec(&body)?)) } else { diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index 6bf0675f2..cec7e0649 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -11,6 +11,7 @@ use chrono::Utc; use crossbeam_channel::Sender; use opentelemetry::global; use serde_json::json; +use shuttle_common::backends::auth::Claim; use shuttle_service::builder::{build_crate, get_config, Runtime}; use tokio::time::{sleep, timeout}; use tracing::{debug, debug_span, error, info, instrument, trace, warn, Instrument, Span}; @@ -63,7 +64,7 @@ pub async fn task( async move { match timeout( - Duration::from_secs(60 * 5), // Timeout after 5 minutes if the build queue hangs or it takes too long for a slot to become available + Duration::from_secs(60 * 3), // Timeout after 3 minutes if the build queue hangs or it takes too long for a slot to become available wait_for_queue(queue_client.clone(), id), ) .await @@ -81,11 +82,15 @@ pub async fn task( ) .await { - Ok(built) => promote_to_run(built, run_send_cloned).await, - Err(err) => build_failed(&id, err), + Ok(built) => { + remove_from_queue(queue_client, id).await; + promote_to_run(built, run_send_cloned).await + } + Err(err) => { + remove_from_queue(queue_client, id).await; + build_failed(&id, err) + } } - - remove_from_queue(queue_client, id).await } .instrument(span) .await @@ -103,6 +108,7 @@ fn build_failed(_id: &Uuid, error: impl std::error::Error + 'static) { #[instrument(skip(queue_client), fields(state = %State::Queued))] async fn wait_for_queue(queue_client: impl BuildQueueClient, id: Uuid) -> Result<()> { + trace!("getting a build slot"); loop { let got_slot = queue_client.get_slot(id).await?; @@ -148,6 +154,7 @@ pub struct Queued { pub data: Vec, pub will_run_tests: bool, pub tracing_context: HashMap, + pub claim: Option, } impl Queued { @@ -234,6 +241,7 @@ impl Queued { service_id: self.service_id, tracing_context: Default::default(), is_next, + claim: self.claim, }; Ok(built) @@ -413,7 +421,7 @@ mod tests { use shuttle_common::storage_manager::ArtifactsStorageManager; use shuttle_service::builder::Runtime; - use tempdir::TempDir; + use tempfile::Builder; use tokio::fs; use uuid::Uuid; @@ -421,7 +429,10 @@ mod tests { #[tokio::test] async fn extract_tar_gz_data() { - let dir = TempDir::new("shuttle-extraction-test").unwrap(); + let dir = Builder::new() + .prefix("shuttle-extraction-test") + .tempdir() + .unwrap(); let p = dir.path(); // Files whose content should be replaced with the archive @@ -540,7 +551,7 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", #[tokio::test] async fn store_lib() { - let libs_dir = TempDir::new("lib-store").unwrap(); + let libs_dir = Builder::new().prefix("lib-store").tempdir().unwrap(); let libs_p = libs_dir.path(); let storage_manager = ArtifactsStorageManager::new(libs_p.to_path_buf()); @@ -569,7 +580,7 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", #[tokio::test] async fn get_secrets() { - let temp = TempDir::new("secrets").unwrap(); + let temp = Builder::new().prefix("secrets").tempdir().unwrap(); let temp_p = temp.path(); let secret_p = temp_p.join("Secrets.toml"); diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index e536ab0ea..f814766a2 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -8,12 +8,12 @@ use std::{ use async_trait::async_trait; use opentelemetry::global; use portpicker::pick_unused_port; -use shuttle_common::storage_manager::ArtifactsStorageManager; +use shuttle_common::{backends::auth::Claim, storage_manager::ArtifactsStorageManager}; + use shuttle_proto::runtime::{ runtime_client::RuntimeClient, LoadRequest, StartRequest, StopReason, SubscribeStopRequest, SubscribeStopResponse, }; - use tokio::sync::Mutex; use tonic::{transport::Channel, Code}; use tracing::{debug, debug_span, error, info, instrument, trace, warn, Instrument}; @@ -167,6 +167,7 @@ pub struct Built { pub service_id: Uuid, pub tracing_context: HashMap, pub is_next: bool, + pub claim: Option, } impl Built { @@ -342,11 +343,11 @@ mod tests { use shuttle_proto::{ provisioner::{ provisioner_server::{Provisioner, ProvisionerServer}, - DatabaseRequest, DatabaseResponse, + DatabaseDeletionResponse, DatabaseRequest, DatabaseResponse, }, runtime::{StopReason, SubscribeStopResponse}, }; - use tempdir::TempDir; + use tempfile::Builder; use tokio::{ sync::{oneshot, Mutex}, time::sleep, @@ -365,7 +366,7 @@ mod tests { const RESOURCES_PATH: &str = "tests/resources"; fn get_storage_manager() -> ArtifactsStorageManager { - let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); + let tmp_dir = Builder::new().prefix("shuttle_run_test").tempdir().unwrap(); let path = tmp_dir.into_path(); ArtifactsStorageManager::new(path) @@ -385,6 +386,13 @@ mod tests { ) -> Result, tonic::Status> { panic!("no run tests should request a db"); } + + async fn delete_database( + &self, + _request: tonic::Request, + ) -> Result, tonic::Status> { + panic!("no run tests should delete a db"); + } } fn get_runtime_manager() -> Arc> { @@ -400,7 +408,7 @@ mod tests { .unwrap(); }); - let tmp_dir = TempDir::new("shuttle_run_test").unwrap(); + let tmp_dir = Builder::new().prefix("shuttle_run_test").tempdir().unwrap(); let path = tmp_dir.into_path(); let (tx, _rx) = crossbeam_channel::unbounded(); @@ -607,6 +615,7 @@ mod tests { service_id: Uuid::new_v4(), tracing_context: Default::default(), is_next: false, + claim: None, }; let handle_cleanup = |_result| panic!("no service means no cleanup"); @@ -664,6 +673,7 @@ mod tests { service_id: Uuid::new_v4(), tracing_context: Default::default(), is_next: false, + claim: None, }, storage_manager, ) diff --git a/deployer/src/handlers/error.rs b/deployer/src/handlers/error.rs index f0fb98a0a..6ded00b06 100644 --- a/deployer/src/handlers/error.rs +++ b/deployer/src/handlers/error.rs @@ -6,6 +6,7 @@ use axum::Json; use serde::{ser::SerializeMap, Serialize}; use shuttle_common::models::error::ApiError; +use tracing::error; #[derive(thiserror::Error, Debug)] pub enum Error { @@ -40,6 +41,8 @@ impl Serialize for Error { impl IntoResponse for Error { fn into_response(self) -> Response { + error!(error = &self as &dyn std::error::Error, "request error"); + let code = match self { Error::NotFound => StatusCode::NOT_FOUND, _ => StatusCode::INTERNAL_SERVER_ERROR, diff --git a/deployer/src/handlers/mod.rs b/deployer/src/handlers/mod.rs index ed034d7b8..2e8e18237 100644 --- a/deployer/src/handlers/mod.rs +++ b/deployer/src/handlers/mod.rs @@ -1,9 +1,9 @@ mod error; -use axum::body::{Body, BoxBody}; use axum::extract::ws::{self, WebSocket}; -use axum::extract::{Extension, MatchedPath, Path, Query}; -use axum::http::{Request, Response}; +use axum::extract::{Extension, Path, Query}; +use axum::handler::Handler; +use axum::headers::HeaderMapExt; use axum::middleware::from_extractor; use axum::routing::{get, post, Router}; use axum::{extract::BodyStream, Json}; @@ -11,114 +11,98 @@ use bytes::BufMut; use chrono::{TimeZone, Utc}; use fqdn::FQDN; use futures::StreamExt; -use opentelemetry::global; -use opentelemetry_http::HeaderExtractor; -use shuttle_common::backends::metrics::Metrics; +use hyper::Uri; +use shuttle_common::backends::auth::{ + AdminSecretLayer, AuthPublicKey, Claim, JwtAuthenticationLayer, Scope, ScopedLayer, +}; +use shuttle_common::backends::headers::XShuttleAccountName; +use shuttle_common::backends::metrics::{Metrics, TraceLayer}; use shuttle_common::models::secret; use shuttle_common::project::ProjectName; use shuttle_common::storage_manager::StorageManager; -use shuttle_common::LogItem; +use shuttle_common::{request_span, LogItem}; use shuttle_service::builder::clean_crate; -use tower_http::auth::RequireAuthorizationLayer; -use tower_http::trace::TraceLayer; -use tracing::{debug, debug_span, error, field, instrument, trace, Span}; -use tracing_opentelemetry::OpenTelemetrySpanExt; +use tracing::{debug, error, field, instrument, trace}; use uuid::Uuid; use crate::deployment::{DeploymentManager, Queued}; -use crate::persistence::{Deployment, Log, Persistence, SecretGetter, State}; +use crate::persistence::{Deployment, Log, Persistence, ResourceManager, SecretGetter, State}; use std::collections::HashMap; -use std::time::Duration; pub use {self::error::Error, self::error::Result}; mod project; -pub fn make_router( +pub async fn make_router( persistence: Persistence, deployment_manager: DeploymentManager, proxy_fqdn: FQDN, admin_secret: String, + auth_uri: Uri, project_name: ProjectName, ) -> Router { Router::new() - .route("/projects/:project_name/services", get(list_services)) + .route( + "/projects/:project_name/services", + get(list_services.layer(ScopedLayer::new(vec![Scope::Service]))), + ) .route( "/projects/:project_name/services/:service_name", - get(get_service).post(post_service).delete(delete_service), + get(get_service.layer(ScopedLayer::new(vec![Scope::Service]))) + .post(post_service.layer(ScopedLayer::new(vec![Scope::ServiceCreate]))) + .delete(stop_service.layer(ScopedLayer::new(vec![Scope::ServiceCreate]))), ) .route( "/projects/:project_name/services/:service_name/summary", - get(get_service_summary), + get(get_service_summary).layer(ScopedLayer::new(vec![Scope::Service])), ) .route( "/projects/:project_name/deployments/:deployment_id", - get(get_deployment).delete(delete_deployment), + get(get_deployment.layer(ScopedLayer::new(vec![Scope::Deployment]))) + .delete(delete_deployment.layer(ScopedLayer::new(vec![Scope::DeploymentPush]))), ) .route( "/projects/:project_name/ws/deployments/:deployment_id/logs", - get(get_logs_subscribe), + get(get_logs_subscribe.layer(ScopedLayer::new(vec![Scope::Logs]))), ) .route( "/projects/:project_name/deployments/:deployment_id/logs", - get(get_logs), + get(get_logs.layer(ScopedLayer::new(vec![Scope::Logs]))), ) .route( "/projects/:project_name/secrets/:service_name", - get(get_secrets), + get(get_secrets.layer(ScopedLayer::new(vec![Scope::Secret]))), + ) + .route( + "/projects/:project_name/clean", + post(post_clean.layer(ScopedLayer::new(vec![Scope::DeploymentPush]))), ) - .route("/projects/:project_name/clean", post(post_clean)) .layer(Extension(persistence)) .layer(Extension(deployment_manager)) .layer(Extension(proxy_fqdn)) - .layer(RequireAuthorizationLayer::bearer(&admin_secret)) + .layer(JwtAuthenticationLayer::new(AuthPublicKey::new(auth_uri))) + .layer(AdminSecretLayer::new(admin_secret)) // This route should be below the auth bearer since it does not need authentication .route("/projects/:project_name/status", get(get_status)) .route_layer(from_extractor::()) .layer( - TraceLayer::new_for_http() - .make_span_with(|request: &Request| { - let path = if let Some(path) = request.extensions().get::() { - path.as_str() - } else { - "" - }; - - let account_name = request - .headers() - .get("X-Shuttle-Account-Name") - .map(|value| value.to_str().unwrap_or_default()); - - let span = debug_span!( - "request", - http.uri = %request.uri(), - http.method = %request.method(), - http.status_code = field::Empty, - account.name = account_name, - // A bunch of extra things for metrics - // Should be able to make this clearer once `Valuable` support lands in tracing - request.path = path, - request.params.project_name = field::Empty, - request.params.service_name = field::Empty, - request.params.deployment_id = field::Empty, - ); - let parent_context = global::get_text_map_propagator(|propagator| { - propagator.extract(&HeaderExtractor(request.headers())) - }); - span.set_parent(parent_context); - - span - }) - .on_response( - |response: &Response, latency: Duration, span: &Span| { - span.record("http.status_code", response.status().as_u16()); - debug!( - latency = format_args!("{} ns", latency.as_nanos()), - "finished processing request" - ); - }, - ), + TraceLayer::new(|request| { + let account_name = request + .headers() + .typed_get::() + .unwrap_or_default(); + + request_span!( + request, + account.name = account_name.0, + request.params.project_name = field::Empty, + request.params.service_name = field::Empty, + request.params.deployment_id = field::Empty, + ) + }) + .with_propagation() + .build(), ) .route_layer(from_extractor::()) .layer(Extension(project_name)) @@ -151,7 +135,7 @@ async fn get_service( .map(Into::into) .collect(); let resources = persistence - .get_service_resources(&service.id) + .get_resources(&service.id) .await? .into_iter() .map(Into::into) @@ -188,7 +172,7 @@ async fn get_service_summary( .await? .map(Into::into); let resources = persistence - .get_service_resources(&service.id) + .get_resources(&service.id) .await? .into_iter() .map(Into::into) @@ -211,6 +195,7 @@ async fn get_service_summary( async fn post_service( Extension(persistence): Extension, Extension(deployment_manager): Extension, + Extension(claim): Extension, Path((project_name, service_name)): Path<(String, String)>, Query(params): Query>, mut stream: BodyStream, @@ -244,6 +229,7 @@ async fn post_service( data, will_run_tests: !params.contains_key("no-test"), tracing_context: Default::default(), + claim: Some(claim), }; deployment_manager.queue_push(queued).await; @@ -252,40 +238,33 @@ async fn post_service( } #[instrument(skip_all, fields(%project_name, %service_name))] -async fn delete_service( +async fn stop_service( Extension(persistence): Extension, Extension(deployment_manager): Extension, + Extension(proxy_fqdn): Extension, Path((project_name, service_name)): Path<(String, String)>, -) -> Result> { +) -> Result> { if let Some(service) = persistence.get_service_by_name(&service_name).await? { - let old_deployments = persistence - .delete_deployments_by_service_id(&service.id) - .await?; + let running_deployment = persistence.get_active_deployment(&service.id).await?; - for deployment in old_deployments.iter() { + if let Some(ref deployment) = running_deployment { deployment_manager.kill(deployment.id).await; + } else { + return Err(Error::NotFound); } let resources = persistence - .get_service_resources(&service.id) - .await? - .into_iter() - .map(Into::into) - .collect(); - let secrets = persistence - .get_secrets(&service.id) + .get_resources(&service.id) .await? .into_iter() .map(Into::into) .collect(); - persistence.delete_service(&service.id).await?; - - let response = shuttle_common::models::service::Detailed { + let response = shuttle_common::models::service::Summary { name: service.name, - deployments: old_deployments.into_iter().map(Into::into).collect(), + deployment: running_deployment.map(Into::into), resources, - secrets, + uri: format!("https://{proxy_fqdn}"), }; Ok(Json(response)) diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index e5ae62450..347ba254f 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -51,6 +51,7 @@ pub async fn start( service_id: existing_deployment.service_id, tracing_context: Default::default(), is_next: existing_deployment.is_next, + claim: None, // This will cause us to read the resource info from past provisions }; deployment_manager.run_push(built).await; } @@ -60,8 +61,10 @@ pub async fn start( deployment_manager, args.proxy_fqdn, args.admin_secret, + args.auth_uri, args.project, - ); + ) + .await; let make_service = router.into_make_service(); info!(address=%args.api_address, "Binding to and listening at address"); diff --git a/deployer/src/main.rs b/deployer/src/main.rs index dce1ae036..8a249cb63 100644 --- a/deployer/src/main.rs +++ b/deployer/src/main.rs @@ -1,12 +1,11 @@ use std::process::exit; use clap::Parser; -use opentelemetry::global; +use shuttle_common::backends::tracing::setup_tracing; use shuttle_deployer::{start, start_proxy, Args, DeployLayer, Persistence, RuntimeManager}; use tokio::select; use tracing::{error, trace}; use tracing_subscriber::prelude::*; -use tracing_subscriber::{fmt, EnvFilter}; // The `multi_thread` is needed to prevent a deadlock in shuttle_service::loader::build_crate() which spawns two threads // Without this, both threads just don't start up @@ -16,26 +15,11 @@ async fn main() { trace!(args = ?args, "parsed args"); - global::set_text_map_propagator(opentelemetry_datadog::DatadogPropagator::new()); - - let fmt_layer = fmt::layer(); - let filter_layer = EnvFilter::try_from_default_env() - .or_else(|_| EnvFilter::try_new("info")) - .unwrap(); - let (persistence, _) = Persistence::new(&args.state).await; - let tracer = opentelemetry_datadog::new_pipeline() - .with_service_name("deployer") - .with_agent_endpoint("http://datadog-agent:8126") - .install_batch(opentelemetry::runtime::Tokio) - .unwrap(); - let opentelemetry = tracing_opentelemetry::layer().with_tracer(tracer); - tracing_subscriber::registry() - .with(DeployLayer::new(persistence.clone())) - .with(filter_layer) - .with(fmt_layer) - .with(opentelemetry) - .init(); + setup_tracing( + tracing_subscriber::registry().with(DeployLayer::new(persistence.clone())), + "deployer", + ); let runtime_manager = RuntimeManager::new( args.artifacts_path.clone(), diff --git a/deployer/src/persistence/mod.rs b/deployer/src/persistence/mod.rs index 7ac9f3e2d..b726e8d64 100644 --- a/deployer/src/persistence/mod.rs +++ b/deployer/src/persistence/mod.rs @@ -20,7 +20,7 @@ use chrono::Utc; use serde_json::json; use shuttle_common::STATE_MESSAGE; use sqlx::migrate::{MigrateDatabase, Migrator}; -use sqlx::sqlite::{Sqlite, SqlitePool}; +use sqlx::sqlite::{Sqlite, SqliteConnectOptions, SqliteJournalMode, SqlitePool}; use tokio::sync::broadcast::{self, Receiver, Sender}; use tokio::task::JoinHandle; use tracing::{error, info, instrument, trace}; @@ -30,7 +30,7 @@ use self::deployment::DeploymentRunnable; pub use self::deployment::{Deployment, DeploymentState, DeploymentUpdater}; pub use self::error::Error as PersistenceError; pub use self::log::{Level as LogLevel, Log}; -pub use self::resource::{Resource, ResourceRecorder, Type as ResourceType}; +pub use self::resource::{Resource, ResourceManager, Type as ResourceType}; pub use self::secret::{Secret, SecretGetter, SecretRecorder}; pub use self::service::Service; pub use self::state::State; @@ -60,7 +60,20 @@ impl Persistence { std::fs::canonicalize(path).unwrap().to_string_lossy() ); - let pool = SqlitePool::connect(path).await.unwrap(); + // We have found in the past that setting synchronous to anything other than the default (full) breaks the + // broadcast channel in deployer. The broken symptoms are that the ws socket connections won't get any logs + // from the broadcast channel and would then close. When users did deploys, this would make it seem like the + // deploy is done (while it is still building for most of the time) and the status of the previous deployment + // would be returned to the user. + // + // If you want to activate a faster synchronous mode, then also do proper testing to confirm this bug is no + // longer present. + let sqlite_options = SqliteConnectOptions::from_str(path) + .unwrap() + .journal_mode(SqliteJournalMode::Wal); + + let pool = SqlitePool::connect_with(sqlite_options).await.unwrap(); + Self::from_pool(pool).await } @@ -243,20 +256,6 @@ impl Persistence { .map_err(Error::from) } - pub async fn delete_deployments_by_service_id( - &self, - service_id: &Uuid, - ) -> Result> { - let deployments = self.get_deployments(service_id).await?; - - let _ = sqlx::query("DELETE FROM deployments WHERE service_id = ?") - .bind(service_id) - .execute(&self.pool) - .await; - - Ok(deployments) - } - pub async fn get_all_services(&self) -> Result> { sqlx::query_as("SELECT * FROM services") .fetch_all(&self.pool) @@ -278,14 +277,6 @@ impl Persistence { .map_err(Error::from) } - pub async fn get_service_resources(&self, service_id: &Uuid) -> Result> { - sqlx::query_as(r#"SELECT * FROM resources WHERE service_id = ?"#) - .bind(service_id) - .fetch_all(&self.pool) - .await - .map_err(Error::from) - } - pub(crate) async fn get_deployment_logs(&self, id: &Uuid) -> Result> { // TODO: stress this a bit get_deployment_logs(&self.pool, id).await @@ -358,7 +349,7 @@ impl LogRecorder for Persistence { } #[async_trait::async_trait] -impl ResourceRecorder for Persistence { +impl ResourceManager for Persistence { type Err = Error; async fn insert_resource(&self, resource: &Resource) -> Result<()> { @@ -371,6 +362,14 @@ impl ResourceRecorder for Persistence { .map(|_| ()) .map_err(Error::from) } + + async fn get_resources(&self, service_id: &Uuid) -> Result> { + sqlx::query_as(r#"SELECT * FROM resources WHERE service_id = ?"#) + .bind(service_id) + .fetch_all(&self.pool) + .await + .map_err(Error::from) + } } #[async_trait::async_trait] @@ -795,51 +794,6 @@ mod tests { ); } - #[tokio::test(flavor = "multi_thread")] - async fn deployment_deletion() { - let (p, _) = Persistence::new_in_memory().await; - - let service_id = add_service(&p.pool).await.unwrap(); - - let deployments = [ - Deployment { - id: Uuid::new_v4(), - service_id, - state: State::Running, - last_update: Utc::now(), - address: None, - is_next: true, - }, - Deployment { - id: Uuid::new_v4(), - service_id, - state: State::Running, - last_update: Utc::now(), - address: None, - is_next: false, - }, - ]; - - for deployment in deployments.iter() { - p.insert_deployment(deployment.clone()).await.unwrap(); - } - - assert!(!p.get_deployments(&service_id).await.unwrap().is_empty()); - - // This should error since deployments are linked to this service - p.delete_service(&service_id).await.unwrap_err(); - assert_eq!( - p.delete_deployments_by_service_id(&service_id) - .await - .unwrap(), - deployments - ); - - // It should not be safe to delete - p.delete_service(&service_id).await.unwrap(); - assert!(p.get_deployments(&service_id).await.unwrap().is_empty()); - } - #[tokio::test(flavor = "multi_thread")] async fn log_insert() { let (p, _) = Persistence::new_in_memory().await; @@ -1045,7 +999,7 @@ mod tests { p.insert_resource(resource).await.unwrap(); } - let resources = p.get_service_resources(&service_id).await.unwrap(); + let resources = p.get_resources(&service_id).await.unwrap(); assert_eq!(resources, vec![resource2, resource4]); } diff --git a/deployer/src/persistence/resource/mod.rs b/deployer/src/persistence/resource/mod.rs index fe94ee83a..20069563d 100644 --- a/deployer/src/persistence/resource/mod.rs +++ b/deployer/src/persistence/resource/mod.rs @@ -9,11 +9,13 @@ use uuid::Uuid; pub use self::database::Type as DatabaseType; +/// Types that can record and retrieve resource allocations #[async_trait::async_trait] -pub trait ResourceRecorder: Clone + Send + Sync + 'static { +pub trait ResourceManager: Clone + Send + Sync + 'static { type Err: std::error::Error; async fn insert_resource(&self, resource: &Resource) -> Result<(), Self::Err>; + async fn get_resources(&self, service_id: &Uuid) -> Result, Self::Err>; } #[derive(sqlx::FromRow, Debug, Eq, PartialEq)] diff --git a/deployer/src/proxy.rs b/deployer/src/proxy.rs index cbb216ac9..eaead7f45 100644 --- a/deployer/src/proxy.rs +++ b/deployer/src/proxy.rs @@ -4,6 +4,7 @@ use std::{ }; use async_trait::async_trait; +use axum::headers::HeaderMapExt; use fqdn::FQDN; use hyper::{ client::{connect::dns::GaiResolver, HttpConnector}, @@ -14,6 +15,7 @@ use hyper_reverse_proxy::{ProxyError, ReverseProxy}; use once_cell::sync::Lazy; use opentelemetry::global; use opentelemetry_http::HeaderExtractor; +use shuttle_common::backends::headers::XShuttleProject; use tracing::{error, field, instrument, trace, Span}; use tracing_opentelemetry::OpenTelemetrySpanExt; @@ -60,8 +62,8 @@ pub async fn handle( // We only have one service per project, and its name coincides // with that of the project - let service = match req.headers().get("X-Shuttle-Project") { - Some(project) => project.to_str().unwrap_or_default().to_owned(), + let service = match req.headers().typed_get::() { + Some(project) => project.0, None => { trace!("proxy request has no X-Shuttle-Project header"); return Ok(Response::builder() diff --git a/deployer/tests/deploy_layer/bind-panic/Cargo.toml b/deployer/tests/deploy_layer/bind-panic/Cargo.toml index 1f971dfe5..2a06bc95d 100644 --- a/deployer/tests/deploy_layer/bind-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/bind-panic/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = "0.8.0" +shuttle-service = "0.11.0" diff --git a/deployer/tests/deploy_layer/main-panic/Cargo.toml b/deployer/tests/deploy_layer/main-panic/Cargo.toml index c1768ce6a..047878b66 100644 --- a/deployer/tests/deploy_layer/main-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/main-panic/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = "0.8.0" +shuttle-service = "0.11.0" diff --git a/deployer/tests/deploy_layer/self-stop/Cargo.toml b/deployer/tests/deploy_layer/self-stop/Cargo.toml index 36b4c4892..1e7b037ae 100644 --- a/deployer/tests/deploy_layer/self-stop/Cargo.toml +++ b/deployer/tests/deploy_layer/self-stop/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [workspace] [dependencies] -shuttle-service = "0.8.0" +shuttle-service = "0.11.0" diff --git a/deployer/tests/deploy_layer/sleep-async/Cargo.toml b/deployer/tests/deploy_layer/sleep-async/Cargo.toml index 694bc88ef..d1f5d1a50 100644 --- a/deployer/tests/deploy_layer/sleep-async/Cargo.toml +++ b/deployer/tests/deploy_layer/sleep-async/Cargo.toml @@ -12,4 +12,4 @@ crate-type = ["cdylib"] [dependencies] tokio = { version = "1.0", features = ["time"]} -shuttle-service = "0.8.0" +shuttle-service = "0.11.0" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 15928d045..c1f95de6b 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -22,5 +22,10 @@ services: exec /usr/local/bin/service "$${@:0}" ports: - - published: 5000 - target: 8000 + - 5000:8000 + panamax: + profiles: + - panamax + deck-chores: + profiles: + - panamax diff --git a/docker-compose.yml b/docker-compose.yml index 10edbccbc..85ef0e204 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,6 @@ version: "3.7" volumes: + auth-vol: gateway-vol: postgres-vol: panamax-crates-vol: @@ -12,10 +13,40 @@ networks: config: - subnet: 10.99.0.0/16 services: + auth: + image: "${CONTAINER_REGISTRY}/auth:${BACKEND_TAG}" + ports: + - 8008:8000 + deploy: + restart_policy: + condition: on-failure + delay: 5s + max_attempts: 3 + update_config: + order: start-first + failure_action: rollback + delay: 10s + rollback_config: + parallelism: 0 + order: stop-first + placement: + constraints: + - node.hostname==controller + networks: + user-net: + volumes: + - auth-vol:/var/lib/shuttle-auth + environment: + - RUST_LOG=${RUST_LOG} + command: + - "--state=/var/lib/shuttle-auth" + - "start" + - "--address=0.0.0.0:8000" gateway: image: "${CONTAINER_REGISTRY}/gateway:${BACKEND_TAG}" depends_on: - provisioner + - auth ports: - 7999:7999 - 8000:8000 @@ -54,6 +85,7 @@ services: - "--prefix=shuttle_" - "--network-name=${STACK}_user-net" - "--docker-host=/var/run/docker.sock" + - "--auth-uri=http://auth:8000" - "--provisioner-host=provisioner" - "--proxy-fqdn=${APPS_FQDN}" - "--use-tls=${USE_TLS}" @@ -68,6 +100,7 @@ services: depends_on: - postgres - mongodb + - auth environment: - RUST_LOG=${RUST_LOG} networks: @@ -95,6 +128,7 @@ services: - "--internal-mongodb-address=mongodb" - "--internal-pg-address=postgres" - "--fqdn=${DB_FQDN}" + - "--auth-uri=http://auth:8000" postgres: image: "${CONTAINER_REGISTRY}/postgres:${POSTGRES_TAG}" restart: always @@ -123,21 +157,17 @@ services: placement: constraints: - node.hostname==postgres - datadog-agent: - image: datadog/agent - restart: always - networks: - user-net: + otel-collector: + image: "${CONTAINER_REGISTRY}/otel:${OTEL_TAG}" volumes: # Pull docker stats - /var/run/docker.sock:/var/run/docker.sock:ro + restart: always + networks: + user-net: environment: - - DD_APM_ENABLED=true - - DD_APM_NON_LOCAL_TRAFFIC=true - - DD_SITE=datadoghq.eu - DD_API_KEY=${DD_API_KEY} - DD_ENV=${DD_ENV} - - DD_CONTAINER_LABELS_AS_TAGS={"project.name":"project_name"} deploy: placement: constraints: diff --git a/e2e/Cargo.toml b/e2e/Cargo.toml index f1d1ed83b..ec7c91d7a 100644 --- a/e2e/Cargo.toml +++ b/e2e/Cargo.toml @@ -11,4 +11,4 @@ portpicker = "0.1.1" rand = "0.8.5" reqwest = { version = "0.11.10", features = ["blocking", "json"] } which = "4.2.5" -tempdir = "0.3.7" +tempfile = "3.3.0" diff --git a/e2e/README.md b/e2e/README.md index 7d6caaf99..2da03d7f5 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -1,9 +1,13 @@ -# Overview +# e2e + +## Overview + This crate runs all the end-to-end tests for shuttle. These tests must run against a local dev environment, so you first have to set that up by following [these instructions](../CONTRIBUTING.md). Running all the end-to-end tests may take a long time, so it is recommended to run individual tests shipped as part of each crate in the workspace first. ## Running the tests + In the root of the repository, run: ```bash diff --git a/e2e/tests/integration/helpers/mod.rs b/e2e/tests/integration/helpers/mod.rs index f888830c8..45a4e1dab 100644 --- a/e2e/tests/integration/helpers/mod.rs +++ b/e2e/tests/integration/helpers/mod.rs @@ -11,7 +11,7 @@ use crossterm::style::{Color, Stylize}; use reqwest::blocking::RequestBuilder; use lazy_static::lazy_static; -use tempdir::TempDir; +use tempfile::{Builder, TempDir}; /// The directory given to `cargo shuttle` run in the context of E2E /// testing @@ -31,7 +31,7 @@ impl TempCargoHome { match env::var("SHUTTLE_CARGO_HOME") { Ok(path) => Self::User(path.into()), Err(_) => { - let dir = TempDir::new("shuttle-tests").unwrap(); + let dir = Builder::new().prefix("shuttle-tests").tempdir().unwrap(); // Apply the `patch.crates-io` for `shuttle-service` let mut config = std::fs::File::create(dir.path().join("config.toml")).unwrap(); diff --git a/examples b/examples index 8ada30396..a5c78703a 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 8ada303965ff7ac14873358243bfa071ed11b7e8 +Subproject commit a5c78703ab676bf7ed1649ef19cb4bfe43c5cc29 diff --git a/extras/otel/Containerfile b/extras/otel/Containerfile new file mode 100644 index 000000000..129451fd7 --- /dev/null +++ b/extras/otel/Containerfile @@ -0,0 +1,10 @@ +ARG OTEL_TAG= + +FROM otel/opentelemetry-collector-contrib:${OTEL_TAG} + +COPY otel-collector-config.yaml /etc/otel-collector-config.yaml + +# Reset the user to allow reading from the docker.sock +USER 0 + +CMD ["--config=/etc/otel-collector-config.yaml"] diff --git a/extras/otel/otel-collector-config.yaml b/extras/otel/otel-collector-config.yaml new file mode 100644 index 000000000..b34f371cd --- /dev/null +++ b/extras/otel/otel-collector-config.yaml @@ -0,0 +1,70 @@ +receivers: + otlp: + protocols: + grpc: + # The hostmetrics receiver is required to get correct infrastructure metrics in Datadog. + hostmetrics: + collection_interval: 10s + scrapers: + paging: + metrics: + system.paging.utilization: + enabled: true + cpu: + metrics: + system.cpu.utilization: + enabled: true + disk: + filesystem: + metrics: + system.filesystem.utilization: + enabled: true + load: + memory: + network: + processes: + # The prometheus receiver scrapes metrics needed for the OpenTelemetry Collector Dashboard. + prometheus/otel: + config: + scrape_configs: + - job_name: 'otelcol' + scrape_interval: 10s + static_configs: + - targets: ['0.0.0.0:8888'] + docker_stats: + endpoint: unix:///var/run/docker.sock + timeout: 20s + api_version: 1.41 + +processors: + batch: + # Make small enough to be processed by datadog + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/datadogexporter#why-am-i-getting-errors-413---request-entity-too-large-how-do-i-fix-it + send_batch_max_size: 100 + send_batch_size: 10 + timeout: 10s + attributes: + actions: + - key: env + value: ${env:DD_ENV} + action: insert + +exporters: + datadog: + api: + site: datadoghq.eu + key: ${env:DD_API_KEY} +service: + pipelines: + traces: + receivers: [otlp] + processors: [attributes, batch] + exporters: [datadog] + logs: + receivers: [otlp] + processors: [attributes, batch] + exporters: [datadog] + metrics: + receivers: [hostmetrics, prometheus/otel, otlp] + processors: [batch] + exporters: [datadog] diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 3fde2914a..9f3c867dd 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-gateway" -version.workspace = true +version = "0.11.2" edition.workspace = true license.workspace = true publish = false @@ -13,36 +13,36 @@ axum-server = { version = "0.4.4", features = [ "tls-rustls" ] } base64 = "0.13.1" bollard = "0.13.0" chrono = { workspace = true } -clap = { version = "4.0.27", features = [ "derive" ] } +clap = { workspace = true } fqdn = "0.2.3" futures = "0.3.25" -http = "0.2.8" -hyper = { version = "0.14.23", features = [ "stream" ] } +http = { workspace = true } +hyper = { workspace = true, features = [ "stream" ] } # not great, but waiting for WebSocket changes to be merged hyper-reverse-proxy = { git = "https://github.com/chesedo/hyper-reverse-proxy", branch = "bug/host_header" } instant-acme = "0.1.1" lazy_static = "1.4.0" num_cpus = "1.14.0" once_cell = { workspace = true } -opentelemetry = { version = "0.18.0", features = ["rt-tokio"] } -opentelemetry-datadog = { version = "0.6.0", features = ["reqwest-client"] } -opentelemetry-http = "0.7.0" +opentelemetry = { workspace = true } +opentelemetry-http = { workspace = true } pem = "1.1.0" -rand = "0.8.5" +pin-project = { workspace = true } +rand = { workspace = true } rcgen = "0.10.0" rustls = "0.20.7" rustls-pemfile = "1.0.1" serde = { workspace = true, features = [ "derive" ] } serde_json = { workspace = true } sqlx = { version = "0.6.2", features = [ "sqlite", "json", "runtime-tokio-native-tls", "migrate" ] } -strum = { version = "0.24.1", features = ["derive"] } +strum = { workspace = true } tokio = { version = "1.22.0", features = [ "full" ] } -tower = { version = "0.4.13", features = [ "steer" ] } +tower = { workspace = true, features = [ "steer" ] } tower-http = { version = "0.3.4", features = ["trace"] } tracing = { workspace = true, features = ["default"] } -tracing-opentelemetry = "0.18.0" +tracing-opentelemetry = { workspace = true } tracing-subscriber = { workspace = true, features = ["default", "env-filter"] } -ttl_cache = "0.5.1" +ttl_cache = { workspace = true } uuid = { workspace = true, features = [ "v4" ] } [dependencies.shuttle-common] @@ -53,7 +53,9 @@ features = ["backend", "models"] anyhow = { workspace = true } base64 = "0.13.1" colored = "2.0.0" -portpicker = "0.1.1" +jsonwebtoken = { workspace = true } +portpicker = { workspace = true } +ring = { workspace = true } snailquote = "0.3.1" tempfile = "3.3.0" diff --git a/gateway/README.md b/gateway/README.md index 8450081ab..8797b724b 100644 --- a/gateway/README.md +++ b/gateway/README.md @@ -1,7 +1,8 @@ # shuttle-gateway ## Tests -To run the tests for gateway, follow the steps in [contributing](https://github.com/shuttle-hq/shuttle/blob/main/CONTRIBUTING.md) to set up your local environment. Then, from the root of the repository, run: + +To run the tests for gateway, follow the steps in [contributing](../CONTRIBUTING.md) to set up your local environment. Then, from the root of the repository, run: ```bash SHUTTLE_TESTS_RUNTIME_IMAGE=public.ecr.aws/shuttle-dev/deployer:latest SHUTTLE_TESTS_NETWORK=shuttle-dev_user-net cargo test --package shuttle-gateway --all-features -- --nocapture diff --git a/gateway/migrations/0003_drop_accounts.sql b/gateway/migrations/0003_drop_accounts.sql new file mode 100644 index 000000000..1616db497 --- /dev/null +++ b/gateway/migrations/0003_drop_accounts.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS accounts; diff --git a/gateway/src/api/auth_layer.rs b/gateway/src/api/auth_layer.rs new file mode 100644 index 000000000..0e08d2587 --- /dev/null +++ b/gateway/src/api/auth_layer.rs @@ -0,0 +1,352 @@ +use std::{convert::Infallible, net::Ipv4Addr, sync::Arc, time::Duration}; + +use axum::{ + body::{boxed, HttpBody}, + headers::{authorization::Bearer, Authorization, Cookie, Header, HeaderMapExt}, + response::Response, +}; +use chrono::{TimeZone, Utc}; +use futures::future::BoxFuture; +use http::{Request, StatusCode, Uri}; +use hyper::{ + client::{connect::dns::GaiResolver, HttpConnector}, + Body, Client, +}; +use hyper_reverse_proxy::ReverseProxy; +use once_cell::sync::Lazy; +use opentelemetry::global; +use opentelemetry_http::HeaderInjector; +use shuttle_common::backends::{auth::ConvertResponse, cache::CacheManagement}; +use tower::{Layer, Service}; +use tracing::{error, trace, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; + +static PROXY_CLIENT: Lazy>> = + Lazy::new(|| ReverseProxy::new(Client::new())); + +/// The idea of this layer is to do two things: +/// 1. Forward all user related routes (`/login`, `/logout`, `/users/*`, etc) to our auth service +/// 2. Upgrade all Authorization Bearer keys and session cookies to JWT tokens for internal +/// communication inside and below gateway, fetching the JWT token from a ttl-cache if it isn't expired, +/// and inserting it in the cache if it isn't there. +#[derive(Clone)] +pub struct ShuttleAuthLayer { + auth_uri: Uri, + cache_manager: Arc>>, +} + +impl ShuttleAuthLayer { + pub fn new( + auth_uri: Uri, + cache_manager: Arc>>, + ) -> Self { + Self { + auth_uri, + cache_manager, + } + } +} + +impl Layer for ShuttleAuthLayer { + type Service = ShuttleAuthService; + + fn layer(&self, inner: S) -> Self::Service { + ShuttleAuthService { + inner, + auth_uri: self.auth_uri.clone(), + cache_manager: self.cache_manager.clone(), + } + } +} + +#[derive(Clone)] +pub struct ShuttleAuthService { + inner: S, + auth_uri: Uri, + cache_manager: Arc>>, +} + +impl Service> for ShuttleAuthService +where + S: Service, Response = Response> + Send + Clone + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = Infallible; + type Future = BoxFuture<'static, Result>; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + match self.inner.poll_ready(cx) { + std::task::Poll::Ready(_) => std::task::Poll::Ready(Ok(())), + std::task::Poll::Pending => std::task::Poll::Pending, + } + } + + fn call(&mut self, mut req: Request) -> Self::Future { + // Pass through status page + if req.uri().path() == "/" { + let future = self.inner.call(req); + + return Box::pin(async move { + match future.await { + Ok(response) => Ok(response), + Err(_) => { + error!("unexpected internal error from gateway"); + + Ok(Response::builder() + .status(StatusCode::SERVICE_UNAVAILABLE) + .body(boxed(Body::empty())) + .unwrap()) + } + } + }); + } + + let forward_to_auth = match req.uri().path() { + "/login" | "/logout" => true, + other => other.starts_with("/users"), + }; + + // If logout is called, invalidate the cached JWT for the callers cookie. + if req.uri().path() == "/logout" { + let cache_manager = self.cache_manager.clone(); + + if let Ok(Some(cookie)) = req.headers().typed_try_get::() { + if let Some(key) = cookie.get("shuttle.sid").map(|id| id.to_string()) { + cache_manager.invalidate(&key); + } + }; + } + + if forward_to_auth { + let target_url = self.auth_uri.to_string(); + + let cx = Span::current().context(); + + global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut HeaderInjector(req.headers_mut())) + }); + + Box::pin(async move { + let response = PROXY_CLIENT + .call(Ipv4Addr::LOCALHOST.into(), &target_url, req) + .await; + + match response { + Ok(res) => { + let (parts, body) = res.into_parts(); + let body = + ::map_err(body, axum::Error::new).boxed_unsync(); + + Ok(Response::from_parts(parts, body)) + } + Err(error) => { + error!(?error, "failed to call authentication service"); + + Ok(Response::builder() + .status(StatusCode::SERVICE_UNAVAILABLE) + .body(boxed(Body::empty())) + .unwrap()) + } + } + }) + } else { + // Enrich the current key | session + + // TODO: read this page to get rid of this clone + // https://github.com/tower-rs/tower/blob/master/guides/building-a-middleware-from-scratch.md + let mut this = self.clone(); + + Box::pin(async move { + let mut auth_details = None; + let mut cache_key = None; + + if let Some(bearer) = req.headers().typed_get::>() { + cache_key = Some(bearer.token().trim().to_string()); + auth_details = Some(make_token_request("/auth/key", bearer)); + } + + if let Some(cookie) = req.headers().typed_get::() { + if let Some(id) = cookie.get("shuttle.sid") { + cache_key = Some(id.to_string()); + auth_details = Some(make_token_request("/auth/session", cookie)); + }; + } + + // Only if there is something to upgrade + if let Some(token_request) = auth_details { + let target_url = this.auth_uri.to_string(); + + if let Some(key) = cache_key { + // Check if the token is cached. + if let Some(token) = this.cache_manager.get(&key) { + trace!("JWT cache hit, setting token from cache on request"); + + // Token is cached and not expired, return it in the response. + req.headers_mut() + .typed_insert(Authorization::bearer(&token).unwrap()); + } else { + trace!("JWT cache missed, sending convert token request"); + + // Token is not in the cache, send a convert request. + let token_response = match PROXY_CLIENT + .call(Ipv4Addr::LOCALHOST.into(), &target_url, token_request) + .await + { + Ok(res) => res, + Err(error) => { + error!(?error, "failed to call authentication service"); + + return Ok(Response::builder() + .status(StatusCode::SERVICE_UNAVAILABLE) + .body(boxed(Body::empty())) + .unwrap()); + } + }; + + // Bubble up auth errors + if token_response.status() != StatusCode::OK { + let (parts, body) = token_response.into_parts(); + let body = ::map_err(body, axum::Error::new) + .boxed_unsync(); + + return Ok(Response::from_parts(parts, body)); + } + + let body = match hyper::body::to_bytes(token_response.into_body()).await + { + Ok(body) => body, + Err(error) => { + error!( + error = &error as &dyn std::error::Error, + "failed to get response body" + ); + + return Ok(Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(boxed(Body::empty())) + .unwrap()); + } + }; + + let response: ConvertResponse = match serde_json::from_slice(&body) { + Ok(response) => response, + Err(error) => { + error!( + error = &error as &dyn std::error::Error, + "failed to convert body to ConvertResponse" + ); + + return Ok(Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(boxed(Body::empty())) + .unwrap()); + } + }; + + match extract_token_expiration(response.token.clone()) { + Ok(expiration) => { + // Cache the token. + this.cache_manager.insert( + key.as_str(), + response.token.clone(), + expiration, + ); + } + Err(status) => { + error!( + "failed to extract token expiration before inserting into cache" + ); + return Ok(Response::builder() + .status(status) + .body(boxed(Body::empty())) + .unwrap()); + } + }; + + trace!("token inserted in cache, request proceeding"); + req.headers_mut() + .typed_insert(Authorization::bearer(&response.token).unwrap()); + } + }; + } + + match this.inner.call(req).await { + Ok(response) => Ok(response), + Err(_) => { + error!("unexpected internal error from gateway"); + + Ok(Response::builder() + .status(StatusCode::SERVICE_UNAVAILABLE) + .body(boxed(Body::empty())) + .unwrap()) + } + } + }) + } + } +} + +fn extract_token_expiration(token: String) -> Result { + let (_header, rest) = token + .split_once('.') + .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?; + + let (claim, _sig) = rest + .split_once('.') + .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?; + + let claim = base64::decode_config(claim, base64::URL_SAFE_NO_PAD) + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + + let claim: serde_json::Map = + serde_json::from_slice(&claim).map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + + let exp = claim["exp"] + .as_i64() + .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?; + + let expiration_timestamp = Utc + .timestamp_opt(exp, 0) + .single() + .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?; + + let duration = expiration_timestamp - Utc::now(); + + // We will use this duration to set the TTL for the JWT in the cache. We subtract 180 seconds + // to make sure a token from the cache will still be valid in cases where it will be used to + // authorize some operation, the operation takes some time, and then the token needs to be + // used again. + // + // This number should never be negative since the JWT has just been created, and so should be + // safe to cast to u64. However, if the number *is* negative it would wrap and the TTL duration + // would be near u64::MAX, so we use try_from to ensure that can't happen. + let duration_minus_buffer = u64::try_from(duration.num_seconds() - 180) + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + + Ok(std::time::Duration::from_secs(duration_minus_buffer)) +} + +fn make_token_request(uri: &str, header: impl Header) -> Request { + let mut token_request = Request::builder().uri(uri); + token_request + .headers_mut() + .expect("manual request to be valid") + .typed_insert(header); + + let cx = Span::current().context(); + + global::get_text_map_propagator(|propagator| { + propagator.inject_context( + &cx, + &mut HeaderInjector(token_request.headers_mut().expect("request to be valid")), + ) + }); + + token_request + .body(Body::empty()) + .expect("manual request to be valid") +} diff --git a/gateway/src/api/latest.rs b/gateway/src/api/latest.rs index b9210cc97..2b64bc4fb 100644 --- a/gateway/src/api/latest.rs +++ b/gateway/src/api/latest.rs @@ -3,8 +3,9 @@ use std::net::SocketAddr; use std::sync::Arc; use std::time::Duration; -use axum::body::{Body, BoxBody}; -use axum::extract::{Extension, MatchedPath, Path, State}; +use axum::body::Body; +use axum::extract::{Extension, Path, State}; +use axum::handler::Handler; use axum::http::Request; use axum::middleware::from_extractor; use axum::response::Response; @@ -12,26 +13,32 @@ use axum::routing::{any, get, post}; use axum::{Json as AxumJson, Router}; use fqdn::FQDN; use futures::Future; -use http::StatusCode; +use http::{StatusCode, Uri}; use instant_acme::{AccountCredentials, ChallengeType}; use serde::{Deserialize, Serialize}; -use shuttle_common::backends::metrics::Metrics; +use shuttle_common::backends::auth::{ + AuthPublicKey, JwtAuthenticationLayer, Scope, ScopedLayer, EXP_MINUTES, +}; +use shuttle_common::backends::cache::CacheManager; +use shuttle_common::backends::metrics::{Metrics, TraceLayer}; use shuttle_common::models::error::ErrorKind; -use shuttle_common::models::{project, stats, user}; +use shuttle_common::models::{project, stats}; +use shuttle_common::request_span; use tokio::sync::mpsc::Sender; use tokio::sync::{Mutex, MutexGuard}; -use tower_http::trace::TraceLayer; -use tracing::{debug, debug_span, field, instrument, Span}; +use tracing::{field, instrument, trace}; use ttl_cache::TtlCache; use uuid::Uuid; use crate::acme::{AcmeClient, CustomDomain}; -use crate::auth::{Admin, ScopedUser, User}; -use crate::project::{Project, ProjectCreating}; +use crate::auth::{ScopedUser, User}; +use crate::project::{ContainerInspectResponseExt, Project, ProjectCreating}; use crate::task::{self, BoxedTask, TaskResult}; use crate::tls::GatewayCertResolver; use crate::worker::WORKER_QUEUE_SIZE; -use crate::{AccountName, Error, GatewayService, ProjectName}; +use crate::{Error, GatewayService, ProjectName}; + +use super::auth_layer::ShuttleAuthLayer; pub const SVC_DEGRADED_THRESHOLD: usize = 128; @@ -68,28 +75,6 @@ impl StatusResponse { } } -#[instrument(skip_all, fields(%account_name))] -async fn get_user( - State(RouterState { service, .. }): State, - Path(account_name): Path, - _: Admin, -) -> Result, Error> { - let user = User::retrieve_from_account_name(&service, account_name).await?; - - Ok(AxumJson(user.into())) -} - -#[instrument(skip_all, fields(%account_name))] -async fn post_user( - State(RouterState { service, .. }): State, - Path(account_name): Path, - _: Admin, -) -> Result, Error> { - let user = service.create_user(account_name).await?; - - Ok(AxumJson(user.into())) -} - #[instrument(skip(service))] async fn get_project( State(RouterState { service, .. }): State, @@ -121,16 +106,37 @@ async fn get_projects_list( Ok(AxumJson(projects)) } +// async fn get_projects_list_with_filter( +// State(RouterState { service, .. }): State, +// User { name, .. }: User, +// Path(project_status): Path, +// ) -> Result>, Error> { +// let projects = service +// .iter_user_projects_detailed_filtered(name.clone(), project_status) +// .await? +// .into_iter() +// .map(|project| project::Response { +// name: project.0.to_string(), +// state: project.1.into(), +// }) +// .collect(); + +// Ok(AxumJson(projects)) +// } + #[instrument(skip_all, fields(%project))] async fn post_project( State(RouterState { service, sender, .. }): State, - User { name, .. }: User, + User { name, claim, .. }: User, Path(project): Path, + AxumJson(config): AxumJson, ) -> Result, Error> { + let is_admin = claim.scopes.contains(&Scope::Admin); + let state = service - .create_project(project.clone(), name.clone()) + .create_project(project.clone(), name.clone(), is_admin, config.idle_minutes) .await?; service @@ -180,11 +186,18 @@ async fn delete_project( #[instrument(skip_all, fields(scope = %scoped_user.scope))] async fn route_project( - State(RouterState { service, .. }): State, + State(RouterState { + service, sender, .. + }): State, scoped_user: ScopedUser, req: Request, ) -> Result, Error> { - service.route(&scoped_user, req).await + let project_name = scoped_user.scope; + let project = service.find_or_start_project(&project_name, sender).await?; + + service + .route(&project, &project_name, &scoped_user.user.name, req) + .await } async fn get_status(State(RouterState { sender, .. }): State) -> Response { @@ -212,11 +225,13 @@ async fn post_load( AxumJson(build): AxumJson, ) -> Result, Error> { let mut running_builds = running_builds.lock().await; + + trace!(id = %build.id, "checking build queue"); let mut load = calculate_capacity(&mut running_builds); if load.has_capacity && running_builds - .insert(build.id, (), Duration::from_secs(60 * 10)) + .insert(build.id, (), Duration::from_secs(60 * EXP_MINUTES as u64)) .is_none() { // Only increase when an item was not already in the queue @@ -234,6 +249,7 @@ async fn delete_load( let mut running_builds = running_builds.lock().await; running_builds.remove(&build.id); + trace!(id = %build.id, "removing from build queue"); let load = calculate_capacity(&mut running_builds); Ok(AxumJson(load)) @@ -241,7 +257,6 @@ async fn delete_load( #[instrument(skip_all)] async fn get_load_admin( - _: Admin, State(RouterState { running_builds, .. }): State, ) -> Result, Error> { let mut running_builds = running_builds.lock().await; @@ -253,7 +268,6 @@ async fn get_load_admin( #[instrument(skip_all)] async fn delete_load_admin( - _: Admin, State(RouterState { running_builds, .. }): State, ) -> Result, Error> { let mut running_builds = running_builds.lock().await; @@ -277,7 +291,6 @@ fn calculate_capacity(running_builds: &mut MutexGuard>) -> st #[instrument(skip_all)] async fn revive_projects( - _: Admin, State(RouterState { service, sender, .. }): State, @@ -289,7 +302,6 @@ async fn revive_projects( #[instrument(skip_all, fields(%email, ?acme_server))] async fn create_acme_account( - _: Admin, Extension(acme_client): Extension, Path(email): Path, AxumJson(acme_server): AxumJson>, @@ -301,7 +313,6 @@ async fn create_acme_account( #[instrument(skip_all, fields(%project_name, %fqdn))] async fn request_acme_certificate( - _: Admin, State(RouterState { service, sender, .. }): State, @@ -332,6 +343,9 @@ async fn request_acme_certificate( Err(err) => return Err(err), }; + let project = service.find_project(&project_name).await?; + let idle_minutes = project.container().unwrap().idle_minutes(); + // destroy and recreate the project with the new domain service .new_task() @@ -343,8 +357,11 @@ async fn request_acme_certificate( move |ctx| { let fqdn = fqdn.clone(); async move { - let creating = ProjectCreating::new_with_random_initial_key(ctx.project_name) - .with_fqdn(fqdn); + let creating = ProjectCreating::new_with_random_initial_key( + ctx.project_name, + idle_minutes, + ) + .with_fqdn(fqdn); TaskResult::Done(Project::Creating(creating)) } } @@ -363,7 +380,6 @@ async fn request_acme_certificate( } async fn get_projects( - _: Admin, State(RouterState { service, .. }): State, ) -> Result>, Error> { let projects = service @@ -409,10 +425,16 @@ impl ApiBuilder { pub fn with_acme(mut self, acme: AcmeClient, resolver: Arc) -> Self { self.router = self .router - .route("/admin/acme/:email", post(create_acme_account)) + .route( + "/admin/acme/:email", + post(create_acme_account.layer(ScopedLayer::new(vec![Scope::AcmeCreate]))), + ) .route( "/admin/acme/request/:project_name/:fqdn", - post(request_acme_certificate), + post( + request_acme_certificate + .layer(ScopedLayer::new(vec![Scope::CustomDomainCreate])), + ), ) .layer(Extension(acme)) .layer(Extension(resolver)); @@ -436,36 +458,16 @@ impl ApiBuilder { pub fn with_default_traces(mut self) -> Self { self.router = self.router.route_layer(from_extractor::()).layer( - TraceLayer::new_for_http() - .make_span_with(|request: &Request| { - let path = if let Some(path) = request.extensions().get::() { - path.as_str() - } else { - "" - }; - - debug_span!( - "request", - http.uri = %request.uri(), - http.method = %request.method(), - http.status_code = field::Empty, - account.name = field::Empty, - // A bunch of extra things for metrics - // Should be able to make this clearer once `Valuable` support lands in tracing - request.path = path, - request.params.project_name = field::Empty, - request.params.account_name = field::Empty, - ) - }) - .on_response( - |response: &Response, latency: Duration, span: &Span| { - span.record("http.status_code", response.status().as_u16()); - debug!( - latency = format_args!("{} ns", latency.as_nanos()), - "finished processing request" - ); - }, - ), + TraceLayer::new(|request| { + request_span!( + request, + account.name = field::Empty, + request.params.project_name = field::Empty, + request.params.account_name = field::Empty + ) + }) + .with_propagation() + .build(), ); self } @@ -474,23 +476,55 @@ impl ApiBuilder { self.router = self .router .route("/", get(get_status)) - .route("/projects", get(get_projects_list)) + .route( + "/projects", + get(get_projects_list.layer(ScopedLayer::new(vec![Scope::Project]))), + ) + // .route( + // "/projects/:state", + // get(get_projects_list_with_filter.layer(ScopedLayer::new(vec![Scope::Project]))), + // ) .route( "/projects/:project_name", - get(get_project).delete(delete_project).post(post_project), + get(get_project.layer(ScopedLayer::new(vec![Scope::Project]))) + .delete(delete_project.layer(ScopedLayer::new(vec![Scope::ProjectCreate]))) + .post(post_project.layer(ScopedLayer::new(vec![Scope::ProjectCreate]))), ) - .route("/users/:account_name", get(get_user).post(post_user)) .route("/projects/:project_name/*any", any(route_project)) .route("/stats/load", post(post_load).delete(delete_load)) - .route("/admin/projects", get(get_projects)) - .route("/admin/revive", post(revive_projects)) + .route( + "/admin/projects", + get(get_projects.layer(ScopedLayer::new(vec![Scope::Admin]))), + ) + .route( + "/admin/revive", + post(revive_projects.layer(ScopedLayer::new(vec![Scope::Admin]))), + ) .route( "/admin/stats/load", - get(get_load_admin).delete(delete_load_admin), + get(get_load_admin) + .delete(delete_load_admin) + .layer(ScopedLayer::new(vec![Scope::Admin])), ); self } + pub fn with_auth_service(mut self, auth_uri: Uri) -> Self { + let auth_public_key = AuthPublicKey::new(auth_uri.clone()); + + let jwt_cache_manager = CacheManager::new(1000); + + self.router = self + .router + .layer(JwtAuthenticationLayer::new(auth_public_key)) + .layer(ShuttleAuthLayer::new( + auth_uri, + Arc::new(Box::new(jwt_cache_manager)), + )); + + self + } + pub fn into_router(self) -> Router { let service = self.service.expect("a GatewayService is required"); let sender = self.sender.expect("a task Sender is required"); @@ -550,9 +584,10 @@ pub mod tests { .with_service(Arc::clone(&service)) .with_sender(sender) .with_default_routes() + .with_auth_service(world.context().auth_uri) .into_router(); - let neo = service.create_user("neo".parse().unwrap()).await?; + let neo_key = world.create_user("neo"); let create_project = |project: &str| { Request::builder() @@ -576,7 +611,7 @@ pub mod tests { .await .unwrap(); - let authorization = Authorization::bearer(neo.key.as_str()).unwrap(); + let authorization = Authorization::bearer(&neo_key).unwrap(); router .call(create_project("matrix").with_header(&authorization)) @@ -634,9 +669,9 @@ pub mod tests { .await .unwrap(); - let trinity = service.create_user("trinity".parse().unwrap()).await?; + let trinity_key = world.create_user("trinity"); - let authorization = Authorization::bearer(trinity.key.as_str()).unwrap(); + let authorization = Authorization::bearer(&trinity_key).unwrap(); router .call(get_project("reloaded").with_header(&authorization)) @@ -652,125 +687,32 @@ pub mod tests { .await .unwrap(); - service - .set_super_user(&"trinity".parse().unwrap(), true) - .await?; - - router - .call(get_project("reloaded").with_header(&authorization)) - .map_ok(|resp| assert_eq!(resp.status(), StatusCode::OK)) - .await - .unwrap(); - - router - .call(delete_project("reloaded").with_header(&authorization)) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::OK); - }) - .await - .unwrap(); - - // delete returns 404 for project that doesn't exist - router - .call(delete_project("resurrections").with_header(&authorization)) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::NOT_FOUND); - }) - .await - .unwrap(); - - Ok(()) - } - - #[tokio::test] - async fn api_create_get_users() -> anyhow::Result<()> { - let world = World::new().await; - let service = Arc::new(GatewayService::init(world.args(), world.pool()).await); - - let (sender, mut receiver) = channel::(256); - tokio::spawn(async move { - while receiver.recv().await.is_some() { - // do not do any work with inbound requests - } - }); - - let mut router = ApiBuilder::new() - .with_service(Arc::clone(&service)) - .with_sender(sender) - .with_default_routes() - .into_router(); - - let get_neo = || { - Request::builder() - .method("GET") - .uri("/users/neo") - .body(Body::empty()) - .unwrap() - }; - - let post_trinity = || { - Request::builder() - .method("POST") - .uri("/users/trinity") - .body(Body::empty()) - .unwrap() - }; - - router - .call(get_neo()) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::UNAUTHORIZED); - }) - .await - .unwrap(); - - let user = service.create_user("neo".parse().unwrap()).await?; - - router - .call(get_neo()) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::UNAUTHORIZED); - }) - .await - .unwrap(); - - let authorization = Authorization::bearer(user.key.as_str()).unwrap(); - - router - .call(get_neo().with_header(&authorization)) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::FORBIDDEN); - }) - .await - .unwrap(); - - router - .call(post_trinity().with_header(&authorization)) - .map_ok(|resp| assert_eq!(resp.status(), StatusCode::FORBIDDEN)) - .await - .unwrap(); - - service.set_super_user(&user.name, true).await?; - - router - .call(get_neo().with_header(&authorization)) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::OK); - }) - .await - .unwrap(); - - router - .call(post_trinity().with_header(&authorization)) - .map_ok(|resp| assert_eq!(resp.status(), StatusCode::OK)) - .await - .unwrap(); - - router - .call(post_trinity().with_header(&authorization)) - .map_ok(|resp| assert_eq!(resp.status(), StatusCode::BAD_REQUEST)) - .await - .unwrap(); + // TODO: setting the user to admin here doesn't update the cached token, so the + // commands will still fail. We need to add functionality for this or modify the test. + // world.set_super_user("trinity"); + + // router + // .call(get_project("reloaded").with_header(&authorization)) + // .map_ok(|resp| assert_eq!(resp.status(), StatusCode::OK)) + // .await + // .unwrap(); + + // router + // .call(delete_project("reloaded").with_header(&authorization)) + // .map_ok(|resp| { + // assert_eq!(resp.status(), StatusCode::OK); + // }) + // .await + // .unwrap(); + + // // delete returns 404 for project that doesn't exist + // router + // .call(delete_project("resurrections").with_header(&authorization)) + // .map_ok(|resp| { + // assert_eq!(resp.status(), StatusCode::NOT_FOUND); + // }) + // .await + // .unwrap(); Ok(()) } @@ -798,6 +740,7 @@ pub mod tests { .with_service(Arc::clone(&service)) .with_sender(sender) .with_default_routes() + .with_auth_service(world.context().auth_uri) .into_router(); let get_status = || { @@ -811,11 +754,10 @@ pub mod tests { let resp = router.call(get_status()).await.unwrap(); assert_eq!(resp.status(), StatusCode::OK); - let neo: AccountName = "neo".parse().unwrap(); let matrix: ProjectName = "matrix".parse().unwrap(); - let neo = service.create_user(neo).await.unwrap(); - let authorization = Authorization::bearer(neo.key.as_str()).unwrap(); + let neo_key = world.create_user("neo"); + let authorization = Authorization::bearer(&neo_key).unwrap(); let create_project = Request::builder() .method("POST") diff --git a/gateway/src/api/mod.rs b/gateway/src/api/mod.rs index 27f571e54..3165903a4 100644 --- a/gateway/src/api/mod.rs +++ b/gateway/src/api/mod.rs @@ -1 +1,3 @@ +mod auth_layer; + pub mod latest; diff --git a/gateway/src/args.rs b/gateway/src/args.rs index fd720025b..34a3becae 100644 --- a/gateway/src/args.rs +++ b/gateway/src/args.rs @@ -2,8 +2,7 @@ use std::{net::SocketAddr, path::PathBuf}; use clap::{Parser, Subcommand, ValueEnum}; use fqdn::FQDN; - -use crate::auth::Key; +use http::Uri; #[derive(Parser, Debug)] pub struct Args { @@ -24,7 +23,6 @@ pub enum UseTls { #[derive(Subcommand, Debug)] pub enum Commands { Start(StartArgs), - Init(InitArgs), } #[derive(clap::Args, Debug, Clone)] @@ -45,16 +43,6 @@ pub struct StartArgs { pub context: ContextArgs, } -#[derive(clap::Args, Debug, Clone)] -pub struct InitArgs { - /// Name of initial account to create - #[arg(long)] - pub name: String, - /// Key to assign to initial account - #[arg(long)] - pub key: Option, -} - #[derive(clap::Args, Debug, Clone)] pub struct ContextArgs { /// Default image to deploy user runtimes into @@ -68,6 +56,9 @@ pub struct ContextArgs { /// the provisioner service #[arg(long, default_value = "provisioner")] pub provisioner_host: String, + /// Address to reach the authentication service at + #[arg(long, default_value = "http://127.0.0.1:8008")] + pub auth_uri: Uri, /// The Docker Network name in which to deploy user runtimes #[arg(long, default_value = "shuttle_default")] pub network_name: String, diff --git a/gateway/src/auth.rs b/gateway/src/auth.rs index 2e1b84b19..679890b0c 100644 --- a/gateway/src/auth.rs +++ b/gateway/src/auth.rs @@ -1,186 +1,25 @@ -use std::fmt::{Debug, Formatter}; +use std::fmt::Debug; use std::str::FromStr; -use axum::extract::{FromRef, FromRequestParts, Path, TypedHeader}; -use axum::headers::authorization::Bearer; -use axum::headers::Authorization; +use axum::extract::{FromRef, FromRequestParts, Path}; use axum::http::request::Parts; -use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; +use shuttle_common::backends::auth::{Claim, Scope}; use tracing::{trace, Span}; use crate::api::latest::RouterState; -use crate::service::GatewayService; use crate::{AccountName, Error, ErrorKind, ProjectName}; -#[derive(Clone, Debug, sqlx::Type, PartialEq, Hash, Eq, Serialize, Deserialize)] -#[serde(transparent)] -#[sqlx(transparent)] -pub struct Key(String); - -impl Key { - pub fn as_str(&self) -> &str { - &self.0 - } -} - -#[async_trait] -impl FromRequestParts for Key -where - S: Send + Sync, -{ - type Rejection = Error; - - async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { - let key = TypedHeader::>::from_request_parts(parts, state) - .await - .map_err(|_| Error::from(ErrorKind::KeyMissing)) - .and_then(|TypedHeader(Authorization(bearer))| bearer.token().trim().parse())?; - - trace!(%key, "got bearer key"); - - Ok(key) - } -} - -impl std::fmt::Display for Key { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.0) - } -} - -impl FromStr for Key { - type Err = Error; - - fn from_str(s: &str) -> Result { - Ok(Self(s.to_string())) - } -} - -impl Key { - pub fn new_random() -> Self { - Self(Alphanumeric.sample_string(&mut rand::thread_rng(), 16)) - } -} - -/// A wrapper for a guard that verifies an API key is associated with a -/// valid user. +/// A wrapper to enrich a token with user details /// -/// The `FromRequest` impl consumes the API key and verifies it is valid for the -/// a user. Generally you want to use [`ScopedUser`] instead to ensure the request +/// The `FromRequest` impl consumes the API claim and enriches it with project +/// details. Generally you want to use [`ScopedUser`] instead to ensure the request /// is valid against the user's owned resources. #[derive(Clone, Deserialize, PartialEq, Eq, Serialize, Debug)] pub struct User { - pub name: AccountName, - pub key: Key, pub projects: Vec, - pub permissions: Permissions, -} - -impl User { - pub fn is_super_user(&self) -> bool { - self.permissions.is_super_user() - } - - pub fn new_with_defaults(name: AccountName, key: Key) -> Self { - Self { - name, - key, - projects: Vec::new(), - permissions: Permissions::default(), - } - } - - pub async fn retrieve_from_account_name( - svc: &GatewayService, - name: AccountName, - ) -> Result { - let key = svc.key_from_account_name(&name).await?; - let permissions = svc.get_permissions(&name).await?; - let projects = svc.iter_user_projects(&name).await?.collect(); - Ok(User { - name, - key, - projects, - permissions, - }) - } - - pub async fn retrieve_from_key(svc: &GatewayService, key: Key) -> Result { - let name = svc.account_name_from_key(&key).await?; - trace!(%name, "got account name from key"); - - let permissions = svc.get_permissions(&name).await?; - let projects = svc.iter_user_projects(&name).await?.collect(); - Ok(User { - name, - key, - projects, - permissions, - }) - } -} - -#[derive(Clone, Copy, Deserialize, PartialEq, Eq, Serialize, Debug, sqlx::Type)] -#[sqlx(rename_all = "lowercase")] -pub enum AccountTier { - Basic, - Pro, - Team, -} - -#[derive(Default)] -pub struct PermissionsBuilder { - tier: Option, - super_user: Option, -} - -impl PermissionsBuilder { - pub fn super_user(mut self, is_super_user: bool) -> Self { - self.super_user = Some(is_super_user); - self - } - - pub fn tier(mut self, tier: AccountTier) -> Self { - self.tier = Some(tier); - self - } - - pub fn build(self) -> Permissions { - Permissions { - tier: self.tier.unwrap_or(AccountTier::Basic), - super_user: self.super_user.unwrap_or_default(), - } - } -} - -#[derive(Clone, Deserialize, PartialEq, Eq, Serialize, Debug)] -pub struct Permissions { - pub tier: AccountTier, - pub super_user: bool, -} - -impl Default for Permissions { - fn default() -> Self { - Self { - tier: AccountTier::Basic, - super_user: false, - } - } -} - -impl Permissions { - pub fn builder() -> PermissionsBuilder { - PermissionsBuilder::default() - } - - pub fn tier(&self) -> &AccountTier { - &self.tier - } - - pub fn is_super_user(&self) -> bool { - self.super_user - } + pub claim: Claim, + pub name: AccountName, } #[async_trait] @@ -192,37 +31,28 @@ where type Rejection = Error; async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { - let key = Key::from_request_parts(parts, state).await?; + let claim = parts.extensions.get::().ok_or(ErrorKind::Internal)?; + let name = AccountName::from_str(&claim.sub) + .map_err(|err| Error::source(ErrorKind::Internal, err))?; + + // Record current account name for tracing purposes + Span::current().record("account.name", &name.to_string()); let RouterState { service, .. } = RouterState::from_ref(state); - let user = User::retrieve_from_key(&service, key) - .await - // Absord any error into `Unauthorized` - .map_err(|e| Error::source(ErrorKind::Unauthorized, e))?; + let user = User { + claim: claim.clone(), + projects: service.iter_user_projects(&name).await?.collect(), + name, + }; - // Record current account name for tracing purposes - Span::current().record("account.name", &user.name.to_string()); + trace!(?user, "got user"); Ok(user) } } -impl From for shuttle_common::models::user::Response { - fn from(user: User) -> Self { - Self { - name: user.name.to_string(), - key: user.key.to_string(), - projects: user - .projects - .into_iter() - .map(|name| name.to_string()) - .collect(), - } - } -} - -/// A wrapper for a guard that validates a user's API key *and* +/// A wrapper for a guard that validates a user's API token *and* /// scopes the request to a project they own. /// /// It is guaranteed that [`ScopedUser::scope`] exists and is owned @@ -251,33 +81,10 @@ where .unwrap(), }; - if user.is_super_user() || user.projects.contains(&scope) { + if user.projects.contains(&scope) || user.claim.scopes.contains(&Scope::Admin) { Ok(Self { user, scope }) } else { Err(Error::from(ErrorKind::ProjectNotFound)) } } } - -pub struct Admin { - pub user: User, -} - -#[async_trait] -impl FromRequestParts for Admin -where - S: Send + Sync, - RouterState: FromRef, -{ - type Rejection = Error; - - async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { - let user = User::from_request_parts(parts, state).await?; - - if user.is_super_user() { - Ok(Self { user }) - } else { - Err(Error::from(ErrorKind::Forbidden)) - } - } -} diff --git a/gateway/src/lib.rs b/gateway/src/lib.rs index 09c60b79d..b1a6e6175 100644 --- a/gateway/src/lib.rs +++ b/gateway/src/lib.rs @@ -322,15 +322,18 @@ pub trait Refresh: Sized { #[cfg(test)] pub mod tests { + use std::collections::HashMap; use std::env; - use std::io::Read; use std::net::SocketAddr; use std::str::FromStr; - use std::sync::Arc; + use std::sync::{Arc, Mutex}; use std::time::Duration; use anyhow::{anyhow, Context as AnyhowContext}; + use axum::headers::authorization::Bearer; use axum::headers::Authorization; + use axum::routing::get; + use axum::{extract, Router, TypedHeader}; use bollard::Docker; use fqdn::FQDN; use futures::prelude::*; @@ -338,15 +341,17 @@ pub mod tests { use hyper::http::uri::Scheme; use hyper::http::Uri; use hyper::{Body, Client as HyperClient, Request, Response, StatusCode}; + use jsonwebtoken::EncodingKey; use rand::distributions::{Alphanumeric, DistString, Distribution, Uniform}; - use shuttle_common::models::{project, service, user}; + use ring::signature::{self, Ed25519KeyPair, KeyPair}; + use shuttle_common::backends::auth::{Claim, ConvertResponse, Scope}; + use shuttle_common::models::project; use sqlx::SqlitePool; use tokio::sync::mpsc::channel; use crate::acme::AcmeClient; use crate::api::latest::ApiBuilder; use crate::args::{ContextArgs, StartArgs, UseTls}; - use crate::auth::User; use crate::proxy::UserServiceBuilder; use crate::service::{ContainerSettings, GatewayService, MIGRATIONS}; use crate::worker::Worker; @@ -544,6 +549,8 @@ pub mod tests { hyper: HyperClient, pool: SqlitePool, acme_client: AcmeClient, + auth_service: Arc>, + auth_uri: Uri, } #[derive(Clone)] @@ -551,6 +558,7 @@ pub mod tests { pub docker: Docker, pub container_settings: ContainerSettings, pub hyper: HyperClient, + pub auth_uri: Uri, } impl World { @@ -566,9 +574,14 @@ pub mod tests { let control: i16 = Uniform::from(9000..10000).sample(&mut rand::thread_rng()); let user = control + 1; let bouncer = user + 1; + let auth = bouncer + 1; let control = format!("127.0.0.1:{control}").parse().unwrap(); let user = format!("127.0.0.1:{user}").parse().unwrap(); let bouncer = format!("127.0.0.1:{bouncer}").parse().unwrap(); + let auth: SocketAddr = format!("127.0.0.1:{auth}").parse().unwrap(); + let auth_uri: Uri = format!("http://{auth}").parse().unwrap(); + + let auth_service = AuthService::new(auth); let prefix = format!( "shuttle_test_{}_", @@ -595,14 +608,13 @@ pub mod tests { image, prefix, provisioner_host, + auth_uri: auth_uri.clone(), network_name, proxy_fqdn: FQDN::from_str("test.shuttleapp.rs").unwrap(), }, }; - let settings = ContainerSettings::builder(&docker) - .from_args(&args.context) - .await; + let settings = ContainerSettings::builder().from_args(&args.context).await; let hyper = HyperClient::builder().build(HttpConnector::new()); @@ -618,6 +630,8 @@ pub mod tests { hyper, pool, acme_client, + auth_service, + auth_uri, } } @@ -640,6 +654,22 @@ pub mod tests { pub fn acme_client(&self) -> AcmeClient { self.acme_client.clone() } + + pub fn create_user(&self, user: &str) -> String { + self.auth_service + .lock() + .unwrap() + .users + .insert(user.to_string(), vec![Scope::Project, Scope::ProjectCreate]); + + user.to_string() + } + + pub fn set_super_user(&self, user: &str) { + if let Some(scopes) = self.auth_service.lock().unwrap().users.get_mut(user) { + scopes.push(Scope::Admin) + } + } } impl World { @@ -648,6 +678,7 @@ pub mod tests { docker: self.docker.clone(), container_settings: self.settings.clone(), hyper: self.hyper.clone(), + auth_uri: self.auth_uri.clone(), } } } @@ -662,6 +693,60 @@ pub mod tests { } } + struct AuthService { + users: HashMap>, + encoding_key: EncodingKey, + public_key: Vec, + } + + impl AuthService { + fn new(address: SocketAddr) -> Arc> { + let doc = signature::Ed25519KeyPair::generate_pkcs8(&ring::rand::SystemRandom::new()) + .unwrap(); + let encoding_key = EncodingKey::from_ed_der(doc.as_ref()); + let pair = Ed25519KeyPair::from_pkcs8(doc.as_ref()).unwrap(); + let public_key = pair.public_key().as_ref().to_vec(); + + let this = Arc::new(Mutex::new(Self { + users: HashMap::new(), + encoding_key, + public_key, + })); + + let router = Router::new() + .route( + "/public-key", + get(|extract::State(state): extract::State>>| async move { + state.lock().unwrap().public_key.clone() + }), + ) + .route( + "/auth/key", + get(|extract::State(state): extract::State>>, TypedHeader(bearer): TypedHeader> | async move { + let state = state.lock().unwrap(); + + if let Some(scopes) = state.users.get(bearer.token()) { + let claim = Claim::new(bearer.token().to_string(), scopes.clone()); + let token = claim.into_token(&state.encoding_key)?; + Ok(serde_json::to_vec(&ConvertResponse { token }).unwrap()) + } else { + Err(StatusCode::NOT_FOUND) + } + }), + ) + .with_state(this.clone()); + + tokio::spawn(async move { + axum::Server::bind(&address) + .serve(router.into_make_service()) + .await + .unwrap(); + }); + + this + } + } + #[tokio::test] async fn end_to_end() { let world = World::new().await; @@ -682,27 +767,19 @@ pub mod tests { } }); - let base_port = loop { - let port = portpicker::pick_unused_port().unwrap(); - if portpicker::is_free_tcp(port + 1) { - break port; - } - }; - - let api_addr = format!("127.0.0.1:{}", base_port).parse().unwrap(); - let api_client = world.client(api_addr); + let api_client = world.client(world.args.control); let api = ApiBuilder::new() .with_service(Arc::clone(&service)) - .with_sender(log_out) + .with_sender(log_out.clone()) .with_default_routes() - .binding_to(api_addr); + .with_auth_service(world.context().auth_uri) + .binding_to(world.args.control); - let user_addr: SocketAddr = format!("127.0.0.1:{}", base_port + 1).parse().unwrap(); - let proxy_client = world.client(user_addr); let user = UserServiceBuilder::new() .with_service(Arc::clone(&service)) + .with_task_sender(log_out.clone()) .with_public(world.fqdn()) - .with_user_proxy_binding_to(user_addr); + .with_user_proxy_binding_to(world.args.user); let _gateway = tokio::spawn(async move { tokio::select! { @@ -712,25 +789,14 @@ pub mod tests { } }); - let User { key, name, .. } = service.create_user("neo".parse().unwrap()).await.unwrap(); - service.set_super_user(&name, true).await.unwrap(); + // Allow the spawns to start + tokio::time::sleep(Duration::from_secs(1)).await; - let user::Response { key, .. } = api_client - .request( - Request::post("/users/trinity") - .with_header(&Authorization::bearer(key.as_str()).unwrap()) - .body(Body::empty()) - .unwrap(), - ) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::OK); - serde_json::from_slice(resp.body()).unwrap() - }) - .await - .unwrap(); + let neo_key = world.create_user("neo"); - let authorization = Authorization::bearer(key.as_str()).unwrap(); + let authorization = Authorization::bearer(&neo_key).unwrap(); + println!("Creating the matrix project"); api_client .request( Request::post("/projects/matrix") @@ -766,6 +832,7 @@ pub mod tests { tokio::time::sleep(Duration::from_secs(1)).await; }); + println!("get matrix project status"); api_client .request( Request::get("/projects/matrix/status") @@ -777,59 +844,7 @@ pub mod tests { .await .unwrap(); - // === deployment test BEGIN === - api_client - .request({ - let mut data = Vec::new(); - let mut f = std::fs::File::open("tests/hello_world.crate").unwrap(); - f.read_to_end(&mut data).unwrap(); - Request::post("/projects/matrix/services/matrix") - .with_header(&authorization) - .body(Body::from(data)) - .unwrap() - }) - .map_ok(|resp| assert_eq!(resp.status(), StatusCode::OK)) - .await - .unwrap(); - - timed_loop!(wait: 1, max: 600, { - let service: service::Summary = api_client - .request( - Request::get("/projects/matrix/services/matrix/summary") - .with_header(&authorization) - .body(Body::empty()) - .unwrap(), - ) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::OK); - serde_json::from_slice(resp.body()).unwrap() - }) - .await - .unwrap(); - if service.deployment.is_some() { - break; - } - }); - - proxy_client - .request( - Request::get("/hello") - .header("Host", "matrix.test.shuttleapp.rs") - .header("x-shuttle-project", "matrix") - .body(Body::empty()) - .unwrap(), - ) - .map_ok(|resp| { - assert_eq!(resp.status(), StatusCode::OK); - assert_eq!( - String::from_utf8(resp.into_body()).unwrap().as_str(), - "Hello, world!" - ); - }) - .await - .unwrap(); - // === deployment test END === - + println!("delete matrix project"); api_client .request( Request::delete("/projects/matrix") diff --git a/gateway/src/main.rs b/gateway/src/main.rs index b2912034d..ecad9833b 100644 --- a/gateway/src/main.rs +++ b/gateway/src/main.rs @@ -2,25 +2,25 @@ use clap::Parser; use fqdn::FQDN; use futures::prelude::*; use instant_acme::{AccountCredentials, ChallengeType}; -use opentelemetry::global; +use shuttle_common::backends::tracing::setup_tracing; use shuttle_gateway::acme::{AcmeClient, CustomDomain}; use shuttle_gateway::api::latest::{ApiBuilder, SVC_DEGRADED_THRESHOLD}; use shuttle_gateway::args::StartArgs; -use shuttle_gateway::args::{Args, Commands, InitArgs, UseTls}; -use shuttle_gateway::auth::Key; +use shuttle_gateway::args::{Args, Commands, UseTls}; use shuttle_gateway::proxy::UserServiceBuilder; use shuttle_gateway::service::{GatewayService, MIGRATIONS}; use shuttle_gateway::task; use shuttle_gateway::tls::{make_tls_acceptor, ChainAndPrivateKey}; use shuttle_gateway::worker::{Worker, WORKER_QUEUE_SIZE}; use sqlx::migrate::MigrateDatabase; -use sqlx::{query, Sqlite, SqlitePool}; +use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqliteSynchronous}; +use sqlx::{Sqlite, SqlitePool}; use std::io::{self, Cursor}; use std::path::{Path, PathBuf}; +use std::str::FromStr; use std::sync::Arc; use std::time::Duration; use tracing::{debug, error, info, info_span, trace, warn, Instrument}; -use tracing_subscriber::{fmt, prelude::*, EnvFilter}; #[tokio::main(flavor = "multi_thread")] async fn main() -> io::Result<()> { @@ -28,24 +28,7 @@ async fn main() -> io::Result<()> { trace!(args = ?args, "parsed args"); - global::set_text_map_propagator(opentelemetry_datadog::DatadogPropagator::new()); - - let fmt_layer = fmt::layer(); - let filter_layer = EnvFilter::try_from_default_env() - .or_else(|_| EnvFilter::try_new("info")) - .unwrap(); - - let tracer = opentelemetry_datadog::new_pipeline() - .with_service_name("gateway") - .with_agent_endpoint("http://datadog-agent:8126") - .install_batch(opentelemetry::runtime::Tokio) - .unwrap(); - let opentelemetry = tracing_opentelemetry::layer().with_tracer(tracer); - tracing_subscriber::registry() - .with(filter_layer) - .with(fmt_layer) - .with(opentelemetry) - .init(); + setup_tracing(tracing_subscriber::registry(), "gateway"); let db_path = args.state.join("gateway.sqlite"); let db_uri = db_path.to_str().unwrap(); @@ -60,13 +43,17 @@ async fn main() -> io::Result<()> { .unwrap() .to_string_lossy() ); - let db = SqlitePool::connect(db_uri).await.unwrap(); + let sqlite_options = SqliteConnectOptions::from_str(db_uri) + .unwrap() + .journal_mode(SqliteJournalMode::Wal) + .synchronous(SqliteSynchronous::Normal); + + let db = SqlitePool::connect_with(sqlite_options).await.unwrap(); MIGRATIONS.run(&db).await.unwrap(); match args.command { Commands::Start(start_args) => start(db, args.state, start_args).await, - Commands::Init(init_args) => init(db, init_args).await, } } @@ -106,8 +93,12 @@ async fn start(db: SqlitePool, fs: PathBuf, args: StartArgs) -> io::Result<()> { let gateway = Arc::clone(&gateway); let sender = sender.clone(); async move { + let mut interval = tokio::time::interval(Duration::from_secs(60)); + interval.tick().await; // first tick is immediate + loop { - tokio::time::sleep(Duration::from_secs(60)).await; + interval.tick().await; + if sender.capacity() < WORKER_QUEUE_SIZE - SVC_DEGRADED_THRESHOLD { // if degraded, don't stack more health checks warn!( @@ -151,11 +142,12 @@ async fn start(db: SqlitePool, fs: PathBuf, args: StartArgs) -> io::Result<()> { let mut api_builder = ApiBuilder::new() .with_service(Arc::clone(&gateway)) - .with_sender(sender) + .with_sender(sender.clone()) .binding_to(args.control); let mut user_builder = UserServiceBuilder::new() .with_service(Arc::clone(&gateway)) + .with_task_sender(sender) .with_public(args.context.proxy_fqdn.clone()) .with_user_proxy_binding_to(args.user) .with_bouncer(args.bouncer); @@ -196,6 +188,7 @@ async fn start(db: SqlitePool, fs: PathBuf, args: StartArgs) -> io::Result<()> { let api_handle = api_builder .with_default_routes() + .with_auth_service(args.context.auth_uri) .with_default_traces() .serve(); @@ -213,23 +206,6 @@ async fn start(db: SqlitePool, fs: PathBuf, args: StartArgs) -> io::Result<()> { Ok(()) } -async fn init(db: SqlitePool, args: InitArgs) -> io::Result<()> { - let key = match args.key { - Some(key) => key, - None => Key::new_random(), - }; - - query("INSERT INTO accounts (account_name, key, super_user) VALUES (?1, ?2, 1)") - .bind(&args.name) - .bind(&key) - .execute(&db) - .await - .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; - - println!("`{}` created as super user with key: {key}", args.name); - Ok(()) -} - async fn init_certs>(fs: P, public: FQDN, acme: AcmeClient) -> ChainAndPrivateKey { let tls_path = fs.as_ref().join("ssl.pem"); diff --git a/gateway/src/project.rs b/gateway/src/project.rs index d352d9f14..efc13ddf9 100644 --- a/gateway/src/project.rs +++ b/gateway/src/project.rs @@ -1,15 +1,15 @@ -use std::collections::HashMap; +use std::collections::{HashMap, VecDeque}; use std::convert::{identity, Infallible}; use std::net::{IpAddr, SocketAddr}; use std::time::Duration; use bollard::container::{ - Config, CreateContainerOptions, RemoveContainerOptions, StopContainerOptions, + Config, CreateContainerOptions, KillContainerOptions, RemoveContainerOptions, Stats, + StatsOptions, StopContainerOptions, }; use bollard::errors::Error as DockerError; use bollard::models::{ContainerInspectResponse, ContainerStateStatusEnum}; use bollard::network::{ConnectNetworkOptions, DisconnectNetworkOptions}; -use bollard::service::EndpointSettings; use bollard::system::EventsOptions; use fqdn::FQDN; use futures::prelude::*; @@ -20,7 +20,8 @@ use hyper::Client; use once_cell::sync::Lazy; use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; -use tokio::time::{self, timeout}; +use shuttle_common::models::project::IDLE_MINUTES; +use tokio::time::{sleep, timeout}; use tracing::{debug, error, info, instrument}; use crate::{ @@ -64,7 +65,9 @@ macro_rules! impl_from_variant { } const RUNTIME_API_PORT: u16 = 8001; -const MAX_RESTARTS: usize = 3; +const MAX_RECREATES: usize = 5; +const MAX_RESTARTS: usize = 5; +const MAX_REBOOTS: usize = 3; // Client used for health checks static CLIENT: Lazy> = Lazy::new(Client::new); @@ -87,20 +90,29 @@ where pub trait ContainerInspectResponseExt { fn container(&self) -> &ContainerInspectResponse; - fn project_name(&self, prefix: &str) -> Result { - // This version can't be enabled while there are active - // deployers before v0.8.0 since the don't have this label - // TODO: switch to this version when you notice all deployers - // are greater than v0.8.0 - // let name = safe_unwrap!(container.config.labels.get("project.name")).to_string(); - + fn project_name(&self) -> Result { let container = self.container(); - let container_name = safe_unwrap!(container.name.strip_prefix("/")).to_string(); - safe_unwrap!(container_name.strip_prefix(prefix).strip_suffix("_run")) + + safe_unwrap!(container.config.labels.get("shuttle.project")) + .to_string() .parse::() .map_err(|_| ProjectError::internal("invalid project name")) } + fn idle_minutes(&self) -> u64 { + let container = self.container(); + + if let Some(config) = &container.config { + if let Some(labels) = &config.labels { + if let Some(idle_minutes) = labels.get("shuttle.idle_minutes") { + return idle_minutes.parse::().unwrap_or(IDLE_MINUTES); + } + } + } + + IDLE_MINUTES + } + fn find_arg_and_then<'s, F, O>(&'s self, find: &str, and_then: F) -> Result where F: FnOnce(&'s str) -> O, @@ -149,9 +161,12 @@ impl From for Error { pub enum Project { Creating(ProjectCreating), Attaching(ProjectAttaching), + Recreating(ProjectRecreating), Starting(ProjectStarting), + Restarting(ProjectRestarting), Started(ProjectStarted), Ready(ProjectReady), + Rebooting(ProjectRebooting), Stopping(ProjectStopping), Stopped(ProjectStopped), Destroying(ProjectDestroying), @@ -162,11 +177,14 @@ pub enum Project { impl_from_variant!(Project: ProjectCreating => Creating, ProjectAttaching => Attaching, + ProjectRecreating => Recreating, ProjectStarting => Starting, + ProjectRestarting => Restarting, ProjectStarted => Started, ProjectReady => Ready, ProjectStopping => Stopping, ProjectStopped => Stopped, + ProjectRebooting => Rebooting, ProjectDestroying => Destroying, ProjectDestroyed => Destroyed, ProjectError => Errored); @@ -183,8 +201,15 @@ impl Project { } } - pub fn create(project_name: ProjectName) -> Self { - Self::Creating(ProjectCreating::new_with_random_initial_key(project_name)) + pub fn reboot(self) -> Result { + if let Some(container) = self.container() { + Ok(Self::Rebooting(ProjectRebooting { container })) + } else { + Err(Error::custom( + ErrorKind::InvalidOperation, + format!("cannot reboot a project in the `{}` state", self.state()), + )) + } } pub fn destroy(self) -> Result { @@ -195,6 +220,20 @@ impl Project { } } + pub fn start(self) -> Result { + if let Some(container) = self.container() { + Ok(Self::Starting(ProjectStarting { + container, + restart_count: 0, + })) + } else { + Err(Error::custom( + ErrorKind::InvalidOperation, + format!("cannot start a project in the `{}` state", self.state()), + )) + } + } + pub fn is_ready(&self) -> bool { matches!(self, Self::Ready(_)) } @@ -203,6 +242,10 @@ impl Project { matches!(self, Self::Destroyed(_)) } + pub fn is_stopped(&self) -> bool { + matches!(self, Self::Stopped(_)) + } + pub fn target_ip(&self) -> Result, Error> { match self.clone() { Self::Ready(project_ready) => Ok(Some(*project_ready.target_ip())), @@ -216,18 +259,43 @@ impl Project { .map(|target_ip| SocketAddr::new(target_ip, RUNTIME_API_PORT))) } - pub fn state(&self) -> &'static str { + pub fn state(&self) -> String { match self { - Self::Started(_) => "started", - Self::Ready(_) => "ready", - Self::Stopped(_) => "stopped", - Self::Starting(_) => "starting", - Self::Stopping(_) => "stopping", - Self::Creating(_) => "creating", - Self::Attaching(_) => "attaching", - Self::Destroying(_) => "destroying", - Self::Destroyed(_) => "destroyed", - Self::Errored(_) => "error", + Self::Started(_) => "started".to_string(), + Self::Ready(_) => "ready".to_string(), + Self::Stopped(_) => "stopped".to_string(), + Self::Starting(ProjectStarting { restart_count, .. }) => { + if *restart_count > 0 { + format!("starting (attempt {restart_count})") + } else { + "starting".to_string() + } + } + Self::Recreating(ProjectRecreating { recreate_count, .. }) => { + format!("recreating (attempt {recreate_count})") + } + Self::Restarting(ProjectRestarting { restart_count, .. }) => { + format!("restarting (attempt {restart_count})") + } + Self::Stopping(_) => "stopping".to_string(), + Self::Rebooting(_) => "rebooting".to_string(), + Self::Creating(ProjectCreating { recreate_count, .. }) => { + if *recreate_count > 0 { + format!("creating (attempt {recreate_count})") + } else { + "creating".to_string() + } + } + Self::Attaching(ProjectAttaching { recreate_count, .. }) => { + if *recreate_count > 0 { + format!("attaching (attempt {recreate_count})") + } else { + "attaching".to_string() + } + } + Self::Destroying(_) => "destroying".to_string(), + Self::Destroyed(_) => "destroyed".to_string(), + Self::Errored(_) => "error".to_string(), } } @@ -235,10 +303,13 @@ impl Project { match self { Self::Starting(ProjectStarting { container, .. }) | Self::Started(ProjectStarted { container, .. }) + | Self::Recreating(ProjectRecreating { container, .. }) + | Self::Restarting(ProjectRestarting { container, .. }) | Self::Attaching(ProjectAttaching { container, .. }) | Self::Ready(ProjectReady { container, .. }) - | Self::Stopping(ProjectStopping { container }) - | Self::Stopped(ProjectStopped { container }) + | Self::Stopping(ProjectStopping { container, .. }) + | Self::Stopped(ProjectStopped { container, .. }) + | Self::Rebooting(ProjectRebooting { container, .. }) | Self::Destroying(ProjectDestroying { container }) => Some(container.clone()), Self::Errored(ProjectError { ctx: Some(ctx), .. }) => ctx.container(), Self::Errored(_) | Self::Creating(_) | Self::Destroyed(_) => None, @@ -261,16 +332,29 @@ impl Project { impl From for shuttle_common::models::project::State { fn from(project: Project) -> Self { match project { - Project::Creating(_) => Self::Creating, - Project::Attaching(_) => Self::Attaching, - Project::Starting(_) => Self::Starting, + Project::Creating(ProjectCreating { recreate_count, .. }) => { + Self::Creating { recreate_count } + } + Project::Attaching(ProjectAttaching { recreate_count, .. }) => { + Self::Attaching { recreate_count } + } + Project::Recreating(ProjectRecreating { recreate_count, .. }) => { + Self::Recreating { recreate_count } + } + Project::Starting(ProjectStarting { restart_count, .. }) => { + Self::Starting { restart_count } + } + Project::Restarting(ProjectRestarting { restart_count, .. }) => { + Self::Restarting { restart_count } + } Project::Started(_) => Self::Started, Project::Ready(_) => Self::Ready, Project::Stopping(_) => Self::Stopping, Project::Stopped(_) => Self::Stopped, + Project::Rebooting(_) => Self::Rebooting, Project::Destroying(_) => Self::Destroying, Project::Destroyed(_) => Self::Destroyed, - Project::Errored(_) => Self::Errored, + Project::Errored(ProjectError { message, .. }) => Self::Errored { message }, } } } @@ -290,26 +374,45 @@ where let mut new = match self { Self::Creating(creating) => creating.next(ctx).await.into_try_state(), - Self::Attaching(attaching) => match attaching.next(ctx).await { + Self::Attaching(attaching) => match attaching.clone().next(ctx).await { Err(ProjectError { kind: ProjectErrorKind::NoNetwork, - ctx, .. }) => { - // Restart the container to try and connect to the network again - Ok(ctx.unwrap().stop().unwrap()) + // Recreate the container to try and connect to the network again + Ok(Self::Recreating(ProjectRecreating { + container: attaching.container, + recreate_count: attaching.recreate_count, + })) } attaching => attaching.into_try_state(), }, - Self::Starting(ready) => ready.next(ctx).await.into_try_state(), + Self::Recreating(recreating) => recreating.next(ctx).await.into_try_state(), + Self::Starting(starting) => match starting.clone().next(ctx).await { + Err(error) => { + error!( + error = &error as &dyn std::error::Error, + "project failed to start. Will restart it" + ); + + Ok(Self::Restarting(ProjectRestarting { + container: starting.container, + restart_count: starting.restart_count, + })) + } + starting => starting.into_try_state(), + }, + Self::Restarting(restarting) => restarting.next(ctx).await.into_try_state(), Self::Started(started) => match started.next(ctx).await { Ok(ProjectReadying::Ready(ready)) => Ok(ready.into()), Ok(ProjectReadying::Started(started)) => Ok(started.into()), + Ok(ProjectReadying::Idle(stopping)) => Ok(stopping.into()), Err(err) => Ok(Self::Errored(err)), }, Self::Ready(ready) => ready.next(ctx).await.into_try_state(), Self::Stopped(stopped) => stopped.next(ctx).await.into_try_state(), Self::Stopping(stopping) => stopping.next(ctx).await.into_try_state(), + Self::Rebooting(rebooting) => rebooting.next(ctx).await.into_try_state(), Self::Destroying(destroying) => destroying.next(ctx).await.into_try_state(), Self::Destroyed(destroyed) => destroyed.next(ctx).await.into_try_state(), Self::Errored(errored) => Ok(Self::Errored(errored)), @@ -338,7 +441,10 @@ where Ctx: DockerContext, { fn is_done(&self) -> bool { - matches!(self, Self::Errored(_) | Self::Ready(_) | Self::Destroyed(_)) + matches!( + self, + Self::Errored(_) | Self::Ready(_) | Self::Destroyed(_) | Self::Stopped(_) + ) } } @@ -369,27 +475,53 @@ where let refreshed = match self { Self::Creating(creating) => Self::Creating(creating), Self::Attaching(attaching) => Self::Attaching(attaching), - Self::Starting(ProjectStarting { container }) - | Self::Started(ProjectStarted { container, .. }) - | Self::Ready(ProjectReady { container, .. }) - | Self::Stopping(ProjectStopping { container }) - | Self::Stopped(ProjectStopped { container }) => match container + Self::Starting(ProjectStarting { container, restart_count }) => match container .clone() .refresh(ctx) .await { - Ok(container) => match container.state.as_ref().unwrap().status.as_ref().unwrap() { + Ok(container) => match safe_unwrap!(container.state.status) { ContainerStateStatusEnum::RUNNING => { - Self::Started(ProjectStarted::new(container)) + Self::Started(ProjectStarted::new(container, VecDeque::new())) } - ContainerStateStatusEnum::CREATED => { - Self::Starting(ProjectStarting { container }) + ContainerStateStatusEnum::CREATED => Self::Starting(ProjectStarting { + container, + restart_count, + }), + ContainerStateStatusEnum::EXITED => Self::Restarting(ProjectRestarting { container, restart_count: 0 }), + _ => { + return Err(Error::custom( + ErrorKind::Internal, + "container resource has drifted out of sync from the starting state: cannot recover", + )) } - ContainerStateStatusEnum::EXITED => Self::Stopped(ProjectStopped { container }), + }, + Err(DockerError::DockerResponseServerError { + status_code: 404, .. + }) => { + // container not found, let's try to recreate it + // with the same image + Self::Creating(ProjectCreating::from_container(container, 0)?) + } + Err(err) => return Err(err.into()), + }, + Self::Started(ProjectStarted { container, stats, .. }) + | Self::Ready(ProjectReady { container, stats, .. }) + => match container + .clone() + .refresh(ctx) + .await + { + Ok(container) => match safe_unwrap!(container.state.status) { + ContainerStateStatusEnum::RUNNING => { + Self::Started(ProjectStarted::new(container, stats)) + } + // Restart the container if it went down + ContainerStateStatusEnum::EXITED => Self::Restarting(ProjectRestarting { container, restart_count: 0 }), _ => { return Err(Error::custom( ErrorKind::Internal, - "container resource has drifted out of sync: cannot recover", + "container resource has drifted out of sync from a started state: cannot recover", )) } }, @@ -398,13 +530,34 @@ where }) => { // container not found, let's try to recreate it // with the same image - let project_name = container.project_name(&ctx.container_settings().prefix)?; - let initial_key = container.initial_key()?; - let creating = ProjectCreating::new(project_name, initial_key).from(container); - Self::Creating(creating) + Self::Creating(ProjectCreating::from_container(container, 0)?) } Err(err) => return Err(err.into()), }, + Self::Stopping(ProjectStopping { container }) + => match container + .clone() + .refresh(ctx) + .await + { + Ok(container) => match safe_unwrap!(container.state.status) { + ContainerStateStatusEnum::RUNNING => { + Self::Stopping(ProjectStopping{ container }) + } + ContainerStateStatusEnum::EXITED => Self::Stopped(ProjectStopped { container }), + _ => { + return Err(Error::custom( + ErrorKind::Internal, + "container resource has drifted out of sync from a stopping state: cannot recover", + )) + } + }, + Err(err) => return Err(err.into()), + }, + Self::Restarting(restarting) => Self::Restarting(restarting), + Self::Recreating(recreating) => Self::Recreating(recreating), + Self::Stopped(stopped) => Self::Stopped(stopped), + Self::Rebooting(rebooting) => Self::Rebooting(rebooting), Self::Destroying(destroying) => Self::Destroying(destroying), Self::Destroyed(destroyed) => Self::Destroyed(destroyed), Self::Errored(err) => Self::Errored(err), @@ -425,19 +578,45 @@ pub struct ProjectCreating { /// Configuration will be extracted from there if specified (will /// take precedence over other overrides) from: Option, + // Use default for backward compatibility. Can be removed when all projects in the DB have this property set + #[serde(default)] + recreate_count: usize, + /// Label set on container as to how many minutes to wait before a project is considered idle + idle_minutes: u64, } impl ProjectCreating { - pub fn new(project_name: ProjectName, initial_key: String) -> Self { + pub fn new(project_name: ProjectName, initial_key: String, idle_minutes: u64) -> Self { Self { project_name, initial_key, fqdn: None, image: None, from: None, + recreate_count: 0, + idle_minutes, } } + pub fn from_container( + container: ContainerInspectResponse, + recreate_count: usize, + ) -> Result { + let project_name = container.project_name()?; + let idle_minutes = container.idle_minutes(); + let initial_key = container.initial_key()?; + + Ok(Self { + project_name, + initial_key, + fqdn: None, + image: None, + from: Some(container), + recreate_count, + idle_minutes, + }) + } + pub fn from(mut self, from: ContainerInspectResponse) -> Self { self.from = Some(from); self @@ -448,9 +627,9 @@ impl ProjectCreating { self } - pub fn new_with_random_initial_key(project_name: ProjectName) -> Self { + pub fn new_with_random_initial_key(project_name: ProjectName, idle_minutes: u64) -> Self { let initial_key = Alphanumeric.sample_string(&mut rand::thread_rng(), 32); - Self::new(project_name, initial_key) + Self::new(project_name, initial_key, idle_minutes) } pub fn with_image(mut self, image: String) -> Self { @@ -466,6 +645,10 @@ impl ProjectCreating { &self.initial_key } + pub fn fqdn(&self) -> &Option { + &self.fqdn + } + fn container_name(&self, ctx: &C) -> String { let prefix = &ctx.container_settings().prefix; @@ -482,6 +665,7 @@ impl ProjectCreating { image: default_image, prefix, provisioner_host, + auth_uri, fqdn: public, .. } = ctx.container_settings(); @@ -491,6 +675,7 @@ impl ProjectCreating { project_name, fqdn, image, + idle_minutes, .. } = &self; @@ -509,6 +694,7 @@ impl ProjectCreating { "Labels": { "shuttle.prefix": prefix, "shuttle.project": project_name, + "shuttle.idle_minutes": format!("{idle_minutes}"), }, "Cmd": [ "--admin-secret", @@ -527,9 +713,11 @@ impl ProjectCreating { "/opt/shuttle", "--state", "/opt/shuttle/deployer.sqlite", + "--auth-uri", + auth_uri, ], "Env": [ - "RUST_LOG=debug", + "RUST_LOG=debug,shuttle=trace", ] }) }); @@ -572,6 +760,8 @@ where #[instrument(skip_all)] async fn next(self, ctx: &Ctx) -> Result { let container_name = self.container_name(ctx); + let Self { recreate_count, .. } = self; + let container = ctx .docker() // If container already exists, use that @@ -589,13 +779,19 @@ where } }) .await?; - Ok(ProjectAttaching { container }) + Ok(ProjectAttaching { + container, + recreate_count, + }) } } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct ProjectAttaching { container: ContainerInspectResponse, + // Use default for backward compatibility. Can be removed when all projects in the DB have this property set + #[serde(default)] + recreate_count: usize, } #[async_trait] @@ -608,14 +804,10 @@ where #[instrument(skip_all)] async fn next(self, ctx: &Ctx) -> Result { - let Self { container } = self; + let Self { container, .. } = self; - let container_id = container.id.as_ref().unwrap(); - let ContainerSettings { - network_name, - network_id, - .. - } = ctx.container_settings(); + let container_id = safe_unwrap!(container.id); + let ContainerSettings { network_name, .. } = ctx.container_settings(); // Disconnect the bridge network before trying to start up // For docker bug https://github.com/docker/cli/issues/1891 @@ -640,10 +832,7 @@ where // Make sure the container is connected to the user network let network_config = ConnectNetworkOptions { container: container_id, - endpoint_config: EndpointSettings { - network_id: Some(network_id.to_string()), - ..Default::default() - }, + endpoint_config: Default::default(), }; ctx.docker() .connect_network(network_name, network_config) @@ -668,13 +857,69 @@ where let container = container.refresh(ctx).await?; - Ok(ProjectStarting { container }) + Ok(ProjectStarting { + container, + restart_count: 0, + }) + } +} + +// Special state to try and recreate a container if it failed to be created +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct ProjectRecreating { + container: ContainerInspectResponse, + recreate_count: usize, +} + +#[async_trait] +impl State for ProjectRecreating +where + Ctx: DockerContext, +{ + type Next = ProjectCreating; + type Error = ProjectError; + + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { + let Self { + container, + recreate_count, + } = self; + let container_id = safe_unwrap!(container.id); + + ctx.docker() + .stop_container(container_id, Some(StopContainerOptions { t: 1 })) + .await + .unwrap_or(()); + ctx.docker() + .remove_container( + container_id, + Some(RemoveContainerOptions { + force: true, + ..Default::default() + }), + ) + .await + .unwrap_or(()); + + if recreate_count < MAX_RECREATES { + sleep(Duration::from_secs(5)).await; + Ok(ProjectCreating::from_container( + container, + recreate_count + 1, + )?) + } else { + Err(ProjectError::internal("too many recreates")) + } } } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct ProjectStarting { container: ContainerInspectResponse, + // Use default for backward compatibility. Can be removed when all projects in the DB have this property set + #[serde(default)] + restart_count: usize, } #[async_trait] @@ -687,7 +932,8 @@ where #[instrument(skip_all)] async fn next(self, ctx: &Ctx) -> Result { - let container_id = self.container.id.as_ref().unwrap(); + let Self { container, .. } = self; + let container_id = safe_unwrap!(container.id); ctx.docker() .start_container::(container_id, None) @@ -701,9 +947,53 @@ where } })?; - let container = self.container.refresh(ctx).await?; + let container = container.refresh(ctx).await?; - Ok(Self::Next::new(container)) + Ok(Self::Next::new(container, VecDeque::new())) + } +} + +/// Special state for when `ProjectStarting` fails to retry it +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct ProjectRestarting { + container: ContainerInspectResponse, + restart_count: usize, +} + +#[async_trait] +impl State for ProjectRestarting +where + Ctx: DockerContext, +{ + type Next = ProjectStarting; + type Error = ProjectError; + + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { + let Self { + container, + restart_count, + } = self; + + let container_id = safe_unwrap!(container.id); + + // Stop it just to be safe + ctx.docker() + .stop_container(container_id, Some(StopContainerOptions { t: 1 })) + .await + .unwrap_or(()); + + debug!("project restarted {} times", restart_count); + + if restart_count < MAX_RESTARTS { + sleep(Duration::from_secs(5)).await; + Ok(ProjectStarting { + container, + restart_count: restart_count + 1, + }) + } else { + Err(ProjectError::internal("too many restarts")) + } } } @@ -711,13 +1001,17 @@ where pub struct ProjectStarted { container: ContainerInspectResponse, service: Option, + // Use default for backward compatibility. Can be removed when all projects in the DB have this property set + #[serde(default)] + stats: VecDeque, } impl ProjectStarted { - pub fn new(container: ContainerInspectResponse) -> Self { + pub fn new(container: ContainerInspectResponse, stats: VecDeque) -> Self { Self { container, service: None, + stats, } } } @@ -726,6 +1020,7 @@ impl ProjectStarted { pub enum ProjectReadying { Ready(ProjectReady), Started(ProjectStarted), + Idle(ProjectStopping), } #[async_trait] @@ -738,16 +1033,91 @@ where #[instrument(skip_all)] async fn next(self, ctx: &Ctx) -> Result { - time::sleep(Duration::from_secs(1)).await; - - let container = self.container.refresh(ctx).await?; - let mut service = match self.service { + let Self { + container, + service, + mut stats, + } = self; + let container = container.refresh(ctx).await?; + let mut service = match service { Some(service) => service, - None => Service::from_container(ctx, container.clone())?, + None => Service::from_container(container.clone())?, }; if service.is_healthy().await { - Ok(Self::Next::Ready(ProjectReady { container, service })) + let idle_minutes = container.idle_minutes(); + + // Idle minutes of `0` means it is disabled and the project will always stay up + if idle_minutes < 1 { + Ok(Self::Next::Ready(ProjectReady { + container, + service, + stats, + })) + } else { + let new_stat = ctx + .docker() + .stats( + safe_unwrap!(container.id), + Some(StatsOptions { + one_shot: true, + stream: false, + }), + ) + .next() + .await + .unwrap()?; + + stats.push_back(new_stat.clone()); + + let mut last = None; + + while stats.len() > (idle_minutes as usize) { + last = stats.pop_front(); + } + + if let Some(last) = last { + let cpu_per_minute = (new_stat.cpu_stats.cpu_usage.total_usage + - last.cpu_stats.cpu_usage.total_usage) + / idle_minutes; + + debug!( + "{} has {} CPU usage per minute", + service.name, cpu_per_minute + ); + + // From analysis we know the following kind of CPU usage for different kinds of idle projects + // Web framework uses 6_200_000 CPU per minute + // Serenity uses 20_000_000 CPU per minute + // + // We want to make sure we are able to stop these kinds of projects + // + // Now, the following kind of CPU usage has been observed for different kinds of projects having + // 2 web requests / processing 2 discord messages per minute + // Web framework uses 100_000_000 CPU per minute + // Serenity uses 30_000_000 CPU per minute + // + // And projects at these levels we will want to keep active. However, the 30_000_000 + // for an "active" discord will be to close to the 20_000_000 of an idle framework. And + // discord will have more traffic in anyway. So using the 100_000_000 threshold of an + // active framework for now + if cpu_per_minute < 100_000_000 { + Ok(Self::Next::Idle(ProjectStopping { container })) + } else { + Ok(Self::Next::Ready(ProjectReady { + container, + service, + stats, + })) + } + } else { + Ok(Self::Next::Ready(ProjectReady { + container, + service, + stats, + })) + } + } } else { let started_at = chrono::DateTime::parse_from_rfc3339(safe_unwrap!(container.state.started_at)) @@ -764,6 +1134,7 @@ where Ok(Self::Next::Started(ProjectStarted { container, service: Some(service), + stats, })) } } @@ -773,6 +1144,9 @@ where pub struct ProjectReady { container: ContainerInspectResponse, service: Service, + // Use default for backward compatibility. Can be removed when all projects in the DB have this property set + #[serde(default)] + stats: VecDeque, } #[async_trait] @@ -826,11 +1200,8 @@ pub struct Service { } impl Service { - pub fn from_container( - ctx: &Ctx, - container: ContainerInspectResponse, - ) -> Result { - let resource_name = container.project_name(&ctx.container_settings().prefix)?; + pub fn from_container(container: ContainerInspectResponse) -> Result { + let resource_name = container.project_name()?; let network = safe_unwrap!(container.network_settings.networks) .values() @@ -864,51 +1235,30 @@ impl Service { } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct ProjectStopping { +pub struct ProjectRebooting { container: ContainerInspectResponse, } #[async_trait] -impl State for ProjectStopping +impl State for ProjectRebooting where Ctx: DockerContext, { - type Next = ProjectStopped; + type Next = ProjectStarting; type Error = ProjectError; #[instrument(skip_all)] async fn next(self, ctx: &Ctx) -> Result { - let Self { container } = self; + let Self { mut container } = self; ctx.docker() .stop_container( - container.id.as_ref().unwrap(), + safe_unwrap!(container.id), Some(StopContainerOptions { t: 30 }), ) .await?; - Ok(Self::Next { - container: container.refresh(ctx).await?, - }) - } -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct ProjectStopped { - container: ContainerInspectResponse, -} - -#[async_trait] -impl State for ProjectStopped -where - Ctx: DockerContext, -{ - type Next = ProjectStarting; - type Error = ProjectError; - - #[instrument(skip_all)] - async fn next(self, ctx: &Ctx) -> Result { - let container = self.container; + container = container.refresh(ctx).await?; let since = (chrono::Utc::now() - chrono::Duration::minutes(15)) .timestamp() .to_string(); @@ -935,8 +1285,11 @@ where ); // If stopped, and has not restarted too much, try to restart - if start_event_count < MAX_RESTARTS { - Ok(ProjectStarting { container }) + if start_event_count < MAX_REBOOTS { + Ok(ProjectStarting { + container, + restart_count: 0, + }) } else { Err(ProjectError::internal( "too many restarts in the last 15 minutes", @@ -945,6 +1298,62 @@ where } } +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct ProjectStopping { + container: ContainerInspectResponse, +} + +#[async_trait] +impl State for ProjectStopping +where + Ctx: DockerContext, +{ + type Next = ProjectStopped; + + type Error = ProjectError; + + #[instrument(skip_all)] + async fn next(self, ctx: &Ctx) -> Result { + let Self { container } = self; + + // Stopping a docker containers sends a SIGTERM which will stop the tokio runtime that deployer starts up. + // Killing this runtime causes the deployment to enter the `completed` state and it therefore does not + // start up again when starting up the project's container. Luckily the kill command allows us to change the + // signal to prevent this from happening. + // + // In some future state when all deployers hadle `SIGTERM` correctly, this can be changed to docker stop + // safely. + ctx.docker() + .kill_container( + safe_unwrap!(container.id), + Some(KillContainerOptions { signal: "SIGKILL" }), + ) + .await?; + Ok(Self::Next { + container: container.refresh(ctx).await?, + }) + } +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct ProjectStopped { + container: ContainerInspectResponse, +} + +#[async_trait] +impl State for ProjectStopped +where + Ctx: DockerContext, +{ + type Next = ProjectStopped; + type Error = ProjectError; + + #[instrument(skip_all)] + async fn next(self, _ctx: &Ctx) -> Result { + Ok(self) + } +} + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct ProjectDestroying { container: ContainerInspectResponse, @@ -960,7 +1369,8 @@ where #[instrument(skip_all)] async fn next(self, ctx: &Ctx) -> Result { - let container_id = self.container.id.as_ref().unwrap(); + let Self { container } = self; + let container_id = safe_unwrap!(container.id); ctx.docker() .stop_container(container_id, Some(StopContainerOptions { t: 1 })) .await @@ -976,7 +1386,7 @@ where .await .unwrap_or(()); Ok(Self::Next { - destroyed: Some(self.container), + destroyed: Some(container), }) } } @@ -1118,60 +1528,84 @@ pub mod exec { .await .expect("could not list projects") { - if let Project::Errored(ProjectError { ctx: Some(ctx), .. }) = - gateway.find_project(&project_name).await.unwrap() - { - if let Some(container) = ctx.container() { + match gateway.find_project(&project_name).await.unwrap() { + Project::Errored(ProjectError { ctx: Some(ctx), .. }) => { + if let Some(container) = ctx.container() { + if let Ok(container) = gateway + .context() + .docker() + .inspect_container(safe_unwrap!(container.id), None) + .await + { + match container.state { + Some(ContainerState { + status: Some(ContainerStateStatusEnum::EXITED), + .. + }) => { + debug!("{} will be revived", project_name.clone()); + _ = gateway + .new_task() + .project(project_name) + .and_then(task::run(|ctx| async move { + TaskResult::Done(Project::Rebooting(ProjectRebooting { + container: ctx.state.container().unwrap(), + })) + })) + .send(&sender) + .await; + } + Some(ContainerState { + status: Some(ContainerStateStatusEnum::RUNNING), + .. + }) + | Some(ContainerState { + status: Some(ContainerStateStatusEnum::CREATED), + .. + }) => { + debug!( + "{} is errored but ready according to docker. So restarting it", + project_name.clone() + ); + _ = gateway + .new_task() + .project(project_name) + .and_then(task::run(|ctx| async move { + TaskResult::Done(Project::Starting(ProjectStarting { + container: ctx.state.container().unwrap(), + restart_count: 0, + })) + })) + .send(&sender) + .await; + } + _ => {} + } + } + } + } + // Currently nothing should enter the stopped state + Project::Stopped(ProjectStopped { container }) => { if let Ok(container) = gateway .context() .docker() .inspect_container(safe_unwrap!(container.id), None) .await { - match container.state { - Some(ContainerState { - status: Some(ContainerStateStatusEnum::EXITED), - .. - }) => { - debug!("{} will be revived", project_name.clone()); - _ = gateway - .new_task() - .project(project_name) - .and_then(task::run(|ctx| async move { - TaskResult::Done(Project::Stopped(ProjectStopped { - container: ctx.state.container().unwrap(), - })) - })) - .send(&sender) - .await; - } - Some(ContainerState { - status: Some(ContainerStateStatusEnum::RUNNING), - .. - }) - | Some(ContainerState { - status: Some(ContainerStateStatusEnum::CREATED), - .. - }) => { - debug!( - "{} is errored but ready according to docker. So restarting it", - project_name.clone() - ); - _ = gateway - .new_task() - .project(project_name) - .and_then(task::run(|ctx| async move { - TaskResult::Done(Project::Stopping(ProjectStopping { - container: ctx.state.container().unwrap(), - })) + if container.state.is_some() { + _ = gateway + .new_task() + .project(project_name) + .and_then(task::run(|ctx| async move { + TaskResult::Done(Project::Rebooting(ProjectRebooting { + container: ctx.state.container().unwrap(), })) - .send(&sender) - .await; - } - _ => {} + })) + .send(&sender) + .await; } } } + _ => {} } } @@ -1205,6 +1639,8 @@ pub mod tests { fqdn: None, image: None, from: None, + recreate_count: 0, + idle_minutes: 0, }), #[assertion = "Container created, attach network"] Ok(Project::Attaching(ProjectAttaching { @@ -1218,7 +1654,8 @@ pub mod tests { .. }), .. - } + }, + recreate_count: 0, })) if networks.keys().collect::>() == vec!["bridge"], #[assertion = "Container attached, assigned an `id`"] Ok(Project::Starting(ProjectStarting { @@ -1233,7 +1670,8 @@ pub mod tests { .. }), .. - } + }, + restart_count: 0 })) if networks.keys().collect::>() == vec![&ctx.container_settings.network_name], #[assertion = "Container started, in a running state"] Ok(Project::Started(ProjectStarted { @@ -1249,7 +1687,7 @@ pub mod tests { })) if id == container_id, ); - let delay = time::sleep(Duration::from_secs(10)); + let delay = sleep(Duration::from_secs(10)); futures::pin_mut!(delay); let mut project_readying = project_started .unwrap() @@ -1302,7 +1740,7 @@ pub mod tests { .. }), .. - } + }, })), ); diff --git a/gateway/src/proxy.rs b/gateway/src/proxy.rs index aa51b0e9c..986ed46d6 100644 --- a/gateway/src/proxy.rs +++ b/gateway/src/proxy.rs @@ -6,7 +6,7 @@ use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; -use axum::headers::{Error as HeaderError, Header, HeaderMapExt, HeaderName, HeaderValue, Host}; +use axum::headers::{HeaderMapExt, Host}; use axum::response::{IntoResponse, Response}; use axum_server::accept::DefaultAcceptor; use axum_server::tls_rustls::RustlsAcceptor; @@ -22,13 +22,16 @@ use hyper_reverse_proxy::ReverseProxy; use once_cell::sync::Lazy; use opentelemetry::global; use opentelemetry_http::HeaderInjector; +use shuttle_common::backends::headers::XShuttleProject; +use tokio::sync::mpsc::Sender; use tower::{Service, ServiceBuilder}; use tracing::{debug_span, error, field, trace}; use tracing_opentelemetry::OpenTelemetrySpanExt; use crate::acme::{AcmeClient, ChallengeResponderLayer, CustomDomain}; use crate::service::GatewayService; -use crate::{Error, ErrorKind, ProjectName}; +use crate::task::BoxedTask; +use crate::{Error, ErrorKind}; static PROXY_CLIENT: Lazy>> = Lazy::new(|| ReverseProxy::new(Client::new())); @@ -65,40 +68,10 @@ where } } -lazy_static::lazy_static! { - pub static ref X_SHUTTLE_PROJECT: HeaderName = HeaderName::from_static("x-shuttle-project"); -} - -pub struct XShuttleProject(ProjectName); - -impl Header for XShuttleProject { - fn name() -> &'static HeaderName { - &X_SHUTTLE_PROJECT - } - - fn encode>(&self, values: &mut E) { - values.extend(std::iter::once( - HeaderValue::from_str(self.0.as_str()).unwrap(), - )); - } - - fn decode<'i, I>(values: &mut I) -> Result - where - Self: Sized, - I: Iterator, - { - values - .last() - .and_then(|value| value.to_str().ok()) - .and_then(|value| value.parse().ok()) - .map(Self) - .ok_or_else(HeaderError::invalid) - } -} - #[derive(Clone)] pub struct UserProxy { gateway: Arc, + task_sender: Sender, remote_addr: SocketAddr, public: FQDN, } @@ -112,7 +85,11 @@ impl<'r> AsResponderTo<&'r AddrStream> for UserProxy { } impl UserProxy { - async fn proxy(self, mut req: Request) -> Result { + async fn proxy( + self, + task_sender: Sender, + mut req: Request, + ) -> Result { let span = debug_span!("proxy", http.method = %req.method(), http.host = ?req.headers().get("Host"), http.uri = %req.uri(), http.status_code = field::Empty, project = field::Empty); trace!(?req, "serving proxy request"); @@ -139,9 +116,12 @@ impl UserProxy { }; req.headers_mut() - .typed_insert(XShuttleProject(project_name.clone())); + .typed_insert(XShuttleProject(project_name.to_string())); - let project = self.gateway.find_project(&project_name).await?; + let project = self + .gateway + .find_or_start_project(&project_name, task_sender) + .await?; // Record current project for tracing purposes span.record("project", &project_name.to_string()); @@ -183,8 +163,9 @@ impl Service> for UserProxy { } fn call(&mut self, req: Request) -> Self::Future { + let task_sender = self.task_sender.clone(); self.clone() - .proxy(req) + .proxy(task_sender, req) .or_else(|err: Error| future::ready(Ok(err.into_response()))) .boxed() } @@ -249,6 +230,7 @@ impl Service> for Bouncer { pub struct UserServiceBuilder { service: Option>, + task_sender: Option>, acme: Option, tls_acceptor: Option>, bouncer_binds_to: Option, @@ -266,6 +248,7 @@ impl UserServiceBuilder { pub fn new() -> Self { Self { service: None, + task_sender: None, public: None, acme: None, tls_acceptor: None, @@ -284,6 +267,11 @@ impl UserServiceBuilder { self } + pub fn with_task_sender(mut self, task_sender: Sender) -> Self { + self.task_sender = Some(task_sender); + self + } + pub fn with_bouncer(mut self, bound_to: SocketAddr) -> Self { self.bouncer_binds_to = Some(bound_to); self @@ -306,6 +294,7 @@ impl UserServiceBuilder { pub fn serve(self) -> impl Future> { let service = self.service.expect("a GatewayService is required"); + let task_sender = self.task_sender.expect("a task sender is required"); let public = self.public.expect("a public FQDN is required"); let user_binds_to = self .user_binds_to @@ -313,6 +302,7 @@ impl UserServiceBuilder { let user_proxy = UserProxy { gateway: service.clone(), + task_sender, remote_addr: "127.0.0.1:80".parse().unwrap(), public: public.clone(), }; diff --git a/gateway/src/service.rs b/gateway/src/service.rs index 16d6bfcc9..7bd55b61e 100644 --- a/gateway/src/service.rs +++ b/gateway/src/service.rs @@ -1,14 +1,12 @@ -use std::collections::HashMap; +use std::net::Ipv4Addr; use std::sync::Arc; use axum::body::Body; -use axum::headers::{Authorization, HeaderMapExt}; +use axum::headers::HeaderMapExt; use axum::http::Request; use axum::response::Response; -use bollard::network::ListNetworksOptions; use bollard::{Docker, API_DEFAULT_VERSION}; use fqdn::Fqdn; -use http::HeaderValue; use hyper::client::connect::dns::GaiResolver; use hyper::client::HttpConnector; use hyper::Client; @@ -16,19 +14,20 @@ use hyper_reverse_proxy::ReverseProxy; use once_cell::sync::Lazy; use opentelemetry::global; use opentelemetry_http::HeaderInjector; +use shuttle_common::backends::headers::{XShuttleAccountName, XShuttleAdminSecret}; use sqlx::error::DatabaseError; use sqlx::migrate::Migrator; use sqlx::sqlite::SqlitePool; use sqlx::types::Json as SqlxJson; use sqlx::{query, Error as SqlxError, Row}; -use tracing::{debug, Span}; +use tokio::sync::mpsc::Sender; +use tracing::{debug, trace, Span}; use tracing_opentelemetry::OpenTelemetrySpanExt; use crate::acme::CustomDomain; use crate::args::ContextArgs; -use crate::auth::{Key, Permissions, ScopedUser, User}; -use crate::project::Project; -use crate::task::{BoxedTask, TaskBuilder}; +use crate::project::{Project, ProjectCreating}; +use crate::task::{self, BoxedTask, TaskBuilder}; use crate::worker::TaskRouter; use crate::{AccountName, DockerContext, Error, ErrorKind, ProjectDetails, ProjectName}; @@ -43,22 +42,28 @@ impl From for Error { } } -pub struct ContainerSettingsBuilder<'d> { - docker: &'d Docker, +pub struct ContainerSettingsBuilder { prefix: Option, image: Option, provisioner: Option, + auth_uri: Option, network_name: Option, fqdn: Option, } -impl<'d> ContainerSettingsBuilder<'d> { - pub fn new(docker: &'d Docker) -> Self { +impl Default for ContainerSettingsBuilder { + fn default() -> Self { + Self::new() + } +} + +impl ContainerSettingsBuilder { + pub fn new() -> Self { Self { - docker, prefix: None, image: None, provisioner: None, + auth_uri: None, network_name: None, fqdn: None, } @@ -69,6 +74,7 @@ impl<'d> ContainerSettingsBuilder<'d> { prefix, network_name, provisioner_host, + auth_uri, image, proxy_fqdn, .. @@ -76,6 +82,7 @@ impl<'d> ContainerSettingsBuilder<'d> { self.prefix(prefix) .image(image) .provisioner_host(provisioner_host) + .auth_uri(auth_uri) .network_name(network_name) .fqdn(proxy_fqdn) .build() @@ -97,6 +104,11 @@ impl<'d> ContainerSettingsBuilder<'d> { self } + pub fn auth_uri(mut self, auth_uri: S) -> Self { + self.auth_uri = Some(auth_uri.to_string()); + self + } + pub fn network_name(mut self, name: S) -> Self { self.network_name = Some(name.to_string()); self @@ -107,45 +119,21 @@ impl<'d> ContainerSettingsBuilder<'d> { self } - /// Resolves the Docker network ID for the given network name. - /// - /// # Panics - /// If no such Docker network can be found. - async fn resolve_network_id(&self, network_name: &str) -> String { - self.docker - .list_networks(Some(ListNetworksOptions { - filters: HashMap::from([("name", vec![network_name])]), - })) - .await - .unwrap() - .into_iter() - .find_map(|network| { - network.name.as_ref().and_then(|name| { - if name == network_name { - network.id - } else { - None - } - }) - }) - .unwrap_or_else(|| panic!("cannot find a Docker network with name=`{network_name}`")) - } - pub async fn build(mut self) -> ContainerSettings { let prefix = self.prefix.take().unwrap(); let image = self.image.take().unwrap(); let provisioner_host = self.provisioner.take().unwrap(); + let auth_uri = self.auth_uri.take().unwrap(); let network_name = self.network_name.take().unwrap(); - let network_id = self.resolve_network_id(&network_name).await; let fqdn = self.fqdn.take().unwrap(); ContainerSettings { prefix, image, provisioner_host, + auth_uri, network_name, - network_id, fqdn, } } @@ -156,14 +144,14 @@ pub struct ContainerSettings { pub prefix: String, pub image: String, pub provisioner_host: String, + pub auth_uri: String, pub network_name: String, - pub network_id: String, pub fqdn: String, } impl ContainerSettings { - pub fn builder(docker: &Docker) -> ContainerSettingsBuilder { - ContainerSettingsBuilder::new(docker) + pub fn builder() -> ContainerSettingsBuilder { + ContainerSettingsBuilder::new() } } @@ -199,7 +187,7 @@ impl GatewayService { pub async fn init(args: ContextArgs, db: SqlitePool) -> Self { let docker = Docker::connect_with_unix(&args.docker_host, 60, API_DEFAULT_VERSION).unwrap(); - let container_settings = ContainerSettings::builder(&docker).from_args(&args).await; + let container_settings = ContainerSettings::builder().from_args(&args).await; let provider = GatewayContextProvider::new(docker, container_settings); @@ -214,30 +202,24 @@ impl GatewayService { pub async fn route( &self, - scoped_user: &ScopedUser, + project: &Project, + project_name: &ProjectName, + account_name: &AccountName, mut req: Request, ) -> Result, Error> { - let project_name = &scoped_user.scope; - let target_ip = self - .find_project(project_name) - .await? + let target_ip = project .target_ip()? .ok_or_else(|| Error::from_kind(ErrorKind::ProjectNotReady))?; - let control_key = self.control_key_from_project_name(project_name).await?; - let auth_header = Authorization::bearer(&control_key) - .map_err(|e| Error::source(ErrorKind::KeyMalformed, e))?; - req.headers_mut().typed_insert(auth_header); - let target_url = format!("http://{target_ip}:8001"); debug!(target_url, "routing control"); + let control_key = self.control_key_from_project_name(project_name).await?; + let headers = req.headers_mut(); - headers.append( - "X-Shuttle-Account-Name", - HeaderValue::from_str(&scoped_user.user.name.to_string()).unwrap(), - ); + headers.typed_insert(XShuttleAccountName(account_name.to_string())); + headers.typed_insert(XShuttleAdminSecret(control_key)); let cx = Span::current().context(); global::get_text_map_propagator(|propagator| { @@ -245,7 +227,7 @@ impl GatewayService { }); let resp = PROXY_CLIENT - .call("127.0.0.1".parse().unwrap(), &target_url, req) + .call(Ipv4Addr::LOCALHOST.into(), &target_url, req) .await .map_err(|_| Error::from_kind(ErrorKind::ProjectUnavailable))?; @@ -295,6 +277,27 @@ impl GatewayService { Ok(iter) } + pub async fn iter_user_projects_detailed_filtered( + &self, + account_name: AccountName, + filter: String, + ) -> Result, Error> { + let iter = + query("SELECT project_name, project_state FROM projects WHERE account_name = ?1 AND project_state = ?2") + .bind(account_name) + .bind(filter) + .fetch_all(&self.db) + .await? + .into_iter() + .map(|row| { + ( + row.get("project_name"), + row.get::, _>("project_state").0, + ) + }); + Ok(iter) + } + pub async fn update_project( &self, project_name: &ProjectName, @@ -327,26 +330,6 @@ impl GatewayService { .ok_or_else(|| Error::from(ErrorKind::ProjectNotFound)) } - pub async fn key_from_account_name(&self, account_name: &AccountName) -> Result { - let key = query("SELECT key FROM accounts WHERE account_name = ?1") - .bind(account_name) - .fetch_optional(&self.db) - .await? - .map(|row| row.try_get("key").unwrap()) - .ok_or_else(|| Error::from(ErrorKind::UserNotFound))?; - Ok(key) - } - - pub async fn account_name_from_key(&self, key: &Key) -> Result { - let name = query("SELECT account_name FROM accounts WHERE key = ?1") - .bind(key) - .fetch_optional(&self.db) - .await? - .map(|row| row.try_get("account_name").unwrap()) - .ok_or_else(|| Error::from(ErrorKind::UserNotFound))?; - Ok(name) - } - pub async fn control_key_from_project_name( &self, project_name: &ProjectName, @@ -360,71 +343,6 @@ impl GatewayService { Ok(control_key) } - pub async fn create_user(&self, name: AccountName) -> Result { - let key = Key::new_random(); - query("INSERT INTO accounts (account_name, key) VALUES (?1, ?2)") - .bind(&name) - .bind(&key) - .execute(&self.db) - .await - .map_err(|err| { - // If the error is a broken PK constraint, this is a - // project name clash - if let Some(db_err) = err.as_database_error() { - if db_err.code().unwrap() == "1555" { - // SQLITE_CONSTRAINT_PRIMARYKEY - return Error::from_kind(ErrorKind::UserAlreadyExists); - } - } - // Otherwise this is internal - err.into() - })?; - Ok(User::new_with_defaults(name, key)) - } - - pub async fn get_permissions(&self, account_name: &AccountName) -> Result { - let permissions = - query("SELECT super_user, account_tier FROM accounts WHERE account_name = ?1") - .bind(account_name) - .fetch_optional(&self.db) - .await? - .map(|row| { - Permissions::builder() - .super_user(row.try_get("super_user").unwrap()) - .tier(row.try_get("account_tier").unwrap()) - .build() - }) - .unwrap_or_default(); // defaults to `false` (i.e. not super user) - Ok(permissions) - } - - pub async fn set_super_user( - &self, - account_name: &AccountName, - super_user: bool, - ) -> Result<(), Error> { - query("UPDATE accounts SET super_user = ?1 WHERE account_name = ?2") - .bind(super_user) - .bind(account_name) - .execute(&self.db) - .await?; - Ok(()) - } - - pub async fn set_permissions( - &self, - account_name: &AccountName, - permissions: &Permissions, - ) -> Result<(), Error> { - query("UPDATE accounts SET super_user = ?1, account_tier = ?2 WHERE account_name = ?3") - .bind(permissions.super_user) - .bind(permissions.tier) - .bind(account_name) - .execute(&self.db) - .await?; - Ok(()) - } - pub async fn iter_user_projects( &self, AccountName(account_name): &AccountName, @@ -442,18 +360,42 @@ impl GatewayService { &self, project_name: ProjectName, account_name: AccountName, + is_admin: bool, + idle_minutes: u64, ) -> Result { - if let Some(row) = query("SELECT project_name, account_name, initial_key, project_state FROM projects WHERE project_name = ?1 AND account_name = ?2") - .bind(&project_name) - .bind(&account_name) - .fetch_optional(&self.db) - .await? + if let Some(row) = query( + r#" + SELECT project_name, account_name, initial_key, project_state + FROM projects + WHERE (project_name = ?1) + AND (account_name = ?2 OR ?3) + "#, + ) + .bind(&project_name) + .bind(&account_name) + .bind(is_admin) + .fetch_optional(&self.db) + .await? { // If the project already exists and belongs to this account let project = row.get::, _>("project_state").0; if project.is_destroyed() { // But is in `::Destroyed` state, recreate it - let project = Project::create(project_name.clone()); + let mut creating = ProjectCreating::new_with_random_initial_key( + project_name.clone(), + idle_minutes, + ); + // Restore previous custom domain, if any + match self.find_custom_domain_for_project(&project_name).await { + Ok(custom_domain) => { + creating = creating.with_fqdn(custom_domain.fqdn.to_string()); + } + Err(error) if error.kind() == ErrorKind::CustomDomainNotFound => { + // no previous custom domain + } + Err(error) => return Err(error), + } + let project = Project::Creating(creating); self.update_project(&project_name, &project).await?; Ok(project) } else { @@ -469,7 +411,8 @@ impl GatewayService { // Otherwise attempt to create a new one. This will fail // outright if the project already exists (this happens if // it belongs to another account). - self.insert_project(project_name, account_name).await + self.insert_project(project_name, account_name, idle_minutes) + .await } else { Err(Error::from_kind(ErrorKind::InvalidProjectName)) } @@ -480,8 +423,11 @@ impl GatewayService { &self, project_name: ProjectName, account_name: AccountName, + idle_minutes: u64, ) -> Result { - let project = SqlxJson(Project::create(project_name.clone())); + let project = SqlxJson(Project::Creating( + ProjectCreating::new_with_random_initial_key(project_name.clone(), idle_minutes), + )); query("INSERT INTO projects (project_name, account_name, initial_key, project_state) VALUES (?1, ?2, ?3, ?4)") .bind(&project_name) @@ -540,6 +486,26 @@ impl GatewayService { .map_err(|_| Error::from_kind(ErrorKind::Internal)) } + pub async fn find_custom_domain_for_project( + &self, + project_name: &ProjectName, + ) -> Result { + let custom_domain = query( + "SELECT fqdn, project_name, certificate, private_key FROM custom_domains WHERE project_name = ?1", + ) + .bind(project_name.to_string()) + .fetch_optional(&self.db) + .await? + .map(|row| CustomDomain { + fqdn: row.get::<&str, _>("fqdn").parse().unwrap(), + project_name: row.try_get("project_name").unwrap(), + certificate: row.get("certificate"), + private_key: row.get("private_key"), + }) + .ok_or_else(|| Error::from(ErrorKind::CustomDomainNotFound))?; + Ok(custom_domain) + } + pub async fn project_details_for_custom_domain( &self, fqdn: &Fqdn, @@ -583,6 +549,35 @@ impl GatewayService { TaskBuilder::new(self.clone()) } + /// Find a project by name. And start the project if it is idle, waiting for it to start up + pub async fn find_or_start_project( + self: &Arc, + project_name: &ProjectName, + task_sender: Sender, + ) -> Result { + let mut project = self.find_project(project_name).await?; + + // Start the project if it is idle + if project.is_stopped() { + trace!(%project_name, "starting up idle project"); + + let handle = self + .new_task() + .project(project_name.clone()) + .and_then(task::start()) + .and_then(task::run_until_done()) + .and_then(task::check_health()) + .send(&task_sender) + .await?; + + // Wait for project to come up and set new state + handle.await; + project = self.find_project(project_name).await?; + } + + Ok(project) + } + pub fn task_router(&self) -> TaskRouter { self.task_router.clone() } @@ -606,68 +601,13 @@ impl DockerContext for GatewayContext { #[cfg(test)] pub mod tests { - - use std::str::FromStr; - use fqdn::FQDN; use super::*; - use crate::auth::AccountTier; use crate::task::{self, TaskResult}; use crate::tests::{assert_err_kind, World}; use crate::{Error, ErrorKind}; - #[tokio::test] - async fn service_create_find_user() -> anyhow::Result<()> { - let world = World::new().await; - let svc = GatewayService::init(world.args(), world.pool()).await; - - let account_name: AccountName = "test_user_123".parse()?; - - assert_err_kind!( - User::retrieve_from_account_name(&svc, account_name.clone()).await, - ErrorKind::UserNotFound - ); - - assert_err_kind!( - User::retrieve_from_key(&svc, Key::from_str("123").unwrap()).await, - ErrorKind::UserNotFound - ); - - let user = svc.create_user(account_name.clone()).await?; - - assert_eq!( - User::retrieve_from_account_name(&svc, account_name.clone()).await?, - user - ); - - let User { - name, - key, - projects, - permissions, - } = user; - - assert!(projects.is_empty()); - - assert!(!permissions.is_super_user()); - - assert_eq!(*permissions.tier(), AccountTier::Basic); - - assert_eq!(name, account_name); - - assert_err_kind!( - svc.create_user(account_name.clone()).await, - ErrorKind::UserAlreadyExists - ); - - let user_key = svc.key_from_account_name(&account_name).await?; - - assert_eq!(key, user_key); - - Ok(()) - } - #[tokio::test] async fn service_create_find_delete_project() -> anyhow::Result<()> { let world = World::new().await; @@ -684,11 +624,8 @@ pub mod tests { ) }; - svc.create_user(neo.clone()).await.unwrap(); - svc.create_user(trinity.clone()).await.unwrap(); - let project = svc - .create_project(matrix.clone(), neo.clone()) + .create_project(matrix.clone(), neo.clone(), false, 0) .await .unwrap(); @@ -715,6 +652,23 @@ pub mod tests { vec![matrix.clone()] ); + // assert_eq!( + // svc.iter_user_projects_detailed_filtered(neo.clone(), "ready".to_string()) + // .await + // .unwrap() + // .next() + // .expect("to get one project with its user and a valid Ready status"), + // (matrix.clone(), project) + // ); + + // assert_eq!( + // svc.iter_user_projects_detailed_filtered(neo.clone(), "destroyed".to_string()) + // .await + // .unwrap() + // .next(), + // None + // ); + let mut work = svc .new_task() .project(matrix.clone()) @@ -732,7 +686,8 @@ pub mod tests { // If recreated by a different user assert!(matches!( - svc.create_project(matrix.clone(), trinity.clone()).await, + svc.create_project(matrix.clone(), trinity.clone(), false, 0) + .await, Err(Error { kind: ErrorKind::ProjectAlreadyExists, .. @@ -741,7 +696,28 @@ pub mod tests { // If recreated by the same user assert!(matches!( - svc.create_project(matrix, neo).await, + svc.create_project(matrix.clone(), neo, false, 0).await, + Ok(Project::Creating(_)) + )); + + let mut work = svc + .new_task() + .project(matrix.clone()) + .and_then(task::destroy()) + .build(); + + while let TaskResult::Pending(_) = work.poll(()).await {} + assert!(matches!(work.poll(()).await, TaskResult::Done(()))); + + // After project has been destroyed again... + assert!(matches!( + svc.find_project(&matrix).await, + Ok(Project::Destroyed(_)) + )); + + // If recreated by an admin + assert!(matches!( + svc.create_project(matrix, trinity, true, 0).await, Ok(Project::Creating(_)) )); @@ -756,8 +732,7 @@ pub mod tests { let neo: AccountName = "neo".parse().unwrap(); let matrix: ProjectName = "matrix".parse().unwrap(); - svc.create_user(neo.clone()).await.unwrap(); - svc.create_project(matrix.clone(), neo.clone()) + svc.create_project(matrix.clone(), neo.clone(), false, 0) .await .unwrap(); @@ -816,15 +791,13 @@ pub mod tests { let certificate = "dummy certificate"; let private_key = "dummy private key"; - svc.create_user(account.clone()).await.unwrap(); - assert_err_kind!( svc.project_details_for_custom_domain(&domain).await, ErrorKind::CustomDomainNotFound ); let _ = svc - .create_project(project_name.clone(), account.clone()) + .create_project(project_name.clone(), account.clone(), false, 0) .await .unwrap(); @@ -860,4 +833,51 @@ pub mod tests { Ok(()) } + + #[tokio::test] + async fn service_create_custom_domain_destroy_recreate_project() -> anyhow::Result<()> { + let world = World::new().await; + let svc = Arc::new(GatewayService::init(world.args(), world.pool()).await); + + let account: AccountName = "neo".parse().unwrap(); + let project_name: ProjectName = "matrix".parse().unwrap(); + let domain: FQDN = "neo.the.matrix".parse().unwrap(); + let certificate = "dummy certificate"; + let private_key = "dummy private key"; + + assert_err_kind!( + svc.project_details_for_custom_domain(&domain).await, + ErrorKind::CustomDomainNotFound + ); + + let _ = svc + .create_project(project_name.clone(), account.clone(), false, 0) + .await + .unwrap(); + + svc.create_custom_domain(project_name.clone(), &domain, certificate, private_key) + .await + .unwrap(); + + let mut work = svc + .new_task() + .project(project_name.clone()) + .and_then(task::destroy()) + .build(); + + while let TaskResult::Pending(_) = work.poll(()).await {} + assert!(matches!(work.poll(()).await, TaskResult::Done(()))); + + let recreated_project = svc + .create_project(project_name.clone(), account.clone(), false, 0) + .await + .unwrap(); + + let Project::Creating(creating) = recreated_project else { + panic!("Project should be Creating"); + }; + assert_eq!(creating.fqdn(), &Some(domain.to_string())); + + Ok(()) + } } diff --git a/gateway/src/task.rs b/gateway/src/task.rs index dc506306a..fabd2292d 100644 --- a/gateway/src/task.rs +++ b/gateway/src/task.rs @@ -7,7 +7,7 @@ use std::time::{Duration, Instant}; use tokio::sync::mpsc::Sender; use tokio::sync::oneshot; use tokio::time::{sleep, timeout}; -use tracing::{error, info, info_span, warn}; +use tracing::{error, info_span, trace, warn}; use uuid::Uuid; use crate::project::*; @@ -126,6 +126,15 @@ pub fn destroy() -> impl Task { }) } +pub fn start() -> impl Task { + run(|ctx| async move { + match ctx.state.start() { + Ok(state) => TaskResult::Done(state), + Err(err) => TaskResult::Err(err), + } + }) +} + pub fn check_health() -> impl Task { run(|ctx| async move { match ctx.state.refresh(&ctx.gateway).await { @@ -133,7 +142,7 @@ pub fn check_health() -> impl Task TaskResult::Done(update), @@ -482,14 +491,14 @@ where }; if let Some(update) = res.as_ref().ok() { - info!(new_state = ?update.state(), "new state"); + trace!(new_state = ?update.state(), "new state"); match self .service .update_project(&self.project_name, update) .await { Ok(_) => { - info!(new_state = ?update.state(), "successfully updated project state"); + trace!(new_state = ?update.state(), "successfully updated project state"); } Err(err) => { error!(err = %err, "could not update project state"); @@ -498,7 +507,7 @@ where } } - info!(result = res.to_str(), "poll result"); + trace!(result = res.to_str(), "poll result"); match res { TaskResult::Pending(_) => TaskResult::Pending(()), diff --git a/proto/provisioner.proto b/proto/provisioner.proto index ab67da88c..66d166e98 100644 --- a/proto/provisioner.proto +++ b/proto/provisioner.proto @@ -3,6 +3,7 @@ package provisioner; service Provisioner { rpc ProvisionDatabase(DatabaseRequest) returns (DatabaseResponse); + rpc DeleteDatabase(DatabaseRequest) returns (DatabaseDeletionResponse); } message DatabaseRequest { @@ -28,9 +29,7 @@ message AwsRds { } } -message RdsConfig { - -} +message RdsConfig {} message DatabaseResponse { string username = 1; @@ -41,3 +40,5 @@ message DatabaseResponse { string address_public = 6; string port = 7; } + +message DatabaseDeletionResponse {} diff --git a/provisioner/Cargo.toml b/provisioner/Cargo.toml index 89ced2ac6..f183d283c 100644 --- a/provisioner/Cargo.toml +++ b/provisioner/Cargo.toml @@ -10,25 +10,32 @@ publish = false [dependencies] aws-config = "0.51.0" aws-sdk-rds = "0.21.0" -clap = { version = "3.2.17", features = ["derive", "env"] } +clap = { workspace = true, features = ["env"] } fqdn = "0.2.3" -mongodb = "2.3.1" +mongodb = "2.4.0" prost = "0.11.2" -rand = "0.8.5" -sqlx = { version = "0.6.2", features = ["postgres", "runtime-tokio-native-tls"] } +rand = { workspace = true } +sqlx = { version = "0.6.2", features = [ + "postgres", + "runtime-tokio-native-tls", +] } thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } tonic = { workspace = true } tracing = { workspace = true, features = ["default"] } tracing-subscriber = { workspace = true, features = ["default", "fmt"] } +[dependencies.shuttle-common] +workspace = true +features = ["backend"] + [dependencies.shuttle-proto] workspace = true [dev-dependencies] ctor = "0.1.26" once_cell = { workspace = true } -portpicker = "0.1.1" +portpicker = { workspace = true } serde_json = { workspace = true } [build-dependencies] diff --git a/provisioner/src/args.rs b/provisioner/src/args.rs index 85b5f875f..034932df8 100644 --- a/provisioner/src/args.rs +++ b/provisioner/src/args.rs @@ -5,37 +5,42 @@ use std::{ use clap::Parser; use fqdn::FQDN; +use tonic::transport::Uri; #[derive(Parser, Debug)] -#[clap(author, version, about, long_about = None)] +#[command(author, version, about, long_about = None)] pub struct Args { /// Address to bind provisioner on - #[clap(long, env = "PROVISIONER_IP", default_value_t = Ipv4Addr::LOCALHOST.into())] + #[arg(long, env = "PROVISIONER_IP", default_value_t = Ipv4Addr::LOCALHOST.into())] pub ip: IpAddr, /// Port to start provisioner on - #[clap(long, env = "PROVISIONER_PORT", default_value_t = 5001)] + #[arg(long, env = "PROVISIONER_PORT", default_value_t = 5001)] pub port: u16, /// URI to connect to Postgres for managing shared DB resources - #[clap(long, env = "PROVISIONER_PG_URI", hide_env_values = true)] + #[arg(long, env = "PROVISIONER_PG_URI", hide_env_values = true)] pub shared_pg_uri: String, /// URI to connect to MongoDb for managing shared DB resources - #[clap(long, env = "PROVISIONER_MONGODB_URI", hide_env_values = true)] + #[arg(long, env = "PROVISIONER_MONGODB_URI", hide_env_values = true)] pub shared_mongodb_uri: String, /// Fully qualified domain name this provisioner instance is reachable at - #[clap(long, env = "PROVISIONER_FQDN", parse(try_from_str = parse_fqdn))] + #[arg(long, env = "PROVISIONER_FQDN", value_parser = parse_fqdn)] pub fqdn: FQDN, /// Address the provisioned PostgreSQL DB can be reached at on the internal network - #[clap(long, env = "PROVISIONER_PG_ADDRESS", default_value = "pg")] + #[arg(long, env = "PROVISIONER_PG_ADDRESS", default_value = "pg")] pub internal_pg_address: String, /// Address the provisioned MongoDB can be reached at on the internal network - #[clap(long, env = "PROVISIONER_MONGODB_ADDRESS", default_value = "mongodb")] + #[arg(long, env = "PROVISIONER_MONGODB_ADDRESS", default_value = "mongodb")] pub internal_mongodb_address: String, + + /// Address to reach the authentication service at + #[arg(long, default_value = "http://127.0.0.1:8008")] + pub auth_uri: Uri, } fn parse_fqdn(src: &str) -> Result { diff --git a/provisioner/src/error.rs b/provisioner/src/error.rs index 21bac6bc1..e8b522c0c 100644 --- a/provisioner/src/error.rs +++ b/provisioner/src/error.rs @@ -14,9 +14,15 @@ pub enum Error { #[error("failed to update role: {0}")] UpdateRole(String), + #[error("failed to drop role: {0}")] + DeleteRole(String), + #[error("failed to create DB: {0}")] CreateDB(String), + #[error("failed to drop DB: {0}")] + DeleteDB(String), + #[error("unexpected sqlx error: {0}")] UnexpectedSqlx(#[from] sqlx::Error), diff --git a/provisioner/src/lib.rs b/provisioner/src/lib.rs index a877a6dd9..7c732149a 100644 --- a/provisioner/src/lib.rs +++ b/provisioner/src/lib.rs @@ -6,12 +6,13 @@ use aws_sdk_rds::{error::ModifyDBInstanceErrorKind, model::DbInstance, types::Sd pub use error::Error; use mongodb::{bson::doc, options::ClientOptions}; use rand::Rng; -use shuttle_proto::provisioner::provisioner_server::Provisioner; +use shuttle_common::backends::auth::{Claim, Scope}; pub use shuttle_proto::provisioner::provisioner_server::ProvisionerServer; use shuttle_proto::provisioner::{ aws_rds, database_request::DbType, shared, AwsRds, DatabaseRequest, DatabaseResponse, Shared, }; -use sqlx::{postgres::PgPoolOptions, PgPool}; +use shuttle_proto::provisioner::{provisioner_server::Provisioner, DatabaseDeletionResponse}; +use sqlx::{postgres::PgPoolOptions, ConnectOptions, Executor, PgPool}; use tokio::time::sleep; use tonic::{Request, Response, Status}; use tracing::{debug, info}; @@ -164,6 +165,23 @@ impl MyProvisioner { .execute(&self.pool) .await .map_err(|e| Error::CreateDB(e.to_string()))?; + + // Make sure database can't see other databases or other users + // For #557 + let options = self.pool.connect_options().clone().database(&database_name); + let mut conn = options.connect().await?; + + let stmts = vec![ + "REVOKE ALL ON pg_user FROM public;", + "REVOKE ALL ON pg_roles FROM public;", + "REVOKE ALL ON pg_database FROM public;", + ]; + + for stmt in stmts { + conn.execute(stmt) + .await + .map_err(|e| Error::CreateDB(e.to_string()))?; + } } Ok(database_name) @@ -298,6 +316,92 @@ impl MyProvisioner { port: engine_to_port(engine), }) } + + async fn delete_shared_db( + &self, + project_name: &str, + engine: shared::Engine, + ) -> Result { + match engine { + shared::Engine::Postgres(_) => self.delete_pg(project_name).await?, + shared::Engine::Mongodb(_) => self.delete_mongodb(project_name).await?, + } + Ok(DatabaseDeletionResponse {}) + } + + async fn delete_pg(&self, project_name: &str) -> Result<(), Error> { + let database_name = format!("db-{project_name}"); + let role_name = format!("user-{project_name}"); + + // Idenfitiers cannot be used as query parameters + let drop_db_query = format!("DROP DATABASE \"{database_name}\";"); + + // Drop the database. Note that this can fail if there are still active connections to it + sqlx::query(&drop_db_query) + .execute(&self.pool) + .await + .map_err(|e| Error::DeleteRole(e.to_string()))?; + + // Drop the role + let drop_role_query = format!("DROP ROLE IF EXISTS \"{role_name}\""); + sqlx::query(&drop_role_query) + .execute(&self.pool) + .await + .map_err(|e| Error::DeleteDB(e.to_string()))?; + + Ok(()) + } + + async fn delete_mongodb(&self, project_name: &str) -> Result<(), Error> { + let database_name = format!("mongodb-{project_name}"); + let db = self.mongodb_client.database(&database_name); + + // dropping a database in mongodb doesn't delete any associated users + // so do that first + + let drop_users_command = doc! { + "dropAllUsersFromDatabase": 1 + }; + + db.run_command(drop_users_command, None) + .await + .map_err(|e| Error::DeleteRole(e.to_string()))?; + + // drop the actual database + + db.drop(None) + .await + .map_err(|e| Error::DeleteDB(e.to_string()))?; + + Ok(()) + } + + async fn delete_aws_rds( + &self, + project_name: &str, + engine: aws_rds::Engine, + ) -> Result { + let client = &self.rds_client; + let instance_name = format!("{project_name}-{engine}"); + + // try to delete the db instance + let delete_result = client + .delete_db_instance() + .db_instance_identifier(&instance_name) + .send() + .await; + + // Did we get an error that wasn't "db instance not found" + if let Err(SdkError::ServiceError { err, .. }) = delete_result { + if !err.is_db_instance_not_found_fault() { + return Err(Error::Plain(format!( + "got unexpected error from AWS RDS service: {err}" + ))); + } + } + + Ok(DatabaseDeletionResponse {}) + } } #[tonic::async_trait] @@ -307,6 +411,8 @@ impl Provisioner for MyProvisioner { &self, request: Request, ) -> Result, Status> { + verify_claim(&request)?; + let request = request.into_inner(); let db_type = request.db_type.unwrap(); @@ -323,6 +429,46 @@ impl Provisioner for MyProvisioner { Ok(Response::new(reply)) } + + #[tracing::instrument(skip(self))] + async fn delete_database( + &self, + request: Request, + ) -> Result, Status> { + verify_claim(&request)?; + + let request = request.into_inner(); + let db_type = request.db_type.unwrap(); + + let reply = match db_type { + DbType::Shared(Shared { engine }) => { + self.delete_shared_db(&request.project_name, engine.expect("oneof to be set")) + .await? + } + DbType::AwsRds(AwsRds { engine }) => { + self.delete_aws_rds(&request.project_name, engine.expect("oneof to be set")) + .await? + } + }; + + Ok(Response::new(reply)) + } +} + +/// Verify the claim on the request has the correct scope to call this service +fn verify_claim(request: &Request) -> Result<(), Status> { + let claim = request + .extensions() + .get::() + .ok_or_else(|| Status::internal("could not get claim"))?; + + if claim.scopes.contains(&Scope::ResourcesWrite) { + Ok(()) + } else { + Err(Status::permission_denied( + "does not have resource allocation scope", + )) + } } fn generate_password() -> String { diff --git a/provisioner/src/main.rs b/provisioner/src/main.rs index 3c42acf90..f5fef85af 100644 --- a/provisioner/src/main.rs +++ b/provisioner/src/main.rs @@ -1,12 +1,16 @@ use std::{net::SocketAddr, time::Duration}; use clap::Parser; +use shuttle_common::backends::{ + auth::{AuthPublicKey, JwtAuthenticationLayer}, + tracing::{setup_tracing, ExtractPropagationLayer}, +}; use shuttle_provisioner::{Args, MyProvisioner, ProvisionerServer}; use tonic::transport::Server; #[tokio::main] async fn main() -> Result<(), Box> { - tracing_subscriber::fmt::init(); + setup_tracing(tracing_subscriber::registry(), "provisioner"); let Args { ip, @@ -16,6 +20,7 @@ async fn main() -> Result<(), Box> { fqdn, internal_pg_address, internal_mongodb_address, + auth_uri, } = Args::parse(); let addr = SocketAddr::new(ip, port); @@ -32,6 +37,8 @@ async fn main() -> Result<(), Box> { println!("starting provisioner on {}", addr); Server::builder() .http2_keepalive_interval(Some(Duration::from_secs(30))) // Prevent deployer clients from loosing connection #ENG-219 + .layer(JwtAuthenticationLayer::new(AuthPublicKey::new(auth_uri))) + .layer(ExtractPropagationLayer) .add_service(ProvisionerServer::new(provisioner)) .serve(addr) .await?; diff --git a/resources/README.md b/resources/README.md index d6e00cd77..531322c0a 100644 --- a/resources/README.md +++ b/resources/README.md @@ -1,5 +1,11 @@ +# Resources + ## Managed resources -The list of managed resources for shuttle is always growing. If you feel we are missing a resource you would like, then feel to create a feature request for your desired resource. + +The list of managed resources for shuttle is always growing. +If you feel we are missing a resource you would like, then feel to create a feature request for your desired resource. ## Writing your own managed resources -Creating your own resources is actually easy. You only need to implement the [`ResourceBuilder`](https://docs.rs/shuttle-service/latest/shuttle_service/trait.ResourceBuilder.html) trait for your resource. + +Creating your own resources is actually easy. +You only need to implement the [`ResourceBuilder`](https://docs.rs/shuttle-service/latest/shuttle_service/trait.ResourceBuilder.html) trait for your resource. diff --git a/resources/aws-rds/Cargo.toml b/resources/aws-rds/Cargo.toml index 0dfec8369..951ced4d5 100644 --- a/resources/aws-rds/Cargo.toml +++ b/resources/aws-rds/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-aws-rds" -version = "0.8.0" +version = "0.11.0" edition = "2021" license = "Apache-2.0" description = "Plugin to provision AWS RDS resources" @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "rds"] [dependencies] async-trait = "0.1.56" paste = "1.0.7" -shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"] } [features] diff --git a/resources/aws-rds/README.md b/resources/aws-rds/README.md index b48228fe1..a8bf7099f 100644 --- a/resources/aws-rds/README.md +++ b/resources/aws-rds/README.md @@ -1,10 +1,13 @@ # Shuttle AWS RDS + This plugin provisions databases on AWS RDS using [shuttle](https://www.shuttle.rs). The following three engines are supported: + - Postgres - MySql - MariaDB ## Usage + Add `shuttle-aws-rds` to the dependencies for your service. Every engine is behind the following feature flags and attribute paths: | Engine | Feature flag | Attribute path | @@ -15,3 +18,10 @@ Add `shuttle-aws-rds` to the dependencies for your service. Every engine is behi An example using the Tide framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/tide/postgres) +### Options + +Each engine can take in the following options: + +| Option | Type | Description | +|-----------|------|--------------------------------------------------------------------------------------------------------------| +| local_uri | &str | Don't spin up a local docker instance of the DB, but rather connect to this URI instead for `cargo shuttle run` | diff --git a/resources/aws-rds/src/lib.rs b/resources/aws-rds/src/lib.rs index dec92c198..16b00212a 100644 --- a/resources/aws-rds/src/lib.rs +++ b/resources/aws-rds/src/lib.rs @@ -13,20 +13,35 @@ macro_rules! aws_engine { paste! { #[cfg(feature = $feature)] #[doc = "A resource connected to an AWS RDS " $struct_ident " instance"] - pub struct $struct_ident; + pub struct $struct_ident{ + local_uri: Option, + } #[cfg(feature = $feature)] #[doc = "Gets a `sqlx::Pool` connected to an AWS RDS " $struct_ident " instance"] #[async_trait] impl ResourceBuilder<$pool_path> for $struct_ident { fn new() -> Self { - Self {} + Self { local_uri: None } } async fn build(self, factory: &mut dyn Factory) -> Result<$pool_path, shuttle_service::Error> { - let connection_string = factory - .get_db_connection_string(Type::AwsRds(AwsRdsEngine::$struct_ident)) - .await?; + let connection_string = match factory.get_environment() { + shuttle_service::Environment::Production => { + factory + .get_db_connection_string(Type::AwsRds(AwsRdsEngine::$struct_ident)) + .await? + } + shuttle_service::Environment::Local => { + if let Some(local_uri) = self.local_uri { + local_uri + } else { + factory + .get_db_connection_string(Type::AwsRds(AwsRdsEngine::$struct_ident)) + .await? + } + } + }; let pool = $options_path::new() .min_connections(1) @@ -38,6 +53,16 @@ macro_rules! aws_engine { Ok(pool) } } + + #[cfg(feature = $feature)] + impl $struct_ident { + /// Use a custom connection string for local runs + pub fn local_uri(mut self, local_uri: &str) -> Self { + self.local_uri = Some(local_uri.to_string()); + + self + } + } } }; } diff --git a/resources/persist/Cargo.toml b/resources/persist/Cargo.toml index 82e0559e6..dd0ed1860 100644 --- a/resources/persist/Cargo.toml +++ b/resources/persist/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-persist" -version = "0.8.0" +version = "0.11.0" edition = "2021" license = "Apache-2.0" description = "Plugin for persist objects" @@ -11,6 +11,6 @@ keywords = ["shuttle-service", "persistence"] async-trait = "0.1.56" bincode = "1.2.1" serde = { version = "1.0.0", features = ["derive"] } -shuttle-common = { path = "../../common", version = "0.8.0", default-features = false } -shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } +shuttle-common = { path = "../../common", version = "0.11.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } thiserror = "1.0.32" diff --git a/resources/persist/README.md b/resources/persist/README.md index 333bf75ba..c829ee10b 100644 --- a/resources/persist/README.md +++ b/resources/persist/README.md @@ -1,8 +1,9 @@ # Shuttle Persist + This plugin allows persisting struct that implement `serde::Serialize` and loading them again using `serde::Deserialize`. ## Usage + Add `shuttle-persist` to the dependencies for your service. You can get this resource using the `shuttle-persist::Persist` attribute to get a `PersistInstance`. Object can now be saved using `PersistInstance.save()` and loaded again using `PersistInstance.load()`. An example using the Rocket framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/rocket/persist) - diff --git a/resources/secrets/Cargo.toml b/resources/secrets/Cargo.toml index 83c107c1c..599ce1a82 100644 --- a/resources/secrets/Cargo.toml +++ b/resources/secrets/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-secrets" -version = "0.8.0" +version = "0.11.0" edition = "2021" license = "Apache-2.0" description = "Plugin to for managing secrets on shuttle" @@ -9,4 +9,4 @@ keywords = ["shuttle-service", "secrets"] [dependencies] async-trait = "0.1.56" -shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } diff --git a/resources/secrets/README.md b/resources/secrets/README.md index 08e7912a5..1d2a5ca84 100644 --- a/resources/secrets/README.md +++ b/resources/secrets/README.md @@ -1,7 +1,9 @@ # Shuttle Secrets + This plugin manages secrets on [shuttle](https://www.shuttle.rs). ## Usage + Add `shuttle-secrets` to the dependencies for your service, and add a `Secrets.toml` to the root of your project with the secrets you'd like to store. Make sure to add `Secrets.toml` to a `.gitignore` to omit your secrets from version control. diff --git a/resources/shared-db/Cargo.toml b/resources/shared-db/Cargo.toml index 0cbf266eb..3d78638e5 100644 --- a/resources/shared-db/Cargo.toml +++ b/resources/shared-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-shared-db" -version = "0.8.0" +version = "0.11.0" edition = "2021" license = "Apache-2.0" description = "Plugin for managing shared databases on shuttle" @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "database"] [dependencies] async-trait = "0.1.56" mongodb = { version = "2.3.0", optional = true } -shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"], optional = true } [features] diff --git a/resources/shared-db/README.md b/resources/shared-db/README.md index a3b1c877c..fad4bdfa5 100644 --- a/resources/shared-db/README.md +++ b/resources/shared-db/README.md @@ -1,7 +1,9 @@ # Shuttle Shared Databases + This plugin manages databases that are shared with other services on [shuttle](https://www.shuttle.rs). ## Usage + Add `shuttle-shared-db` to the dependencies for your service. Every type of shareable database is behind the following feature flag and attribute path | Engine | Feature flag | Attribute path | @@ -11,3 +13,18 @@ Add `shuttle-shared-db` to the dependencies for your service. Every type of shar An example using the Rocket framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/rocket/postgres) +### Postgres + +This resource has the following options + +| Option | Type | Description | +|-----------|------|----------------------------------------------------------------------------------------------------------------| +| local_uri | &str | Don't spin a local docker instance of Postgres, but rather connect to this URI instead for `cargo shuttle run` | + +### MongoDB + +This resource has the following options + +| Option | Type | Description | +|-----------|------|---------------------------------------------------------------------------------------------------------------| +| local_uri | &str | Don't spin a local docker instance of MongoDB, but rather connect to this URI instead for `cargo shuttle run` | diff --git a/resources/shared-db/src/lib.rs b/resources/shared-db/src/lib.rs index fb3fd15a3..b44eab3a4 100644 --- a/resources/shared-db/src/lib.rs +++ b/resources/shared-db/src/lib.rs @@ -4,20 +4,39 @@ use async_trait::async_trait; use shuttle_service::{database, error::CustomError, Error, Factory, ResourceBuilder}; #[cfg(feature = "postgres")] -pub struct Postgres; +pub struct Postgres { + local_uri: Option, +} #[cfg(feature = "postgres")] /// Get an `sqlx::PgPool` from any factory #[async_trait] impl ResourceBuilder for Postgres { fn new() -> Self { - Self {} + Self { local_uri: None } } async fn build(self, factory: &mut dyn Factory) -> Result { - let connection_string = factory - .get_db_connection_string(database::Type::Shared(database::SharedEngine::Postgres)) - .await?; + let connection_string = match factory.get_environment() { + shuttle_service::Environment::Production => { + factory + .get_db_connection_string(database::Type::Shared( + database::SharedEngine::Postgres, + )) + .await? + } + shuttle_service::Environment::Local => { + if let Some(local_uri) = self.local_uri { + local_uri + } else { + factory + .get_db_connection_string(database::Type::Shared( + database::SharedEngine::Postgres, + )) + .await? + } + } + }; let pool = sqlx::postgres::PgPoolOptions::new() .min_connections(1) @@ -30,22 +49,48 @@ impl ResourceBuilder for Postgres { } } +#[cfg(feature = "postgres")] +impl Postgres { + /// Use a custom connection string for local runs + pub fn local_uri(mut self, local_uri: &str) -> Self { + self.local_uri = Some(local_uri.to_string()); + + self + } +} + #[cfg(feature = "mongodb")] -pub struct MongoDb; +pub struct MongoDb { + local_uri: Option, +} /// Get a `mongodb::Database` from any factory #[cfg(feature = "mongodb")] #[async_trait] impl ResourceBuilder for MongoDb { fn new() -> Self { - Self {} + Self { local_uri: None } } async fn build(self, factory: &mut dyn Factory) -> Result { - let connection_string = factory - .get_db_connection_string(database::Type::Shared(database::SharedEngine::MongoDb)) - .await - .map_err(CustomError::new)?; + let connection_string = match factory.get_environment() { + shuttle_service::Environment::Production => factory + .get_db_connection_string(database::Type::Shared(database::SharedEngine::MongoDb)) + .await + .map_err(CustomError::new)?, + shuttle_service::Environment::Local => { + if let Some(local_uri) = self.local_uri { + local_uri + } else { + factory + .get_db_connection_string(database::Type::Shared( + database::SharedEngine::MongoDb, + )) + .await + .map_err(CustomError::new)? + } + } + }; let mut client_options = mongodb::options::ClientOptions::parse(connection_string) .await @@ -67,3 +112,13 @@ impl ResourceBuilder for MongoDb { } } } + +#[cfg(feature = "mongodb")] +impl MongoDb { + /// Use a custom connection string for local runs + pub fn local_uri(mut self, local_uri: &str) -> Self { + self.local_uri = Some(local_uri.to_string()); + + self + } +} diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml index 860c9875c..23a200eec 100644 --- a/resources/static-folder/Cargo.toml +++ b/resources/static-folder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-static-folder" -version = "0.8.0" +version = "0.11.3" edition = "2021" license = "Apache-2.0" description = "Plugin to get a static folder at runtime on shuttle" @@ -9,8 +9,10 @@ keywords = ["shuttle-service", "static-folder"] [dependencies] async-trait = "0.1.56" -shuttle-service = { path = "../../service", version = "0.8.0", default-features = false } +fs_extra = "1.3.0" +shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } +tracing = "0.1.37" [dev-dependencies] -tempdir = "0.3.7" +tempfile = "3.3.0" tokio = { version = "1.19.2", features = ["macros", "rt"] } diff --git a/resources/static-folder/README.md b/resources/static-folder/README.md index 48e27ba32..272381ed0 100644 --- a/resources/static-folder/README.md +++ b/resources/static-folder/README.md @@ -1,7 +1,9 @@ # Shuttle Static Folder + This plugin allows services to get the path to a static folder at runtime ## Usage + Add `shuttle-static-folder` to the dependencies for your service. This resource can be using by the `shuttle_static_folder::StaticFolder` attribute to get a `PathBuf` with the location of the static folder. An example using the Axum framework can be found on [GitHub](https://github.com/shuttle-hq/examples/tree/main/axum/websocket) @@ -14,11 +16,13 @@ async fn main( ``` ### Parameters + | Parameter | Type | Default | Description | |-----------|------|----------|--------------------------------------------------------------------| | folder | str | `static` | The relative path, from the crate root, to the directory containing static files to deploy | ### Example: Using the public folder instead + Since this plugin defaults to the `static` folder, the arguments can be used to use the `public` folder instead. ``` rust diff --git a/resources/static-folder/src/lib.rs b/resources/static-folder/src/lib.rs index 524ffe80f..4d9abc944 100644 --- a/resources/static-folder/src/lib.rs +++ b/resources/static-folder/src/lib.rs @@ -1,12 +1,11 @@ use async_trait::async_trait; +use fs_extra::dir::{copy, CopyOptions}; use shuttle_service::{ error::{CustomError, Error as ShuttleError}, Factory, ResourceBuilder, }; -use std::{ - fs::rename, - path::{Path, PathBuf}, -}; +use std::path::{Path, PathBuf}; +use tracing::{error, trace}; pub struct StaticFolder<'a> { /// The folder to reach at runtime. Defaults to `static` @@ -16,6 +15,7 @@ pub struct StaticFolder<'a> { pub enum Error { AbsolutePath, TransversedUp, + Copy(fs_extra::error::Error), } impl<'a> StaticFolder<'a> { @@ -35,34 +35,59 @@ impl<'a> ResourceBuilder for StaticFolder<'a> { async fn build(self, factory: &mut dyn Factory) -> Result { let folder = Path::new(self.folder); + trace!(?folder, "building static folder"); + // Prevent users from users from reading anything outside of their crate's build folder if folder.is_absolute() { + error!("the static folder cannot be an absolute path"); return Err(Error::AbsolutePath)?; } let input_dir = factory.get_build_path()?.join(self.folder); + trace!(input_directory = ?input_dir, "got input directory"); + match input_dir.canonicalize() { Ok(canonical_path) if canonical_path != input_dir => return Err(Error::TransversedUp)?, Ok(_) => { // The path did not change to outside the crate's build folder } - Err(err) => return Err(err)?, + Err(err) => { + error!( + error = &err as &dyn std::error::Error, + "failed to get static folder" + ); + return Err(err)?; + } } - let output_dir = factory.get_storage_path()?.join(self.folder); + let output_dir = factory.get_storage_path()?; + + trace!(output_directory = ?output_dir, "got output directory"); - rename(input_dir, output_dir.clone())?; + let copy_options = CopyOptions::new().overwrite(true); + match copy(&input_dir, &output_dir, ©_options) { + Ok(_) => Ok(output_dir.join(self.folder)), + Err(error) => { + error!( + error = &error as &dyn std::error::Error, + "failed to copy static folder" + ); - Ok(output_dir) + Err(Error::Copy(error))? + } + } } } impl From for shuttle_service::Error { fn from(error: Error) -> Self { let msg = match error { - Error::AbsolutePath => "Cannot use an absolute path for a static folder", - Error::TransversedUp => "Cannot transverse out of crate for a static folder", + Error::AbsolutePath => "Cannot use an absolute path for a static folder".to_string(), + Error::TransversedUp => { + "Cannot transverse out of crate for a static folder".to_string() + } + Error::Copy(error) => format!("Cannot copy static folder: {}", error), }; ShuttleError::Custom(CustomError::msg(msg)) @@ -71,12 +96,12 @@ impl From for shuttle_service::Error { #[cfg(test)] mod tests { - use std::fs::{self}; + use std::fs; use std::path::PathBuf; use async_trait::async_trait; use shuttle_service::{Factory, ResourceBuilder}; - use tempdir::TempDir; + use tempfile::{Builder, TempDir}; use crate::StaticFolder; @@ -97,7 +122,7 @@ mod tests { impl MockFactory { fn new() -> Self { Self { - temp_dir: TempDir::new("static_folder").unwrap(), + temp_dir: Builder::new().prefix("static_folder").tempdir().unwrap(), } } @@ -143,6 +168,10 @@ mod tests { panic!("no static folder test should try to get the service name") } + fn get_environment(&self) -> shuttle_service::Environment { + panic!("no static folder test should try to get the environment") + } + fn get_build_path(&self) -> Result { Ok(self.build_path()) } diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 4fdfe7d73..db6ee9d86 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -23,6 +23,7 @@ thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["full"] } tokio-stream = "0.1.11" tonic = { workspace = true } +tower = { workspace = true } tracing = { workspace = true, features = ["default"] } tracing-subscriber = { workspace = true, features = ["default", "env-filter", "fmt"] } uuid = { workspace = true, features = ["v4"] } diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index e87ad02e3..fa8bce121 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -13,6 +13,7 @@ use async_trait::async_trait; use clap::Parser; use core::future::Future; use shuttle_common::{ + backends::{auth::ClaimLayer, tracing::InjectPropagationLayer}, storage_manager::{StorageManager, WorkingDirStorageManager}, LogItem, }; @@ -25,7 +26,7 @@ use shuttle_proto::{ StopResponse, SubscribeLogsRequest, SubscribeStopRequest, SubscribeStopResponse, }, }; -use shuttle_service::{Factory, Service, ServiceName}; +use shuttle_service::{Environment, Factory, Service, ServiceName}; use tokio::sync::{broadcast, oneshot}; use tokio::sync::{ broadcast::Sender, @@ -36,6 +37,7 @@ use tonic::{ transport::{Endpoint, Server}, Request, Response, Status, }; +use tower::ServiceBuilder; use tracing::{error, instrument, trace}; use uuid::Uuid; @@ -60,6 +62,7 @@ pub async fn start( provisioner_address, loader, WorkingDirStorageManager::new(args.storage_manager_path), + Environment::Local, ); let svc = RuntimeServer::new(legacy); @@ -79,10 +82,16 @@ pub struct Legacy { storage_manager: M, loader: Mutex>, service: Mutex>, + env: Environment, } impl Legacy { - pub fn new(provisioner_address: Endpoint, loader: L, storage_manager: M) -> Self { + pub fn new( + provisioner_address: Endpoint, + loader: L, + storage_manager: M, + env: Environment, + ) -> Self { let (tx, rx) = mpsc::unbounded_channel(); let (stopped_tx, _stopped_rx) = broadcast::channel(10); @@ -95,6 +104,7 @@ impl Legacy { storage_manager, loader: Mutex::new(Some(loader)), service: Mutex::new(None), + env, } } } @@ -149,10 +159,19 @@ where let secrets = BTreeMap::from_iter(secrets.into_iter()); - let provisioner_client = ProvisionerClient::connect(self.provisioner_address.clone()) + let channel = self + .provisioner_address + .clone() + .connect() .await .context("failed to connect to provisioner") .map_err(|err| Status::internal(err.to_string()))?; + let channel = ServiceBuilder::new() + .layer(ClaimLayer) + .layer(InjectPropagationLayer) + .service(channel); + + let provisioner_client = ProvisionerClient::new(channel); let service_name = ServiceName::from_str(service_name.as_str()) .map_err(|err| Status::from_error(Box::new(err)))?; @@ -165,6 +184,7 @@ where deployment_id, secrets, self.storage_manager.clone(), + self.env, ); trace!("got factory"); @@ -214,30 +234,6 @@ where Ok(Response::new(message)) } - type SubscribeLogsStream = ReceiverStream>; - - async fn subscribe_logs( - &self, - _request: Request, - ) -> Result, Status> { - let logs_rx = self.logs_rx.lock().unwrap().deref_mut().take(); - - if let Some(mut logs_rx) = logs_rx { - let (tx, rx) = mpsc::channel(1); - - // Move logger items into stream to be returned - tokio::spawn(async move { - while let Some(log) = logs_rx.recv().await { - tx.send(Ok(log.into())).await.expect("to send log"); - } - }); - - Ok(Response::new(ReceiverStream::new(rx))) - } else { - Err(Status::internal("logs have already been subscribed to")) - } - } - async fn stop(&self, _request: Request) -> Result, Status> { let kill_tx = self.kill_tx.lock().unwrap().deref_mut().take(); @@ -276,6 +272,30 @@ where Ok(Response::new(ReceiverStream::new(rx))) } + + type SubscribeLogsStream = ReceiverStream>; + + async fn subscribe_logs( + &self, + _request: Request, + ) -> Result, Status> { + let logs_rx = self.logs_rx.lock().unwrap().deref_mut().take(); + + if let Some(mut logs_rx) = logs_rx { + let (tx, rx) = mpsc::channel(1); + + // Move logger items into stream to be returned + tokio::spawn(async move { + while let Some(log) = logs_rx.recv().await { + tx.send(Ok(log.into())).await.expect("to send log"); + } + }); + + Ok(Response::new(ReceiverStream::new(rx))) + } else { + Err(Status::internal("logs have already been subscribed to")) + } + } } /// Run the service until a stop signal is received diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index e22d0a9f0..027d16c25 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -25,7 +25,6 @@ use tokio::sync::{mpsc, oneshot}; use tokio_stream::wrappers::ReceiverStream; use tonic::Status; use tracing::{error, trace}; -use uuid::Uuid; use wasi_common::file::FileCaps; use wasmtime::{Engine, Linker, Module, Store}; use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs index 9b017d01c..67a6f1957 100644 --- a/runtime/src/provisioner_factory.rs +++ b/runtime/src/provisioner_factory.rs @@ -1,11 +1,16 @@ use std::{collections::BTreeMap, path::PathBuf}; use async_trait::async_trait; -use shuttle_common::{database, storage_manager::StorageManager, DatabaseReadyInfo}; +use shuttle_common::{ + backends::{auth::ClaimService, tracing::InjectPropagation}, + database, + storage_manager::StorageManager, + DatabaseReadyInfo, +}; use shuttle_proto::provisioner::{ database_request::DbType, provisioner_client::ProvisionerClient, DatabaseRequest, }; -use shuttle_service::{Factory, ServiceName}; +use shuttle_service::{Environment, Factory, ServiceName}; use tonic::{transport::Channel, Request}; use tracing::{debug, info, trace}; use uuid::Uuid; @@ -18,9 +23,10 @@ where service_name: ServiceName, deployment_id: Uuid, storage_manager: S, - provisioner_client: ProvisionerClient, + provisioner_client: ProvisionerClient>>, info: Option, secrets: BTreeMap, + env: Environment, } impl ProvisionerFactory @@ -28,11 +34,12 @@ where S: StorageManager, { pub(crate) fn new( - provisioner_client: ProvisionerClient, + provisioner_client: ProvisionerClient>>, service_name: ServiceName, deployment_id: Uuid, secrets: BTreeMap, storage_manager: S, + env: Environment, ) -> Self { Self { provisioner_client, @@ -41,6 +48,7 @@ where storage_manager, info: None, secrets, + env, } } } @@ -104,4 +112,8 @@ where .deployment_storage_path(self.service_name.as_str(), &self.deployment_id) .map_err(Into::into) } + + fn get_environment(&self) -> shuttle_service::Environment { + self.env + } } diff --git a/runtime/tests/integration/helpers.rs b/runtime/tests/integration/helpers.rs index afa093f82..a894aec06 100644 --- a/runtime/tests/integration/helpers.rs +++ b/runtime/tests/integration/helpers.rs @@ -9,7 +9,7 @@ use async_trait::async_trait; use shuttle_proto::{ provisioner::{ provisioner_server::{Provisioner, ProvisionerServer}, - DatabaseRequest, DatabaseResponse, + DatabaseDeletionResponse, DatabaseRequest, DatabaseResponse, }, runtime::{self, runtime_client::RuntimeClient}, }; @@ -92,4 +92,11 @@ impl Provisioner for DummyProvisioner { ) -> Result, Status> { panic!("did not expect any runtime test to use dbs") } + + async fn delete_database( + &self, + _request: Request, + ) -> Result, Status> { + panic!("did not expect any runtime test to delete dbs") + } } diff --git a/service/Cargo.toml b/service/Cargo.toml index ceb48a7ef..4940fe30d 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,8 +1,9 @@ [package] name = "shuttle-service" -version = "0.8.0" +version = "0.11.0" edition.workspace = true license.workspace = true +repository.workspace = true description = "Service traits and macros to deploy on the shuttle platform (https://www.shuttle.rs/)" homepage = "https://www.shuttle.rs" @@ -19,20 +20,23 @@ bincode = { version = "1.3.3", optional = true } cargo = { version = "0.65.0", optional = true } cargo_metadata = "0.15.2" crossbeam-channel = "0.5.6" -hyper = { version = "0.14.23", features = ["server", "tcp", "http1"], optional = true } +futures = { version = "0.3.25", features = ["std"] } +hyper = { workspace = true, features = ["server", "tcp", "http1"], optional = true } +libloading = { version = "0.7.4", optional = true } num_cpus = { version = "1.14.0", optional = true } pipe = "0.4.0" poem = { version = "1.3.49", optional = true } +poise = { version = "0.5.2", optional = true } rocket = { version = "0.5.0-rc.2", optional = true } salvo = { version = "0.37.5", optional = true } serde_json = { workspace = true } serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"], optional = true } -poise = { version = "0.5.2", optional = true } +strfmt = "0.2.2" thiserror = { workspace = true } thruster = { version = "1.3.0", optional = true } tide = { version = "0.16.0", optional = true } -tokio = { version = "1.22.0", features = ["sync"] } -tower = { version = "0.4.13", features = ["make"], optional = true } +tokio = { version = "=1.22.0", features = ["sync"] } +tower = { workspace = true, features = ["make"], optional = true } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } warp = { version = "0.3.3", optional = true } @@ -53,7 +57,10 @@ workspace = true features = ["tracing", "service"] [dev-dependencies] -tokio = { version = "1.22.0", features = ["macros", "rt"] } +portpicker = { workspace = true } +sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } +tokio = { version = "1.22.0", features = ["macros"] } +uuid = { workspace = true, features = ["v4"] } [features] default = ["codegen"] @@ -63,13 +70,13 @@ builder = ["cargo"] web-actix-web = ["actix-web", "num_cpus"] web-axum = ["axum"] +web-poem = ["poem"] web-rocket = ["rocket"] +web-salvo = ["salvo"] web-thruster = ["thruster"] web-tide = ["tide", "async-std"] web-tower = ["tower", "hyper"] -web-poem = ["poem"] -web-salvo = ["salvo"] +web-warp = ["warp"] -bot-serenity = ["serenity"] bot-poise = ["poise"] -web-warp = ["warp"] +bot-serenity = ["serenity"] diff --git a/service/src/error.rs b/service/src/error.rs index ba261ef46..980d219da 100644 --- a/service/src/error.rs +++ b/service/src/error.rs @@ -12,6 +12,8 @@ pub enum Error { BuildPanic(String), #[error("Panic occurred in `Service::bind`: {0}")] BindPanic(String), + #[error("Failed to interpolate string. Is your Secrets.toml correct?")] + StringInterpolation(#[from] strfmt::FmtError), #[error("Custom error: {0}")] Custom(#[from] CustomError), } diff --git a/service/src/lib.rs b/service/src/lib.rs index de58ad046..bd6be6537 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -27,7 +27,7 @@ //! be a library crate with a `shuttle-service` dependency with the `web-rocket` feature on the `shuttle-service` dependency. //! //! ```toml -//! shuttle-service = { version = "0.8.0", features = ["web-rocket"] } +//! shuttle-service = { version = "0.11.0", features = ["web-rocket"] } //! ``` //! //! A boilerplate code for your rocket project can also be found in `src/lib.rs`: @@ -107,7 +107,7 @@ //! Add `shuttle-shared-db` as a dependency with the `postgres` feature, and add `sqlx` as a dependency with the `runtime-tokio-native-tls` and `postgres` features inside `Cargo.toml`: //! //! ```toml -//! shuttle-shared-db = { version = "0.8.0", features = ["postgres"] } +//! shuttle-shared-db = { version = "0.11.0", features = ["postgres"] } //! sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } //! ``` //! @@ -217,6 +217,7 @@ pub use async_trait::async_trait; // Pub uses by `codegen` pub use anyhow::Context; +pub use strfmt::strfmt; pub use tracing; pub use tracing_subscriber; @@ -283,7 +284,7 @@ pub use shuttle_codegen::main; #[cfg(feature = "builder")] pub mod builder; -pub use shuttle_common::project::ProjectName as ServiceName; +pub use shuttle_common::{deployment::Environment, project::ProjectName as ServiceName}; /// Factories can be used to request the provisioning of additional resources (like databases). /// @@ -306,6 +307,9 @@ pub trait Factory: Send + Sync { /// Get the name for the service being deployed fn get_service_name(&self) -> ServiceName; + /// Get the environment for this deployment + fn get_environment(&self) -> Environment; + /// Get the path where the build files are stored for this service fn get_build_path(&self) -> Result; diff --git a/service/tests/resources/not-shuttle/Cargo.toml b/service/tests/resources/not-shuttle/Cargo.toml index 86af40f54..b951779af 100644 --- a/service/tests/resources/not-shuttle/Cargo.toml +++ b/service/tests/resources/not-shuttle/Cargo.toml @@ -9,4 +9,3 @@ edition = "2021" axum = "0.6.0" shuttle-runtime = { path = "../../../../runtime" } shuttle-service = { path = "../../../", features = ["web-axum"] } -tokio = { version = "1.22.0" } From 66ba53071a9120b8c879627287252c4c7c227206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 13 Mar 2023 15:10:41 +0000 Subject: [PATCH 53/74] Feature/eng 486 update deployer with runtime changes (#696) * feat: update deployer to work with runtime changes * feat: pass next feature flag to runtime installs * fix: revert this change, the error is a rust-analyzer bug * tests: make deployer test resources bins * ci: add shuttle-runtime patch to CI * refactor: consistent naming * fix: redundant clone of runtime manager * feat: delete rocket bin from runtime * feat: make storagemanager a trait object * docs: add comment about why we use arc * refactor: use &str in storagemanager * feat: add runtime patch to deployer * fix: deployer logic bug, add debug logs --- .circleci/config.yml | 1 + cargo-shuttle/src/lib.rs | 10 ++- codegen/src/shuttle_main/mod.rs | 16 ++-- common/src/storage_manager.rs | 42 +++++----- deployer/prepare.sh | 5 +- deployer/src/deployment/queue.rs | 45 ++++++----- deployer/src/deployment/run.rs | 29 +++++-- deployer/src/deployment/storage_manager.rs | 69 ----------------- deployer/src/handlers/mod.rs | 2 +- deployer/src/lib.rs | 3 +- deployer/src/runtime_manager.rs | 77 ++++++++++++------- .../tests/deploy_layer/bind-panic/Cargo.toml | 7 +- .../bind-panic/src/main.rs} | 5 +- .../tests/deploy_layer/main-panic/Cargo.toml | 7 +- .../main-panic/src/main.rs} | 5 +- .../tests/deploy_layer/self-stop/Cargo.toml | 7 +- .../self-stop/src/{lib.rs => main.rs} | 5 +- .../tests/deploy_layer/sleep-async/Cargo.toml | 6 +- .../sleep-async/src/{lib.rs => main.rs} | 5 +- .../tests/resources/bind-panic/Cargo.toml | 4 +- .../bind-panic/src/main.rs} | 5 +- .../tests/resources/main-panic/Cargo.toml | 5 +- .../main-panic/src/main.rs} | 5 +- .../tests/resources/sleep-async/Cargo.toml | 6 +- .../sleep-async/src/{lib.rs => main.rs} | 5 +- .../tests/resources/tests-fail/Cargo.toml | 5 +- .../tests-fail/src/{lib.rs => main.rs} | 0 .../tests/resources/tests-pass/Cargo.toml | 5 +- .../tests-pass/src/{lib.rs => main.rs} | 0 runtime/Cargo.toml | 24 +----- runtime/src/bin/rocket.rs | 51 ------------ runtime/src/legacy/mod.rs | 38 +++++---- runtime/src/next/mod.rs | 2 +- runtime/src/provisioner_factory.rs | 21 ++--- 34 files changed, 200 insertions(+), 322 deletions(-) delete mode 100644 deployer/src/deployment/storage_manager.rs rename deployer/tests/{resources/bind-panic/src/lib.rs => deploy_layer/bind-panic/src/main.rs} (67%) rename deployer/tests/{resources/main-panic/src/lib.rs => deploy_layer/main-panic/src/main.rs} (66%) rename deployer/tests/deploy_layer/self-stop/src/{lib.rs => main.rs} (64%) rename deployer/tests/deploy_layer/sleep-async/src/{lib.rs => main.rs} (76%) rename deployer/tests/{deploy_layer/bind-panic/src/lib.rs => resources/bind-panic/src/main.rs} (67%) rename deployer/tests/{deploy_layer/main-panic/src/lib.rs => resources/main-panic/src/main.rs} (66%) rename deployer/tests/resources/sleep-async/src/{lib.rs => main.rs} (76%) rename deployer/tests/resources/tests-fail/src/{lib.rs => main.rs} (100%) rename deployer/tests/resources/tests-pass/src/{lib.rs => main.rs} (100%) delete mode 100644 runtime/src/bin/rocket.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 9211a8b86..925bbc209 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -89,6 +89,7 @@ commands: shuttle-aws-rds = { path = "$PWD/resources/aws-rds" } shuttle-persist = { path = "$PWD/resources/persist" } shuttle-next = { path = "$PWD/next" } + shuttle-runtime = { path = "$PWD/runtime" } shuttle-shared-db = { path = "$PWD/resources/shared-db" } shuttle-secrets = { path = "$PWD/resources/secrets" } shuttle-static-folder = { path = "$PWD/resources/static-folder" } diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 4890433cd..730d11360 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -449,7 +449,7 @@ impl Shuttle { let service_name = self.ctx.project_name().to_string(); - let (is_wasm, bin_path) = match runtime { + let (is_wasm, executable_path) = match runtime { Runtime::Next(path) => (true, path), Runtime::Legacy(path) => (false, path), }; @@ -479,6 +479,8 @@ impl Shuttle { .arg(path) .arg("--bin") .arg("shuttle-next") + .arg("--features") + .arg("next") .output() .expect("failed to install the shuttle runtime"); } else { @@ -499,6 +501,8 @@ impl Shuttle { .arg("https://github.com/shuttle-hq/shuttle") .arg("--branch") .arg("production") + .arg("--features") + .arg("next") .output() .expect("failed to install the shuttle runtime"); }; @@ -506,7 +510,7 @@ impl Shuttle { runtime_path } else { - bin_path.clone() + executable_path.clone() } }; @@ -525,7 +529,7 @@ impl Shuttle { })?; let load_request = tonic::Request::new(LoadRequest { - path: bin_path + path: executable_path .into_os_string() .into_string() .expect("to convert path to string"), diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 771e751cc..97ca75813 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -239,8 +239,8 @@ impl ToTokens for Loader { }; let loader = quote! { - async fn loader( - mut #factory_ident: shuttle_runtime::ProvisionerFactory, + async fn loader( + mut #factory_ident: shuttle_runtime::ProvisionerFactory, logger: shuttle_runtime::Logger, ) -> #return_type { use shuttle_service::Context; @@ -299,8 +299,8 @@ mod tests { let actual = quote!(#input); let expected = quote! { - async fn loader( - mut _factory: shuttle_runtime::ProvisionerFactory, + async fn loader( + mut _factory: shuttle_runtime::ProvisionerFactory, logger: shuttle_runtime::Logger, ) -> ShuttleSimple { use shuttle_service::Context; @@ -379,8 +379,8 @@ mod tests { let actual = quote!(#input); let expected = quote! { - async fn loader( - mut factory: shuttle_runtime::ProvisionerFactory, + async fn loader( + mut factory: shuttle_runtime::ProvisionerFactory, logger: shuttle_runtime::Logger, ) -> ShuttleComplex { use shuttle_service::Context; @@ -494,8 +494,8 @@ mod tests { let actual = quote!(#input); let expected = quote! { - async fn loader( - mut factory: shuttle_runtime::ProvisionerFactory, + async fn loader( + mut factory: shuttle_runtime::ProvisionerFactory, logger: shuttle_runtime::Logger, ) -> ShuttleComplex { use shuttle_service::Context; diff --git a/common/src/storage_manager.rs b/common/src/storage_manager.rs index f2270243a..22ac50c4e 100644 --- a/common/src/storage_manager.rs +++ b/common/src/storage_manager.rs @@ -2,14 +2,14 @@ use std::{fs, io, path::PathBuf}; use uuid::Uuid; -pub trait StorageManager: Clone + Sync + Send { +pub trait StorageManager: Sync + Send { /// Path for a specific service build files - fn service_build_path>(&self, service_name: S) -> Result; + fn service_build_path(&self, service_name: &str) -> Result; /// Path to folder for storing deployment files - fn deployment_storage_path>( + fn deployment_storage_path( &self, - service_name: S, + service_name: &str, deployment_id: &Uuid, ) -> Result; } @@ -33,19 +33,19 @@ impl ArtifactsStorageManager { Ok(builds_path) } - /// The directory in which compiled '.so' files are stored. - pub fn libraries_path(&self) -> Result { - let libs_path = self.artifacts_path.join("shuttle-libs"); - fs::create_dir_all(&libs_path)?; + /// The directory in which compiled executables are stored. + pub fn executables_path(&self) -> Result { + let executables_path = self.artifacts_path.join("shuttle-executables"); + fs::create_dir_all(&executables_path)?; - Ok(libs_path) + Ok(executables_path) } - /// Path to `.so` for a service - pub fn deployment_library_path(&self, deployment_id: &Uuid) -> Result { - let library_path = self.libraries_path()?.join(deployment_id.to_string()); + /// Path to executable for a service + pub fn deployment_executable_path(&self, deployment_id: &Uuid) -> Result { + let executable_path = self.executables_path()?.join(deployment_id.to_string()); - Ok(library_path) + Ok(executable_path) } /// Path of the directory to store user files @@ -58,21 +58,21 @@ impl ArtifactsStorageManager { } impl StorageManager for ArtifactsStorageManager { - fn service_build_path>(&self, service_name: S) -> Result { - let builds_path = self.builds_path()?.join(service_name.as_ref()); + fn service_build_path(&self, service_name: &str) -> Result { + let builds_path = self.builds_path()?.join(service_name); fs::create_dir_all(&builds_path)?; Ok(builds_path) } - fn deployment_storage_path>( + fn deployment_storage_path( &self, - service_name: S, + service_name: &str, deployment_id: &Uuid, ) -> Result { let storage_path = self .storage_path()? - .join(service_name.as_ref()) + .join(service_name) .join(deployment_id.to_string()); fs::create_dir_all(&storage_path)?; @@ -93,13 +93,13 @@ impl WorkingDirStorageManager { } impl StorageManager for WorkingDirStorageManager { - fn service_build_path>(&self, _service_name: S) -> Result { + fn service_build_path(&self, _service_name: &str) -> Result { Ok(self.working_dir.clone()) } - fn deployment_storage_path>( + fn deployment_storage_path( &self, - _service_name: S, + _service_name: &str, _deployment_id: &Uuid, ) -> Result { Ok(self.working_dir.clone()) diff --git a/deployer/prepare.sh b/deployer/prepare.sh index 6fc385470..882f8d320 100755 --- a/deployer/prepare.sh +++ b/deployer/prepare.sh @@ -9,17 +9,18 @@ mkdir -p $CARGO_HOME; \ echo '[patch.crates-io] shuttle-service = { path = "/usr/src/shuttle/service" } +shuttle-runtime = { path = "/usr/src/shuttle/runtime" } shuttle-aws-rds = { path = "/usr/src/shuttle/resources/aws-rds" } shuttle-persist = { path = "/usr/src/shuttle/resources/persist" } shuttle-shared-db = { path = "/usr/src/shuttle/resources/shared-db" } shuttle-secrets = { path = "/usr/src/shuttle/resources/secrets" } shuttle-static-folder = { path = "/usr/src/shuttle/resources/static-folder" }' > $CARGO_HOME/config.toml -# + # Add the wasm32-wasi target rustup target add wasm32-wasi # Install the shuttle runtime -cargo install shuttle-runtime --path "/usr/src/shuttle/runtime" +cargo install shuttle-runtime --path "/usr/src/shuttle/runtime" --bin shuttle-next --features next while getopts "p," o; do case $o in diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index cec7e0649..1c7263f3d 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -224,9 +224,9 @@ impl Queued { run_pre_deploy_tests(&project_path, tx).await?; } - info!("Moving built library"); + info!("Moving built executable"); - store_lib(&storage_manager, &runtime, &self.id).await?; + store_executable(&storage_manager, &runtime, &self.id).await?; let is_next = matches!(runtime, Runtime::Next(_)); @@ -396,21 +396,22 @@ async fn run_pre_deploy_tests( } } -/// Store 'so' file in the libs folder +/// This will store the path to the executable for each runtime, which will be the users project with +/// an embedded runtime for legacy, and a .wasm file for shuttle-next. #[instrument(skip(storage_manager, runtime, id))] -async fn store_lib( +async fn store_executable( storage_manager: &ArtifactsStorageManager, runtime: &Runtime, id: &Uuid, ) -> Result<()> { - let so_path = match runtime { + let executable_path = match runtime { Runtime::Next(path) => path, Runtime::Legacy(path) => path, }; - let new_so_path = storage_manager.deployment_library_path(id)?; + let new_executable_path = storage_manager.deployment_executable_path(id)?; - fs::rename(so_path, new_so_path).await?; + fs::rename(executable_path, new_executable_path).await?; Ok(()) } @@ -550,30 +551,34 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", } #[tokio::test] - async fn store_lib() { - let libs_dir = Builder::new().prefix("lib-store").tempdir().unwrap(); - let libs_p = libs_dir.path(); - let storage_manager = ArtifactsStorageManager::new(libs_p.to_path_buf()); + async fn store_executable() { + let executables_dir = Builder::new().prefix("executable-store").tempdir().unwrap(); + let executables_p = executables_dir.path(); + let storage_manager = ArtifactsStorageManager::new(executables_p.to_path_buf()); let build_p = storage_manager.builds_path().unwrap(); - let so_path = build_p.join("xyz.so"); - let runtime = Runtime::Legacy(so_path.clone()); + let executable_path = build_p.join("xyz"); + let runtime = Runtime::Legacy(executable_path.clone()); let id = Uuid::new_v4(); - fs::write(&so_path, "barfoo").await.unwrap(); + fs::write(&executable_path, "barfoo").await.unwrap(); - super::store_lib(&storage_manager, &runtime, &id) + super::store_executable(&storage_manager, &runtime, &id) .await .unwrap(); - // Old '.so' file gone? - assert!(!so_path.exists()); + // Old executable file gone? + assert!(!executable_path.exists()); assert_eq!( - fs::read_to_string(libs_p.join("shuttle-libs").join(id.to_string())) - .await - .unwrap(), + fs::read_to_string( + executables_p + .join("shuttle-executables") + .join(id.to_string()) + ) + .await + .unwrap(), "barfoo" ); } diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index f814766a2..4df39521c 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -182,7 +182,10 @@ impl Built { kill_old_deployments: impl futures::Future>, cleanup: impl FnOnce(SubscribeStopResponse) + Send + 'static, ) -> Result<()> { - let so_path = storage_manager.deployment_library_path(&self.id)?; + // For legacy this is the path to the users project with an embedded runtime. + // For shuttle-next this is the path to the compiled .wasm file, which will be + // used in the load request. + let executable_path = storage_manager.deployment_executable_path(&self.id)?; let port = match pick_unused_port() { Some(port) => port, @@ -194,10 +197,18 @@ impl Built { }; let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); + + let legacy_runtime_path = if self.is_next { + // The runtime client for next is the installed shuttle-next bin + None + } else { + Some(executable_path.clone()) + }; + let runtime_client = runtime_manager .lock() .await - .get_runtime_client(self.is_next) + .get_runtime_client(legacy_runtime_path.clone()) .await .map_err(Error::Runtime)?; @@ -208,7 +219,7 @@ impl Built { load( self.service_name.clone(), self.service_id, - so_path, + executable_path.clone(), secret_getter, runtime_client.clone(), ) @@ -230,13 +241,13 @@ impl Built { async fn load( service_name: String, service_id: Uuid, - so_path: PathBuf, + executable_path: PathBuf, secret_getter: impl SecretGetter, mut runtime_client: RuntimeClient, ) -> Result<()> { info!( "loading project from: {}", - so_path + executable_path .clone() .into_os_string() .into_string() @@ -252,7 +263,10 @@ async fn load( let secrets = HashMap::from_iter(secrets); let load_request = tonic::Request::new(LoadRequest { - path: so_path.into_os_string().into_string().unwrap_or_default(), + path: executable_path + .into_os_string() + .into_string() + .unwrap_or_default(), service_name: service_name.clone(), secrets, }); @@ -662,10 +676,9 @@ mod tests { let id = Uuid::new_v4(); let so_path = crate_dir.join("target/release").join(lib_name); let storage_manager = get_storage_manager(); - let new_so_path = storage_manager.deployment_library_path(&id).unwrap(); + let new_so_path = storage_manager.deployment_executable_path(&id).unwrap(); std::fs::copy(so_path, new_so_path).unwrap(); - ( Built { id, diff --git a/deployer/src/deployment/storage_manager.rs b/deployer/src/deployment/storage_manager.rs deleted file mode 100644 index 5a5fa1300..000000000 --- a/deployer/src/deployment/storage_manager.rs +++ /dev/null @@ -1,69 +0,0 @@ -use std::{fs, io, path::PathBuf}; - -use uuid::Uuid; - -/// Manager to take care of directories for storing project, services and deployment files -#[derive(Clone)] -pub struct StorageManager { - artifacts_path: PathBuf, -} - -impl StorageManager { - pub fn new(artifacts_path: PathBuf) -> Self { - Self { artifacts_path } - } - - /// Path of the directory that contains extracted service Cargo projects. - pub fn builds_path(&self) -> Result { - let builds_path = self.artifacts_path.join("shuttle-builds"); - fs::create_dir_all(&builds_path)?; - - Ok(builds_path) - } - - /// Path for a specific service - pub fn service_build_path>(&self, service_name: S) -> Result { - let builds_path = self.builds_path()?.join(service_name.as_ref()); - fs::create_dir_all(&builds_path)?; - - Ok(builds_path) - } - - /// The directory in which compiled '.so' files are stored. - pub fn libraries_path(&self) -> Result { - let libs_path = self.artifacts_path.join("shuttle-libs"); - fs::create_dir_all(&libs_path)?; - - Ok(libs_path) - } - - /// Path to `.so` for a service - pub fn deployment_library_path(&self, deployment_id: &Uuid) -> Result { - let library_path = self.libraries_path()?.join(deployment_id.to_string()); - - Ok(library_path) - } - - /// Path of the directory to store user files - pub fn storage_path(&self) -> Result { - let storage_path = self.artifacts_path.join("shuttle-storage"); - fs::create_dir_all(&storage_path)?; - - Ok(storage_path) - } - - /// Path to folder for storing deployment files - pub fn deployment_storage_path>( - &self, - service_name: S, - deployment_id: &Uuid, - ) -> Result { - let storage_path = self - .storage_path()? - .join(service_name.as_ref()) - .join(deployment_id.to_string()); - fs::create_dir_all(&storage_path)?; - - Ok(storage_path) - } -} diff --git a/deployer/src/handlers/mod.rs b/deployer/src/handlers/mod.rs index 2e8e18237..c7a01f1c3 100644 --- a/deployer/src/handlers/mod.rs +++ b/deployer/src/handlers/mod.rs @@ -405,7 +405,7 @@ async fn post_clean( ) -> Result>> { let project_path = deployment_manager .storage_manager() - .service_build_path(project_name) + .service_build_path(&project_name) .map_err(anyhow::Error::new)?; let lines = clean_crate(&project_path, true)?; diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index 347ba254f..dc689820c 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -65,12 +65,11 @@ pub async fn start( args.project, ) .await; - let make_service = router.into_make_service(); info!(address=%args.api_address, "Binding to and listening at address"); axum::Server::bind(&args.api_address) - .serve(make_service) + .serve(router.into_make_service()) .await .unwrap_or_else(|_| panic!("Failed to bind to address: {}", args.api_address)); } diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index c416556b2..14638d155 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -6,7 +6,7 @@ use shuttle_proto::runtime::{ }; use tokio::{process, sync::Mutex}; use tonic::transport::Channel; -use tracing::{info, instrument, trace}; +use tracing::{debug, info, instrument, trace}; use uuid::Uuid; use crate::deployment::deploy_layer; @@ -43,23 +43,27 @@ impl RuntimeManager { pub async fn get_runtime_client( &mut self, - is_next: bool, + legacy_runtime_path: Option, ) -> anyhow::Result> { - if is_next { + if legacy_runtime_path.is_none() { + debug!("Getting shuttle-next runtime client"); + Self::get_runtime_client_helper( &mut self.next, &mut self.next_process, - is_next, + None, self.artifacts_path.clone(), &self.provisioner_address, self.log_sender.clone(), ) .await } else { + debug!("Getting legacy runtime client"); + Self::get_runtime_client_helper( &mut self.legacy, &mut self.legacy_process, - is_next, + legacy_runtime_path, self.artifacts_path.clone(), &self.provisioner_address, self.log_sender.clone(), @@ -101,7 +105,7 @@ impl RuntimeManager { async fn get_runtime_client_helper( runtime_option: &mut Option>, process_option: &mut Option>>, - is_next: bool, + legacy_runtime_path: Option, artifacts_path: PathBuf, provisioner_address: &str, log_sender: crossbeam_channel::Sender, @@ -113,31 +117,50 @@ impl RuntimeManager { trace!("making new client"); let port = portpicker::pick_unused_port().context("failed to find available port")?; + let is_next = legacy_runtime_path.is_none(); let get_runtime_executable = || { - if cfg!(debug_assertions) { - // If we're running deployer natively, install shuttle-runtime using the - // version of runtime from the calling repo. - let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")); - - // The path will not be valid if we are in a deployer container, in which - // case we don't try to install and use the one installed in deploy.sh. - if let Ok(path) = path { - std::process::Command::new("cargo") - .arg("install") - .arg("shuttle-runtime") - .arg("--path") - .arg(path) - .output() - .expect("failed to install the local version of shuttle-runtime"); + if let Some(legacy_runtime) = legacy_runtime_path { + debug!( + "Starting legacy runtime at: {}", + legacy_runtime + .clone() + .into_os_string() + .into_string() + .unwrap_or_default() + ); + legacy_runtime + } else { + if cfg!(debug_assertions) { + debug!("Installing shuttle-next runtime in debug mode from local source"); + // If we're running deployer natively, install shuttle-runtime using the + // version of runtime from the calling repo. + let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")); + + // The path will not be valid if we are in a deployer container, in which + // case we don't try to install and use the one installed in deploy.sh. + if let Ok(path) = path { + std::process::Command::new("cargo") + .arg("install") + .arg("shuttle-runtime") + .arg("--path") + .arg(path) + .arg("--bin") + .arg("shuttle-next") + .arg("--features") + .arg("next") + .output() + .expect("failed to install the local version of shuttle-runtime"); + } } - } - // If we're in a deployer built with the containerfile, the runtime will have - // been installed in deploy.sh. - home::cargo_home() - .expect("failed to find path to cargo home") - .join("bin/shuttle-runtime") + debug!("Returning path to shuttle-next runtime",); + // If we're in a deployer built with the containerfile, the runtime will have + // been installed in deploy.sh. + home::cargo_home() + .expect("failed to find path to cargo home") + .join("bin/shuttle-next") + } }; let (process, runtime_client) = runtime::start( diff --git a/deployer/tests/deploy_layer/bind-panic/Cargo.toml b/deployer/tests/deploy_layer/bind-panic/Cargo.toml index 2a06bc95d..5c476820e 100644 --- a/deployer/tests/deploy_layer/bind-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/bind-panic/Cargo.toml @@ -3,12 +3,11 @@ name = "bind-panic" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [workspace] [dependencies] -shuttle-service = "0.11.0" +shuttle-service = { path = "../../../../service" } +shuttle-runtime = { path = "../../../../runtime" } +tokio = "1.22" diff --git a/deployer/tests/resources/bind-panic/src/lib.rs b/deployer/tests/deploy_layer/bind-panic/src/main.rs similarity index 67% rename from deployer/tests/resources/bind-panic/src/lib.rs rename to deployer/tests/deploy_layer/bind-panic/src/main.rs index 1ecd700bf..b8ccf9c3b 100644 --- a/deployer/tests/resources/bind-panic/src/lib.rs +++ b/deployer/tests/deploy_layer/bind-panic/src/main.rs @@ -4,10 +4,7 @@ struct MyService; #[shuttle_service::async_trait] impl Service for MyService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::Error> { panic!("panic in bind"); } } diff --git a/deployer/tests/deploy_layer/main-panic/Cargo.toml b/deployer/tests/deploy_layer/main-panic/Cargo.toml index 047878b66..157965845 100644 --- a/deployer/tests/deploy_layer/main-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/main-panic/Cargo.toml @@ -3,12 +3,11 @@ name = "main-panic" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [workspace] [dependencies] -shuttle-service = "0.11.0" +shuttle-service = { path = "../../../../service" } +shuttle-runtime = { path = "../../../../runtime" } +tokio = "1.22" diff --git a/deployer/tests/resources/main-panic/src/lib.rs b/deployer/tests/deploy_layer/main-panic/src/main.rs similarity index 66% rename from deployer/tests/resources/main-panic/src/lib.rs rename to deployer/tests/deploy_layer/main-panic/src/main.rs index 438c12540..4186a4508 100644 --- a/deployer/tests/resources/main-panic/src/lib.rs +++ b/deployer/tests/deploy_layer/main-panic/src/main.rs @@ -4,10 +4,7 @@ struct MyService; #[shuttle_service::async_trait] impl Service for MyService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::Error> { Ok(()) } } diff --git a/deployer/tests/deploy_layer/self-stop/Cargo.toml b/deployer/tests/deploy_layer/self-stop/Cargo.toml index 1e7b037ae..170cd3670 100644 --- a/deployer/tests/deploy_layer/self-stop/Cargo.toml +++ b/deployer/tests/deploy_layer/self-stop/Cargo.toml @@ -3,12 +3,11 @@ name = "self-stop" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [workspace] [dependencies] -shuttle-service = "0.11.0" +shuttle-service = { path = "../../../../service" } +shuttle-runtime = { path = "../../../../runtime" } +tokio = "1.22" diff --git a/deployer/tests/deploy_layer/self-stop/src/lib.rs b/deployer/tests/deploy_layer/self-stop/src/main.rs similarity index 64% rename from deployer/tests/deploy_layer/self-stop/src/lib.rs rename to deployer/tests/deploy_layer/self-stop/src/main.rs index 46558244a..8ba075244 100644 --- a/deployer/tests/deploy_layer/self-stop/src/lib.rs +++ b/deployer/tests/deploy_layer/self-stop/src/main.rs @@ -4,10 +4,7 @@ struct MyService; #[shuttle_service::async_trait] impl Service for MyService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::error::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::error::Error> { Ok(()) } } diff --git a/deployer/tests/deploy_layer/sleep-async/Cargo.toml b/deployer/tests/deploy_layer/sleep-async/Cargo.toml index d1f5d1a50..3d6e1e4ad 100644 --- a/deployer/tests/deploy_layer/sleep-async/Cargo.toml +++ b/deployer/tests/deploy_layer/sleep-async/Cargo.toml @@ -3,13 +3,11 @@ name = "sleep-async" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [workspace] [dependencies] +shuttle-service = { path = "../../../../service" } +shuttle-runtime = { path = "../../../../runtime" } tokio = { version = "1.0", features = ["time"]} -shuttle-service = "0.11.0" diff --git a/deployer/tests/deploy_layer/sleep-async/src/lib.rs b/deployer/tests/deploy_layer/sleep-async/src/main.rs similarity index 76% rename from deployer/tests/deploy_layer/sleep-async/src/lib.rs rename to deployer/tests/deploy_layer/sleep-async/src/main.rs index 542694709..1322552d1 100644 --- a/deployer/tests/deploy_layer/sleep-async/src/lib.rs +++ b/deployer/tests/deploy_layer/sleep-async/src/main.rs @@ -14,10 +14,7 @@ async fn simple() -> Result { #[shuttle_service::async_trait] impl Service for SleepService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::error::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::error::Error> { let duration = Duration::from_secs(self.duration); sleep(duration).await; diff --git a/deployer/tests/resources/bind-panic/Cargo.toml b/deployer/tests/resources/bind-panic/Cargo.toml index 0a721bd4a..894f3ca8e 100644 --- a/deployer/tests/resources/bind-panic/Cargo.toml +++ b/deployer/tests/resources/bind-panic/Cargo.toml @@ -3,8 +3,6 @@ name = "bind-panic" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -12,3 +10,5 @@ crate-type = ["cdylib"] [dependencies] shuttle-service = { path = "../../../../service" } +shuttle-runtime = { path = "../../../../runtime" } +tokio = "1.22" diff --git a/deployer/tests/deploy_layer/bind-panic/src/lib.rs b/deployer/tests/resources/bind-panic/src/main.rs similarity index 67% rename from deployer/tests/deploy_layer/bind-panic/src/lib.rs rename to deployer/tests/resources/bind-panic/src/main.rs index 1ecd700bf..b8ccf9c3b 100644 --- a/deployer/tests/deploy_layer/bind-panic/src/lib.rs +++ b/deployer/tests/resources/bind-panic/src/main.rs @@ -4,10 +4,7 @@ struct MyService; #[shuttle_service::async_trait] impl Service for MyService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::Error> { panic!("panic in bind"); } } diff --git a/deployer/tests/resources/main-panic/Cargo.toml b/deployer/tests/resources/main-panic/Cargo.toml index da7b5c841..157965845 100644 --- a/deployer/tests/resources/main-panic/Cargo.toml +++ b/deployer/tests/resources/main-panic/Cargo.toml @@ -3,12 +3,11 @@ name = "main-panic" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [workspace] [dependencies] shuttle-service = { path = "../../../../service" } +shuttle-runtime = { path = "../../../../runtime" } +tokio = "1.22" diff --git a/deployer/tests/deploy_layer/main-panic/src/lib.rs b/deployer/tests/resources/main-panic/src/main.rs similarity index 66% rename from deployer/tests/deploy_layer/main-panic/src/lib.rs rename to deployer/tests/resources/main-panic/src/main.rs index 438c12540..4186a4508 100644 --- a/deployer/tests/deploy_layer/main-panic/src/lib.rs +++ b/deployer/tests/resources/main-panic/src/main.rs @@ -4,10 +4,7 @@ struct MyService; #[shuttle_service::async_trait] impl Service for MyService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::Error> { Ok(()) } } diff --git a/deployer/tests/resources/sleep-async/Cargo.toml b/deployer/tests/resources/sleep-async/Cargo.toml index c0dc45479..3d6e1e4ad 100644 --- a/deployer/tests/resources/sleep-async/Cargo.toml +++ b/deployer/tests/resources/sleep-async/Cargo.toml @@ -3,13 +3,11 @@ name = "sleep-async" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [workspace] [dependencies] -tokio = { version = "1.0", features = ["time"]} shuttle-service = { path = "../../../../service" } +shuttle-runtime = { path = "../../../../runtime" } +tokio = { version = "1.0", features = ["time"]} diff --git a/deployer/tests/resources/sleep-async/src/lib.rs b/deployer/tests/resources/sleep-async/src/main.rs similarity index 76% rename from deployer/tests/resources/sleep-async/src/lib.rs rename to deployer/tests/resources/sleep-async/src/main.rs index 542694709..1322552d1 100644 --- a/deployer/tests/resources/sleep-async/src/lib.rs +++ b/deployer/tests/resources/sleep-async/src/main.rs @@ -14,10 +14,7 @@ async fn simple() -> Result { #[shuttle_service::async_trait] impl Service for SleepService { - async fn bind( - mut self: Box, - _: std::net::SocketAddr, - ) -> Result<(), shuttle_service::error::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::error::Error> { let duration = Duration::from_secs(self.duration); sleep(duration).await; diff --git a/deployer/tests/resources/tests-fail/Cargo.toml b/deployer/tests/resources/tests-fail/Cargo.toml index 43b6ff357..ae2a76515 100644 --- a/deployer/tests/resources/tests-fail/Cargo.toml +++ b/deployer/tests/resources/tests-fail/Cargo.toml @@ -3,11 +3,10 @@ name = "tests-fail" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - [workspace] [dependencies] rocket = "0.5.0-rc.2" shuttle-service = { path = "../../../../service", features = ["web-rocket"] } +shuttle-runtime = { path = "../../../../runtime" } +tokio = "1.22" diff --git a/deployer/tests/resources/tests-fail/src/lib.rs b/deployer/tests/resources/tests-fail/src/main.rs similarity index 100% rename from deployer/tests/resources/tests-fail/src/lib.rs rename to deployer/tests/resources/tests-fail/src/main.rs diff --git a/deployer/tests/resources/tests-pass/Cargo.toml b/deployer/tests/resources/tests-pass/Cargo.toml index 43e898a65..ffbd29a9f 100644 --- a/deployer/tests/resources/tests-pass/Cargo.toml +++ b/deployer/tests/resources/tests-pass/Cargo.toml @@ -3,11 +3,10 @@ name = "tests-pass" version = "0.1.0" edition = "2021" -[lib] -crate-type = ["cdylib"] - [workspace] [dependencies] rocket = "0.5.0-rc.2" shuttle-service = { path = "../../../../service", features = ["web-rocket"] } +shuttle-runtime = { path = "../../../../runtime" } +tokio = "1.22" diff --git a/deployer/tests/resources/tests-pass/src/lib.rs b/deployer/tests/resources/tests-pass/src/main.rs similarity index 100% rename from deployer/tests/resources/tests-pass/src/lib.rs rename to deployer/tests/resources/tests-pass/src/main.rs diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index db6ee9d86..60f768767 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -6,9 +6,6 @@ license.workspace = true publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[[bin]] -name = "rocket" - [[bin]] name = "shuttle-next" required-features = ["next"] @@ -37,21 +34,16 @@ wasi-common = { version = "4.0.0", optional = true } wasmtime = { version = "4.0.0", optional = true } wasmtime-wasi = { version = "4.0.0", optional = true } -# For rocket.rs -# TODO: remove -shuttle-secrets = { path = "../resources/secrets" } -rocket = "0.5.0-rc.2" - [dependencies.shuttle-common] workspace = true -features = ["service"] +features = ["service", "backend"] [dependencies.shuttle-proto] workspace = true [dependencies.shuttle-service] workspace = true -features = ["builder", "web-rocket"] # TODO: remove web-rocket +features = ["builder"] [dev-dependencies] crossbeam-channel = "0.5.6" @@ -59,14 +51,4 @@ portpicker = "0.1.1" futures = { version = "0.3.25" } [features] -next = [ - "cap-std", - "futures", - "hyper/server", - "rmp-serde", - "futures", - "wasi-common", - "wasmtime", - "wasmtime-wasi", - "shuttle-common/wasm" -] +next = ["cap-std", "futures", "hyper/server", "rmp-serde", "futures", "wasi-common", "wasmtime", "wasmtime-wasi", "shuttle-common/wasm"] diff --git a/runtime/src/bin/rocket.rs b/runtime/src/bin/rocket.rs deleted file mode 100644 index db3836826..000000000 --- a/runtime/src/bin/rocket.rs +++ /dev/null @@ -1,51 +0,0 @@ -// The few line below is what we should now codegen for legacy -#[tokio::main] -async fn main() { - shuttle_runtime::start(loader).await; -} - -async fn loader( - mut factory: shuttle_runtime::ProvisionerFactory, - _logger: shuttle_runtime::Logger, -) -> shuttle_service::ShuttleRocket { - use shuttle_service::ResourceBuilder; - - let secrets = shuttle_secrets::Secrets::new().build(&mut factory).await?; - - rocket(secrets).await -} - -// Everything below this is the usual code a user will write -use anyhow::anyhow; -use rocket::response::status::BadRequest; -use rocket::State; -use shuttle_secrets::SecretStore; - -#[rocket::get("/secret")] -async fn secret(state: &State) -> Result> { - Ok(state.secret.clone()) -} - -struct MyState { - secret: String, -} - -// #[shuttle_service::main] -pub async fn rocket( - // #[shuttle_secrets::Secrets] secret_store: SecretStore, - secret_store: SecretStore, -) -> shuttle_service::ShuttleRocket { - // get secret defined in `Secrets.toml` file. - let secret = if let Some(secret) = secret_store.get("MY_API_KEY") { - secret - } else { - return Err(anyhow!("secret was not found").into()); - }; - - let state = MyState { secret }; - let rocket = rocket::build() - .mount("/", rocket::routes![secret]) - .manage(state); - - Ok(rocket) -} diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index fa8bce121..5d430bbc1 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -4,7 +4,7 @@ use std::{ net::{Ipv4Addr, SocketAddr}, ops::DerefMut, str::FromStr, - sync::Mutex, + sync::{Arc, Mutex}, time::Duration, }; @@ -14,7 +14,7 @@ use clap::Parser; use core::future::Future; use shuttle_common::{ backends::{auth::ClaimLayer, tracing::InjectPropagationLayer}, - storage_manager::{StorageManager, WorkingDirStorageManager}, + storage_manager::{ArtifactsStorageManager, StorageManager, WorkingDirStorageManager}, LogItem, }; use shuttle_proto::{ @@ -47,9 +47,7 @@ use self::args::Args; mod args; -pub async fn start( - loader: impl Loader> + Send + 'static, -) { +pub async fn start(loader: impl Loader + Send + 'static) { let args = Args::parse(); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); @@ -57,11 +55,24 @@ pub async fn start( let mut server_builder = Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); + // We wrap the StorageManager trait object in an Arc rather than a Box, since we need + // to clone it in the `ProvisionerFactory::new` call in the legacy runtime `load` method. + // We might be able to optimize this by implementing clone for a Box + // or by using static dispatch instead. + let storage_manager: Arc = match args.storage_manager_type { + args::StorageManagerType::Artifacts => { + Arc::new(ArtifactsStorageManager::new(args.storage_manager_path)) + } + args::StorageManagerType::WorkingDir => { + Arc::new(WorkingDirStorageManager::new(args.storage_manager_path)) + } + }; + let router = { let legacy = Legacy::new( provisioner_address, loader, - WorkingDirStorageManager::new(args.storage_manager_path), + storage_manager, Environment::Local, ); @@ -72,24 +83,24 @@ pub async fn start( router.serve(addr).await.unwrap(); } -pub struct Legacy { +pub struct Legacy { // Mutexes are for interior mutability logs_rx: Mutex>>, logs_tx: UnboundedSender, stopped_tx: Sender<(StopReason, String)>, provisioner_address: Endpoint, kill_tx: Mutex>>, - storage_manager: M, + storage_manager: Arc, loader: Mutex>, service: Mutex>, env: Environment, } -impl Legacy { +impl Legacy { pub fn new( provisioner_address: Endpoint, loader: L, - storage_manager: M, + storage_manager: Arc, env: Environment, ) -> Self { let (tx, rx) = mpsc::unbounded_channel(); @@ -143,10 +154,9 @@ where } #[async_trait] -impl Runtime for Legacy +impl Runtime for Legacy where - M: StorageManager + Send + Sync + 'static, - L: Loader, Service = S> + Send + 'static, + L: Loader + Send + 'static, S: Service + Send + 'static, { async fn load(&self, request: Request) -> Result, Status> { @@ -155,7 +165,7 @@ where secrets, service_name, } = request.into_inner(); - trace!(path, "loading"); + trace!(path, "loading legacy project"); let secrets = BTreeMap::from_iter(secrets.into_iter()); diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index 027d16c25..6c43948d5 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -79,7 +79,7 @@ impl Runtime for AxumWasm { request: tonic::Request, ) -> Result, Status> { let wasm_path = request.into_inner().path; - trace!(wasm_path, "loading"); + trace!(wasm_path, "loading shuttle-next project"); let router = RouterBuilder::new() .map_err(|err| Status::from_error(err.into()))? diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs index 67a6f1957..8193af78e 100644 --- a/runtime/src/provisioner_factory.rs +++ b/runtime/src/provisioner_factory.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, path::PathBuf}; +use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; use async_trait::async_trait; use shuttle_common::{ @@ -16,29 +16,23 @@ use tracing::{debug, info, trace}; use uuid::Uuid; /// A factory (service locator) which goes through the provisioner crate -pub struct ProvisionerFactory -where - S: StorageManager, -{ +pub struct ProvisionerFactory { service_name: ServiceName, deployment_id: Uuid, - storage_manager: S, + storage_manager: Arc, provisioner_client: ProvisionerClient>>, info: Option, secrets: BTreeMap, env: Environment, } -impl ProvisionerFactory -where - S: StorageManager, -{ +impl ProvisionerFactory { pub(crate) fn new( provisioner_client: ProvisionerClient>>, service_name: ServiceName, deployment_id: Uuid, secrets: BTreeMap, - storage_manager: S, + storage_manager: Arc, env: Environment, ) -> Self { Self { @@ -54,10 +48,7 @@ where } #[async_trait] -impl Factory for ProvisionerFactory -where - S: StorageManager + Sync + Send, -{ +impl Factory for ProvisionerFactory { async fn get_db_connection_string( &mut self, db_type: database::Type, From c6061bede5aa7f78efaad9008be6ef71c31443a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 13 Mar 2023 16:38:57 +0000 Subject: [PATCH 54/74] feat: extract service integrations into separate crates (#702) * feat: draft of extracting service integrations * refactor: revert codegen changes * refactor: depend on shuttle_runtime & service integration * feat: remove rocket bin, comment out version check * feat: impl from for integration wrapper * feat: cleanup shuttle-axum docs, remove version check * feat: actix-web service integration * feat: extract poem service integration * feat: extract poise service integration * feat: extract rocket service integration * feat: extract salvo service integration * feat: extract the serenity service integration * feat: extract the thruster service integration * feat: extract warp service integration * feat: extract the tower service integration * feat: delete persist from service * feat: extract tide service integration * feat: update cargo.lock * feat: make service integration inner pub * fix: merge fixes * refactor: rename integrations, remove comment * ci: run check-standalone on services * feat: update test resources * ci: refactor workspace-clippy job * fix: add tokio dev dep to services * fix: remaining services tests --- .circleci/config.yml | 45 +- Cargo.lock | 2949 +++-------------- Cargo.toml | 3 +- codegen/src/shuttle_main/mod.rs | 60 +- .../tests/deploy_layer/bind-panic/Cargo.toml | 1 - .../tests/deploy_layer/bind-panic/src/main.rs | 12 +- .../tests/deploy_layer/main-panic/Cargo.toml | 1 - .../tests/deploy_layer/main-panic/src/main.rs | 12 +- .../tests/deploy_layer/self-stop/Cargo.toml | 1 - .../tests/deploy_layer/self-stop/src/main.rs | 10 +- .../tests/deploy_layer/sleep-async/Cargo.toml | 1 - .../deploy_layer/sleep-async/src/main.rs | 10 +- .../tests/resources/bind-panic/Cargo.toml | 1 - .../tests/resources/bind-panic/src/main.rs | 12 +- .../tests/resources/main-panic/Cargo.toml | 1 - .../tests/resources/main-panic/src/main.rs | 12 +- .../tests/resources/sleep-async/Cargo.toml | 1 - .../tests/resources/sleep-async/src/main.rs | 10 +- .../tests/resources/tests-fail/Cargo.toml | 2 +- .../tests/resources/tests-fail/src/main.rs | 6 +- .../tests/resources/tests-pass/Cargo.toml | 2 +- .../tests/resources/tests-pass/src/main.rs | 6 +- runtime/Cargo.toml | 14 +- runtime/src/lib.rs | 9 +- service/Cargo.toml | 43 +- service/src/builder.rs | 28 +- service/src/lib.rs | 215 +- service/src/persist.rs | 108 - service/tests/resources/is-bin/Cargo.toml | 2 +- service/tests/resources/is-bin/src/main.rs | 6 +- service/tests/resources/not-bin/Cargo.toml | 2 +- service/tests/resources/not-bin/src/lib.rs | 6 +- .../tests/resources/not-shuttle/Cargo.toml | 2 +- .../tests/resources/not-shuttle/src/main.rs | 4 +- services/README.md | 5 + services/shuttle-actix-web/Cargo.toml | 15 + services/shuttle-actix-web/src/lib.rs | 60 + services/shuttle-axum/Cargo.toml | 14 + services/shuttle-axum/src/lib.rs | 43 + services/shuttle-poem/Cargo.toml | 14 + services/shuttle-poem/src/lib.rs | 49 + services/shuttle-poise/Cargo.toml | 15 + services/shuttle-poise/src/lib.rs | 76 + services/shuttle-rocket/Cargo.toml | 14 + services/shuttle-rocket/src/lib.rs | 63 + services/shuttle-salvo/Cargo.toml | 14 + services/shuttle-salvo/src/lib.rs | 44 + services/shuttle-serenity/Cargo.toml | 17 + services/shuttle-serenity/src/lib.rs | 76 + services/shuttle-thruster/Cargo.toml | 15 + services/shuttle-thruster/src/lib.rs | 53 + services/shuttle-tide/Cargo.toml | 20 + services/shuttle-tide/src/lib.rs | 40 + services/shuttle-tower/Cargo.toml | 15 + services/shuttle-tower/src/lib.rs | 87 + services/shuttle-warp/Cargo.toml | 14 + services/shuttle-warp/src/lib.rs | 53 + 57 files changed, 1344 insertions(+), 3069 deletions(-) delete mode 100644 service/src/persist.rs create mode 100644 services/README.md create mode 100644 services/shuttle-actix-web/Cargo.toml create mode 100644 services/shuttle-actix-web/src/lib.rs create mode 100644 services/shuttle-axum/Cargo.toml create mode 100644 services/shuttle-axum/src/lib.rs create mode 100644 services/shuttle-poem/Cargo.toml create mode 100644 services/shuttle-poem/src/lib.rs create mode 100644 services/shuttle-poise/Cargo.toml create mode 100644 services/shuttle-poise/src/lib.rs create mode 100644 services/shuttle-rocket/Cargo.toml create mode 100644 services/shuttle-rocket/src/lib.rs create mode 100644 services/shuttle-salvo/Cargo.toml create mode 100644 services/shuttle-salvo/src/lib.rs create mode 100644 services/shuttle-serenity/Cargo.toml create mode 100644 services/shuttle-serenity/src/lib.rs create mode 100644 services/shuttle-thruster/Cargo.toml create mode 100644 services/shuttle-thruster/src/lib.rs create mode 100644 services/shuttle-tide/Cargo.toml create mode 100644 services/shuttle-tide/src/lib.rs create mode 100644 services/shuttle-tower/Cargo.toml create mode 100644 services/shuttle-tower/src/lib.rs create mode 100644 services/shuttle-warp/Cargo.toml create mode 100644 services/shuttle-warp/src/lib.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 925bbc209..f8f86c2ad 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -93,6 +93,17 @@ commands: shuttle-shared-db = { path = "$PWD/resources/shared-db" } shuttle-secrets = { path = "$PWD/resources/secrets" } shuttle-static-folder = { path = "$PWD/resources/static-folder" } + shuttle-axum = { path = "$PWD/services/shuttle-axum" } + shuttle-actix-web = { path = "$PWD/services/shuttle-actix-web" } + shuttle-poem = { path = "$PWD/services/shuttle-poem" } + shuttle-poise = { path = "$PWD/services/shuttle-poise" } + shuttle-rocket = { path = "$PWD/services/shuttle-rocket" } + shuttle-salvo = { path = "$PWD/services/shuttle-salvo" } + shuttle-serenity = { path = "$PWD/services/shuttle-serenity" } + shuttle-thruster = { path = "$PWD/services/shuttle-thruster" } + shuttle-tide = { path = "$PWD/services/shuttle-tide" } + shuttle-tower = { path = "$PWD/services/shuttle-tower" } + shuttle-warp = { path = "$PWD/services/shuttle-warp" } EOF install-rust: steps: @@ -162,10 +173,6 @@ jobs: - run: cargo check --workspace --all-targets - save-cargo-cache workspace-clippy: - parameters: - framework: - description: "Framework to activate" - type: string executor: docker-rust steps: - checkout @@ -174,7 +181,7 @@ jobs: - run: | cargo clippy --tests \ --all-targets \ - --features="codegen,builder,<< parameters.framework >>" \ + --all-features \ --no-deps -- \ --D warnings \ -A clippy::let-unit-value \ @@ -393,25 +400,8 @@ workflows: jobs: - workspace-fmt - workspace-clippy: - name: workspace-clippy-<< matrix.framework >> requires: - workspace-fmt - matrix: - parameters: - framework: - [ - "web-actix-web", - "web-axum", - "web-rocket", - "web-poem", - "web-thruster", - "web-tide", - "web-tower", - "web-warp", - "web-salvo", - "bot-serenity", - "bot-poise", - ] - check-standalone: matrix: parameters: @@ -421,6 +411,17 @@ workflows: - resources/secrets - resources/shared-db - resources/static-folder + - services/shuttle-actix-web + - services/shuttle-axum + - services/shuttle-poem + - services/shuttle-poise + - services/shuttle-rocket + - services/shuttle-salvo + - services/shuttle-serenity + - services/shuttle-thruster + - services/shuttle-tide + - services/shuttle-tower + - services/shuttle-warp - service-test: requires: - workspace-clippy diff --git a/Cargo.lock b/Cargo.lock index 5b9fd1397..ec6ba3832 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453e534d4f46dcdddd7aa8619e9a664e153f34383d14710db0b0d76c2964db89" dependencies = [ - "base64 0.13.1", + "base64", "hyper", "openssl", "reqwest", @@ -20,185 +20,6 @@ dependencies = [ "tracing-futures", ] -[[package]] -name = "actix-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" -dependencies = [ - "bitflags", - "bytes 1.3.0", - "futures-core", - "futures-sink", - "log", - "memchr", - "pin-project-lite 0.2.9", - "tokio", - "tokio-util 0.7.3", -] - -[[package]] -name = "actix-http" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c83abf9903e1f0ad9973cc4f7b9767fd5a03a583f51a5b7a339e07987cd2724" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "ahash", - "base64 0.13.1", - "bitflags", - "brotli", - "bytes 1.3.0", - "bytestring", - "derive_more", - "encoding_rs", - "flate2", - "futures-core", - "h2", - "http 0.2.8", - "httparse", - "httpdate", - "itoa 1.0.2", - "language-tags", - "local-channel", - "mime", - "percent-encoding", - "pin-project-lite 0.2.9", - "rand 0.8.5", - "sha1 0.10.4", - "smallvec", - "tracing", - "zstd", -] - -[[package]] -name = "actix-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" -dependencies = [ - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "actix-router" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" -dependencies = [ - "bytestring", - "http 0.2.8", - "regex", - "serde", - "tracing", -] - -[[package]] -name = "actix-rt" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" -dependencies = [ - "futures-core", - "tokio", -] - -[[package]] -name = "actix-server" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" -dependencies = [ - "actix-rt", - "actix-service", - "actix-utils", - "futures-core", - "futures-util", - "mio", - "num_cpus", - "socket2", - "tokio", - "tracing", -] - -[[package]] -name = "actix-service" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" -dependencies = [ - "futures-core", - "paste", - "pin-project-lite 0.2.9", -] - -[[package]] -name = "actix-utils" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" -dependencies = [ - "local-waker", - "pin-project-lite 0.2.9", -] - -[[package]] -name = "actix-web" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48f7b6534e06c7bfc72ee91db7917d4af6afe23e7d223b51e68fffbb21e96b9" -dependencies = [ - "actix-codec", - "actix-http", - "actix-macros", - "actix-router", - "actix-rt", - "actix-server", - "actix-service", - "actix-utils", - "actix-web-codegen", - "ahash", - "bytes 1.3.0", - "bytestring", - "cfg-if 1.0.0", - "cookie 0.16.0", - "derive_more", - "encoding_rs", - "futures-core", - "futures-util", - "http 0.2.8", - "itoa 1.0.2", - "language-tags", - "log", - "mime", - "once_cell", - "pin-project-lite 0.2.9", - "regex", - "serde", - "serde_json", - "serde_urlencoded", - "smallvec", - "socket2", - "time 0.3.11", - "url", -] - -[[package]] -name = "actix-web-codegen" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa9362663c8643d67b2d5eafba49e4cb2c8a053a29ed00a0bea121f17c76b13" -dependencies = [ - "actix-router", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - [[package]] name = "addr2line" version = "0.17.0" @@ -214,102 +35,13 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array", -] - -[[package]] -name = "aead" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" -dependencies = [ - "generic-array", -] - -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.3.0", - "cpufeatures", - "opaque-debug", -] - -[[package]] -name = "aes-gcm" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da" -dependencies = [ - "aead 0.3.2", - "aes 0.6.0", - "cipher 0.2.5", - "ctr 0.6.0", - "ghash 0.3.1", - "subtle", -] - -[[package]] -name = "aes-gcm" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" -dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "cipher 0.3.0", - "ctr 0.8.0", - "ghash 0.4.4", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - [[package]] name = "ahash" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.7", + "getrandom", "once_cell", "version_check", ] @@ -323,21 +55,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - [[package]] name = "ambient-authority" version = "0.0.1" @@ -397,107 +114,6 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "async-channel" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-compression" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345fd392ab01f746c717b1357165b76f0b67a60192007b234058c9045fdcf695" -dependencies = [ - "brotli", - "flate2", - "futures-core", - "memchr", - "pin-project-lite 0.2.9", - "tokio", -] - -[[package]] -name = "async-dup" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7427a12b8dc09291528cfb1da2447059adb4a257388c2acd6497a79d55cf6f7c" -dependencies = [ - "futures-io", - "simple-mutex", -] - -[[package]] -name = "async-executor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "once_cell", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5262ed948da60dd8956c6c5aca4d4163593dddb7b32d73267c93dab7b2e98940" -dependencies = [ - "async-channel", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "num_cpus", - "once_cell", - "tokio", -] - -[[package]] -name = "async-h1" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8101020758a4fc3a7c326cb42aa99e9fa77cbfb76987c128ad956406fe1f70a7" -dependencies = [ - "async-channel", - "async-dup", - "async-std", - "futures-core", - "http-types", - "httparse", - "log", - "pin-project", -] - -[[package]] -name = "async-io" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e18f61464ae81cde0a23e713ae8fd299580c54d697a35820cfd0625b8b0e07" -dependencies = [ - "concurrent-queue", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - [[package]] name = "async-lock" version = "2.5.0" @@ -507,44 +123,6 @@ dependencies = [ "event-listener", ] -[[package]] -name = "async-process" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c" -dependencies = [ - "async-io", - "blocking", - "cfg-if 1.0.0", - "event-listener", - "futures-lite", - "libc", - "once_cell", - "signal-hook", - "winapi", -] - -[[package]] -name = "async-session" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345022a2eed092cd105cc1b26fd61c341e100bd5fcbbd792df4baf31c2cc631f" -dependencies = [ - "anyhow", - "async-std", - "async-trait", - "base64 0.12.3", - "bincode", - "blake3", - "chrono", - "hmac 0.8.1", - "kv-log-macro", - "rand 0.7.3", - "serde", - "serde_json", - "sha2 0.9.9", -] - [[package]] name = "async-session" version = "3.0.0" @@ -554,59 +132,18 @@ dependencies = [ "anyhow", "async-lock", "async-trait", - "base64 0.13.1", + "base64", "bincode", "blake3", "chrono", "hmac 0.11.0", "log", - "rand 0.8.5", + "rand", "serde", "serde_json", "sha2 0.9.9", ] -[[package]] -name = "async-sse" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53bba003996b8fd22245cd0c59b869ba764188ed435392cf2796d03b805ade10" -dependencies = [ - "async-channel", - "async-std", - "http-types", - "log", - "memchr", - "pin-project-lite 0.1.12", -] - -[[package]] -name = "async-std" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" -dependencies = [ - "async-channel", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite 0.2.9", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - [[package]] name = "async-stream" version = "0.3.3" @@ -623,42 +160,20 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] -[[package]] -name = "async-task" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" - [[package]] name = "async-trait" version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "async-tungstenite" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b71b31561643aa8e7df3effe284fa83ab1a840e52294c5f4bd7bfd8b2becbb" -dependencies = [ - "futures-io", - "futures-util", - "log", - "pin-project-lite 0.2.9", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -670,21 +185,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "atomic" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "atomic-waker" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" - [[package]] name = "atty" version = "0.2.14" @@ -696,15 +196,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -727,12 +218,12 @@ dependencies = [ "aws-smithy-json", "aws-smithy-types", "aws-types", - "bytes 1.3.0", + "bytes", "hex 0.4.3", - "http 0.2.8", + "http", "hyper", "ring", - "time 0.3.11", + "time", "tokio", "tower", "tracing", @@ -748,7 +239,7 @@ dependencies = [ "aws-smithy-http", "aws-smithy-types", "aws-types", - "http 0.2.8", + "http", "regex", "tracing", ] @@ -762,12 +253,12 @@ dependencies = [ "aws-smithy-http", "aws-smithy-types", "aws-types", - "bytes 1.3.0", - "http 0.2.8", + "bytes", + "http", "http-body", "lazy_static", "percent-encoding", - "pin-project-lite 0.2.9", + "pin-project-lite", "tracing", ] @@ -788,8 +279,8 @@ dependencies = [ "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes 1.3.0", - "http 0.2.8", + "bytes", + "http", "tokio-stream", "tower", ] @@ -810,8 +301,8 @@ dependencies = [ "aws-smithy-json", "aws-smithy-types", "aws-types", - "bytes 1.3.0", - "http 0.2.8", + "bytes", + "http", "tokio-stream", "tower", ] @@ -833,8 +324,8 @@ dependencies = [ "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes 1.3.0", - "http 0.2.8", + "bytes", + "http", "tower", ] @@ -847,7 +338,7 @@ dependencies = [ "aws-sigv4", "aws-smithy-http", "aws-types", - "http 0.2.8", + "http", "tracing", ] @@ -860,12 +351,12 @@ dependencies = [ "aws-smithy-http", "form_urlencoded", "hex 0.4.3", - "http 0.2.8", + "http", "once_cell", "percent-encoding", "regex", "ring", - "time 0.3.11", + "time", "tracing", ] @@ -876,7 +367,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b3442b4c5d3fc39891a2e5e625735fba6b24694887d49c6518460fde98247a9" dependencies = [ "futures-util", - "pin-project-lite 0.2.9", + "pin-project-lite", "tokio", "tokio-stream", ] @@ -891,14 +382,14 @@ dependencies = [ "aws-smithy-http", "aws-smithy-http-tower", "aws-smithy-types", - "bytes 1.3.0", + "bytes", "fastrand", - "http 0.2.8", + "http", "http-body", "hyper", "hyper-rustls", "lazy_static", - "pin-project-lite 0.2.9", + "pin-project-lite", "tokio", "tower", "tracing", @@ -911,18 +402,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf58ed4fefa61dbf038e5421a521cbc2c448ef69deff0ab1d915d8a10eda5664" dependencies = [ "aws-smithy-types", - "bytes 1.3.0", + "bytes", "bytes-utils", "futures-core", - "http 0.2.8", + "http", "http-body", "hyper", "once_cell", "percent-encoding", - "pin-project-lite 0.2.9", + "pin-project-lite", "pin-utils", "tokio", - "tokio-util 0.7.3", + "tokio-util", "tracing", ] @@ -933,10 +424,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20c96d7bd35e7cf96aca1134b2f81b1b59ffe493f7c6539c051791cbbf7a42d3" dependencies = [ "aws-smithy-http", - "bytes 1.3.0", - "http 0.2.8", + "bytes", + "http", "http-body", - "pin-project-lite 0.2.9", + "pin-project-lite", "tower", "tracing", ] @@ -966,10 +457,10 @@ version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b02e06ea63498c43bc0217ea4d16605d4e58d85c12fc23f6572ff6d0a840c61" dependencies = [ - "itoa 1.0.2", + "itoa", "num-integer", "ryu", - "time 0.3.11", + "time", ] [[package]] @@ -991,7 +482,7 @@ dependencies = [ "aws-smithy-client", "aws-smithy-http", "aws-smithy-types", - "http 0.2.8", + "http", "rustc_version 0.4.0", "tracing", "zeroize", @@ -1005,20 +496,20 @@ checksum = "744864363a200a5e724a7e61bc8c11b6628cf2e3ec519c8a1a48e609a8156b40" dependencies = [ "async-trait", "axum-core", - "base64 0.13.1", + "base64", "bitflags", - "bytes 1.3.0", + "bytes", "futures-util", "headers", - "http 0.2.8", + "http", "http-body", "hyper", - "itoa 1.0.2", + "itoa", "matchit", "memchr", "mime", "percent-encoding", - "pin-project-lite 0.2.9", + "pin-project-lite", "rustversion", "serde", "serde_json", @@ -1041,9 +532,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79b8558f5a0581152dc94dcd289132a1d377494bdeafcd41869b3258e3e2ad92" dependencies = [ "async-trait", - "bytes 1.3.0", + "bytes", "futures-util", - "http 0.2.8", + "http", "http-body", "mime", "rustversion", @@ -1058,12 +549,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9a320103719de37b7b4da4c8eb629d4573f6bcfd3dfe80d3208806895ccf81d" dependencies = [ "axum", - "bytes 1.3.0", + "bytes", "cookie 0.16.0", "futures-util", - "http 0.2.8", + "http", "mime", - "pin-project-lite 0.2.9", + "pin-project-lite", "tokio", "tower", "tower-http 0.3.5", @@ -1078,12 +569,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51227033e4d3acad15c879092ac8a228532707b5db5ff2628f638334f63e1b7a" dependencies = [ "axum", - "bytes 1.3.0", + "bytes", "cookie 0.17.0", "futures-util", - "http 0.2.8", + "http", "mime", - "pin-project-lite 0.2.9", + "pin-project-lite", "tokio", "tower", "tower-http 0.3.5", @@ -1098,14 +589,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8456dab8f11484979a86651da8e619b355ede5d61a160755155f6c344bd18c47" dependencies = [ "arc-swap", - "bytes 1.3.0", + "bytes", "futures-util", - "http 0.2.8", + "http", "http-body", "hyper", - "pin-project-lite 0.2.9", + "pin-project-lite", "rustls", - "rustls-pemfile 1.0.1", + "rustls-pemfile", "tokio", "tokio-rustls", "tower-service", @@ -1117,7 +608,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b114309d293dd8a6fedebf09d5b8bbb0f7647b3d204ca0dd333b5f797aed5c8" dependencies = [ - "async-session 3.0.0", + "async-session", "axum", "axum-extra 0.4.2", "futures", @@ -1127,30 +618,12 @@ dependencies = [ "tracing", ] -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - [[package]] name = "base64" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "binascii" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" - [[package]] name = "bincode" version = "1.3.3" @@ -1208,44 +681,30 @@ dependencies = [ "generic-array", ] -[[package]] -name = "blocking" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6ccb65d468978a086b69884437ded69a90faab3bbe6e67f242173ea728acccc" -dependencies = [ - "async-channel", - "async-task", - "atomic-waker", - "fastrand", - "futures-lite", - "once_cell", -] - [[package]] name = "bollard" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d82e7850583ead5f8bbef247e2a3c37a19bd576e8420cd262a6711921827e1e5" dependencies = [ - "base64 0.13.1", + "base64", "bollard-stubs", - "bytes 1.3.0", + "bytes", "futures-core", "futures-util", "hex 0.4.3", - "http 0.2.8", + "http", "hyper", "hyperlocal", "log", - "pin-project-lite 0.2.9", + "pin-project-lite", "serde", "serde_derive", "serde_json", "serde_urlencoded", "thiserror", "tokio", - "tokio-util 0.7.3", + "tokio-util", "url", "winapi", ] @@ -1260,27 +719,6 @@ dependencies = [ "serde_with", ] -[[package]] -name = "brotli" -version = "3.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - [[package]] name = "bson" version = "2.5.0" @@ -1288,16 +726,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8746d07211bb12a7c34d995539b4a2acd4e0b0e757de98ce2ab99bcf17443fad" dependencies = [ "ahash", - "base64 0.13.1", + "base64", "hex 0.4.3", "indexmap", "lazy_static", - "rand 0.8.5", + "rand", "serde", "serde_bytes", "serde_json", - "time 0.3.11", - "uuid 1.2.2", + "time", + "uuid", ] [[package]] @@ -1323,16 +761,6 @@ dependencies = [ "serde", ] -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", -] - [[package]] name = "bumpalo" version = "3.10.0" @@ -1345,22 +773,6 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder", - "iovec", -] - -[[package]] -name = "bytes" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" - [[package]] name = "bytes" version = "1.3.0" @@ -1373,7 +785,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1934a3ef9cac8efde4966a92781e77713e1ba329f1d42e446c7d7eba340d8ef1" dependencies = [ - "bytes 1.3.0", + "bytes", "either", ] @@ -1383,21 +795,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70" -[[package]] -name = "bytestring" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7f83e57d9154148e355404702e2694463241880b939570d7c97c014da7a69a1" -dependencies = [ - "bytes 1.3.0", -] - -[[package]] -name = "cache-padded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" - [[package]] name = "camino" version = "1.0.9" @@ -1443,7 +840,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53df044ddcb88611e19b712211b342ab106105cf658406f5ed4ee09ab10ed727" dependencies = [ "ambient-authority", - "rand 0.8.5", + "rand", ] [[package]] @@ -1526,7 +923,7 @@ dependencies = [ "termcolor", "toml_edit 0.14.4", "unicode-width", - "unicode-xid 0.2.3", + "unicode-xid", "url", "walkdir", "winapi", @@ -1625,7 +1022,7 @@ dependencies = [ "tracing", "tracing-subscriber", "url", - "uuid 1.2.2", + "uuid", "webbrowser", ] @@ -1699,12 +1096,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ "iana-time-zone", - "js-sys", "num-integer", "num-traits", "serde", - "time 0.1.44", - "wasm-bindgen", "winapi", ] @@ -1714,24 +1108,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array", -] - [[package]] name = "clap" version = "3.2.23" @@ -1782,9 +1158,9 @@ checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" dependencies = [ "heck", "proc-macro-error", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1795,9 +1171,9 @@ checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" dependencies = [ "heck", "proc-macro-error", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1818,15 +1194,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags", -] - [[package]] name = "colored" version = "2.0.0" @@ -1844,7 +1211,7 @@ version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" dependencies = [ - "bytes 1.3.0", + "bytes", "memchr", ] @@ -1901,15 +1268,6 @@ version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad159cc964ac8f9d407cbc0aa44b02436c054b541f2b4b5f06972e1efdc54bc7" -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - [[package]] name = "console" version = "0.15.2" @@ -1924,12 +1282,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "const_fn" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" - [[package]] name = "constant_time_eq" version = "0.1.5" @@ -1942,38 +1294,19 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "cookie" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" -dependencies = [ - "aes-gcm 0.8.0", - "base64 0.13.1", - "hkdf 0.10.0", - "hmac 0.10.1", - "percent-encoding", - "rand 0.8.5", - "sha2 0.9.9", - "time 0.2.27", - "version_check", -] - [[package]] name = "cookie" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" dependencies = [ - "aes-gcm 0.9.4", - "base64 0.13.1", - "hkdf 0.12.3", + "base64", "hmac 0.12.1", "percent-encoding", - "rand 0.8.5", + "rand", "sha2 0.10.2", "subtle", - "time 0.3.11", + "time", "version_check", ] @@ -1984,7 +1317,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" dependencies = [ "percent-encoding", - "time 0.3.11", + "time", "version_check", ] @@ -2022,12 +1355,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cpuid-bool" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" - [[package]] name = "cranelift-bforest" version = "0.91.0" @@ -2227,7 +1554,7 @@ version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ - "autocfg 1.1.0", + "autocfg", "cfg-if 1.0.0", "crossbeam-utils", "memoffset 0.7.1", @@ -2279,16 +1606,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cruet" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d174765c7d11eb16f70a4213583aac2ca5ae1ebd1e233c6d5104bfb70fce3" -dependencies = [ - "once_cell", - "regex", -] - [[package]] name = "crypto-common" version = "0.1.3" @@ -2321,16 +1638,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "crypto-mac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" -dependencies = [ - "generic-array", - "subtle", -] - [[package]] name = "crypto-mac" version = "0.11.1" @@ -2347,26 +1654,8 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" dependencies = [ - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "ctr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" -dependencies = [ - "cipher 0.2.5", -] - -[[package]] -name = "ctr" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" -dependencies = [ - "cipher 0.3.0", + "quote", + "syn", ] [[package]] @@ -2412,18 +1701,8 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - -[[package]] -name = "darling" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4529658bdda7fd6769b8614be250cdcfc3aeb0ee72fe66f9e41e5e5eb73eac02" -dependencies = [ - "darling_core 0.14.1", - "darling_macro 0.14.1", + "darling_core", + "darling_macro", ] [[package]] @@ -2434,24 +1713,10 @@ checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.47", - "quote 1.0.21", - "strsim", - "syn 1.0.104", -] - -[[package]] -name = "darling_core" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "649c91bc01e8b1eac09fb91e8dbc7d517684ca6be8ebc75bb9cafc894f9fdb6f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2 1.0.47", - "quote 1.0.21", + "proc-macro2", + "quote", "strsim", - "syn 1.0.104", + "syn", ] [[package]] @@ -2460,20 +1725,9 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core 0.13.4", - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "darling_macro" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5" -dependencies = [ - "darling_core 0.14.1", - "quote 1.0.21", - "syn 1.0.104", + "darling_core", + "quote", + "syn", ] [[package]] @@ -2487,7 +1741,6 @@ dependencies = [ "lock_api", "once_cell", "parking_lot_core 0.9.3", - "serde", ] [[package]] @@ -2500,57 +1753,24 @@ checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" name = "derivative" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2 1.0.47", - "quote 1.0.21", - "rustc_version 0.4.0", - "syn 1.0.104", -] - -[[package]] -name = "devise" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595" -dependencies = [ - "devise_codegen", - "devise_core", -] - -[[package]] -name = "devise_codegen" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "devise_core", - "quote 1.0.21", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "devise_core" -version = "0.3.1" +name = "derive_more" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "bitflags", - "proc-macro2 1.0.47", - "proc-macro2-diagnostics", - "quote 1.0.21", - "syn 1.0.104", + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.0", + "syn", ] [[package]] @@ -2648,12 +1868,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - [[package]] name = "doc-comment" version = "0.3.3" @@ -2703,29 +1917,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" dependencies = [ "heck", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "enumflags2" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" -dependencies = [ - "enumflags2_derive", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2751,15 +1945,6 @@ dependencies = [ "url", ] -[[package]] -name = "erased-serde" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d013529d5574a60caeda29e179e695125448e5de52e3874f7b4c1d7360e18e" -dependencies = [ - "serde", -] - [[package]] name = "errno" version = "0.2.8" @@ -2802,36 +1987,6 @@ dependencies = [ "instant", ] -[[package]] -name = "femme" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc04871e5ae3aa2952d552dae6b291b3099723bf779a8054281c1366a54613ef" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "figment" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790b4292c72618abbab50f787a477014fe15634f96291de45672ce46afe122df" -dependencies = [ - "atomic", - "pear", - "serde", - "toml", - "uncased", - "version_check", -] - [[package]] name = "file-per-thread-logger" version = "0.1.5" @@ -2930,12 +2085,6 @@ dependencies = [ "windows-sys 0.42.0", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - [[package]] name = "futures" version = "0.3.25" @@ -2995,30 +2144,15 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite 0.2.9", - "waker-fn", -] - [[package]] name = "futures-macro" version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -3046,7 +2180,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.9", + "pin-project-lite", "pin-utils", "slab", ] @@ -3079,19 +2213,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "generator" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" -dependencies = [ - "cc", - "libc", - "log", - "rustversion", - "winapi", -] - [[package]] name = "generic-array" version = "0.14.5" @@ -3102,17 +2223,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.7" @@ -3121,27 +2231,7 @@ checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghash" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" -dependencies = [ - "opaque-debug", - "polyval 0.4.5", -] - -[[package]] -name = "ghash" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" -dependencies = [ - "opaque-debug", - "polyval 0.5.3", + "wasi", ] [[package]] @@ -3201,34 +2291,22 @@ dependencies = [ "regex", ] -[[package]] -name = "gloo-timers" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb7d06c1c8cc2a29bee7ec961009a0b2caa0793ee4900c2ffb348734ba1c8f9" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "h2" version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ - "bytes 1.3.0", + "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.8", + "http", "indexmap", "slab", "tokio", - "tokio-util 0.7.3", + "tokio-util", "tracing", ] @@ -3256,14 +2334,14 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ - "base64 0.13.1", + "base64", "bitflags", - "bytes 1.3.0", + "bytes", "headers-core", - "http 0.2.8", + "http", "httpdate", "mime", - "sha1 0.10.4", + "sha1", ] [[package]] @@ -3272,7 +2350,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" dependencies = [ - "http 0.2.8", + "http", ] [[package]] @@ -3317,16 +2395,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hkdf" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" -dependencies = [ - "digest 0.9.0", - "hmac 0.10.1", -] - [[package]] name = "hkdf" version = "0.12.3" @@ -3336,26 +2404,6 @@ dependencies = [ "hmac 0.12.1", ] -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" -dependencies = [ - "crypto-mac 0.10.1", - "digest 0.9.0", -] - [[package]] name = "hmac" version = "0.11.0" @@ -3395,26 +2443,15 @@ dependencies = [ "winapi", ] -[[package]] -name = "http" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -dependencies = [ - "bytes 0.4.12", - "fnv", - "itoa 0.4.8", -] - [[package]] name = "http" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ - "bytes 1.3.0", + "bytes", "fnv", - "itoa 1.0.2", + "itoa", ] [[package]] @@ -3423,21 +2460,9 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.3.0", - "http 0.2.8", - "pin-project-lite 0.2.9", -] - -[[package]] -name = "http-client" -version = "6.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1947510dc91e2bf586ea5ffb412caad7673264e14bb39fb9078da114a94ce1a5" -dependencies = [ - "async-trait", - "cfg-if 1.0.0", - "http-types", - "log", + "bytes", + "http", + "pin-project-lite", ] [[package]] @@ -3452,30 +2477,8 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e272971f774ba29341db2f686255ff8a979365a26fb9e4277f6b6d9ec0cdd5e" dependencies = [ - "http 0.2.8", - "serde", -] - -[[package]] -name = "http-types" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" -dependencies = [ - "anyhow", - "async-channel", - "async-std", - "base64 0.13.1", - "cookie 0.14.4", - "futures-lite", - "infer", - "pin-project-lite 0.2.9", - "rand 0.7.3", + "http", "serde", - "serde_json", - "serde_qs", - "serde_urlencoded", - "url", ] [[package]] @@ -3502,17 +2505,17 @@ version = "0.14.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" dependencies = [ - "bytes 1.3.0", + "bytes", "futures-channel", "futures-core", "futures-util", "h2", - "http 0.2.8", + "http", "http-body", "httparse", "httpdate", - "itoa 1.0.2", - "pin-project-lite 0.2.9", + "itoa", + "pin-project-lite", "socket2", "tokio", "tower-service", @@ -3548,7 +2551,7 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" dependencies = [ - "http 0.2.8", + "http", "hyper", "log", "rustls", @@ -3564,7 +2567,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ "hyper", - "pin-project-lite 0.2.9", + "pin-project-lite", "tokio", "tokio-io-timeout", ] @@ -3575,7 +2578,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.3.0", + "bytes", "hyper", "native-tls", "tokio", @@ -3660,7 +2663,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" dependencies = [ "bitmaps", - "rand_core 0.6.3", + "rand_core", "rand_xoshiro", "sized-chunks", "typenum", @@ -3673,7 +2676,7 @@ version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ - "autocfg 1.1.0", + "autocfg", "hashbrown", "serde", ] @@ -3696,18 +2699,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adab1eaa3408fb7f0c777a73e7465fd5656136fc93b670eb6df3c88c2c1344e3" -[[package]] -name = "infer" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" - -[[package]] -name = "inlinable_string" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" - [[package]] name = "instant" version = "0.1.12" @@ -3723,7 +2714,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c6a5dc426fcc25b99d91e4a283a8f5518339a0f63bf28588a6c5f31e089f8a" dependencies = [ - "base64 0.13.1", + "base64", "hyper", "hyper-rustls", "ring", @@ -3752,15 +2743,6 @@ dependencies = [ "windows-sys 0.42.0", ] -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] - [[package]] name = "ipconfig" version = "0.3.0" @@ -3800,12 +2782,6 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.2" @@ -3876,7 +2852,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09f4f04699947111ec1733e71778d763555737579e44b85844cae8e1940a1828" dependencies = [ - "base64 0.13.1", + "base64", "pem", "ring", "serde", @@ -3893,21 +2869,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "language-tags" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" - [[package]] name = "lazy_static" version = "1.4.0" @@ -3946,16 +2907,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] - [[package]] name = "libnghttp2-sys" version = "0.1.7+1.45.0" @@ -4015,31 +2966,13 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f9f08d8963a6c613f4b1a78f4f4a4dbfadf8e6545b2d72861731e4858b8b47f" -[[package]] -name = "local-channel" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" -dependencies = [ - "futures-core", - "futures-sink", - "futures-util", - "local-waker", -] - -[[package]] -name = "local-waker" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" - [[package]] name = "lock_api" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "autocfg 1.1.0", + "autocfg", "scopeguard", ] @@ -4050,23 +2983,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", - "serde", - "value-bag", -] - -[[package]] -name = "loom" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if 1.0.0", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", ] [[package]] @@ -4159,7 +3075,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -4168,7 +3084,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -4210,7 +3126,7 @@ checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.36.1", ] @@ -4230,7 +3146,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a37fe10c1485a0cd603468e284a1a8535b4ecf46808f5f7de3639a1e1252dbf8" dependencies = [ "async-trait", - "base64 0.13.1", + "base64", "bitflags", "bson", "chrono", @@ -4246,10 +3162,10 @@ dependencies = [ "md-5", "pbkdf2", "percent-encoding", - "rand 0.8.5", + "rand", "rustc_version_runtime", "rustls", - "rustls-pemfile 1.0.1", + "rustls-pemfile", "serde", "serde_bytes", "serde_with", @@ -4262,61 +3178,20 @@ dependencies = [ "thiserror", "tokio", "tokio-rustls", - "tokio-util 0.7.3", - "trust-dns-proto", - "trust-dns-resolver", - "typed-builder", - "uuid 1.2.2", - "webpki-roots", -] - -[[package]] -name = "multer" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f8f35e687561d5c1667590911e6698a8cb714a134a7505718a182e7bc9d3836" -dependencies = [ - "bytes 1.3.0", - "encoding_rs", - "futures-util", - "http 0.2.8", - "httparse", - "log", - "memchr", - "mime", - "spin 0.9.3", - "tokio", - "tokio-util 0.6.10", - "version_check", -] - -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" -dependencies = [ - "serde", -] - -[[package]] -name = "multipart" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" -dependencies = [ - "buf_redux", - "httparse", - "log", - "mime", - "mime_guess", - "quick-error", - "rand 0.8.5", - "safemem", - "tempfile", - "twoway", + "tokio-util", + "trust-dns-proto", + "trust-dns-resolver", + "typed-builder", + "uuid", + "webpki-roots", ] +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + [[package]] name = "native-tls" version = "0.2.10" @@ -4341,24 +3216,13 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" -[[package]] -name = "net2" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi", -] - [[package]] name = "nix" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" dependencies = [ - "autocfg 1.1.0", + "autocfg", "bitflags", "cfg-if 1.0.0", "libc", @@ -4392,7 +3256,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" dependencies = [ - "autocfg 1.1.0", + "autocfg", "num-integer", "num-traits", ] @@ -4403,7 +3267,7 @@ version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "autocfg 1.1.0", + "autocfg", "num-traits", ] @@ -4413,7 +3277,7 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -4505,9 +3369,9 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -4531,7 +3395,7 @@ version = "0.9.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" dependencies = [ - "autocfg 1.1.0", + "autocfg", "cc", "libc", "openssl-src", @@ -4556,8 +3420,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1edc79add46364183ece1a4542592ca593e6421c60807232f5b8f7a31703825d" dependencies = [ "async-trait", - "bytes 1.3.0", - "http 0.2.8", + "bytes", + "http", "opentelemetry_api", ] @@ -4570,7 +3434,7 @@ dependencies = [ "async-trait", "futures", "futures-util", - "http 0.2.8", + "http", "opentelemetry", "opentelemetry-proto", "prost", @@ -4605,7 +3469,7 @@ dependencies = [ "indexmap", "js-sys", "once_cell", - "pin-project-lite 0.2.9", + "pin-project-lite", "thiserror", ] @@ -4625,21 +3489,12 @@ dependencies = [ "once_cell", "opentelemetry_api", "percent-encoding", - "rand 0.8.5", + "rand", "thiserror", "tokio", "tokio-stream", ] -[[package]] -name = "ordered-float" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" -dependencies = [ - "num-traits", -] - [[package]] name = "os_info" version = "3.5.1" @@ -4672,12 +3527,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - [[package]] name = "parking_lot" version = "0.11.2" @@ -4747,36 +3596,13 @@ dependencies = [ "digest 0.10.3", ] -[[package]] -name = "pear" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702" -dependencies = [ - "inlinable_string", - "pear_codegen", - "yansi", -] - -[[package]] -name = "pear_codegen" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" -dependencies = [ - "proc-macro2 1.0.47", - "proc-macro2-diagnostics", - "quote 1.0.21", - "syn 1.0.104", -] - [[package]] name = "pem" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c64931a1a212348ec4f3b4362585eca7159d0d09cbdf4a7f74f02173596fd4" dependencies = [ - "base64 0.13.1", + "base64", ] [[package]] @@ -4810,17 +3636,11 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] -[[package]] -name = "pin-project-lite" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" - [[package]] name = "pin-project-lite" version = "0.2.9" @@ -4848,115 +3668,6 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" -[[package]] -name = "poem" -version = "1.3.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc88a96f338947991534ac756e28bd05665a7dd40ad9c0c143cc5503ef5635e8" -dependencies = [ - "async-trait", - "bytes 1.3.0", - "futures-util", - "headers", - "http 0.2.8", - "hyper", - "mime", - "parking_lot 0.12.1", - "percent-encoding", - "pin-project-lite 0.2.9", - "poem-derive", - "regex", - "rfc7239", - "serde", - "serde_json", - "serde_urlencoded", - "smallvec", - "thiserror", - "tokio", - "tokio-stream", - "tokio-util 0.7.3", - "tracing", -] - -[[package]] -name = "poem-derive" -version = "1.3.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bfb3ddf3eb162c2a2dc4dbdc610eaf56417cd4000fcda2686ccb354e2a1b2b" -dependencies = [ - "proc-macro-crate", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "poise" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca787e4e516076de1995a83ee05fbdfed71d072ea0da3df018318db42a87803" -dependencies = [ - "async-trait", - "derivative", - "futures-core", - "futures-util", - "log", - "once_cell", - "parking_lot 0.12.1", - "poise_macros", - "regex", - "serenity", - "tokio", -] - -[[package]] -name = "poise_macros" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b80c1f4e04114527f9d41ed6bb31707a095276f51bb0aef3ca11f062b25a67c4" -dependencies = [ - "darling 0.14.1", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "polling" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - -[[package]] -name = "polyval" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" -dependencies = [ - "cpuid-bool", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "polyval" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - [[package]] name = "portable-atomic" version = "0.3.15" @@ -4969,7 +3680,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be97d76faf1bfab666e1375477b23fde79eccf0276e9b63b92a39d676a889ba9" dependencies = [ - "rand 0.8.5", + "rand", ] [[package]] @@ -5023,18 +3734,8 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1516508b396cefe095485fdce673007422f5e48e82934b7b423dc26aa5e6a4" dependencies = [ - "proc-macro2 1.0.47", - "syn 1.0.104", -] - -[[package]] -name = "proc-macro-crate" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" -dependencies = [ - "thiserror", - "toml", + "proc-macro2", + "syn", ] [[package]] @@ -5044,9 +3745,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", "version_check", ] @@ -5056,26 +3757,11 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", + "proc-macro2", + "quote", "version_check", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - [[package]] name = "proc-macro2" version = "1.0.47" @@ -5085,26 +3771,13 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", - "version_check", - "yansi", -] - [[package]] name = "prost" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0841812012b2d4a6145fae9a6af1534873c32aa67fff26bd09f8fa42c83f95a" dependencies = [ - "bytes 1.3.0", + "bytes", "prost-derive", ] @@ -5114,7 +3787,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d8b442418ea0822409d9e7d047cbf1e7e9e1760b172bf9982cf29d517c93511" dependencies = [ - "bytes 1.3.0", + "bytes", "heck", "itertools", "lazy_static", @@ -5125,7 +3798,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 1.0.104", + "syn", "tempfile", "which", ] @@ -5138,9 +3811,9 @@ checksum = "7345d5f0e08c0536d7ac7229952590239e77abf0a0100a1b1d890add6ea96364" dependencies = [ "anyhow", "itertools", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -5149,7 +3822,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dfaa718ad76a44b3415e6c4d53b17c8f99160dcb3a99b10470fce8ad43f6e3e" dependencies = [ - "bytes 1.3.0", + "bytes", "prost", ] @@ -5174,54 +3847,13 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - [[package]] name = "quote" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ - "proc-macro2 1.0.47", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", + "proc-macro2", ] [[package]] @@ -5231,28 +3863,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", ] [[package]] @@ -5262,31 +3874,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -5295,78 +3883,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.7", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", + "getrandom", ] [[package]] @@ -5375,7 +3892,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" dependencies = [ - "rand_core 0.6.3", + "rand_core", ] [[package]] @@ -5416,19 +3933,10 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" dependencies = [ - "pem", - "ring", - "time 0.3.11", - "yasna", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", + "pem", + "ring", + "time", + "yasna", ] [[package]] @@ -5446,31 +3954,11 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.7", + "getrandom", "redox_syscall", "thiserror", ] -[[package]] -name = "ref-cast" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685d58625b6c2b83e4cc88a27c4bf65adb7b6b16dbdc413e515c9405b47432ab" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a043824e29c94169374ac5183ac0ed43f5724dc4556b19568007486bd840fa1f" -dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - [[package]] name = "regalloc2" version = "0.5.1" @@ -5524,13 +4012,13 @@ version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" dependencies = [ - "base64 0.13.1", - "bytes 1.3.0", + "base64", + "bytes", "encoding_rs", "futures-core", "futures-util", "h2", - "http 0.2.8", + "http", "http-body", "hyper", "hyper-rustls", @@ -5543,16 +4031,15 @@ dependencies = [ "native-tls", "once_cell", "percent-encoding", - "pin-project-lite 0.2.9", + "pin-project-lite", "rustls", - "rustls-pemfile 1.0.1", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", "tokio-rustls", - "tokio-util 0.7.3", "tower-service", "url", "wasm-bindgen", @@ -5570,7 +4057,7 @@ checksum = "4a1c03e9011a8c59716ad13115550469e081e2e9892656b0ba6a47c907921894" dependencies = [ "anyhow", "async-trait", - "http 0.2.8", + "http", "reqwest", "serde", "task-local-extensions", @@ -5587,7 +4074,7 @@ dependencies = [ "async-trait", "chrono", "futures", - "http 0.2.8", + "http", "hyper", "reqwest", "reqwest-middleware", @@ -5615,7 +4102,7 @@ checksum = "47f9e19b18c6cdd796cc70aea8a9ea5ee7b813be611c6589e3624fcdbfd05f9d" dependencies = [ "anyhow", "chrono", - "rand 0.8.5", + "rand", ] [[package]] @@ -5631,15 +4118,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "rfc7239" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "087317b3cf7eb481f13bd9025d729324b7cd068d6f470e2d76d049e191f5ba47" -dependencies = [ - "uncased", -] - [[package]] name = "ring" version = "0.16.20" @@ -5677,93 +4155,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rocket" -version = "0.5.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ead083fce4a405feb349cf09abdf64471c6077f14e0ce59364aa90d4b99317" -dependencies = [ - "async-stream", - "async-trait", - "atomic", - "atty", - "binascii", - "bytes 1.3.0", - "either", - "figment", - "futures", - "indexmap", - "log", - "memchr", - "multer", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite 0.2.9", - "rand 0.8.5", - "ref-cast", - "rocket_codegen", - "rocket_http", - "serde", - "state", - "tempfile", - "time 0.3.11", - "tokio", - "tokio-stream", - "tokio-util 0.7.3", - "ubyte", - "version_check", - "yansi", -] - -[[package]] -name = "rocket_codegen" -version = "0.5.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6aeb6bb9c61e9cd2c00d70ea267bf36f76a4cc615e5908b349c2f9d93999b47" -dependencies = [ - "devise", - "glob", - "indexmap", - "proc-macro2 1.0.47", - "quote 1.0.21", - "rocket_http", - "syn 1.0.104", - "unicode-xid 0.2.3", -] - -[[package]] -name = "rocket_http" -version = "0.5.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ded65d127954de3c12471630bf4b81a2792f065984461e65b91d0fdaafc17a2" -dependencies = [ - "cookie 0.16.0", - "either", - "futures", - "http 0.2.8", - "hyper", - "indexmap", - "log", - "memchr", - "pear", - "percent-encoding", - "pin-project-lite 0.2.9", - "ref-cast", - "serde", - "smallvec", - "stable-pattern", - "state", - "time 0.3.11", - "tokio", - "uncased", -] - -[[package]] -name = "route-recognizer" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56770675ebc04927ded3e60633437841581c285dc6236109ea25fbf3beb7b59e" - [[package]] name = "rustc-demangle" version = "0.1.21" @@ -5831,7 +4222,7 @@ dependencies = [ "bitflags", "errno", "io-lifetimes", - "itoa 1.0.2", + "itoa", "libc", "linux-raw-sys", "once_cell", @@ -5857,27 +4248,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.1", + "rustls-pemfile", "schannel", "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" -dependencies = [ - "base64 0.13.1", -] - [[package]] name = "rustls-pemfile" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" dependencies = [ - "base64 0.13.1", + "base64", ] [[package]] @@ -5908,77 +4290,6 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "salvo" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b290f01b3b881afd34408b5823cb44f6717ed6b93a6e16a0113e9a49645ea8a7" -dependencies = [ - "salvo_core", -] - -[[package]] -name = "salvo_core" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fea63014bacaaaef1eaa1f28d90921cfbbee73a379974fca30fc698f64a8853" -dependencies = [ - "async-compression", - "async-trait", - "base64 0.13.1", - "bytes 1.3.0", - "cookie 0.16.0", - "cruet", - "encoding_rs", - "enumflags2", - "fastrand", - "form_urlencoded", - "futures-util", - "headers", - "http 0.2.8", - "hyper", - "mime", - "mime_guess", - "multer", - "multimap", - "once_cell", - "parking_lot 0.12.1", - "percent-encoding", - "regex", - "salvo_macros", - "serde", - "serde_json", - "serde_urlencoded", - "tempfile", - "textnonce", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", -] - -[[package]] -name = "salvo_macros" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b305a54f28b92483eabbfc91dd39bba62c840095b5513e83d31582c7e6bd8d44" -dependencies = [ - "cruet", - "darling 0.14.1", - "proc-macro-crate", - "proc-macro2 1.0.47", - "quote 1.0.21", - "regex", - "syn 1.0.104", -] - [[package]] name = "same-file" version = "1.0.6" @@ -5998,12 +4309,6 @@ dependencies = [ "windows-sys 0.36.1", ] -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - [[package]] name = "scopeguard" version = "1.1.0" @@ -6076,16 +4381,6 @@ dependencies = [ "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_bytes" version = "0.11.7" @@ -6101,18 +4396,9 @@ version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "serde_fmt" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2963a69a2b3918c1dc75a45a18bd3fcd1120e31d3f59deb1b2f9b5d5ffb8baa4" -dependencies = [ - "serde", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -6131,7 +4417,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ "indexmap", - "itoa 1.0.2", + "itoa", "ryu", "serde", ] @@ -6145,17 +4431,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_qs" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -6163,7 +4438,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.2", + "itoa", "ryu", "serde", ] @@ -6184,42 +4459,10 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ - "darling 0.13.4", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "serenity" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fd5e7b5858ad96e99d440138f34f5b98e1b959ebcd3a1036203b30e78eb788" -dependencies = [ - "async-trait", - "async-tungstenite", - "base64 0.13.1", - "bitflags", - "bytes 1.3.0", - "cfg-if 1.0.0", - "chrono", - "dashmap", - "flate2", - "futures", - "mime", - "mime_guess", - "parking_lot 0.12.1", - "percent-encoding", - "reqwest", - "rustversion", - "serde", - "serde-value", - "serde_json", - "time 0.3.11", - "tokio", - "tracing", - "typemap_rev", - "url", + "darling", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -6233,15 +4476,6 @@ dependencies = [ "digest 0.10.3", ] -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - [[package]] name = "sha1" version = "0.10.4" @@ -6253,12 +4487,6 @@ dependencies = [ "digest 0.10.3", ] -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - [[package]] name = "sha2" version = "0.9.9" @@ -6334,11 +4562,11 @@ dependencies = [ "axum-extra 0.5.0", "axum-sessions", "clap 4.0.27", - "http 0.2.8", + "http", "hyper", "jsonwebtoken", "opentelemetry", - "rand 0.8.5", + "rand", "ring", "serde", "serde_json", @@ -6359,9 +4587,9 @@ version = "0.11.0" dependencies = [ "pretty_assertions", "proc-macro-error", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", "trybuild", ] @@ -6372,14 +4600,14 @@ dependencies = [ "anyhow", "async-trait", "axum", - "base64 0.13.1", - "bytes 1.3.0", + "base64", + "bytes", "cap-std", "chrono", "comfy-table", "crossterm", "headers", - "http 0.2.8", + "http", "http-body", "http-serde", "hyper", @@ -6407,7 +4635,7 @@ dependencies = [ "tracing-opentelemetry", "tracing-subscriber", "ttl_cache", - "uuid 1.2.2", + "uuid", ] [[package]] @@ -6417,7 +4645,7 @@ dependencies = [ "anyhow", "async-trait", "axum", - "bytes 1.3.0", + "bytes", "cargo", "cargo_metadata", "chrono", @@ -6436,7 +4664,7 @@ dependencies = [ "opentelemetry-http", "pipe", "portpicker", - "rand 0.8.5", + "rand", "serde", "serde_json", "shuttle-common", @@ -6455,7 +4683,7 @@ dependencies = [ "tracing", "tracing-opentelemetry", "tracing-subscriber", - "uuid 1.2.2", + "uuid", ] [[package]] @@ -6467,14 +4695,14 @@ dependencies = [ "async-trait", "axum", "axum-server", - "base64 0.13.1", + "base64", "bollard", "chrono", "clap 4.0.27", "colored", "fqdn", "futures", - "http 0.2.8", + "http", "hyper", "hyper-reverse-proxy 0.5.2-dev (git+https://github.com/chesedo/hyper-reverse-proxy?branch=bug/host_header)", "instant-acme", @@ -6487,11 +4715,11 @@ dependencies = [ "pem", "pin-project", "portpicker", - "rand 0.8.5", + "rand", "rcgen", "ring", "rustls", - "rustls-pemfile 1.0.1", + "rustls-pemfile", "serde", "serde_json", "shuttle-common", @@ -6506,7 +4734,7 @@ dependencies = [ "tracing-opentelemetry", "tracing-subscriber", "ttl_cache", - "uuid 1.2.2", + "uuid", ] [[package]] @@ -6515,7 +4743,7 @@ version = "0.8.0" dependencies = [ "axum", "futures-executor", - "http 0.2.8", + "http", "rmp-serde", "shuttle-codegen", "shuttle-common", @@ -6537,7 +4765,7 @@ dependencies = [ "tonic", "tonic-build", "tracing", - "uuid 1.2.2", + "uuid", ] [[package]] @@ -6553,7 +4781,7 @@ dependencies = [ "once_cell", "portpicker", "prost", - "rand 0.8.5", + "rand", "serde_json", "shuttle-common", "shuttle-proto", @@ -6580,12 +4808,11 @@ dependencies = [ "hyper", "portpicker", "rmp-serde", - "rocket", "serde_json", "shuttle-common", "shuttle-proto", - "shuttle-secrets", "shuttle-service", + "strfmt", "thiserror", "tokio", "tokio-stream", @@ -6593,7 +4820,7 @@ dependencies = [ "tower", "tracing", "tracing-subscriber", - "uuid 1.2.2", + "uuid", "wasi-common", "wasmtime", "wasmtime-wasi", @@ -6611,40 +4838,20 @@ dependencies = [ name = "shuttle-service" version = "0.11.0" dependencies = [ - "actix-web", "anyhow", - "async-std", "async-trait", "axum", - "bincode", "cargo", "cargo_metadata", "crossbeam-channel", - "futures", - "hyper", - "libloading", - "num_cpus", "pipe", - "poem", - "poise", - "portpicker", - "rocket", - "salvo", "serde_json", - "serenity", "shuttle-codegen", "shuttle-common", - "sqlx", "strfmt", "thiserror", - "thruster", - "tide", "tokio", - "tower", "tracing", - "tracing-subscriber", - "uuid 1.2.2", - "warp", ] [[package]] @@ -6677,15 +4884,6 @@ dependencies = [ "libc", ] -[[package]] -name = "simple-mutex" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38aabbeafa6f6dead8cebf246fe9fae1f9215c8d29b3a69f93bd62a9e4a3dcd6" -dependencies = [ - "event-listener", -] - [[package]] name = "simple_asn1" version = "0.6.2" @@ -6695,7 +4893,7 @@ dependencies = [ "num-bigint", "num-traits", "thiserror", - "time 0.3.11", + "time", ] [[package]] @@ -6732,7 +4930,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" dependencies = [ - "autocfg 1.1.0", + "autocfg", "serde", "static_assertions", "version_check", @@ -6813,10 +5011,10 @@ checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" dependencies = [ "ahash", "atoi", - "base64 0.13.1", + "base64", "bitflags", "byteorder", - "bytes 1.3.0", + "bytes", "chrono", "crc", "crossbeam-queue", @@ -6832,10 +5030,10 @@ dependencies = [ "futures-util", "hashlink", "hex 0.4.3", - "hkdf 0.12.3", + "hkdf", "hmac 0.12.1", "indexmap", - "itoa 1.0.2", + "itoa", "libc", "libsqlite3-sys", "log", @@ -6844,10 +5042,10 @@ dependencies = [ "once_cell", "paste", "percent-encoding", - "rand 0.8.5", + "rand", "serde", "serde_json", - "sha1 0.10.4", + "sha1", "sha2 0.10.2", "smallvec", "sqlformat", @@ -6856,7 +5054,7 @@ dependencies = [ "thiserror", "tokio-stream", "url", - "uuid 1.2.2", + "uuid", "whoami", ] @@ -6867,118 +5065,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" dependencies = [ "dotenvy", - "either", - "heck", - "once_cell", - "proc-macro2 1.0.47", - "quote 1.0.21", - "serde_json", - "sha2 0.10.2", - "sqlx-core", - "sqlx-rt", - "syn 1.0.104", - "url", -] - -[[package]] -name = "sqlx-rt" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396" -dependencies = [ - "native-tls", - "once_cell", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "stable-pattern" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" -dependencies = [ - "memchr", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", -] - -[[package]] -name = "state" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" -dependencies = [ - "loom", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version 0.2.3", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", + "either", + "heck", + "once_cell", + "proc-macro2", + "quote", + "serde_json", + "sha2 0.10.2", + "sqlx-core", + "sqlx-rt", + "syn", + "url", ] [[package]] -name = "stdweb-derive" -version = "0.5.3" +name = "sqlx-rt" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" +checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "serde", - "serde_derive", - "syn 1.0.104", + "native-tls", + "once_cell", + "tokio", + "tokio-native-tls", ] [[package]] -name = "stdweb-internal-macros" -version = "0.2.9" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2 1.0.47", - "quote 1.0.21", - "serde", - "serde_derive", - "serde_json", - "sha1 0.6.1", - "syn 1.0.104", -] +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strfmt" @@ -7027,10 +5149,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4faebde00e8ff94316c01800f9054fd2ba77d30d9e922541913051d1d978918b" dependencies = [ "heck", - "proc-macro2 1.0.47", - "quote 1.0.21", + "proc-macro2", + "quote", "rustversion", - "syn 1.0.104", + "syn", ] [[package]] @@ -7049,34 +5171,14 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" -[[package]] -name = "sval" -version = "1.0.0-alpha.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f6ee7c7b87caf59549e9fe45d6a69c75c8019e79e212a835c5da0e92f0ba08" -dependencies = [ - "serde", -] - -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - [[package]] name = "syn" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae548ec36cf198c0ef7710d3c230987c2d6d7bd98ad6edc0274462724c585ce" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", + "proc-macro2", + "quote", "unicode-ident", ] @@ -7147,15 +5249,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "templatify" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a528032d6917c9a80cf894d9feeffe34056e8d62d3492bbfc15abfdcfa8a8fe1" -dependencies = [ - "bytes 0.4.12", -] - [[package]] name = "termcolor" version = "1.1.3" @@ -7208,18 +5301,8 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8901a55b0a7a06ebc4a674dcca925170da8e613fa3b163a1df804ed10afb154d" dependencies = [ - "quote 1.0.21", - "syn 1.0.104", -] - -[[package]] -name = "textnonce" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f8d70cd784ed1dc33106a18998d77758d281dc40dc3e6d050cf0f5286683" -dependencies = [ - "base64 0.12.3", - "rand 0.7.3", + "quote", + "syn", ] [[package]] @@ -7243,9 +5326,9 @@ version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -7257,121 +5340,16 @@ dependencies = [ "once_cell", ] -[[package]] -name = "thruster" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910effe6fa8063f44f9f2f4d15d758270a679562414235c6781bf3b606b72682" -dependencies = [ - "async-trait", - "bytes 0.5.6", - "bytes 1.3.0", - "fnv", - "futures", - "http 0.1.21", - "http 0.2.8", - "httparse", - "lazy_static", - "log", - "net2", - "num_cpus", - "paste", - "serde", - "serde_derive", - "serde_json", - "smallvec", - "socket2", - "templatify", - "thruster-proc", - "time 0.1.44", - "tokio", - "tokio-stream", - "tokio-util 0.6.10", -] - -[[package]] -name = "thruster-proc" -version = "1.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfac33b0a1b0be1aae8e3ca87005671eb2e33617661c20052c98709410d364f" -dependencies = [ - "lazy_static", - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", - "uuid 0.7.4", -] - -[[package]] -name = "tide" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c459573f0dd2cc734b539047f57489ea875af8ee950860ded20cf93a79a1dee0" -dependencies = [ - "async-h1", - "async-session 2.0.1", - "async-sse", - "async-std", - "async-trait", - "femme", - "futures-util", - "http-client", - "http-types", - "kv-log-macro", - "log", - "pin-project-lite 0.2.9", - "route-recognizer", - "serde", - "serde_json", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" -dependencies = [ - "const_fn", - "libc", - "standback", - "stdweb", - "time-macros 0.1.1", - "version_check", - "winapi", -] - [[package]] name = "time" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" dependencies = [ - "itoa 1.0.2", + "itoa", "libc", "num_threads", - "serde", - "time-macros 0.2.4", -] - -[[package]] -name = "time-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", + "time-macros", ] [[package]] @@ -7380,19 +5358,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2 1.0.47", - "quote 1.0.21", - "standback", - "syn 1.0.104", -] - [[package]] name = "tinyvec" version = "1.6.0" @@ -7410,22 +5375,22 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.22.0" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76ce4a75fb488c605c54bf610f221cea8b0dafb53333c1a67e8ee199dcd2ae3" +checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" dependencies = [ - "autocfg 1.1.0", - "bytes 1.3.0", + "autocfg", + "bytes", "libc", "memchr", "mio", "num_cpus", "parking_lot 0.12.1", - "pin-project-lite 0.2.9", + "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "winapi", + "windows-sys 0.45.0", ] [[package]] @@ -7434,7 +5399,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" dependencies = [ - "pin-project-lite 0.2.9", + "pin-project-lite", "tokio", ] @@ -7444,9 +5409,9 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -7477,7 +5442,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" dependencies = [ "futures-core", - "pin-project-lite 0.2.9", + "pin-project-lite", "tokio", ] @@ -7488,7 +5453,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53474327ae5e166530d17f2d956afcb4f8a004de581b3cae10f12006bc8163e3" dependencies = [ "async-stream", - "bytes 1.3.0", + "bytes", "futures-core", "tokio", "tokio-stream", @@ -7508,33 +5473,17 @@ dependencies = [ "tungstenite", ] -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes 1.3.0", - "futures-core", - "futures-io", - "futures-sink", - "log", - "pin-project-lite 0.2.9", - "slab", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ - "bytes 1.3.0", + "bytes", "futures-core", "futures-io", "futures-sink", - "pin-project-lite 0.2.9", + "pin-project-lite", "tokio", "tracing", ] @@ -7605,12 +5554,12 @@ dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.13.1", - "bytes 1.3.0", + "base64", + "bytes", "futures-core", "futures-util", "h2", - "http 0.2.8", + "http", "http-body", "hyper", "hyper-timeout", @@ -7620,7 +5569,7 @@ dependencies = [ "prost-derive", "tokio", "tokio-stream", - "tokio-util 0.7.3", + "tokio-util", "tower", "tower-layer", "tower-service", @@ -7635,10 +5584,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31fa2c5e870bdce133847d15e075333e6e1ca3fff913001fede6754f3060e367" dependencies = [ "prettyplease", - "proc-macro2 1.0.47", + "proc-macro2", "prost-build", - "quote 1.0.21", - "syn 1.0.104", + "quote", + "syn", ] [[package]] @@ -7651,11 +5600,11 @@ dependencies = [ "futures-util", "indexmap", "pin-project", - "pin-project-lite 0.2.9", - "rand 0.8.5", + "pin-project-lite", + "rand", "slab", "tokio", - "tokio-util 0.7.3", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -7668,13 +5617,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" dependencies = [ "bitflags", - "bytes 1.3.0", + "bytes", "futures-core", "futures-util", - "http 0.2.8", + "http", "http-body", "http-range-header", - "pin-project-lite 0.2.9", + "pin-project-lite", "tower-layer", "tower-service", ] @@ -7685,15 +5634,15 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" dependencies = [ - "base64 0.13.1", + "base64", "bitflags", - "bytes 1.3.0", + "bytes", "futures-core", "futures-util", - "http 0.2.8", + "http", "http-body", "http-range-header", - "pin-project-lite 0.2.9", + "pin-project-lite", "tower", "tower-layer", "tower-service", @@ -7720,7 +5669,7 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if 1.0.0", "log", - "pin-project-lite 0.2.9", + "pin-project-lite", "tracing-attributes", "tracing-core", ] @@ -7731,9 +5680,9 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -7827,7 +5776,7 @@ dependencies = [ "ipnet", "lazy_static", "log", - "rand 0.8.5", + "rand", "smallvec", "thiserror", "tinyvec", @@ -7891,29 +5840,18 @@ version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" dependencies = [ - "base64 0.13.1", + "base64", "byteorder", - "bytes 1.3.0", - "http 0.2.8", + "bytes", + "http", "httparse", "log", "native-tls", - "rand 0.8.5", - "rustls", + "rand", "sha-1", "thiserror", "url", "utf-8", - "webpki", -] - -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -dependencies = [ - "memchr", ] [[package]] @@ -7922,42 +5860,17 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", ] -[[package]] -name = "typemap_rev" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5b74f0a24b5454580a79abb6994393b09adf0ab8070f15827cb666255de155" - [[package]] name = "typenum" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "ubyte" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a58e29f263341a29bb79e14ad7fda5f63b1c7e48929bad4c685d7876b1d04e94" -dependencies = [ - "serde", -] - -[[package]] -name = "uncased" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" -dependencies = [ - "serde", - "version_check", -] - [[package]] name = "unicase" version = "2.6.0" @@ -8000,12 +5913,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - [[package]] name = "unicode-xid" version = "0.2.3" @@ -8018,16 +5925,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array", - "subtle", -] - [[package]] name = "untrusted" version = "0.7.1" @@ -8040,7 +5937,7 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97acb4c28a254fd7a4aeec976c46a7fa404eac4d7c134b30c75144846d7cb8f" dependencies = [ - "base64 0.13.1", + "base64", "chunked_transfer", "log", "native-tls", @@ -8063,7 +5960,6 @@ dependencies = [ "form_urlencoded", "idna 0.3.0", "percent-encoding", - "serde", ] [[package]] @@ -8084,22 +5980,13 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" -[[package]] -name = "uuid" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" -dependencies = [ - "rand 0.6.5", -] - [[package]] name = "uuid" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" dependencies = [ - "getrandom 0.2.7", + "getrandom", "serde", ] @@ -8109,20 +5996,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "value-bag" -version = "1.0.0-alpha.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" -dependencies = [ - "ctor", - "erased-serde", - "serde", - "serde_fmt", - "sval", - "version_check", -] - [[package]] name = "vcpkg" version = "0.2.15" @@ -8152,8 +6025,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", + "proc-macro2", + "quote", ] [[package]] @@ -8165,12 +6038,6 @@ dependencies = [ "libc", ] -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - [[package]] name = "walkdir" version = "2.3.2" @@ -8192,49 +6059,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "warp" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7b8be92646fc3d18b06147664ebc5f48d222686cb11a8755e561a735aacc6d" -dependencies = [ - "bytes 1.3.0", - "futures-channel", - "futures-util", - "headers", - "http 0.2.8", - "hyper", - "log", - "mime", - "mime_guess", - "multipart", - "percent-encoding", - "pin-project", - "rustls-pemfile 0.2.1", - "scoped-tls", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tokio-util 0.7.3", - "tower-service", - "tracing", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -8291,8 +6115,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ "cfg-if 1.0.0", - "serde", - "serde_json", "wasm-bindgen-macro", ] @@ -8305,9 +6127,9 @@ dependencies = [ "bumpalo", "lazy_static", "log", - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", "wasm-bindgen-shared", ] @@ -8329,7 +6151,7 @@ version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" dependencies = [ - "quote 1.0.21", + "quote", "wasm-bindgen-macro-support", ] @@ -8339,9 +6161,9 @@ version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -8418,7 +6240,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1e77abcf538af42517e188c109e4b50ecf6c0ee4d77ede76a438e0306b934dc" dependencies = [ "anyhow", - "base64 0.13.1", + "base64", "bincode", "directories-next", "file-per-thread-logger", @@ -8547,7 +6369,7 @@ dependencies = [ "memfd", "memoffset 0.6.5", "paste", - "rand 0.8.5", + "rand", "rustix", "wasmtime-asm-macros", "wasmtime-environ", @@ -8656,15 +6478,6 @@ dependencies = [ "webpki", ] -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "which" version = "4.4.0" @@ -8715,10 +6528,10 @@ checksum = "c15bf89e66bd1a9463ee529d37b999947befafd792f345d4a82e0d2b28c0845f" dependencies = [ "anyhow", "heck", - "proc-macro2 1.0.47", - "quote 1.0.21", + "proc-macro2", + "quote", "shellexpand", - "syn 1.0.104", + "syn", "witx", ] @@ -8728,9 +6541,9 @@ version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "919fb8f106375c7f6daf7b388a1fea3e2092dedb273b17b2d917522917c07a3c" dependencies = [ - "proc-macro2 1.0.47", - "quote 1.0.21", - "syn 1.0.104", + "proc-macro2", + "quote", + "syn", "wiggle-generate", ] @@ -8785,19 +6598,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.0", - "windows_i686_gnu 0.42.0", - "windows_i686_msvc 0.42.0", - "windows_x86_64_gnu 0.42.0", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.0", + "windows_x86_64_msvc 0.42.1", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] name = "windows_aarch64_msvc" @@ -8807,9 +6644,9 @@ checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" @@ -8819,9 +6656,9 @@ checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" @@ -8831,9 +6668,9 @@ checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" @@ -8843,15 +6680,15 @@ checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" @@ -8861,9 +6698,9 @@ checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "winreg" @@ -8933,7 +6770,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c" dependencies = [ - "time 0.3.11", + "time", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a0e9be6ae..ad2d9a375 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,8 @@ exclude = [ "resources/persist", "resources/secrets", "resources/shared-db", - "resources/static-folder" + "resources/static-folder", + "services" ] [workspace.package] diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 97ca75813..7476811d9 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -37,7 +37,7 @@ struct Input { /// The identifier for a resource input ident: Ident, - /// The shuttle_service builder for this resource + /// The shuttle_runtime builder for this resource builder: Builder, } @@ -134,9 +134,9 @@ fn check_return_type(signature: Signature) -> Option { ReturnType::Default => { emit_error!( signature, - "shuttle_service::main functions need to return a service"; + "shuttle_runtime::main functions need to return a service"; hint = "See the docs for services with first class support"; - doc = "https://docs.rs/shuttle-service/latest/shuttle_service/attr.main.html#shuttle-supported-services" + doc = "https://docs.rs/shuttle-service/latest/shuttle_runtime/attr.main.html#shuttle-supported-services" ); None } @@ -145,9 +145,9 @@ fn check_return_type(signature: Signature) -> Option { _ => { emit_error!( r#type, - "shuttle_service::main functions need to return a first class service or 'Result"; + "shuttle_runtime::main functions need to return a first class service or 'Result"; hint = "See the docs for services with first class support"; - doc = "https://docs.rs/shuttle-service/latest/shuttle_service/attr.main.html#shuttle-supported-services" + doc = "https://docs.rs/shuttle-service/latest/shuttle_runtime/attr.main.html#shuttle-supported-services" ); None } @@ -204,7 +204,7 @@ impl ToTokens for Loader { lit: Lit::Str(str), .. }) => { needs_vars = true; - quote!(&shuttle_service::strfmt(#str, &vars)?) + quote!(&shuttle_runtime::strfmt(#str, &vars)?) } other => quote!(#other), }; @@ -226,7 +226,7 @@ impl ToTokens for Loader { None } else { Some(parse_quote!( - use shuttle_service::ResourceBuilder; + use shuttle_runtime::ResourceBuilder; )) }; @@ -243,16 +243,16 @@ impl ToTokens for Loader { mut #factory_ident: shuttle_runtime::ProvisionerFactory, logger: shuttle_runtime::Logger, ) -> #return_type { - use shuttle_service::Context; - use shuttle_service::tracing_subscriber::prelude::*; + use shuttle_runtime::Context; + use shuttle_runtime::tracing_subscriber::prelude::*; #extra_imports let filter_layer = - shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() - .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) + shuttle_runtime::tracing_subscriber::EnvFilter::try_from_default_env() + .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - shuttle_service::tracing_subscriber::registry() + shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) .init(); @@ -303,15 +303,15 @@ mod tests { mut _factory: shuttle_runtime::ProvisionerFactory, logger: shuttle_runtime::Logger, ) -> ShuttleSimple { - use shuttle_service::Context; - use shuttle_service::tracing_subscriber::prelude::*; + use shuttle_runtime::Context; + use shuttle_runtime::tracing_subscriber::prelude::*; let filter_layer = - shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() - .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) + shuttle_runtime::tracing_subscriber::EnvFilter::try_from_default_env() + .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - shuttle_service::tracing_subscriber::registry() + shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) .init(); @@ -383,16 +383,16 @@ mod tests { mut factory: shuttle_runtime::ProvisionerFactory, logger: shuttle_runtime::Logger, ) -> ShuttleComplex { - use shuttle_service::Context; - use shuttle_service::tracing_subscriber::prelude::*; - use shuttle_service::ResourceBuilder; + use shuttle_runtime::Context; + use shuttle_runtime::tracing_subscriber::prelude::*; + use shuttle_runtime::ResourceBuilder; let filter_layer = - shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() - .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) + shuttle_runtime::tracing_subscriber::EnvFilter::try_from_default_env() + .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - shuttle_service::tracing_subscriber::registry() + shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) .init(); @@ -498,22 +498,22 @@ mod tests { mut factory: shuttle_runtime::ProvisionerFactory, logger: shuttle_runtime::Logger, ) -> ShuttleComplex { - use shuttle_service::Context; - use shuttle_service::tracing_subscriber::prelude::*; - use shuttle_service::ResourceBuilder; + use shuttle_runtime::Context; + use shuttle_runtime::tracing_subscriber::prelude::*; + use shuttle_runtime::ResourceBuilder; let filter_layer = - shuttle_service::tracing_subscriber::EnvFilter::try_from_default_env() - .or_else(|_| shuttle_service::tracing_subscriber::EnvFilter::try_new("INFO")) + shuttle_runtime::tracing_subscriber::EnvFilter::try_from_default_env() + .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - shuttle_service::tracing_subscriber::registry() + shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) .init(); let vars = std::collections::HashMap::from_iter(factory.get_secrets().await?.into_iter().map(|(key, value)| (format!("secrets.{}", key), value))); - let pool = shuttle_shared_db::Postgres::new().size(&shuttle_service::strfmt("10Gb", &vars)?).public(false).build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; + let pool = shuttle_shared_db::Postgres::new().size(&shuttle_runtime::strfmt("10Gb", &vars)?).public(false).build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; complex(pool).await } diff --git a/deployer/tests/deploy_layer/bind-panic/Cargo.toml b/deployer/tests/deploy_layer/bind-panic/Cargo.toml index 5c476820e..5475a549c 100644 --- a/deployer/tests/deploy_layer/bind-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/bind-panic/Cargo.toml @@ -8,6 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } shuttle-runtime = { path = "../../../../runtime" } tokio = "1.22" diff --git a/deployer/tests/deploy_layer/bind-panic/src/main.rs b/deployer/tests/deploy_layer/bind-panic/src/main.rs index b8ccf9c3b..d7badcd69 100644 --- a/deployer/tests/deploy_layer/bind-panic/src/main.rs +++ b/deployer/tests/deploy_layer/bind-panic/src/main.rs @@ -1,15 +1,13 @@ -use shuttle_service::Service; - struct MyService; -#[shuttle_service::async_trait] -impl Service for MyService { - async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::Error> { +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for MyService { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { panic!("panic in bind"); } } -#[shuttle_service::main] -async fn bind_panic() -> Result { +#[shuttle_runtime::main] +async fn bind_panic() -> Result { Ok(MyService) } diff --git a/deployer/tests/deploy_layer/main-panic/Cargo.toml b/deployer/tests/deploy_layer/main-panic/Cargo.toml index 157965845..9e068f31d 100644 --- a/deployer/tests/deploy_layer/main-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/main-panic/Cargo.toml @@ -8,6 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } shuttle-runtime = { path = "../../../../runtime" } tokio = "1.22" diff --git a/deployer/tests/deploy_layer/main-panic/src/main.rs b/deployer/tests/deploy_layer/main-panic/src/main.rs index 4186a4508..fcb8bce0b 100644 --- a/deployer/tests/deploy_layer/main-panic/src/main.rs +++ b/deployer/tests/deploy_layer/main-panic/src/main.rs @@ -1,15 +1,13 @@ -use shuttle_service::Service; - struct MyService; -#[shuttle_service::async_trait] -impl Service for MyService { - async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::Error> { +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for MyService { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { Ok(()) } } -#[shuttle_service::main] -async fn main_panic() -> Result { +#[shuttle_runtime::main] +async fn main_panic() -> Result { panic!("main panic") } diff --git a/deployer/tests/deploy_layer/self-stop/Cargo.toml b/deployer/tests/deploy_layer/self-stop/Cargo.toml index 170cd3670..f740b87b7 100644 --- a/deployer/tests/deploy_layer/self-stop/Cargo.toml +++ b/deployer/tests/deploy_layer/self-stop/Cargo.toml @@ -8,6 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } shuttle-runtime = { path = "../../../../runtime" } tokio = "1.22" diff --git a/deployer/tests/deploy_layer/self-stop/src/main.rs b/deployer/tests/deploy_layer/self-stop/src/main.rs index 8ba075244..9150538b5 100644 --- a/deployer/tests/deploy_layer/self-stop/src/main.rs +++ b/deployer/tests/deploy_layer/self-stop/src/main.rs @@ -1,15 +1,13 @@ -use shuttle_service::Service; - struct MyService; -#[shuttle_service::async_trait] -impl Service for MyService { - async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::error::Error> { +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for MyService { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { Ok(()) } } -#[shuttle_service::main] +#[shuttle_runtime::main] async fn self_stop() -> Result { Ok(MyService) } diff --git a/deployer/tests/deploy_layer/sleep-async/Cargo.toml b/deployer/tests/deploy_layer/sleep-async/Cargo.toml index 3d6e1e4ad..edd2ea6bc 100644 --- a/deployer/tests/deploy_layer/sleep-async/Cargo.toml +++ b/deployer/tests/deploy_layer/sleep-async/Cargo.toml @@ -8,6 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } shuttle-runtime = { path = "../../../../runtime" } tokio = { version = "1.0", features = ["time"]} diff --git a/deployer/tests/deploy_layer/sleep-async/src/main.rs b/deployer/tests/deploy_layer/sleep-async/src/main.rs index 1322552d1..aead71b2d 100644 --- a/deployer/tests/deploy_layer/sleep-async/src/main.rs +++ b/deployer/tests/deploy_layer/sleep-async/src/main.rs @@ -1,20 +1,20 @@ use std::time::Duration; -use shuttle_service::Service; +use shuttle_runtime::Service; use tokio::time::sleep; struct SleepService { duration: u64, } -#[shuttle_service::main] -async fn simple() -> Result { +#[shuttle_runtime::main] +async fn simple() -> Result { Ok(SleepService { duration: 4 }) } -#[shuttle_service::async_trait] +#[shuttle_runtime::async_trait] impl Service for SleepService { - async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::error::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { let duration = Duration::from_secs(self.duration); sleep(duration).await; diff --git a/deployer/tests/resources/bind-panic/Cargo.toml b/deployer/tests/resources/bind-panic/Cargo.toml index 894f3ca8e..d20e3c071 100644 --- a/deployer/tests/resources/bind-panic/Cargo.toml +++ b/deployer/tests/resources/bind-panic/Cargo.toml @@ -9,6 +9,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } shuttle-runtime = { path = "../../../../runtime" } tokio = "1.22" diff --git a/deployer/tests/resources/bind-panic/src/main.rs b/deployer/tests/resources/bind-panic/src/main.rs index b8ccf9c3b..d7badcd69 100644 --- a/deployer/tests/resources/bind-panic/src/main.rs +++ b/deployer/tests/resources/bind-panic/src/main.rs @@ -1,15 +1,13 @@ -use shuttle_service::Service; - struct MyService; -#[shuttle_service::async_trait] -impl Service for MyService { - async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::Error> { +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for MyService { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { panic!("panic in bind"); } } -#[shuttle_service::main] -async fn bind_panic() -> Result { +#[shuttle_runtime::main] +async fn bind_panic() -> Result { Ok(MyService) } diff --git a/deployer/tests/resources/main-panic/Cargo.toml b/deployer/tests/resources/main-panic/Cargo.toml index 157965845..9e068f31d 100644 --- a/deployer/tests/resources/main-panic/Cargo.toml +++ b/deployer/tests/resources/main-panic/Cargo.toml @@ -8,6 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } shuttle-runtime = { path = "../../../../runtime" } tokio = "1.22" diff --git a/deployer/tests/resources/main-panic/src/main.rs b/deployer/tests/resources/main-panic/src/main.rs index 4186a4508..fcb8bce0b 100644 --- a/deployer/tests/resources/main-panic/src/main.rs +++ b/deployer/tests/resources/main-panic/src/main.rs @@ -1,15 +1,13 @@ -use shuttle_service::Service; - struct MyService; -#[shuttle_service::async_trait] -impl Service for MyService { - async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::Error> { +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for MyService { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { Ok(()) } } -#[shuttle_service::main] -async fn main_panic() -> Result { +#[shuttle_runtime::main] +async fn main_panic() -> Result { panic!("main panic") } diff --git a/deployer/tests/resources/sleep-async/Cargo.toml b/deployer/tests/resources/sleep-async/Cargo.toml index 3d6e1e4ad..edd2ea6bc 100644 --- a/deployer/tests/resources/sleep-async/Cargo.toml +++ b/deployer/tests/resources/sleep-async/Cargo.toml @@ -8,6 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-service = { path = "../../../../service" } shuttle-runtime = { path = "../../../../runtime" } tokio = { version = "1.0", features = ["time"]} diff --git a/deployer/tests/resources/sleep-async/src/main.rs b/deployer/tests/resources/sleep-async/src/main.rs index 1322552d1..aead71b2d 100644 --- a/deployer/tests/resources/sleep-async/src/main.rs +++ b/deployer/tests/resources/sleep-async/src/main.rs @@ -1,20 +1,20 @@ use std::time::Duration; -use shuttle_service::Service; +use shuttle_runtime::Service; use tokio::time::sleep; struct SleepService { duration: u64, } -#[shuttle_service::main] -async fn simple() -> Result { +#[shuttle_runtime::main] +async fn simple() -> Result { Ok(SleepService { duration: 4 }) } -#[shuttle_service::async_trait] +#[shuttle_runtime::async_trait] impl Service for SleepService { - async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_service::error::Error> { + async fn bind(mut self, _: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { let duration = Duration::from_secs(self.duration); sleep(duration).await; diff --git a/deployer/tests/resources/tests-fail/Cargo.toml b/deployer/tests/resources/tests-fail/Cargo.toml index ae2a76515..12a8c2a5d 100644 --- a/deployer/tests/resources/tests-fail/Cargo.toml +++ b/deployer/tests/resources/tests-fail/Cargo.toml @@ -7,6 +7,6 @@ edition = "2021" [dependencies] rocket = "0.5.0-rc.2" -shuttle-service = { path = "../../../../service", features = ["web-rocket"] } +shuttle-rocket = { path = "../../../../services/shuttle-rocket"} shuttle-runtime = { path = "../../../../runtime" } tokio = "1.22" diff --git a/deployer/tests/resources/tests-fail/src/main.rs b/deployer/tests/resources/tests-fail/src/main.rs index 85efb0bd3..ccb32383c 100644 --- a/deployer/tests/resources/tests-fail/src/main.rs +++ b/deployer/tests/resources/tests-fail/src/main.rs @@ -6,10 +6,10 @@ fn index() -> &'static str { "Hello, world!" } -#[shuttle_service::main] -async fn rocket() -> shuttle_service::ShuttleRocket { +#[shuttle_runtime::main] +async fn rocket() -> shuttle_rocket::ShuttleRocket { let rocket = rocket::build().mount("/hello", routes![index]); - Ok(rocket) + Ok(rocket.into()) } #[cfg(test)] diff --git a/deployer/tests/resources/tests-pass/Cargo.toml b/deployer/tests/resources/tests-pass/Cargo.toml index ffbd29a9f..e9d19b127 100644 --- a/deployer/tests/resources/tests-pass/Cargo.toml +++ b/deployer/tests/resources/tests-pass/Cargo.toml @@ -7,6 +7,6 @@ edition = "2021" [dependencies] rocket = "0.5.0-rc.2" -shuttle-service = { path = "../../../../service", features = ["web-rocket"] } +shuttle-rocket = { path = "../../../../services/shuttle-rocket"} shuttle-runtime = { path = "../../../../runtime" } tokio = "1.22" diff --git a/deployer/tests/resources/tests-pass/src/main.rs b/deployer/tests/resources/tests-pass/src/main.rs index 2f4525283..08e124e91 100644 --- a/deployer/tests/resources/tests-pass/src/main.rs +++ b/deployer/tests/resources/tests-pass/src/main.rs @@ -6,10 +6,10 @@ fn index() -> &'static str { "Hello, world!" } -#[shuttle_service::main] -async fn rocket() -> shuttle_service::ShuttleRocket { +#[shuttle_runtime::main] +async fn rocket() -> shuttle_rocket::ShuttleRocket { let rocket = rocket::build().mount("/hello", routes![index]); - Ok(rocket) + Ok(rocket.into()) } #[cfg(test)] diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 60f768767..6ab22e9c3 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -16,6 +16,7 @@ async-trait = { workspace = true } chrono = { workspace = true } clap ={ version = "4.0.18", features = ["derive"] } serde_json = { workspace = true } +strfmt = "0.2.2" thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["full"] } tokio-stream = "0.1.11" @@ -51,4 +52,15 @@ portpicker = "0.1.1" futures = { version = "0.3.25" } [features] -next = ["cap-std", "futures", "hyper/server", "rmp-serde", "futures", "wasi-common", "wasmtime", "wasmtime-wasi", "shuttle-common/wasm"] +default = [] +next = [ + "cap-std", + "futures", + "hyper/server", + "rmp-serde", + "futures", + "wasi-common", + "wasmtime", + "wasmtime-wasi", + "shuttle-common/wasm" +] diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 233616493..573a3c6f8 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -4,10 +4,17 @@ mod logger; mod next; mod provisioner_factory; +pub use async_trait::async_trait; pub use legacy::{start, Legacy}; pub use logger::Logger; #[cfg(feature = "next")] pub use next::{AxumWasm, NextArgs}; pub use provisioner_factory::ProvisionerFactory; pub use shuttle_common::storage_manager::StorageManager; -pub use shuttle_service::{main, Error, Service}; +pub use shuttle_service::{main, CustomError, Error, ResourceBuilder, Service}; + +// Dependencies required by the codegen +pub use anyhow::Context; +pub use strfmt::strfmt; +pub use tracing; +pub use tracing_subscriber; diff --git a/service/Cargo.toml b/service/Cargo.toml index 4940fe30d..c895c042e 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -11,42 +11,19 @@ homepage = "https://www.shuttle.rs" doctest = false [dependencies] -actix-web = { version = "4.2.1", optional = true } anyhow = { workspace = true } async-trait = { workspace = true } axum = { workspace = true, optional = true } -bincode = { version = "1.3.3", optional = true } # TODO: debug the libgit2-sys conflict with cargo-edit when upgrading cargo to 0.66 cargo = { version = "0.65.0", optional = true } cargo_metadata = "0.15.2" crossbeam-channel = "0.5.6" -futures = { version = "0.3.25", features = ["std"] } -hyper = { workspace = true, features = ["server", "tcp", "http1"], optional = true } -libloading = { version = "0.7.4", optional = true } -num_cpus = { version = "1.14.0", optional = true } pipe = "0.4.0" -poem = { version = "1.3.49", optional = true } -poise = { version = "0.5.2", optional = true } -rocket = { version = "0.5.0-rc.2", optional = true } -salvo = { version = "0.37.5", optional = true } serde_json = { workspace = true } -serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"], optional = true } strfmt = "0.2.2" thiserror = { workspace = true } -thruster = { version = "1.3.0", optional = true } -tide = { version = "0.16.0", optional = true } -tokio = { version = "=1.22.0", features = ["sync"] } -tower = { workspace = true, features = ["make"], optional = true } +tokio = { version = "1.26.0", features = ["sync"] } tracing = { workspace = true } -tracing-subscriber = { workspace = true, features = ["env-filter"] } -warp = { version = "0.3.3", optional = true } - -# Tide does not have tokio support. So make sure async-std is compatible with tokio -# https://github.com/http-rs/tide/issues/791 -[dependencies.async-std] -version = "1.12.0" -optional = true -features = ["tokio1"] [dependencies.shuttle-codegen] workspace = true @@ -57,26 +34,10 @@ workspace = true features = ["tracing", "service"] [dev-dependencies] -portpicker = { workspace = true } -sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } -tokio = { version = "1.22.0", features = ["macros"] } -uuid = { workspace = true, features = ["v4"] } +tokio = { version = "1.26.0", features = ["macros", "rt"] } [features] default = ["codegen"] codegen = ["shuttle-codegen/frameworks"] builder = ["cargo"] - -web-actix-web = ["actix-web", "num_cpus"] -web-axum = ["axum"] -web-poem = ["poem"] -web-rocket = ["rocket"] -web-salvo = ["salvo"] -web-thruster = ["thruster"] -web-tide = ["tide", "async-std"] -web-tower = ["tower", "hyper"] -web-warp = ["warp"] - -bot-poise = ["poise"] -bot-serenity = ["serenity"] diff --git a/service/src/builder.rs b/service/src/builder.rs index 1d1358a8b..baf0082d8 100644 --- a/service/src/builder.rs +++ b/service/src/builder.rs @@ -4,15 +4,15 @@ use anyhow::{anyhow, bail, Context}; use cargo::core::compiler::{CompileKind, CompileMode, CompileTarget, MessageFormat}; use cargo::core::{Manifest, Shell, Summary, Verbosity, Workspace}; use cargo::ops::{clean, compile, CleanOptions, CompileOptions}; +use cargo::util::homedir; use cargo::util::interning::InternedString; -use cargo::util::{homedir, ToSemver}; use cargo::Config; use cargo_metadata::Message; use crossbeam_channel::Sender; use pipe::PipeWriter; use tracing::{error, trace}; -use crate::{NAME, NEXT_NAME, VERSION}; +use crate::NEXT_NAME; /// How to run/build the project pub enum Runtime { @@ -57,7 +57,6 @@ pub async fn build_crate( let is_next = is_next(summary); if !is_next { - check_version(summary)?; ensure_binary(current.manifest())?; } else { ensure_cdylib(current.manifest_mut())?; @@ -208,29 +207,6 @@ fn ensure_cdylib(manifest: &mut Manifest) -> anyhow::Result<()> { } } -/// Check that the crate being build is compatible with this version of loader -fn check_version(summary: &Summary) -> anyhow::Result<()> { - let valid_version = VERSION.to_semver().unwrap(); - - let version_req = if let Some(shuttle) = summary - .dependencies() - .iter() - .find(|dependency| dependency.package_name() == NAME) - { - shuttle.version_req() - } else { - return Err(anyhow!("this crate does not use the shuttle service")); - }; - - if version_req.matches(&valid_version) { - Ok(()) - } else { - Err(anyhow!( - "the version of `shuttle-service` specified as a dependency to this service ({version_req}) is not supported by this project instance ({valid_version}); try updating `shuttle-service` to '{valid_version}' or update the project instance using `cargo shuttle project rm` and `cargo shuttle project new`" - )) - } -} - /// Ensure `panic = "abort"` is not set: fn check_no_panic(ws: &Workspace) -> anyhow::Result<()> { if let Some(profiles) = ws.profiles() { diff --git a/service/src/lib.rs b/service/src/lib.rs index bd6be6537..030a4c9ae 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -213,16 +213,10 @@ use std::collections::BTreeMap; use std::net::SocketAddr; use std::path::PathBuf; -pub use async_trait::async_trait; - -// Pub uses by `codegen` -pub use anyhow::Context; -pub use strfmt::strfmt; -pub use tracing; -pub use tracing_subscriber; +use async_trait::async_trait; pub mod error; -pub use error::Error; +pub use error::{CustomError, Error}; pub use shuttle_common::database; @@ -395,209 +389,4 @@ pub trait Service: Send { async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error>; } -#[cfg(feature = "web-rocket")] -#[async_trait] -impl Service for rocket::Rocket { - async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { - let shutdown = rocket::config::Shutdown { - ctrlc: false, - ..rocket::config::Shutdown::default() - }; - - let config = self - .figment() - .clone() - .merge((rocket::Config::ADDRESS, addr.ip())) - .merge((rocket::Config::PORT, addr.port())) - .merge((rocket::Config::LOG_LEVEL, rocket::config::LogLevel::Off)) - .merge((rocket::Config::SHUTDOWN, shutdown)); - - let _rocket = self - .configure(config) - .launch() - .await - .map_err(error::CustomError::new)?; - - Ok(()) - } -} - -#[cfg(feature = "web-rocket")] -pub type ShuttleRocket = Result, Error>; - -#[cfg(feature = "web-poem")] -#[async_trait] -impl Service for T -where - T: poem::Endpoint + Sync + Send + 'static, -{ - async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { - poem::Server::new(poem::listener::TcpListener::bind(addr)) - .run(self) - .await - .map_err(error::CustomError::new)?; - - Ok(()) - } -} - -#[cfg(feature = "web-poem")] -pub type ShuttlePoem = Result; - -#[cfg(feature = "web-warp")] -#[async_trait] -impl Service for T -where - T: Send + Sync + Clone + 'static + warp::Filter, - T::Extract: warp::reply::Reply, -{ - async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { - warp::serve(*self).run(addr).await; - Ok(()) - } -} - -#[cfg(feature = "web-warp")] -pub type ShuttleWarp = Result, Error>; - -#[cfg(feature = "web-axum")] -#[async_trait] -impl Service for axum::Router { - async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { - axum::Server::bind(&addr) - .serve(self.into_make_service()) - .await - .map_err(error::CustomError::new)?; - - Ok(()) - } -} - -#[cfg(feature = "web-axum")] -pub type ShuttleAxum = Result; - -#[cfg(feature = "web-actix-web")] -#[async_trait] -impl Service for F -where - F: FnOnce(&mut actix_web::web::ServiceConfig) + Sync + Send + Clone + 'static, -{ - async fn bind(mut self, addr: SocketAddr) -> Result<(), Error> { - // Start a worker for each cpu, but no more than 4. - let worker_count = num_cpus::get().max(4); - - let srv = actix_web::HttpServer::new(move || actix_web::App::new().configure(self.clone())) - .workers(worker_count) - .bind(addr)? - .run(); - srv.await.map_err(error::CustomError::new)?; - - Ok(()) - } -} -#[cfg(feature = "web-actix-web")] -pub type ShuttleActixWeb = Result; - -#[cfg(feature = "web-salvo")] -#[async_trait] -impl Service for salvo::Router { - async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { - salvo::Server::new(salvo::listener::TcpListener::bind(addr)) - .serve(self) - .await; - - Ok(()) - } -} - -#[cfg(feature = "web-salvo")] -pub type ShuttleSalvo = Result; - -#[cfg(feature = "web-thruster")] -#[async_trait] -impl Service for T -where - T: thruster::ThrusterServer + Sync + Send + 'static, -{ - async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { - self.build(&addr.ip().to_string(), addr.port()).await; - - Ok(()) - } -} - -#[cfg(feature = "web-thruster")] -pub type ShuttleThruster = Result; - -#[cfg(feature = "web-tide")] -#[async_trait] -impl Service for tide::Server -where - T: Clone + Send + Sync + 'static, -{ - async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { - self.listen(addr).await.map_err(error::CustomError::new)?; - - Ok(()) - } -} - -#[cfg(feature = "web-tide")] -pub type ShuttleTide = Result, Error>; - -#[cfg(feature = "web-tower")] -#[async_trait] -impl Service for T -where - T: tower::Service, Response = hyper::Response> - + Clone - + Send - + Sync - + 'static, - T::Error: std::error::Error + Send + Sync, - T::Future: std::future::Future + Send + Sync, -{ - async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error> { - let shared = tower::make::Shared::new(self); - hyper::Server::bind(&addr) - .serve(shared) - .await - .map_err(error::CustomError::new)?; - - Ok(()) - } -} - -#[cfg(feature = "bot-serenity")] -#[async_trait] -impl Service for serenity::Client { - async fn bind(mut self, _addr: SocketAddr) -> Result<(), error::Error> { - self.start().await.map_err(error::CustomError::new)?; - - Ok(()) - } -} - -#[cfg(feature = "bot-serenity")] -pub type ShuttleSerenity = Result; - -#[cfg(feature = "bot-poise")] -#[async_trait] -impl Service for std::sync::Arc> -where - T: std::marker::Send + std::marker::Sync + 'static, - E: std::marker::Send + std::marker::Sync + 'static, -{ - async fn bind(mut self, _addr: SocketAddr) -> Result<(), error::Error> { - self.start().await.map_err(error::CustomError::new)?; - - Ok(()) - } -} - -#[cfg(feature = "bot-poise")] -pub type ShuttlePoise = Result>, Error>; - -pub const VERSION: &str = env!("CARGO_PKG_VERSION"); -pub const NAME: &str = env!("CARGO_PKG_NAME"); pub const NEXT_NAME: &str = "shuttle-next"; diff --git a/service/src/persist.rs b/service/src/persist.rs deleted file mode 100644 index adeebc263..000000000 --- a/service/src/persist.rs +++ /dev/null @@ -1,108 +0,0 @@ -use crate::{Factory, ResourceBuilder, ServiceName}; -use async_trait::async_trait; -use bincode::{deserialize_from, serialize_into, Error as BincodeError}; -use serde::de::DeserializeOwned; -use serde::Serialize; -use std::fs; -use std::fs::File; -use std::io::BufReader; -use std::io::BufWriter; -use std::path::PathBuf; -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum PersistError { - #[error("failed to open file: {0}")] - Open(std::io::Error), - #[error("failed to create folder: {0}")] - CreateFolder(std::io::Error), - #[error("failed to serialize data: {0}")] - Serialize(BincodeError), - #[error("failed to deserialize data: {0}")] - Deserialize(BincodeError), -} - -pub struct Persist; - -pub struct PersistInstance { - service_name: ServiceName, -} - -impl PersistInstance { - pub fn save(&self, key: &str, struc: T) -> Result<(), PersistError> { - let storage_folder = self.get_storage_folder(); - fs::create_dir_all(storage_folder).map_err(PersistError::CreateFolder)?; - - let file_path = self.get_storage_file(key); - let file = File::create(file_path).map_err(PersistError::Open)?; - let mut writer = BufWriter::new(file); - Ok(serialize_into(&mut writer, &struc).map_err(PersistError::Serialize))? - } - - pub fn load(&self, key: &str) -> Result - where - T: DeserializeOwned, - { - let file_path = self.get_storage_file(key); - let file = File::open(file_path).map_err(PersistError::Open)?; - let reader = BufReader::new(file); - Ok(deserialize_from(reader).map_err(PersistError::Deserialize))? - } - - fn get_storage_folder(&self) -> PathBuf { - ["shuttle_persist", &self.service_name.to_string()] - .iter() - .collect() - } - - fn get_storage_file(&self, key: &str) -> PathBuf { - let mut path = self.get_storage_folder(); - path.push(format!("{key}.bin")); - - path - } -} - -#[async_trait] -impl ResourceBuilder for Persist { - fn new() -> Self { - Self {} - } - - async fn build(self, factory: &mut dyn Factory) -> Result { - Ok(PersistInstance { - service_name: factory.get_service_name(), - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::str::FromStr; - - #[test] - fn test_save_and_load() { - let persist = PersistInstance { - service_name: ServiceName::from_str("test").unwrap(), - }; - - persist.save("test", "test").unwrap(); - let result: String = persist.load("test").unwrap(); - assert_eq!(result, "test"); - } - - #[test] - fn test_load_error() { - let persist = PersistInstance { - service_name: ServiceName::from_str("test").unwrap(), - }; - - // unwrapp error - let result = persist.load::("error").unwrap_err(); - assert_eq!( - result.to_string(), - "failed to open file: No such file or directory (os error 2)" - ); - } -} diff --git a/service/tests/resources/is-bin/Cargo.toml b/service/tests/resources/is-bin/Cargo.toml index 52abbeab9..71680d565 100644 --- a/service/tests/resources/is-bin/Cargo.toml +++ b/service/tests/resources/is-bin/Cargo.toml @@ -7,6 +7,6 @@ edition = "2021" [dependencies] axum = "0.6.0" +shuttle-axum = { path = "../../../../services/shuttle-axum" } shuttle-runtime = { path = "../../../../runtime" } -shuttle-service = { path = "../../../", features = ["web-axum"] } tokio = { version = "1.22.0" } diff --git a/service/tests/resources/is-bin/src/main.rs b/service/tests/resources/is-bin/src/main.rs index 21ffd2090..19e9bd1a6 100644 --- a/service/tests/resources/is-bin/src/main.rs +++ b/service/tests/resources/is-bin/src/main.rs @@ -1,6 +1,6 @@ -#[shuttle_service::main] -async fn axum() -> shuttle_service::ShuttleAxum { +#[shuttle_runtime::main] +async fn axum() -> shuttle_axum::ShuttleAxum { let router = axum::Router::new(); - Ok(router) + Ok(router.into()) } diff --git a/service/tests/resources/not-bin/Cargo.toml b/service/tests/resources/not-bin/Cargo.toml index 8d34c0b74..6bef68b6f 100644 --- a/service/tests/resources/not-bin/Cargo.toml +++ b/service/tests/resources/not-bin/Cargo.toml @@ -10,5 +10,5 @@ crate-type = ["cdylib", "staticlib"] [dependencies] rocket = "0.5.0-rc.2" -shuttle-service = { path = "../../../", features = ["web-rocket"] } +shuttle-rocket = { path = "../../../../services/shuttle-rocket" } shuttle-runtime = { path = "../../../../runtime" } diff --git a/service/tests/resources/not-bin/src/lib.rs b/service/tests/resources/not-bin/src/lib.rs index 329aed72c..1c00c9ad3 100644 --- a/service/tests/resources/not-bin/src/lib.rs +++ b/service/tests/resources/not-bin/src/lib.rs @@ -1,7 +1,7 @@ // This will fail to compile since it's a library. -#[shuttle_service::main] -async fn rocket() -> shuttle_service::ShuttleRocket { +#[shuttle_runtime::main] +async fn rocket() -> shuttle_rocket::ShuttleRocket { let rocket = rocket::build(); - Ok(rocket) + Ok(rocket.into()) } diff --git a/service/tests/resources/not-shuttle/Cargo.toml b/service/tests/resources/not-shuttle/Cargo.toml index b951779af..ecd61ac3c 100644 --- a/service/tests/resources/not-shuttle/Cargo.toml +++ b/service/tests/resources/not-shuttle/Cargo.toml @@ -8,4 +8,4 @@ edition = "2021" [dependencies] axum = "0.6.0" shuttle-runtime = { path = "../../../../runtime" } -shuttle-service = { path = "../../../", features = ["web-axum"] } +shuttle-axum = { path = "../../../../services/shuttle-axum" } diff --git a/service/tests/resources/not-shuttle/src/main.rs b/service/tests/resources/not-shuttle/src/main.rs index 9cf9d865b..2edbe4d18 100644 --- a/service/tests/resources/not-shuttle/src/main.rs +++ b/service/tests/resources/not-shuttle/src/main.rs @@ -1,6 +1,6 @@ // This service cannot be hosted on shuttle since it is missing the runtime the shuttle main macro would have added!!! -async fn axum() -> shuttle_service::ShuttleAxum { +async fn axum() -> shuttle_axum::ShuttleAxum { let router = axum::Router::new(); - Ok(router) + Ok(router.into()) } diff --git a/services/README.md b/services/README.md new file mode 100644 index 000000000..39272e508 --- /dev/null +++ b/services/README.md @@ -0,0 +1,5 @@ +## Service Integrations +The list of supported frameworks for shuttle is always growing. If you feel we are missing a framework you would like, then feel to create a feature request for your desired framework. + +## Writing your own service integration +Creating your own service integration is quite simple. You only need to implement the [`Service`](https://docs.rs/shuttle-service/latest/shuttle_service/trait.Service.html) trait for your framework. diff --git a/services/shuttle-actix-web/Cargo.toml b/services/shuttle-actix-web/Cargo.toml new file mode 100644 index 000000000..b80256c5c --- /dev/null +++ b/services/shuttle-actix-web/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "shuttle-actix-web" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +actix-web = { version = "4.3.1" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +num_cpus = "1.15.0" + +[dev-dependencies] +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-actix-web/src/lib.rs b/services/shuttle-actix-web/src/lib.rs new file mode 100644 index 000000000..793edfc93 --- /dev/null +++ b/services/shuttle-actix-web/src/lib.rs @@ -0,0 +1,60 @@ +//! Shuttle service integration for the Actix Web framework. +//! ## Example +//! ```rust,no_run +//! use actix_web::{get, web::ServiceConfig}; +//! use shuttle_actix_web::ShuttleActixWeb; +//! +//! #[get("/hello")] +//! async fn hello_world() -> &'static str { +//! "Hello World!" +//! } +//! +//! #[shuttle_runtime::main] +//! async fn actix_web( +//! ) -> ShuttleActixWeb { +//! let config = move |cfg: &mut ServiceConfig| { +//! cfg.service(hello_world); +//! }; +//! +//! Ok(config.into()) +//! } +//! ``` +use std::net::SocketAddr; + +/// A wrapper type for a closure that returns an [actix_web::web::ServiceConfig] so we can implement +/// [shuttle_runtime::Service] for it. +#[derive(Clone)] +pub struct ActixWebService(pub F); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for ActixWebService +where + F: FnOnce(&mut actix_web::web::ServiceConfig) + Send + Clone + 'static, +{ + async fn bind(mut self, addr: SocketAddr) -> Result<(), shuttle_runtime::Error> { + // Start a worker for each cpu, but no more than 4. + let worker_count = num_cpus::get().min(4); + + let server = + actix_web::HttpServer::new(move || actix_web::App::new().configure(self.0.clone())) + .workers(worker_count) + .bind(addr)? + .run(); + + server.await.map_err(shuttle_runtime::CustomError::new)?; + + Ok(()) + } +} + +impl From for ActixWebService +where + F: FnOnce(&mut actix_web::web::ServiceConfig) + Send + Clone + 'static, +{ + fn from(service_config: F) -> Self { + Self(service_config) + } +} + +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleActixWeb = Result, shuttle_runtime::Error>; diff --git a/services/shuttle-axum/Cargo.toml b/services/shuttle-axum/Cargo.toml new file mode 100644 index 000000000..dc7002c3d --- /dev/null +++ b/services/shuttle-axum/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "shuttle-axum" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +axum = { version = "0.6.10" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +[dev-dependencies] +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-axum/src/lib.rs b/services/shuttle-axum/src/lib.rs new file mode 100644 index 000000000..6ca9589ff --- /dev/null +++ b/services/shuttle-axum/src/lib.rs @@ -0,0 +1,43 @@ +//! Shuttle service integration for the Axum web framework. +//! ## Example +//! ```rust,no_run +//! use axum::{routing::get, Router}; +//! +//! async fn hello_world() -> &'static str { +//! "Hello, world!" +//! } +//! +//! #[shuttle_runtime::main] +//! async fn axum() -> shuttle_axum::ShuttleAxum { +//! let router = Router::new().route("/hello", get(hello_world)); +//! +//! Ok(router.into()) +//! } +//! ``` +use shuttle_runtime::{CustomError, Error}; +use std::net::SocketAddr; + +/// A wrapper type for [axum::Router] so we can implement [shuttle_runtime::Service] for it. +pub struct AxumService(pub axum::Router); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for AxumService { + /// Takes the router that is returned by the user in their [shuttle_runtime::main] function + /// and binds to an address passed in by shuttle. + async fn bind(mut self, addr: SocketAddr) -> Result<(), Error> { + axum::Server::bind(&addr) + .serve(self.0.into_make_service()) + .await + .map_err(CustomError::new)?; + + Ok(()) + } +} + +impl From for AxumService { + fn from(router: axum::Router) -> Self { + Self(router) + } +} +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleAxum = Result; diff --git a/services/shuttle-poem/Cargo.toml b/services/shuttle-poem/Cargo.toml new file mode 100644 index 000000000..9b68f4cee --- /dev/null +++ b/services/shuttle-poem/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "shuttle-poem" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +poem = { version = "1.3.55" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +[dev-dependencies] +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-poem/src/lib.rs b/services/shuttle-poem/src/lib.rs new file mode 100644 index 000000000..4adef8782 --- /dev/null +++ b/services/shuttle-poem/src/lib.rs @@ -0,0 +1,49 @@ +//! Shuttle service integration for the Poem web framework. +//! ## Example +//! ```rust,no_run +//! use poem::{get, handler, Route}; +//! use shuttle_poem::ShuttlePoem; +//! +//! #[handler] +//! fn hello_world() -> &'static str { +//! "Hello, world!" +//! } +//! +//! #[shuttle_runtime::main] +//! async fn poem() -> ShuttlePoem { +//! let app = Route::new().at("/hello", get(hello_world)); +//! +//! Ok(app.into()) +//! } +//! +//! ``` + +/// A wrapper type for [poem::Endpoint] so we can implement [shuttle_runtime::Service] for it. +pub struct PoemService(pub T); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for PoemService +where + T: poem::Endpoint + Send + 'static, +{ + async fn bind(mut self, addr: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { + poem::Server::new(poem::listener::TcpListener::bind(addr)) + .run(self.0) + .await + .map_err(shuttle_runtime::CustomError::new)?; + + Ok(()) + } +} + +impl From for PoemService +where + T: poem::Endpoint + Send + 'static, +{ + fn from(router: T) -> Self { + Self(router) + } +} + +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttlePoem = Result, shuttle_runtime::Error>; diff --git a/services/shuttle-poise/Cargo.toml b/services/shuttle-poise/Cargo.toml new file mode 100644 index 000000000..8f153217d --- /dev/null +++ b/services/shuttle-poise/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "shuttle-poise" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +poise = { version = "0.5.2" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +[dev-dependencies] +shuttle-secrets = { path = "../../resources/secrets" } +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-poise/src/lib.rs b/services/shuttle-poise/src/lib.rs new file mode 100644 index 000000000..fb88c86d5 --- /dev/null +++ b/services/shuttle-poise/src/lib.rs @@ -0,0 +1,76 @@ +//! Shuttle service integration for the Poise discord bot framework. +//! ## Example +//! ```rust,no_run +//! use shuttle_runtime::Context as _; +//! use poise::serenity_prelude as serenity; +//! use shuttle_secrets::SecretStore; +//! use shuttle_poise::ShuttlePoise; +//! +//! struct Data {} // User data, which is stored and accessible in all command invocations +//! type Error = Box; +//! type Context<'a> = poise::Context<'a, Data, Error>; +//! +//! /// Responds with "world!" +//! #[poise::command(slash_command)] +//! async fn hello(ctx: Context<'_>) -> Result<(), Error> { +//! ctx.say("world!").await?; +//! Ok(()) +//! } +//! +//! #[shuttle_runtime::main] +//! async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { +//! // Get the discord token set in `Secrets.toml` +//! let discord_token = secret_store +//! .get("DISCORD_TOKEN") +//! .context("'DISCORD_TOKEN' was not found")?; +//! +//! let framework = poise::Framework::builder() +//! .options(poise::FrameworkOptions { +//! commands: vec![hello()], +//! ..Default::default() +//! }) +//! .token(discord_token) +//! .intents(serenity::GatewayIntents::non_privileged()) +//! .setup(|ctx, _ready, framework| { +//! Box::pin(async move { +//! poise::builtins::register_globally(ctx, &framework.options().commands).await?; +//! Ok(Data {}) +//! }) +//! }) +//! .build() +//! .await +//! .map_err(shuttle_runtime::CustomError::new)?; +//! +//! Ok(framework.into()) +//! } +//! ``` +use std::net::SocketAddr; +use std::sync::Arc; + +/// A wrapper type for [poise::Framework] so we can implement [shuttle_runtime::Service] for it. +pub struct PoiseService(pub Arc>); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for PoiseService +where + T: Send + Sync + 'static, + E: Send + Sync + 'static, +{ + async fn bind(mut self, _addr: SocketAddr) -> Result<(), shuttle_runtime::Error> { + self.0 + .start() + .await + .map_err(shuttle_runtime::CustomError::new)?; + + Ok(()) + } +} + +impl From>> for PoiseService { + fn from(framework: Arc>) -> Self { + Self(framework) + } +} + +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttlePoise = Result, shuttle_runtime::Error>; diff --git a/services/shuttle-rocket/Cargo.toml b/services/shuttle-rocket/Cargo.toml new file mode 100644 index 000000000..ac2337964 --- /dev/null +++ b/services/shuttle-rocket/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "shuttle-rocket" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rocket = { version = "0.5.0-rc.2" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +[dev-dependencies] +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-rocket/src/lib.rs b/services/shuttle-rocket/src/lib.rs new file mode 100644 index 000000000..e891cec0f --- /dev/null +++ b/services/shuttle-rocket/src/lib.rs @@ -0,0 +1,63 @@ +//! Shuttle service integration for the Rocket web framework. +//! ## Example +//! ```rust,no_run +//! #[macro_use] +//! extern crate rocket; +//! +//! # fn main() { +//! #[get("/")] +//! fn index() -> &'static str { +//! "Hello, world!" +//! } +//! +//! #[shuttle_runtime::main] +//! async fn rocket() -> shuttle_rocket::ShuttleRocket { +//! let rocket = rocket::build().mount("/hello", routes![index]); +//! +//! Ok(rocket.into()) +//! } +//! # } +//! ``` +use std::net::SocketAddr; + +/// A wrapper type for [rocket::Rocket] so we can implement [shuttle_runtime::Service] for it. +pub struct RocketService(pub rocket::Rocket); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for RocketService { + /// Takes the router that is returned by the user in their [shuttle_runtime::main] function + /// and binds to an address passed in by shuttle. + async fn bind(mut self, addr: SocketAddr) -> Result<(), shuttle_runtime::Error> { + let shutdown = rocket::config::Shutdown { + ctrlc: false, + ..rocket::config::Shutdown::default() + }; + + let config = self + .0 + .figment() + .clone() + .merge((rocket::Config::ADDRESS, addr.ip())) + .merge((rocket::Config::PORT, addr.port())) + .merge((rocket::Config::LOG_LEVEL, rocket::config::LogLevel::Off)) + .merge((rocket::Config::SHUTDOWN, shutdown)); + + let _rocket = self + .0 + .configure(config) + .launch() + .await + .map_err(shuttle_runtime::CustomError::new)?; + + Ok(()) + } +} + +impl From> for RocketService { + fn from(router: rocket::Rocket) -> Self { + Self(router) + } +} + +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleRocket = Result; diff --git a/services/shuttle-salvo/Cargo.toml b/services/shuttle-salvo/Cargo.toml new file mode 100644 index 000000000..4568225fe --- /dev/null +++ b/services/shuttle-salvo/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "shuttle-salvo" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +salvo = { version = "0.37.5" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +[dev-dependencies] +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-salvo/src/lib.rs b/services/shuttle-salvo/src/lib.rs new file mode 100644 index 000000000..a38d4ab28 --- /dev/null +++ b/services/shuttle-salvo/src/lib.rs @@ -0,0 +1,44 @@ +//! Shuttle service integration for the Salvo web framework. +//! ## Example +//! ```rust,no_run +//! use salvo::prelude::*; +//! +//! #[handler] +//! async fn hello_world(res: &mut Response) { +//! res.render(Text::Plain("Hello, world!")); +//! } +//! +//! #[shuttle_runtime::main] +//! async fn salvo() -> shuttle_salvo::ShuttleSalvo { +//! let router = Router::with_path("hello").get(hello_world); +//! +//! Ok(router.into()) +//! } +//! +//! ``` +use shuttle_runtime::Error; +use std::net::SocketAddr; + +/// A wrapper type for [salvo::Router] so we can implement [shuttle_runtime::Service] for it. +pub struct SalvoService(pub salvo::Router); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for SalvoService { + /// Takes the router that is returned by the user in their [shuttle_runtime::main] function + /// and binds to an address passed in by shuttle. + async fn bind(mut self, addr: SocketAddr) -> Result<(), Error> { + salvo::Server::new(salvo::listener::TcpListener::bind(addr)) + .serve(self.0) + .await; + + Ok(()) + } +} + +impl From for SalvoService { + fn from(router: salvo::Router) -> Self { + Self(router) + } +} +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleSalvo = Result; diff --git a/services/shuttle-serenity/Cargo.toml b/services/shuttle-serenity/Cargo.toml new file mode 100644 index 000000000..c1e768f5a --- /dev/null +++ b/services/shuttle-serenity/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "shuttle-serenity" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +[dev-dependencies] +anyhow = "1.0.69" +shuttle-secrets = { path = "../../resources/secrets" } +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } +tracing = "0.1.37" diff --git a/services/shuttle-serenity/src/lib.rs b/services/shuttle-serenity/src/lib.rs new file mode 100644 index 000000000..c216b80f9 --- /dev/null +++ b/services/shuttle-serenity/src/lib.rs @@ -0,0 +1,76 @@ +//! Shuttle service integration for the Serenity discord bot framework. +//! ## Example +//! ```rust,no_run +//! use anyhow::anyhow; +//! use serenity::async_trait; +//! use serenity::model::channel::Message; +//! use serenity::model::gateway::Ready; +//! use serenity::prelude::*; +//! use shuttle_secrets::SecretStore; +//! use tracing::{error, info}; +//! +//! struct Bot; +//! +//! #[async_trait] +//! impl EventHandler for Bot { +//! async fn message(&self, ctx: Context, msg: Message) { +//! if msg.content == "!hello" { +//! if let Err(e) = msg.channel_id.say(&ctx.http, "world!").await { +//! error!("Error sending message: {:?}", e); +//! } +//! } +//! } +//! +//! async fn ready(&self, _: Context, ready: Ready) { +//! info!("{} is connected!", ready.user.name); +//! } +//! } +//! +//! #[shuttle_runtime::main] +//! async fn serenity( +//! #[shuttle_secrets::Secrets] secret_store: SecretStore, +//! ) -> shuttle_serenity::ShuttleSerenity { +//! // Get the discord token set in `Secrets.toml` +//! let token = if let Some(token) = secret_store.get("DISCORD_TOKEN") { +//! token +//! } else { +//! return Err(anyhow!("'DISCORD_TOKEN' was not found").into()); +//! }; +//! +//! // Set gateway intents, which decides what events the bot will be notified about +//! let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; +//! +//! let client = Client::builder(&token, intents) +//! .event_handler(Bot) +//! .await +//! .expect("Err creating client"); +//! +//! Ok(client.into()) +//! } +//! +//! ``` +use shuttle_runtime::{CustomError, Error}; +use std::net::SocketAddr; + +/// A wrapper type for [serenity::Client] so we can implement [shuttle_runtime::Service] for it. +pub struct SerenityService(pub serenity::Client); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for SerenityService { + /// Takes the client that is returned by the user in their [shuttle_runtime::main] function + /// and starts it. + async fn bind(mut self, _addr: SocketAddr) -> Result<(), Error> { + self.0.start().await.map_err(CustomError::new)?; + + Ok(()) + } +} + +impl From for SerenityService { + fn from(router: serenity::Client) -> Self { + Self(router) + } +} + +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleSerenity = Result; diff --git a/services/shuttle-thruster/Cargo.toml b/services/shuttle-thruster/Cargo.toml new file mode 100644 index 000000000..af839c677 --- /dev/null +++ b/services/shuttle-thruster/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "shuttle-thruster" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +thruster = { version = "1.3.0" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +[dev-dependencies] +thruster = { version = "1.3.0", features = ["hyper_server"] } +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-thruster/src/lib.rs b/services/shuttle-thruster/src/lib.rs new file mode 100644 index 000000000..f642db1dd --- /dev/null +++ b/services/shuttle-thruster/src/lib.rs @@ -0,0 +1,53 @@ +//! Shuttle service integration for the Thruster web framework. +//! ## Example +//! ```rust,no_run +//! use thruster::{ +//! context::basic_hyper_context::{generate_context, BasicHyperContext as Ctx, HyperRequest}, +//! m, middleware_fn, App, HyperServer, MiddlewareNext, MiddlewareResult, ThrusterServer, +//! }; +//! +//! #[middleware_fn] +//! async fn hello(mut context: Ctx, _next: MiddlewareNext) -> MiddlewareResult { +//! context.body("Hello, World!"); +//! Ok(context) +//! } +//! +//! #[shuttle_runtime::main] +//! async fn thruster() -> shuttle_thruster::ShuttleThruster> { +//! let server = HyperServer::new( +//! App::::create(generate_context, ()).get("/hello", m![hello]), +//! ); +//! +//! Ok(server.into()) +//! } +//! ``` +use shuttle_runtime::Error; +use std::net::SocketAddr; + +/// A wrapper type for [thruster::ThrusterServer] so we can implement [shuttle_runtime::Service] for it. +pub struct ThrusterService(pub T); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for ThrusterService +where + T: thruster::ThrusterServer + Send + 'static, +{ + /// Takes the server that is returned by the user in their [shuttle_runtime::main] function + /// and binds to an address passed in by shuttle. + async fn bind(mut self, addr: SocketAddr) -> Result<(), Error> { + self.0.build(&addr.ip().to_string(), addr.port()).await; + + Ok(()) + } +} + +impl From for ThrusterService +where + T: thruster::ThrusterServer + Send + 'static, +{ + fn from(router: T) -> Self { + Self(router) + } +} +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleThruster = Result, Error>; diff --git a/services/shuttle-tide/Cargo.toml b/services/shuttle-tide/Cargo.toml new file mode 100644 index 000000000..41ec5df63 --- /dev/null +++ b/services/shuttle-tide/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "shuttle-tide" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tide = { version = "0.16.0" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +# Tide does not have tokio support. So make sure async-std is compatible with tokio +# https://github.com/http-rs/tide/issues/791 +[dependencies.async-std] +version = "1.12.0" +features = ["tokio1"] + +[dev-dependencies] +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-tide/src/lib.rs b/services/shuttle-tide/src/lib.rs new file mode 100644 index 000000000..c2ecb8807 --- /dev/null +++ b/services/shuttle-tide/src/lib.rs @@ -0,0 +1,40 @@ +//! Shuttle service integration for the Tide web framework. +//! ## Example +//! ```rust,no_run +//! #[shuttle_runtime::main] +//! async fn tide() -> shuttle_tide::ShuttleTide<()> { +//! let mut app = tide::new(); +//! app.with(tide::log::LogMiddleware::new()); +//! +//! app.at("/hello").get(|_| async { Ok("Hello, world!") }); +//! +//! Ok(app.into()) +//! } +//! ``` +use shuttle_runtime::{CustomError, Error}; +use std::net::SocketAddr; + +/// A wrapper type for [tide::Server(pub tide::Server); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for TideService +where + T: Clone + Send + Sync + 'static, +{ + /// Takes the router that is returned by the user in their [shuttle_runtime::main] function + /// and binds to an address passed in by shuttle. + async fn bind(mut self, addr: SocketAddr) -> Result<(), Error> { + self.0.listen(addr).await.map_err(CustomError::new)?; + + Ok(()) + } +} + +impl From> for TideService { + fn from(router: tide::Server) -> Self { + Self(router) + } +} +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleTide = Result, Error>; diff --git a/services/shuttle-tower/Cargo.toml b/services/shuttle-tower/Cargo.toml new file mode 100644 index 000000000..162508255 --- /dev/null +++ b/services/shuttle-tower/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "shuttle-tower" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +hyper = { version = "0.14.23", features = ["server", "tcp", "http1"] } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +tower = { version = "0.4.13", features = ["make"] } + +[dev-dependencies] +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-tower/src/lib.rs b/services/shuttle-tower/src/lib.rs new file mode 100644 index 000000000..6c00610cc --- /dev/null +++ b/services/shuttle-tower/src/lib.rs @@ -0,0 +1,87 @@ +//! Shuttle service integration for the Tower framework. +//! ## Example +//! ```rust,no_run +//! use std::convert::Infallible; +//! use std::future::Future; +//! use std::pin::Pin; +//! use std::task::{Context, Poll}; +//! +//! #[derive(Clone)] +//! struct HelloWorld; +//! +//! impl tower::Service> for HelloWorld { +//! type Response = hyper::Response; +//! type Error = Infallible; +//! type Future = Pin> + Send + Sync>>; +//! +//! fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { +//! Poll::Ready(Ok(())) +//! } +//! +//! fn call(&mut self, _req: hyper::Request) -> Self::Future { +//! let body = hyper::Body::from("Hello, world!"); +//! let resp = hyper::Response::builder() +//! .status(200) +//! .body(body) +//! .expect("Unable to create the `hyper::Response` object"); +//! +//! let fut = async { Ok(resp) }; +//! +//! Box::pin(fut) +//! } +//! } +//! +//! #[shuttle_runtime::main] +//! async fn tower() -> shuttle_tower::ShuttleTower { +//! let service = HelloWorld; +//! +//! Ok(service.into()) +//! } +//! ``` +use shuttle_runtime::{CustomError, Error}; +use std::net::SocketAddr; + +/// A wrapper type for [tower::Service] so we can implement [shuttle_runtime::Service] for it. +pub struct TowerService(pub T); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for TowerService +where + T: tower::Service, Response = hyper::Response> + + Clone + + Send + + Sync + + 'static, + T::Error: std::error::Error + Send + Sync, + T::Future: std::future::Future + Send + Sync, +{ + /// Takes the service that is returned by the user in their [shuttle_runtime::main] function + /// and binds to an address passed in by shuttle. + async fn bind(mut self, addr: SocketAddr) -> Result<(), Error> { + let shared = tower::make::Shared::new(self.0); + hyper::Server::bind(&addr) + .serve(shared) + .await + .map_err(CustomError::new)?; + + Ok(()) + } +} + +impl From for TowerService +where + T: tower::Service, Response = hyper::Response> + + Clone + + Send + + Sync + + 'static, + T::Error: std::error::Error + Send + Sync, + T::Future: std::future::Future + Send + Sync, +{ + fn from(service: T) -> Self { + Self(service) + } +} + +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleTower = Result, Error>; diff --git a/services/shuttle-warp/Cargo.toml b/services/shuttle-warp/Cargo.toml new file mode 100644 index 000000000..7953981a2 --- /dev/null +++ b/services/shuttle-warp/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "shuttle-warp" +version = "0.1.0" +edition = "2021" + +[workspace] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +warp = { version = "0.3.3" } +shuttle-runtime = { path = "../../runtime", version = "0.1.0" } + +[dev-dependencies] +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-warp/src/lib.rs b/services/shuttle-warp/src/lib.rs new file mode 100644 index 000000000..acaef062f --- /dev/null +++ b/services/shuttle-warp/src/lib.rs @@ -0,0 +1,53 @@ +//! Shuttle service integration for the Warp web framework. +//! ## Example +//! ```rust,no_run +//! use warp::Filter; +//! use warp::Reply; +//! +//! #[shuttle_runtime::main] +//! async fn warp() -> shuttle_warp::ShuttleWarp<(impl Reply,)> { +//! let route = warp::any().map(|| "Hello, World!"); +//! Ok(route.boxed().into()) +//! } +//! ``` +use shuttle_runtime::Error; +use std::net::SocketAddr; +use std::ops::Deref; + +/// A wrapper type for [warp::Filter] so we can implement [shuttle_runtime::Service] for it. +pub struct WarpService(pub T); + +#[shuttle_runtime::async_trait] +impl shuttle_runtime::Service for WarpService +where + T: Send + Sync + Clone + 'static + warp::Filter, + T::Extract: warp::reply::Reply, +{ + /// Takes the router that is returned by the user in their [shuttle_runtime::main] function + /// and binds to an address passed in by shuttle. + async fn bind(mut self, addr: SocketAddr) -> Result<(), Error> { + warp::serve((*self).clone()).run(addr).await; + Ok(()) + } +} + +impl From for WarpService +where + T: Send + Sync + Clone + 'static + warp::Filter, + T::Extract: warp::reply::Reply, +{ + fn from(router: T) -> Self { + Self(router) + } +} + +impl Deref for WarpService { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +/// The return type that should be returned from the [shuttle_runtime::main] function. +pub type ShuttleWarp = Result>, Error>; From 69819c917b6b7e5278b35fb2f15662ffa5b0a79e Mon Sep 17 00:00:00 2001 From: Pieter Date: Tue, 14 Mar 2023 13:11:50 +0200 Subject: [PATCH 55/74] [next] tests: CI go green (#704) * tests: thread local tracing * tests: bind panic in runtime * tests: post create project params * tests: fix cargo-shuttle * misc: std missing from tracing * tests: update main test for shuttle runtime * ci: merge workspace jobs * ci: move service to platform tests * ci: better names * refactor: trim dependencies Trim dependencies to minimize the build times of user projects. * refactor: catch error and panics in main * tests: trim cargo-shuttle tests Make sure there is only one main test for each major vector / feature. * refactor: missing serde derive * refactor: missing serde std * ci: balance machines * tests: give more time * ci: bump images more * ci: bump workspace image * ci: 2xlarge not available '/ --- .circleci/config.yml | 55 +--- Cargo.lock | 1 - Cargo.toml | 2 +- auth/src/api/handlers.rs | 2 +- auth/src/user.rs | 2 +- auth/tests/api/session.rs | 2 +- cargo-shuttle/src/lib.rs | 2 +- cargo-shuttle/tests/integration/run.rs | 11 + codegen/tests/ui/main/missing-return.stderr | 4 +- codegen/tests/ui/main/return-tuple.stderr | 4 +- common/Cargo.toml | 20 +- common/src/backends/auth.rs | 213 +------------ common/src/backends/future.rs | 17 -- common/src/backends/metrics.rs | 11 +- common/src/backends/tracing.rs | 50 +-- common/src/claims.rs | 285 ++++++++++++++++++ common/src/lib.rs | 14 + common/src/models/mod.rs | 12 - common/src/wasm.rs | 4 +- deployer/src/deployment/deploy_layer.rs | 14 +- deployer/src/deployment/queue.rs | 2 +- deployer/src/deployment/run.rs | 93 ++---- deployer/src/handlers/mod.rs | 3 +- .../tests/deploy_layer/bind-panic/Cargo.toml | 2 +- .../tests/deploy_layer/main-panic/Cargo.toml | 2 +- .../tests/deploy_layer/self-stop/Cargo.toml | 2 +- .../tests/deploy_layer/self-stop/src/main.rs | 2 +- .../tests/deploy_layer/sleep-async/Cargo.toml | 2 +- examples | 2 +- gateway/src/api/latest.rs | 11 +- gateway/src/auth.rs | 2 +- gateway/src/lib.rs | 6 +- proto/Cargo.toml | 2 +- proto/runtime.proto | 2 + proto/src/lib.rs | 2 +- provisioner/src/lib.rs | 2 +- runtime/Cargo.toml | 6 +- runtime/src/legacy/mod.rs | 135 ++++++--- runtime/src/logger.rs | 2 +- runtime/src/next/mod.rs | 7 +- runtime/src/provisioner_factory.rs | 2 +- runtime/tests/integration/loader.rs | 34 +-- service/Cargo.toml | 17 +- 43 files changed, 546 insertions(+), 519 deletions(-) create mode 100644 common/src/claims.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index f8f86c2ad..4bbc03100 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,10 +9,12 @@ executors: docker-rust: docker: - image: cimg/rust:1.65.0 + resource_class: small image-ubuntu: machine: image: ubuntu-2204:2022.04.1 docker_layer_caching: true + resource_class: xlarge # sscache steps are from this guide # https://medium.com/@edouard.oger/rust-caching-on-circleci-using-sccache-c996344f0115 @@ -159,8 +161,9 @@ commands: - << parameters.target >>.env jobs: - workspace-fmt: + workspace: executor: docker-rust + resource_class: xlarge steps: - checkout - restore-cargo-cache @@ -170,14 +173,6 @@ jobs: # https://github.com/DevinR528/cargo-sort/pull/29 is merged # - run: cargo install cargo-sort # - run: cargo sort --check --workspace - - run: cargo check --workspace --all-targets - - save-cargo-cache - workspace-clippy: - executor: docker-rust - steps: - - checkout - - restore-cargo-cache - - install-protoc - run: | cargo clippy --tests \ --all-targets \ @@ -214,20 +209,6 @@ jobs: -A clippy::format-push-string - run: cargo test --all-features --manifest-path << parameters.path >>/Cargo.toml -- --nocapture - save-cargo-cache - service-test: - # Using an image since tests will start a docker container - executor: image-ubuntu - steps: - - install-rust - - checkout - - restore-cargo-cache - - run: - name: Run unit tests - command: cargo test --package shuttle-service --features="codegen,builder" --lib -- --nocapture - - run: - name: Run integration tests - command: cargo test --package shuttle-service --features="codegen,builder" --test '*' -- --nocapture - - save-cargo-cache platform-test: parameters: crate: @@ -254,7 +235,6 @@ jobs: (cargo test --package << parameters.crate >> --all-features --test '*' -- --list 2>&1 | grep -q "no test target matches pattern") && echo "nothing to test" || cargo test --package << parameters.crate >> --all-features --test '*' -- --nocapture - save-cargo-cache e2e-test: - resource_class: xlarge executor: image-ubuntu steps: - install-rust @@ -286,7 +266,6 @@ jobs: key: docker-buildx-{{ .Branch }} when: always build-and-push: - resource_class: xlarge executor: image-ubuntu steps: - checkout @@ -360,7 +339,7 @@ jobs: build-binaries-mac: macos: xcode: 12.5.1 - resource_class: medium + resource_class: xlarge steps: - checkout - run: @@ -398,11 +377,9 @@ jobs: workflows: ci: jobs: - - workspace-fmt - - workspace-clippy: - requires: - - workspace-fmt + - workspace - check-standalone: + name: << matrix.path >> matrix: parameters: path: @@ -422,28 +399,26 @@ workflows: - services/shuttle-tide - services/shuttle-tower - services/shuttle-warp - - service-test: - requires: - - workspace-clippy - platform-test: + name: << matrix.crate >> requires: - - workspace-clippy + - workspace matrix: parameters: crate: [ "shuttle-auth", - "shuttle-deployer", "cargo-shuttle", "shuttle-codegen", "shuttle-common", + "shuttle-deployer", "shuttle-proto", "shuttle-provisioner", - "shuttle-runtime" + "shuttle-runtime", + "shuttle-service", ] - e2e-test: requires: - - service-test - platform-test - check-standalone filters: @@ -459,7 +434,7 @@ workflows: name: build-binaries-x86_64-gnu image: ubuntu-2204:2022.04.1 target: x86_64-unknown-linux-gnu - resource_class: medium + resource_class: xlarge filters: branches: only: production @@ -467,7 +442,7 @@ workflows: name: build-binaries-x86_64-musl image: ubuntu-2204:2022.04.1 target: x86_64-unknown-linux-musl - resource_class: medium + resource_class: xlarge filters: branches: only: production @@ -475,7 +450,7 @@ workflows: name: build-binaries-aarch64 image: ubuntu-2004:202101-01 target: aarch64-unknown-linux-musl - resource_class: arm.medium + resource_class: arm.xlarge filters: branches: only: production diff --git a/Cargo.lock b/Cargo.lock index ec6ba3832..0ace53bce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4840,7 +4840,6 @@ version = "0.11.0" dependencies = [ "anyhow", "async-trait", - "axum", "cargo", "cargo_metadata", "crossbeam-channel", diff --git a/Cargo.toml b/Cargo.toml index ad2d9a375..86627999b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ shuttle-service = { path = "service", version = "0.11.0" } anyhow = "1.0.66" async-trait = "0.1.58" axum = { version = "0.6.0", default-features = false } -chrono = { version = "0.4.23", default-features = false, features = ["clock"] } +chrono = { version = "0.4.23", default-features = false } clap = { version = "4.0.27", features = [ "derive" ] } headers = "0.3.8" http = "0.2.8" diff --git a/auth/src/api/handlers.rs b/auth/src/api/handlers.rs index 2d08221ce..b45061bf6 100644 --- a/auth/src/api/handlers.rs +++ b/auth/src/api/handlers.rs @@ -9,7 +9,7 @@ use axum::{ use axum_sessions::extractors::{ReadableSession, WritableSession}; use http::StatusCode; use serde::{Deserialize, Serialize}; -use shuttle_common::{backends::auth::Claim, models::user}; +use shuttle_common::{claims::Claim, models::user}; use tracing::instrument; use super::{ diff --git a/auth/src/user.rs b/auth/src/user.rs index 264adfb60..8d9b5a0c9 100644 --- a/auth/src/user.rs +++ b/auth/src/user.rs @@ -9,7 +9,7 @@ use axum::{ }; use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Deserializer, Serialize}; -use shuttle_common::backends::auth::Scope; +use shuttle_common::claims::Scope; use sqlx::{query, Row, SqlitePool}; use tracing::{trace, Span}; diff --git a/auth/tests/api/session.rs b/auth/tests/api/session.rs index aa07e8bdd..b768a0096 100644 --- a/auth/tests/api/session.rs +++ b/auth/tests/api/session.rs @@ -2,7 +2,7 @@ use axum_extra::extract::cookie::{self, Cookie}; use http::{Request, StatusCode}; use hyper::Body; use serde_json::{json, Value}; -use shuttle_common::backends::auth::Claim; +use shuttle_common::claims::Claim; use crate::helpers::app; diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 730d11360..2194391db 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -1049,7 +1049,7 @@ mod tests { "Secrets.toml", "Secrets.toml.example", "Shuttle.toml", - "src/lib.rs", + "src/main.rs", ] ); } diff --git a/cargo-shuttle/tests/integration/run.rs b/cargo-shuttle/tests/integration/run.rs index e11dbe3dd..cc2244520 100644 --- a/cargo-shuttle/tests/integration/run.rs +++ b/cargo-shuttle/tests/integration/run.rs @@ -58,6 +58,7 @@ async fn cargo_shuttle_run(working_directory: &str, external: bool) -> String { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn rocket_hello_world() { let url = cargo_shuttle_run("../examples/rocket/hello-world", false).await; @@ -120,6 +121,7 @@ async fn rocket_postgres() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn rocket_authentication() { let url = cargo_shuttle_run("../examples/rocket/authentication", false).await; let client = reqwest::Client::new(); @@ -176,6 +178,7 @@ async fn rocket_authentication() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn actix_web_hello_world() { let url = cargo_shuttle_run("../examples/actix-web/hello-world", false).await; @@ -192,6 +195,7 @@ async fn actix_web_hello_world() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn axum_hello_world() { let url = cargo_shuttle_run("../examples/axum/hello-world", false).await; @@ -208,6 +212,7 @@ async fn axum_hello_world() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn tide_hello_world() { let url = cargo_shuttle_run("../examples/tide/hello-world", false).await; @@ -224,6 +229,7 @@ async fn tide_hello_world() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn tower_hello_world() { let url = cargo_shuttle_run("../examples/tower/hello-world", false).await; @@ -240,6 +246,7 @@ async fn tower_hello_world() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn warp_hello_world() { let url = cargo_shuttle_run("../examples/warp/hello-world", false).await; @@ -256,6 +263,7 @@ async fn warp_hello_world() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn poem_hello_world() { let url = cargo_shuttle_run("../examples/poem/hello-world", false).await; @@ -273,6 +281,7 @@ async fn poem_hello_world() { // This example uses a shared Postgres. Thus local runs should create a docker container for it. #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn poem_postgres() { let url = cargo_shuttle_run("../examples/poem/postgres", false).await; let client = reqwest::Client::new(); @@ -336,6 +345,7 @@ async fn poem_mongodb() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn salvo_hello_world() { let url = cargo_shuttle_run("../examples/salvo/hello-world", false).await; @@ -352,6 +362,7 @@ async fn salvo_hello_world() { } #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn thruster_hello_world() { let url = cargo_shuttle_run("../examples/thruster/hello-world", false).await; diff --git a/codegen/tests/ui/main/missing-return.stderr b/codegen/tests/ui/main/missing-return.stderr index e84ed9923..7ec24dffd 100644 --- a/codegen/tests/ui/main/missing-return.stderr +++ b/codegen/tests/ui/main/missing-return.stderr @@ -1,7 +1,7 @@ -error: shuttle_service::main functions need to return a service +error: shuttle_runtime::main functions need to return a service = help: See the docs for services with first class support - = note: https://docs.rs/shuttle-service/latest/shuttle_service/attr.main.html#shuttle-supported-services + = note: https://docs.rs/shuttle-service/latest/shuttle_runtime/attr.main.html#shuttle-supported-services --> tests/ui/main/missing-return.rs:2:1 | diff --git a/codegen/tests/ui/main/return-tuple.stderr b/codegen/tests/ui/main/return-tuple.stderr index b9fed7820..94da0bcb5 100644 --- a/codegen/tests/ui/main/return-tuple.stderr +++ b/codegen/tests/ui/main/return-tuple.stderr @@ -1,7 +1,7 @@ -error: shuttle_service::main functions need to return a first class service or 'Result +error: shuttle_runtime::main functions need to return a first class service or 'Result = help: See the docs for services with first class support - = note: https://docs.rs/shuttle-service/latest/shuttle_service/attr.main.html#shuttle-supported-services + = note: https://docs.rs/shuttle-service/latest/shuttle_runtime/attr.main.html#shuttle-supported-services --> tests/ui/main/return-tuple.rs:2:28 | diff --git a/common/Cargo.toml b/common/Cargo.toml index 05b0494b5..49c4f736f 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -12,10 +12,10 @@ anyhow = { workspace = true, optional = true } async-trait = { workspace = true , optional = true } axum = { workspace = true, optional = true } bytes = { version = "1.3.0", optional = true } -chrono = { workspace = true, features = ["serde"] } +chrono = { workspace = true } comfy-table = { version = "6.1.3", optional = true } crossterm = { version = "0.25.0", optional = true } -headers = { workspace = true } +headers = { workspace = true, optional = true } http = { workspace = true, optional = true } http-body = { version = "0.4.5", optional = true } http-serde = { version = "1.1.2", optional = true } @@ -25,31 +25,33 @@ once_cell = { workspace = true, optional = true } opentelemetry = { workspace = true, optional = true } opentelemetry-http = { workspace = true, optional = true } opentelemetry-otlp = { version = "0.11.0", optional = true } -pin-project = { workspace = true } +pin-project = { workspace = true, optional = true } prost-types = { workspace = true, optional = true } reqwest = { version = "0.11.13", optional = true } rmp-serde = { version = "1.1.1", optional = true } rustrict = { version = "0.5.5", optional = true } -serde = { workspace = true } +serde = { workspace = true, features = ["derive", "std"] } serde_json = { workspace = true, optional = true } strum = { workspace = true, features = ["derive"], optional = true } thiserror = { workspace = true, optional = true } tonic = { version = "0.8.3", optional = true } tower = { workspace = true, optional = true } tower-http = { workspace = true, optional = true } -tracing = { workspace = true } +tracing = { workspace = true, features = ["std"] } tracing-opentelemetry = { workspace = true, optional = true } tracing-subscriber = { workspace = true, optional = true } ttl_cache = { workspace = true, optional = true } uuid = { workspace = true, features = ["v4", "serde"], optional = true } [features] -backend = ["async-trait", "axum/matched-path", "bytes", "http", "http-body", "hyper/client", "jsonwebtoken", "opentelemetry", "opentelemetry-http", "opentelemetry-otlp", "thiserror", "tower", "tower-http", "tracing-opentelemetry", "tracing-subscriber/env-filter", "tracing-subscriber/fmt", "ttl_cache"] -display = ["comfy-table", "crossterm"] -models = ["anyhow", "async-trait", "display", "http", "prost-types", "reqwest", "serde_json", "service", "thiserror"] +backend = ["async-trait", "axum/matched-path", "claims", "hyper/client", "opentelemetry-otlp", "thiserror", "tower-http", "tracing-subscriber/env-filter", "tracing-subscriber/fmt", "ttl_cache"] +claims = ["bytes", "chrono/clock", "headers", "http", "http-body", "jsonwebtoken", "opentelemetry", "opentelemetry-http", "pin-project", "tower", "tracing", "tracing-opentelemetry"] +display = ["chrono/clock", "comfy-table", "crossterm"] +error = ["prost-types", "serde_json", "thiserror", "uuid"] +models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json", "service"] service = ["chrono/serde", "once_cell", "rustrict", "serde/derive", "strum", "uuid"] tracing = ["serde_json"] -wasm = ["http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] +wasm = ["chrono/clock", "http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] [dev-dependencies] axum = { workspace = true } diff --git a/common/src/backends/auth.rs b/common/src/backends/auth.rs index dc293c24b..f87bd3fed 100644 --- a/common/src/backends/auth.rs +++ b/common/src/backends/auth.rs @@ -1,13 +1,11 @@ -use std::{convert::Infallible, future::Future, ops::Add, pin::Pin, sync::Arc}; +use std::{convert::Infallible, future::Future, pin::Pin, sync::Arc}; use async_trait::async_trait; use bytes::Bytes; -use chrono::{Duration, Utc}; use headers::{authorization::Bearer, Authorization, HeaderMapExt}; use http::{Request, Response, StatusCode, Uri}; use http_body::combinators::UnsyncBoxBody; use hyper::{body, Body, Client}; -use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header as JwtHeader, Validation}; use opentelemetry::global; use opentelemetry_http::HeaderInjector; use serde::{Deserialize, Serialize}; @@ -16,14 +14,14 @@ use tower::{Layer, Service}; use tracing::{error, trace, Span}; use tracing_opentelemetry::OpenTelemetrySpanExt; +use crate::claims::{Claim, Scope}; + use super::{ cache::{CacheManagement, CacheManager}, - future::{ResponseFuture, StatusCodeFuture}, + future::StatusCodeFuture, headers::XShuttleAdminSecret, }; -pub const EXP_MINUTES: i64 = 5; -const ISS: &str = "shuttle"; const PUBLIC_KEY_CACHE_KEY: &str = "shuttle.public-key"; /// Layer to check the admin secret set by deployer is correct @@ -86,164 +84,12 @@ where } } -/// The scope of operations that can be performed on shuttle -/// Every scope defaults to read and will use a suffix for updating tasks -#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] -#[serde(rename_all = "snake_case")] -pub enum Scope { - /// Read the details, such as status and address, of a deployment - Deployment, - - /// Push a new deployment - DeploymentPush, - - /// Read the logs of a deployment - Logs, - - /// Read the details of a service - Service, - - /// Create a new service - ServiceCreate, - - /// Read the status of a project - Project, - - /// Create a new project - ProjectCreate, - - /// Get the resources for a project - Resources, - - /// Provision new resources for a project or update existing ones - ResourcesWrite, - - /// List the secrets of a project - Secret, - - /// Add or update secrets of a project - SecretWrite, - - /// Get list of users - User, - - /// Add or update users - UserCreate, - - /// Create an ACME account - AcmeCreate, - - /// Create a custom domain, - CustomDomainCreate, - - /// Admin level scope to internals - Admin, -} - #[derive(Deserialize, Serialize)] /// Response used internally to pass around JWT token pub struct ConvertResponse { pub token: String, } -#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] -pub struct Claim { - /// Expiration time (as UTC timestamp). - pub exp: usize, - /// Issued at (as UTC timestamp). - iat: usize, - /// Issuer. - iss: String, - /// Not Before (as UTC timestamp). - nbf: usize, - /// Subject (whom token refers to). - pub sub: String, - /// Scopes this token can access - pub scopes: Vec, - /// The original token that was parsed - token: Option, -} - -impl Claim { - /// Create a new claim for a user with the given scopes - pub fn new(sub: String, scopes: Vec) -> Self { - let iat = Utc::now(); - let exp = iat.add(Duration::minutes(EXP_MINUTES)); - - Self { - exp: exp.timestamp() as usize, - iat: iat.timestamp() as usize, - iss: ISS.to_string(), - nbf: iat.timestamp() as usize, - sub, - scopes, - token: None, - } - } - - pub fn into_token(self, encoding_key: &EncodingKey) -> Result { - if let Some(token) = self.token { - Ok(token) - } else { - encode( - &JwtHeader::new(jsonwebtoken::Algorithm::EdDSA), - &self, - encoding_key, - ) - .map_err(|err| { - error!( - error = &err as &dyn std::error::Error, - "failed to convert claim to token" - ); - match err.kind() { - jsonwebtoken::errors::ErrorKind::Json(_) => StatusCode::INTERNAL_SERVER_ERROR, - jsonwebtoken::errors::ErrorKind::Crypto(_) => StatusCode::SERVICE_UNAVAILABLE, - _ => StatusCode::INTERNAL_SERVER_ERROR, - } - }) - } - } - - pub fn from_token(token: &str, public_key: &[u8]) -> Result { - let decoding_key = DecodingKey::from_ed_der(public_key); - let mut validation = Validation::new(jsonwebtoken::Algorithm::EdDSA); - validation.set_issuer(&[ISS]); - - trace!(token, "converting token to claim"); - let mut claim: Self = decode(token, &decoding_key, &validation) - .map_err(|err| { - error!( - error = &err as &dyn std::error::Error, - "failed to convert token to claim" - ); - match err.kind() { - jsonwebtoken::errors::ErrorKind::InvalidSignature - | jsonwebtoken::errors::ErrorKind::InvalidAlgorithmName - | jsonwebtoken::errors::ErrorKind::ExpiredSignature - | jsonwebtoken::errors::ErrorKind::InvalidIssuer - | jsonwebtoken::errors::ErrorKind::ImmatureSignature => { - StatusCode::UNAUTHORIZED - } - jsonwebtoken::errors::ErrorKind::InvalidToken - | jsonwebtoken::errors::ErrorKind::InvalidAlgorithm - | jsonwebtoken::errors::ErrorKind::Base64(_) - | jsonwebtoken::errors::ErrorKind::Json(_) - | jsonwebtoken::errors::ErrorKind::Utf8(_) => StatusCode::BAD_REQUEST, - jsonwebtoken::errors::ErrorKind::MissingAlgorithm => { - StatusCode::INTERNAL_SERVER_ERROR - } - jsonwebtoken::errors::ErrorKind::Crypto(_) => StatusCode::SERVICE_UNAVAILABLE, - _ => StatusCode::INTERNAL_SERVER_ERROR, - } - })? - .claims; - - claim.token = Some(token.to_string()); - - Ok(claim) - } -} - /// Trait to get a public key asynchronously #[async_trait] pub trait PublicKeyFn: Send + Sync + Clone { @@ -439,53 +285,6 @@ where } } -/// This layer takes a claim on a request extension and uses it's internal token to set the Authorization Bearer -#[derive(Clone)] -pub struct ClaimLayer; - -impl Layer for ClaimLayer { - type Service = ClaimService; - - fn layer(&self, inner: S) -> Self::Service { - ClaimService { inner } - } -} - -#[derive(Clone)] -pub struct ClaimService { - inner: S, -} - -impl Service>> for ClaimService -where - S: Service>> + Send + 'static, - S::Future: Send + 'static, -{ - type Response = S::Response; - type Error = S::Error; - type Future = ResponseFuture; - - fn poll_ready( - &mut self, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, mut req: Request>) -> Self::Future { - if let Some(claim) = req.extensions().get::() { - if let Some(token) = claim.token.clone() { - req.headers_mut() - .typed_insert(Authorization::bearer(&token).expect("to set JWT token")); - } - } - - let future = self.inner.call(req); - - ResponseFuture(future) - } -} - /// Check that the required scopes are set on the [Claim] extension on a [Request] #[derive(Clone)] pub struct ScopedLayer { @@ -568,7 +367,9 @@ mod tests { use serde_json::json; use tower::{ServiceBuilder, ServiceExt}; - use super::{Claim, JwtAuthenticationLayer, Scope, ScopedLayer}; + use crate::claims::{Claim, Scope}; + + use super::{JwtAuthenticationLayer, ScopedLayer}; #[test] fn to_token_and_back() { diff --git a/common/src/backends/future.rs b/common/src/backends/future.rs index 5603fdaa0..e50bd41d4 100644 --- a/common/src/backends/future.rs +++ b/common/src/backends/future.rs @@ -8,23 +8,6 @@ use axum::response::Response; use http::StatusCode; use pin_project::pin_project; -// Future for layers that just return the inner response -#[pin_project] -pub struct ResponseFuture(#[pin] pub F); - -impl Future for ResponseFuture -where - F: Future>, -{ - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let this = self.project(); - - this.0.poll(cx) - } -} - /// Future for layers that might return a different status code #[pin_project(project = StatusCodeProj)] pub enum StatusCodeFuture { diff --git a/common/src/backends/metrics.rs b/common/src/backends/metrics.rs index 9d7fc2b77..0ecc7ebec 100644 --- a/common/src/backends/metrics.rs +++ b/common/src/backends/metrics.rs @@ -54,6 +54,9 @@ impl TraceLayer { /// /// # Example /// ``` + /// use shuttle_common::{request_span, backends::metrics::TraceLayer}; + /// use tracing::field; + /// /// TraceLayer::new(|request| { /// request_span!( /// request, @@ -206,7 +209,7 @@ mod tests { use tower::ServiceExt; use tracing::field; use tracing_fluent_assertions::{AssertionRegistry, AssertionsLayer}; - use tracing_subscriber::{layer::SubscriberExt, Registry}; + use tracing_subscriber::layer::SubscriberExt; use super::{Metrics, TraceLayer}; @@ -221,9 +224,9 @@ mod tests { #[tokio::test] async fn trace_layer() { let assertion_registry = AssertionRegistry::default(); - let base_subscriber = Registry::default(); - let subscriber = base_subscriber.with(AssertionsLayer::new(&assertion_registry)); - tracing::subscriber::set_global_default(subscriber).unwrap(); + let subscriber = + tracing_subscriber::registry().with(AssertionsLayer::new(&assertion_registry)); + let _guard = tracing::subscriber::set_default(subscriber); // Put in own block to make sure assertion to not interfere with the next test { diff --git a/common/src/backends/tracing.rs b/common/src/backends/tracing.rs index 64a95cb8f..a3fa04eb7 100644 --- a/common/src/backends/tracing.rs +++ b/common/src/backends/tracing.rs @@ -11,7 +11,7 @@ use opentelemetry::{ sdk::{propagation::TraceContextPropagator, trace, Resource}, KeyValue, }; -use opentelemetry_http::{HeaderExtractor, HeaderInjector}; +use opentelemetry_http::HeaderExtractor; use opentelemetry_otlp::WithExportConfig; use pin_project::pin_project; use tower::{Layer, Service}; @@ -19,8 +19,6 @@ use tracing::{debug_span, instrument::Instrumented, Instrument, Span, Subscriber use tracing_opentelemetry::OpenTelemetrySpanExt; use tracing_subscriber::{fmt, prelude::*, registry::LookupSpan, EnvFilter}; -use super::future::ResponseFuture; - pub fn setup_tracing(subscriber: S, service_name: &str) where S: Subscriber + for<'a> LookupSpan<'a> + Send + Sync, @@ -139,49 +137,3 @@ where ExtractPropagationFuture { response_future } } } - -/// This layer adds the current tracing span to any outgoing request -#[derive(Clone)] -pub struct InjectPropagationLayer; - -impl Layer for InjectPropagationLayer { - type Service = InjectPropagation; - - fn layer(&self, inner: S) -> Self::Service { - InjectPropagation { inner } - } -} - -#[derive(Clone)] -pub struct InjectPropagation { - inner: S, -} - -impl Service> for InjectPropagation -where - S: Service> + Send + 'static, - S::Future: Send + 'static, -{ - type Response = S::Response; - type Error = S::Error; - type Future = ResponseFuture; - - fn poll_ready( - &mut self, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, mut req: Request) -> Self::Future { - let cx = Span::current().context(); - - global::get_text_map_propagator(|propagator| { - propagator.inject_context(&cx, &mut HeaderInjector(req.headers_mut())) - }); - - let future = self.inner.call(req); - - ResponseFuture(future) - } -} diff --git a/common/src/claims.rs b/common/src/claims.rs new file mode 100644 index 000000000..c9e4d35df --- /dev/null +++ b/common/src/claims.rs @@ -0,0 +1,285 @@ +use std::{ + future::Future, + ops::Add, + pin::Pin, + task::{Context, Poll}, +}; + +use bytes::Bytes; +use chrono::{Duration, Utc}; +use headers::{Authorization, HeaderMapExt}; +use http::{Request, StatusCode}; +use http_body::combinators::UnsyncBoxBody; +use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation}; +use opentelemetry::global; +use opentelemetry_http::HeaderInjector; +use pin_project::pin_project; +use serde::{Deserialize, Serialize}; +use tower::{Layer, Service}; +use tracing::{error, trace, Span}; +use tracing_opentelemetry::OpenTelemetrySpanExt; + +pub const EXP_MINUTES: i64 = 5; +const ISS: &str = "shuttle"; + +/// The scope of operations that can be performed on shuttle +/// Every scope defaults to read and will use a suffix for updating tasks +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum Scope { + /// Read the details, such as status and address, of a deployment + Deployment, + + /// Push a new deployment + DeploymentPush, + + /// Read the logs of a deployment + Logs, + + /// Read the details of a service + Service, + + /// Create a new service + ServiceCreate, + + /// Read the status of a project + Project, + + /// Create a new project + ProjectCreate, + + /// Get the resources for a project + Resources, + + /// Provision new resources for a project or update existing ones + ResourcesWrite, + + /// List the secrets of a project + Secret, + + /// Add or update secrets of a project + SecretWrite, + + /// Get list of users + User, + + /// Add or update users + UserCreate, + + /// Create an ACME account + AcmeCreate, + + /// Create a custom domain, + CustomDomainCreate, + + /// Admin level scope to internals + Admin, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] +pub struct Claim { + /// Expiration time (as UTC timestamp). + pub exp: usize, + /// Issued at (as UTC timestamp). + iat: usize, + /// Issuer. + iss: String, + /// Not Before (as UTC timestamp). + nbf: usize, + /// Subject (whom token refers to). + pub sub: String, + /// Scopes this token can access + pub scopes: Vec, + /// The original token that was parsed + pub(crate) token: Option, +} + +impl Claim { + /// Create a new claim for a user with the given scopes + pub fn new(sub: String, scopes: Vec) -> Self { + let iat = Utc::now(); + let exp = iat.add(Duration::minutes(EXP_MINUTES)); + + Self { + exp: exp.timestamp() as usize, + iat: iat.timestamp() as usize, + iss: ISS.to_string(), + nbf: iat.timestamp() as usize, + sub, + scopes, + token: None, + } + } + + pub fn into_token(self, encoding_key: &EncodingKey) -> Result { + if let Some(token) = self.token { + Ok(token) + } else { + encode( + &Header::new(jsonwebtoken::Algorithm::EdDSA), + &self, + encoding_key, + ) + .map_err(|err| { + error!( + error = &err as &dyn std::error::Error, + "failed to convert claim to token" + ); + match err.kind() { + jsonwebtoken::errors::ErrorKind::Json(_) => StatusCode::INTERNAL_SERVER_ERROR, + jsonwebtoken::errors::ErrorKind::Crypto(_) => StatusCode::SERVICE_UNAVAILABLE, + _ => StatusCode::INTERNAL_SERVER_ERROR, + } + }) + } + } + + pub fn from_token(token: &str, public_key: &[u8]) -> Result { + let decoding_key = DecodingKey::from_ed_der(public_key); + let mut validation = Validation::new(jsonwebtoken::Algorithm::EdDSA); + validation.set_issuer(&[ISS]); + + trace!(token, "converting token to claim"); + let mut claim: Self = decode(token, &decoding_key, &validation) + .map_err(|err| { + error!( + error = &err as &dyn std::error::Error, + "failed to convert token to claim" + ); + match err.kind() { + jsonwebtoken::errors::ErrorKind::InvalidSignature + | jsonwebtoken::errors::ErrorKind::InvalidAlgorithmName + | jsonwebtoken::errors::ErrorKind::ExpiredSignature + | jsonwebtoken::errors::ErrorKind::InvalidIssuer + | jsonwebtoken::errors::ErrorKind::ImmatureSignature => { + StatusCode::UNAUTHORIZED + } + jsonwebtoken::errors::ErrorKind::InvalidToken + | jsonwebtoken::errors::ErrorKind::InvalidAlgorithm + | jsonwebtoken::errors::ErrorKind::Base64(_) + | jsonwebtoken::errors::ErrorKind::Json(_) + | jsonwebtoken::errors::ErrorKind::Utf8(_) => StatusCode::BAD_REQUEST, + jsonwebtoken::errors::ErrorKind::MissingAlgorithm => { + StatusCode::INTERNAL_SERVER_ERROR + } + jsonwebtoken::errors::ErrorKind::Crypto(_) => StatusCode::SERVICE_UNAVAILABLE, + _ => StatusCode::INTERNAL_SERVER_ERROR, + } + })? + .claims; + + claim.token = Some(token.to_string()); + + Ok(claim) + } +} + +// Future for layers that just return the inner response +#[pin_project] +pub struct ResponseFuture(#[pin] pub F); + +impl Future for ResponseFuture +where + F: Future>, +{ + type Output = Result; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let this = self.project(); + + this.0.poll(cx) + } +} + +/// This layer takes a claim on a request extension and uses it's internal token to set the Authorization Bearer +#[derive(Clone)] +pub struct ClaimLayer; + +impl Layer for ClaimLayer { + type Service = ClaimService; + + fn layer(&self, inner: S) -> Self::Service { + ClaimService { inner } + } +} + +#[derive(Clone)] +pub struct ClaimService { + inner: S, +} + +impl Service>> for ClaimService +where + S: Service>> + Send + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = ResponseFuture; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, mut req: Request>) -> Self::Future { + if let Some(claim) = req.extensions().get::() { + if let Some(token) = claim.token.clone() { + req.headers_mut() + .typed_insert(Authorization::bearer(&token).expect("to set JWT token")); + } + } + + let future = self.inner.call(req); + + ResponseFuture(future) + } +} + +/// This layer adds the current tracing span to any outgoing request +#[derive(Clone)] +pub struct InjectPropagationLayer; + +impl Layer for InjectPropagationLayer { + type Service = InjectPropagation; + + fn layer(&self, inner: S) -> Self::Service { + InjectPropagation { inner } + } +} + +#[derive(Clone)] +pub struct InjectPropagation { + inner: S, +} + +impl Service> for InjectPropagation +where + S: Service> + Send + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = S::Error; + type Future = ResponseFuture; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, mut req: Request) -> Self::Future { + let cx = Span::current().context(); + + global::get_text_map_propagator(|propagator| { + propagator.inject_context(&cx, &mut HeaderInjector(req.headers_mut())) + }); + + let future = self.inner.call(req); + + ResponseFuture(future) + } +} diff --git a/common/src/lib.rs b/common/src/lib.rs index 11d3741c1..a68067084 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -1,5 +1,7 @@ #[cfg(feature = "backend")] pub mod backends; +#[cfg(feature = "claims")] +pub mod claims; #[cfg(feature = "service")] pub mod database; #[cfg(feature = "service")] @@ -38,6 +40,18 @@ pub type Host = String; #[cfg(feature = "service")] pub type DeploymentId = Uuid; +#[cfg(feature = "error")] +/// Errors that can occur when changing types. Especially from prost +#[derive(thiserror::Error, Debug)] +pub enum ParseError { + #[error("failed to parse UUID: {0}")] + Uuid(#[from] uuid::Error), + #[error("failed to parse timestamp: {0}")] + Timestamp(#[from] prost_types::TimestampError), + #[error("failed to parse serde: {0}")] + Serde(#[from] serde_json::Error), +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DatabaseReadyInfo { engine: String, diff --git a/common/src/models/mod.rs b/common/src/models/mod.rs index 2d8042501..328a33cf8 100644 --- a/common/src/models/mod.rs +++ b/common/src/models/mod.rs @@ -11,7 +11,6 @@ use anyhow::{Context, Result}; use async_trait::async_trait; use http::StatusCode; use serde::de::DeserializeOwned; -use thiserror::Error; use tracing::trace; /// A to_json wrapper for handling our error states @@ -50,14 +49,3 @@ impl ToJson for reqwest::Response { } } } - -/// Errors that can occur when changing types. Especially from prost -#[derive(Error, Debug)] -pub enum ParseError { - #[error("failed to parse UUID: {0}")] - Uuid(#[from] uuid::Error), - #[error("failed to parse timestamp: {0}")] - Timestamp(#[from] prost_types::TimestampError), - #[error("failed to parse serde: {0}")] - Serde(#[from] serde_json::Error), -} diff --git a/common/src/wasm.rs b/common/src/wasm.rs index edaa8808b..1508644dd 100644 --- a/common/src/wasm.rs +++ b/common/src/wasm.rs @@ -366,7 +366,7 @@ where } #[cfg(test)] -mod test { +mod tests { use cap_std::os::unix::net::UnixStream; use serde_json::json; use std::io::{Read, Write}; @@ -499,7 +499,7 @@ mod test { (message, log.level) }; - tracing_subscriber::registry().with(logger).init(); + let _guard = tracing_subscriber::registry().with(logger).set_default(); tracing::debug!("this is"); tracing::info!("hi"); diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index ad0877360..f756a56de 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -21,7 +21,7 @@ use chrono::{DateTime, Utc}; use serde_json::json; -use shuttle_common::{models::ParseError, tracing::JsonVisitor, STATE_MESSAGE}; +use shuttle_common::{tracing::JsonVisitor, ParseError, STATE_MESSAGE}; use shuttle_proto::runtime; use std::{convert::TryFrom, str::FromStr, time::SystemTime}; use tracing::{field::Visit, span, warn, Metadata, Subscriber}; @@ -618,7 +618,7 @@ mod tests { ); select! { - _ = sleep(Duration::from_secs(240)) => { + _ = sleep(Duration::from_secs(360)) => { let states = RECORDER.lock().unwrap().get_deployment_states(&id); panic!("states should go into 'Running' for a valid service: {:#?}", states); }, @@ -702,7 +702,7 @@ mod tests { ); select! { - _ = sleep(Duration::from_secs(240)) => { + _ = sleep(Duration::from_secs(360)) => { let states = RECORDER.lock().unwrap().get_deployment_states(&id); panic!("states should go into 'Completed' when a service stops by itself: {:#?}", states); } @@ -749,7 +749,7 @@ mod tests { ); select! { - _ = sleep(Duration::from_secs(240)) => { + _ = sleep(Duration::from_secs(360)) => { let states = RECORDER.lock().unwrap().get_deployment_states(&id); panic!("states should go into 'Crashed' panicking in bind: {:#?}", states); } @@ -784,10 +784,6 @@ mod tests { id, state: State::Loading, }, - StateLog { - id, - state: State::Running, - }, StateLog { id, state: State::Crashed, @@ -796,7 +792,7 @@ mod tests { ); select! { - _ = sleep(Duration::from_secs(240)) => { + _ = sleep(Duration::from_secs(360)) => { let states = RECORDER.lock().unwrap().get_deployment_states(&id); panic!("states should go into 'Crashed' when panicking in main: {:#?}", states); } diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index 1c7263f3d..c48a20306 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -11,7 +11,7 @@ use chrono::Utc; use crossbeam_channel::Sender; use opentelemetry::global; use serde_json::json; -use shuttle_common::backends::auth::Claim; +use shuttle_common::claims::Claim; use shuttle_service::builder::{build_crate, get_config, Runtime}; use tokio::time::{sleep, timeout}; use tracing::{debug, debug_span, error, info, instrument, trace, warn, Instrument, Span}; diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index 4df39521c..5f520b06f 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -8,7 +8,7 @@ use std::{ use async_trait::async_trait; use opentelemetry::global; use portpicker::pick_unused_port; -use shuttle_common::{backends::auth::Claim, storage_manager::ArtifactsStorageManager}; +use shuttle_common::{claims::Claim, storage_manager::ArtifactsStorageManager}; use shuttle_proto::runtime::{ runtime_client::RuntimeClient, LoadRequest, StartRequest, StopReason, SubscribeStopRequest, @@ -276,8 +276,15 @@ async fn load( match response { Ok(response) => { - info!(response = ?response.into_inner(), "loading response: "); - Ok(()) + let response = response.into_inner(); + info!(?response, "loading response"); + + if response.success { + Ok(()) + } else { + error!(error = %response.message, "failed to load service"); + Err(Error::Load(response.message)) + } } Err(error) => { error!(%error, "failed to load service"); @@ -370,7 +377,6 @@ mod tests { use uuid::Uuid; use crate::{ - error::Error, persistence::{DeploymentUpdater, Secret, SecretGetter}, RuntimeManager, }; @@ -424,7 +430,13 @@ mod tests { let tmp_dir = Builder::new().prefix("shuttle_run_test").tempdir().unwrap(); let path = tmp_dir.into_path(); - let (tx, _rx) = crossbeam_channel::unbounded(); + let (tx, rx) = crossbeam_channel::unbounded(); + + tokio::runtime::Handle::current().spawn_blocking(move || { + while let Ok(log) = rx.recv() { + println!("test log: {log:?}"); + } + }); RuntimeManager::new(path, format!("http://{}", provisioner_addr), tx) } @@ -464,7 +476,7 @@ mod tests { // This test uses the kill signal to make sure a service does stop when asked to #[tokio::test] async fn can_be_killed() { - let (built, storage_manager) = make_so_and_built("sleep-async"); + let (built, storage_manager) = make_and_built("sleep-async"); let id = built.id; let runtime_manager = get_runtime_manager(); let (cleanup_send, cleanup_recv) = oneshot::channel(); @@ -506,7 +518,7 @@ mod tests { // This test does not use a kill signal to stop the service. Rather the service decided to stop on its own without errors #[tokio::test] async fn self_stop() { - let (built, storage_manager) = make_so_and_built("sleep-async"); + let (built, storage_manager) = make_and_built("sleep-async"); let runtime_manager = get_runtime_manager(); let (cleanup_send, cleanup_recv) = oneshot::channel(); @@ -544,7 +556,7 @@ mod tests { // Test for panics in Service::bind #[tokio::test] async fn panic_in_bind() { - let (built, storage_manager) = make_so_and_built("bind-panic"); + let (built, storage_manager) = make_and_built("bind-panic"); let runtime_manager = get_runtime_manager(); let (cleanup_send, cleanup_recv) = oneshot::channel(); @@ -552,7 +564,7 @@ mod tests { StopReason::from_i32(response.reason).unwrap(), response.message, ) { - (StopReason::Crash, mes) if mes.contains("Panic occurred in `Service::bind`") => { + (StopReason::Crash, mes) if mes.contains("panic in bind") => { cleanup_send.send(()).unwrap() } (_, mes) => panic!("expected stop due to crash: {mes}"), @@ -583,20 +595,12 @@ mod tests { // Test for panics in the main function #[tokio::test] + #[should_panic(expected = "Load(\"main panic\")")] async fn panic_in_main() { - let (built, storage_manager) = make_so_and_built("main-panic"); + let (built, storage_manager) = make_and_built("main-panic"); let runtime_manager = get_runtime_manager(); - let (cleanup_send, cleanup_recv) = oneshot::channel(); - let handle_cleanup = |response: SubscribeStopResponse| match ( - StopReason::from_i32(response.reason).unwrap(), - response.message, - ) { - (StopReason::Crash, mes) if mes.contains("Panic occurred in shuttle_service::main") => { - cleanup_send.send(()).unwrap() - } - (_, mes) => panic!("expected stop due to crash: {mes}"), - }; + let handle_cleanup = |_result| panic!("service should never be started"); let secret_getter = get_secret_getter(); @@ -611,50 +615,9 @@ mod tests { ) .await .unwrap(); - - tokio::select! { - _ = sleep(Duration::from_secs(5)) => panic!("cleanup should have been called"), - Ok(()) = cleanup_recv => {} - } - - // Prevent the runtime manager from dropping earlier, which will kill the processes it manages - drop(runtime_manager); } - #[tokio::test] - async fn missing_so() { - let built = Built { - id: Uuid::new_v4(), - service_name: "test".to_string(), - service_id: Uuid::new_v4(), - tracing_context: Default::default(), - is_next: false, - claim: None, - }; - - let handle_cleanup = |_result| panic!("no service means no cleanup"); - let secret_getter = get_secret_getter(); - let storage_manager = get_storage_manager(); - - let result = built - .handle( - storage_manager, - secret_getter, - get_runtime_manager(), - StubDeploymentUpdater, - kill_old_deployments(), - handle_cleanup, - ) - .await; - - assert!( - matches!(result, Err(Error::Load(_))), - "expected missing 'so' error: {:?}", - result - ); - } - - fn make_so_and_built(crate_name: &str) -> (Built, ArtifactsStorageManager) { + fn make_and_built(crate_name: &str) -> (Built, ArtifactsStorageManager) { let crate_dir: PathBuf = [RESOURCES_PATH, crate_name].iter().collect(); Command::new("cargo") @@ -665,12 +628,10 @@ mod tests { .wait() .unwrap(); - let dashes_replaced = crate_name.replace('-', "_"); - let lib_name = if cfg!(target_os = "windows") { - format!("{}.dll", dashes_replaced) + format!("{}.exe", crate_name) } else { - format!("lib{}.so", dashes_replaced) + crate_name.to_string() }; let id = Uuid::new_v4(); diff --git a/deployer/src/handlers/mod.rs b/deployer/src/handlers/mod.rs index c7a01f1c3..f0185f02f 100644 --- a/deployer/src/handlers/mod.rs +++ b/deployer/src/handlers/mod.rs @@ -13,10 +13,11 @@ use fqdn::FQDN; use futures::StreamExt; use hyper::Uri; use shuttle_common::backends::auth::{ - AdminSecretLayer, AuthPublicKey, Claim, JwtAuthenticationLayer, Scope, ScopedLayer, + AdminSecretLayer, AuthPublicKey, JwtAuthenticationLayer, ScopedLayer, }; use shuttle_common::backends::headers::XShuttleAccountName; use shuttle_common::backends::metrics::{Metrics, TraceLayer}; +use shuttle_common::claims::{Claim, Scope}; use shuttle_common::models::secret; use shuttle_common::project::ProjectName; use shuttle_common::storage_manager::StorageManager; diff --git a/deployer/tests/deploy_layer/bind-panic/Cargo.toml b/deployer/tests/deploy_layer/bind-panic/Cargo.toml index 5475a549c..632c09176 100644 --- a/deployer/tests/deploy_layer/bind-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/bind-panic/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = { path = "../../../../runtime" } +shuttle-runtime = "0.1.0" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/main-panic/Cargo.toml b/deployer/tests/deploy_layer/main-panic/Cargo.toml index 9e068f31d..9632a72d7 100644 --- a/deployer/tests/deploy_layer/main-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/main-panic/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = { path = "../../../../runtime" } +shuttle-runtime = "0.1.0" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/self-stop/Cargo.toml b/deployer/tests/deploy_layer/self-stop/Cargo.toml index f740b87b7..bab0ac511 100644 --- a/deployer/tests/deploy_layer/self-stop/Cargo.toml +++ b/deployer/tests/deploy_layer/self-stop/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = { path = "../../../../runtime" } +shuttle-runtime = "0.1.0" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/self-stop/src/main.rs b/deployer/tests/deploy_layer/self-stop/src/main.rs index 9150538b5..ddbba66d2 100644 --- a/deployer/tests/deploy_layer/self-stop/src/main.rs +++ b/deployer/tests/deploy_layer/self-stop/src/main.rs @@ -8,6 +8,6 @@ impl shuttle_runtime::Service for MyService { } #[shuttle_runtime::main] -async fn self_stop() -> Result { +async fn self_stop() -> Result { Ok(MyService) } diff --git a/deployer/tests/deploy_layer/sleep-async/Cargo.toml b/deployer/tests/deploy_layer/sleep-async/Cargo.toml index edd2ea6bc..ed33c2630 100644 --- a/deployer/tests/deploy_layer/sleep-async/Cargo.toml +++ b/deployer/tests/deploy_layer/sleep-async/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = { path = "../../../../runtime" } +shuttle-runtime = "0.1.0" tokio = { version = "1.0", features = ["time"]} diff --git a/examples b/examples index a5c78703a..c35653890 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit a5c78703ab676bf7ed1649ef19cb4bfe43c5cc29 +Subproject commit c35653890aa7b0d8e4cb70131027990d4ed6afa6 diff --git a/gateway/src/api/latest.rs b/gateway/src/api/latest.rs index 2b64bc4fb..42f1ff3a6 100644 --- a/gateway/src/api/latest.rs +++ b/gateway/src/api/latest.rs @@ -16,11 +16,10 @@ use futures::Future; use http::{StatusCode, Uri}; use instant_acme::{AccountCredentials, ChallengeType}; use serde::{Deserialize, Serialize}; -use shuttle_common::backends::auth::{ - AuthPublicKey, JwtAuthenticationLayer, Scope, ScopedLayer, EXP_MINUTES, -}; +use shuttle_common::backends::auth::{AuthPublicKey, JwtAuthenticationLayer, ScopedLayer}; use shuttle_common::backends::cache::CacheManager; use shuttle_common::backends::metrics::{Metrics, TraceLayer}; +use shuttle_common::claims::{Scope, EXP_MINUTES}; use shuttle_common::models::error::ErrorKind; use shuttle_common::models::{project, stats}; use shuttle_common::request_span; @@ -593,7 +592,8 @@ pub mod tests { Request::builder() .method("POST") .uri(format!("/projects/{project}")) - .body(Body::empty()) + .header("Content-Type", "application/json") + .body("{\"idle_minutes\": 3}".into()) .unwrap() }; @@ -762,7 +762,8 @@ pub mod tests { let create_project = Request::builder() .method("POST") .uri(format!("/projects/{matrix}")) - .body(Body::empty()) + .header("Content-Type", "application/json") + .body("{\"idle_minutes\": 3}".into()) .unwrap() .with_header(&authorization); diff --git a/gateway/src/auth.rs b/gateway/src/auth.rs index 679890b0c..0c9910aa9 100644 --- a/gateway/src/auth.rs +++ b/gateway/src/auth.rs @@ -4,7 +4,7 @@ use std::str::FromStr; use axum::extract::{FromRef, FromRequestParts, Path}; use axum::http::request::Parts; use serde::{Deserialize, Serialize}; -use shuttle_common::backends::auth::{Claim, Scope}; +use shuttle_common::claims::{Claim, Scope}; use tracing::{trace, Span}; use crate::api::latest::RouterState; diff --git a/gateway/src/lib.rs b/gateway/src/lib.rs index b1a6e6175..000700142 100644 --- a/gateway/src/lib.rs +++ b/gateway/src/lib.rs @@ -344,7 +344,8 @@ pub mod tests { use jsonwebtoken::EncodingKey; use rand::distributions::{Alphanumeric, DistString, Distribution, Uniform}; use ring::signature::{self, Ed25519KeyPair, KeyPair}; - use shuttle_common::backends::auth::{Claim, ConvertResponse, Scope}; + use shuttle_common::backends::auth::ConvertResponse; + use shuttle_common::claims::{Claim, Scope}; use shuttle_common::models::project; use sqlx::SqlitePool; use tokio::sync::mpsc::channel; @@ -801,7 +802,8 @@ pub mod tests { .request( Request::post("/projects/matrix") .with_header(&authorization) - .body(Body::empty()) + .header("Content-Type", "application/json") + .body("{\"idle_minutes\": 3}".into()) .unwrap(), ) .map_ok(|resp| { diff --git a/proto/Cargo.toml b/proto/Cargo.toml index aadf6f749..bb6725807 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -19,7 +19,7 @@ uuid = { workspace = true, features = ["v4"] } [dependencies.shuttle-common] workspace = true -features = ["models", "service", "wasm"] +features = ["error", "service", "wasm"] [build-dependencies] tonic-build = "0.8.3" diff --git a/proto/runtime.proto b/proto/runtime.proto index d75505419..8a0ee293d 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -34,6 +34,8 @@ message LoadRequest { message LoadResponse { // Could the service be loaded bool success = 1; + // Error message if not successful + string message = 2; } message StartRequest { diff --git a/proto/src/lib.rs b/proto/src/lib.rs index f27281d13..39275985d 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -104,7 +104,7 @@ pub mod runtime { use anyhow::Context; use chrono::DateTime; use prost_types::Timestamp; - use shuttle_common::models::ParseError; + use shuttle_common::ParseError; use tokio::process; use tonic::transport::{Channel, Endpoint}; use tracing::info; diff --git a/provisioner/src/lib.rs b/provisioner/src/lib.rs index 7c732149a..cfa9ebdc8 100644 --- a/provisioner/src/lib.rs +++ b/provisioner/src/lib.rs @@ -6,7 +6,7 @@ use aws_sdk_rds::{error::ModifyDBInstanceErrorKind, model::DbInstance, types::Sd pub use error::Error; use mongodb::{bson::doc, options::ClientOptions}; use rand::Rng; -use shuttle_common::backends::auth::{Claim, Scope}; +use shuttle_common::claims::{Claim, Scope}; pub use shuttle_proto::provisioner::provisioner_server::ProvisionerServer; use shuttle_proto::provisioner::{ aws_rds, database_request::DbType, shared, AwsRds, DatabaseRequest, DatabaseResponse, Shared, diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 6ab22e9c3..0a417f502 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -14,7 +14,7 @@ required-features = ["next"] anyhow = { workspace = true } async-trait = { workspace = true } chrono = { workspace = true } -clap ={ version = "4.0.18", features = ["derive"] } +clap = { workspace = true } serde_json = { workspace = true } strfmt = "0.2.2" thiserror = { workspace = true } @@ -37,19 +37,19 @@ wasmtime-wasi = { version = "4.0.0", optional = true } [dependencies.shuttle-common] workspace = true -features = ["service", "backend"] +features = ["claims"] [dependencies.shuttle-proto] workspace = true [dependencies.shuttle-service] workspace = true -features = ["builder"] [dev-dependencies] crossbeam-channel = "0.5.6" portpicker = "0.1.1" futures = { version = "0.3.25" } +shuttle-service = { workspace = true, features = ["builder"] } [features] default = [] diff --git a/runtime/src/legacy/mod.rs b/runtime/src/legacy/mod.rs index 5d430bbc1..521669051 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/legacy/mod.rs @@ -13,7 +13,7 @@ use async_trait::async_trait; use clap::Parser; use core::future::Future; use shuttle_common::{ - backends::{auth::ClaimLayer, tracing::InjectPropagationLayer}, + claims::{ClaimLayer, InjectPropagationLayer}, storage_manager::{ArtifactsStorageManager, StorageManager, WorkingDirStorageManager}, LogItem, }; @@ -38,7 +38,7 @@ use tonic::{ Request, Response, Status, }; use tower::ServiceBuilder; -use tracing::{error, instrument, trace}; +use tracing::{error, info, trace}; use uuid::Uuid; use crate::{provisioner_factory::ProvisionerFactory, Logger}; @@ -203,11 +203,51 @@ where let loader = self.loader.lock().unwrap().deref_mut().take().unwrap(); - let service = loader.load(factory, logger).await.unwrap(); + let service = match tokio::spawn(loader.load(factory, logger)).await { + Ok(res) => match res { + Ok(service) => service, + Err(error) => { + error!(%error, "loading service failed"); + + let message = LoadResponse { + success: false, + message: error.to_string(), + }; + return Ok(Response::new(message)); + } + }, + Err(error) => { + if error.is_panic() { + let panic = error.into_panic(); + let msg = panic + .downcast_ref::<&str>() + .map(|x| x.to_string()) + .unwrap_or_else(|| "".to_string()); + + error!(error = msg, "loading service panicked"); + + let message = LoadResponse { + success: false, + message: msg, + }; + return Ok(Response::new(message)); + } else { + error!(%error, "loading service crashed"); + let message = LoadResponse { + success: false, + message: error.to_string(), + }; + return Ok(Response::new(message)); + } + } + }; *self.service.lock().unwrap() = Some(service); - let message = LoadResponse { success: true }; + let message = LoadResponse { + success: true, + message: String::new(), + }; Ok(Response::new(message)) } @@ -231,13 +271,56 @@ where let (kill_tx, kill_rx) = tokio::sync::oneshot::channel(); *self.kill_tx.lock().unwrap() = Some(kill_tx); + let stopped_tx = self.stopped_tx.clone(); + + let handle = tokio::runtime::Handle::current(); + // start service as a background task with a kill receiver - tokio::spawn(run_until_stopped( - service, - service_address, - self.stopped_tx.clone(), - kill_rx, - )); + tokio::spawn(async move { + let mut background = handle.spawn(service.bind(service_address)); + + tokio::select! { + res = &mut background => { + match res { + Ok(_) => { + info!("service stopped all on its own"); + stopped_tx.send((StopReason::End, String::new())).unwrap(); + }, + Err(error) => { + if error.is_panic() { + let panic = error.into_panic(); + let msg = panic.downcast_ref::<&str>() + .map(|x| x.to_string()) + .unwrap_or_else(|| "".to_string()); + + error!(error = msg, "service panicked"); + + stopped_tx + .send((StopReason::Crash, msg)) + .unwrap(); + } else { + error!(%error, "service crashed"); + stopped_tx + .send((StopReason::Crash, error.to_string())) + .unwrap(); + } + }, + } + }, + message = kill_rx => { + match message { + Ok(_) => { + stopped_tx.send((StopReason::Request, String::new())).unwrap(); + } + Err(_) => trace!("the sender dropped") + }; + + info!("will now abort the service"); + background.abort(); + background.await.unwrap().expect("to stop service"); + } + } + }); let message = StartResponse { success: true }; @@ -307,35 +390,3 @@ where } } } - -/// Run the service until a stop signal is received -#[instrument(skip(service, stopped_tx, kill_rx))] -async fn run_until_stopped( - // service: LoadedService, - service: impl Service, - addr: SocketAddr, - stopped_tx: tokio::sync::broadcast::Sender<(StopReason, String)>, - kill_rx: tokio::sync::oneshot::Receiver, -) { - trace!("starting deployment on {}", &addr); - tokio::select! { - res = service.bind(addr) => { - match res { - Ok(_) => { - stopped_tx.send((StopReason::End, String::new())).unwrap(); - } - Err(error) => { - stopped_tx.send((StopReason::Crash, error.to_string())).unwrap(); - } - } - }, - message = kill_rx => { - match message { - Ok(_) => { - stopped_tx.send((StopReason::Request, String::new())).unwrap(); - } - Err(_) => trace!("the sender dropped") - }; - } - } -} diff --git a/runtime/src/logger.rs b/runtime/src/logger.rs index 79b2f6a49..8a82c2508 100644 --- a/runtime/src/logger.rs +++ b/runtime/src/logger.rs @@ -64,7 +64,7 @@ mod tests { let logger = Logger::new(s, Default::default()); - tracing_subscriber::registry().with(logger).init(); + let _guard = tracing_subscriber::registry().with(logger).set_default(); tracing::debug!("this is"); tracing::info!("hi"); diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index 6c43948d5..060c7b4b9 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -89,7 +89,10 @@ impl Runtime for AxumWasm { *self.router.lock().unwrap() = Some(router); - let message = LoadResponse { success: true }; + let message = LoadResponse { + success: true, + message: String::new(), + }; Ok(tonic::Response::new(message)) } @@ -426,7 +429,7 @@ pub mod tests { .unwrap(); } - #[tokio::test] + #[tokio::test(flavor = "multi_thread")] async fn axum() { compile_module(); diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs index 8193af78e..56d91e94c 100644 --- a/runtime/src/provisioner_factory.rs +++ b/runtime/src/provisioner_factory.rs @@ -2,7 +2,7 @@ use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; use async_trait::async_trait; use shuttle_common::{ - backends::{auth::ClaimService, tracing::InjectPropagation}, + claims::{ClaimService, InjectPropagation}, database, storage_manager::StorageManager, DatabaseReadyInfo, diff --git a/runtime/tests/integration/loader.rs b/runtime/tests/integration/loader.rs index d4051818a..3ef17f059 100644 --- a/runtime/tests/integration/loader.rs +++ b/runtime/tests/integration/loader.rs @@ -1,15 +1,9 @@ -use std::time::Duration; - -use shuttle_proto::runtime::{LoadRequest, StartRequest}; +use shuttle_proto::runtime::{LoadRequest, StartRequest, StopReason, SubscribeStopRequest}; use uuid::Uuid; use crate::helpers::{spawn_runtime, TestRuntime}; -/// This test does panic, but the panic happens in a spawned task inside the project runtime, -/// so we get this output: `thread 'tokio-runtime-worker' panicked at 'panic in bind', src/main.rs:6:9`, -/// but `should_panic(expected = "panic in bind")` doesn't catch it. #[tokio::test] -#[should_panic(expected = "panic in bind")] async fn bind_panic() { let project_path = format!("{}/tests/resources/bind-panic", env!("CARGO_MANIFEST_DIR")); @@ -29,20 +23,24 @@ async fn bind_panic() { let _ = runtime_client.load(load_request).await.unwrap(); + let mut stream = runtime_client + .subscribe_stop(tonic::Request::new(SubscribeStopRequest {})) + .await + .unwrap() + .into_inner(); + let start_request = StartRequest { deployment_id: Uuid::default().as_bytes().to_vec(), ip: runtime_address.to_string(), }; - // I also tried this without spawning, but it gave the same result. Panic but it isn't caught. - tokio::spawn(async move { - runtime_client - .start(tonic::Request::new(start_request)) - .await - .unwrap(); - // Give it a second to panic. - tokio::time::sleep(Duration::from_secs(1)).await; - }) - .await - .unwrap(); + runtime_client + .start(tonic::Request::new(start_request)) + .await + .unwrap(); + + let reason = stream.message().await.unwrap().unwrap(); + + assert_eq!(reason.reason, StopReason::Crash as i32); + assert_eq!(reason.message, "panic in bind"); } diff --git a/service/Cargo.toml b/service/Cargo.toml index c895c042e..64178f863 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -13,17 +13,16 @@ doctest = false [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } -axum = { workspace = true, optional = true } # TODO: debug the libgit2-sys conflict with cargo-edit when upgrading cargo to 0.66 cargo = { version = "0.65.0", optional = true } -cargo_metadata = "0.15.2" -crossbeam-channel = "0.5.6" -pipe = "0.4.0" -serde_json = { workspace = true } +cargo_metadata = { version = "0.15.2", optional = true } +crossbeam-channel = { version = "0.5.6", optional = true } +pipe = { version = "0.4.0", optional = true } +serde_json = { workspace = true, optional = true } strfmt = "0.2.2" thiserror = { workspace = true } -tokio = { version = "1.26.0", features = ["sync"] } -tracing = { workspace = true } +tokio = { version = "1.26.0", features = ["sync"], optional = true } +tracing = { workspace = true, optional = true } [dependencies.shuttle-codegen] workspace = true @@ -31,7 +30,7 @@ optional = true [dependencies.shuttle-common] workspace = true -features = ["tracing", "service"] +features = ["service"] [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt"] } @@ -40,4 +39,4 @@ tokio = { version = "1.26.0", features = ["macros", "rt"] } default = ["codegen"] codegen = ["shuttle-codegen/frameworks"] -builder = ["cargo"] +builder = ["cargo", "cargo_metadata", "crossbeam-channel", "pipe", "tokio", "tracing"] From 9f80ee873b050260d4ef73c42c6c19830242eeea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 14 Mar 2023 11:35:02 +0000 Subject: [PATCH 56/74] feat: emit error when shuttle::main is named main (#707) --- codegen/src/shuttle_main/mod.rs | 12 +++++++++++- codegen/tests/ui/main/duplicate-main-fn.rs | 2 ++ codegen/tests/ui/main/duplicate-main-fn.stderr | 11 +++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 codegen/tests/ui/main/duplicate-main-fn.rs create mode 100644 codegen/tests/ui/main/duplicate-main-fn.stderr diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 7476811d9..741c5f0cf 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -91,6 +91,16 @@ impl Parse for BuilderOption { impl Loader { pub(crate) fn from_item_fn(item_fn: &mut ItemFn) -> Option { + let fn_ident = item_fn.sig.ident.clone(); + + if fn_ident.clone().to_string() == "main".to_string() { + emit_error!( + fn_ident, + "shuttle_runtime::main functions cannot be named `main`" + ); + return None; + } + let inputs: Vec<_> = item_fn .sig .inputs @@ -119,7 +129,7 @@ impl Loader { if let Some(type_path) = check_return_type(item_fn.sig.clone()) { Some(Self { - fn_ident: item_fn.sig.ident.clone(), + fn_ident: fn_ident.clone(), fn_inputs: inputs, fn_return: type_path, }) diff --git a/codegen/tests/ui/main/duplicate-main-fn.rs b/codegen/tests/ui/main/duplicate-main-fn.rs new file mode 100644 index 000000000..ed8e38c30 --- /dev/null +++ b/codegen/tests/ui/main/duplicate-main-fn.rs @@ -0,0 +1,2 @@ +#[shuttle_codegen::main] +async fn main() -> ShuttleRocket {} diff --git a/codegen/tests/ui/main/duplicate-main-fn.stderr b/codegen/tests/ui/main/duplicate-main-fn.stderr new file mode 100644 index 000000000..4b516b5c8 --- /dev/null +++ b/codegen/tests/ui/main/duplicate-main-fn.stderr @@ -0,0 +1,11 @@ +error: shuttle_runtime::main functions cannot be named `main` + --> tests/ui/main/duplicate-main-fn.rs:2:10 + | +2 | async fn main() -> ShuttleRocket {} + | ^^^^ + +error[E0601]: `main` function not found in crate `$CRATE` + --> tests/ui/main/duplicate-main-fn.rs:2:36 + | +2 | async fn main() -> ShuttleRocket {} + | ^ consider adding a `main` function to `$DIR/tests/ui/main/duplicate-main-fn.rs` From 918829bde43575e16bd729b3232794b4c78906e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 14 Mar 2023 11:44:47 +0000 Subject: [PATCH 57/74] Feature: eng 484 update init with codegen changes (#706) * feat: update init boilerplate with shuttle-next changes * tests: update shuttle_init_tests * tests: ignore broken integration tests * feat: refactor init to create bin * fix: bug when passing path to init --- cargo-shuttle/src/args.rs | 2 +- cargo-shuttle/src/init.rs | 590 +++++++++++++++--------- cargo-shuttle/src/lib.rs | 8 +- cargo-shuttle/tests/integration/init.rs | 11 +- 4 files changed, 390 insertions(+), 221 deletions(-) diff --git a/cargo-shuttle/src/args.rs b/cargo-shuttle/src/args.rs index fb1347198..abb623fee 100644 --- a/cargo-shuttle/src/args.rs +++ b/cargo-shuttle/src/args.rs @@ -203,7 +203,7 @@ pub struct InitArgs { #[command(flatten)] pub login_args: LoginArgs, /// Path to initialize a new shuttle project - #[arg(default_value = ".", value_parser = OsStringValueParser::new().try_map(parse_path) )] + #[arg(default_value = ".", value_parser = OsStringValueParser::new().try_map(parse_init_path) )] pub path: PathBuf, } diff --git a/cargo-shuttle/src/init.rs b/cargo-shuttle/src/init.rs index 0ebf76822..8f5aed878 100644 --- a/cargo-shuttle/src/init.rs +++ b/cargo-shuttle/src/init.rs @@ -6,7 +6,7 @@ use anyhow::Result; use cargo::ops::NewOptions; use cargo_edit::{find, get_latest_dependency, registry_url}; use indoc::indoc; -use toml_edit::{value, Array, Document, Item, Table}; +use toml_edit::{value, Array, Document, Table}; use url::Url; #[derive(Clone, Copy, Debug, PartialEq, Eq, strum::Display, strum::EnumIter)] @@ -29,7 +29,7 @@ pub enum Framework { impl Framework { /// Returns a framework-specific struct that implements the trait `ShuttleInit` /// for writing framework-specific dependencies to `Cargo.toml` and generating - /// boilerplate code in `src/lib.rs`. + /// boilerplate code in `src/main.rs`. pub fn init_config(&self) -> Box { match self { Framework::ActixWeb => Box::new(ShuttleInitActixWeb), @@ -78,29 +78,43 @@ impl ShuttleInit for ShuttleInitActixWeb { get_dependency_version_fn, ); - set_inline_table_dependency_features( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-actix-web", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "tokio", dependencies, - vec!["web-actix-web".to_string()], + manifest_path, + url, + true, + get_dependency_version_fn, ); } fn get_boilerplate_code_for_framework(&self) -> &'static str { indoc! {r#" use actix_web::{get, web::ServiceConfig}; - use shuttle_service::ShuttleActixWeb; + use shuttle_actix_web::ShuttleActixWeb; #[get("/hello")] async fn hello_world() -> &'static str { "Hello World!" } - #[shuttle_service::main] + #[shuttle_runtime::main] async fn actix_web( - ) -> ShuttleActixWeb { - Ok(move |cfg: &mut ServiceConfig| { + ) -> ShuttleActixWeb { + let config = move |cfg: &mut ServiceConfig| { cfg.service(hello_world); - }) + }; + + Ok(config.into()) }"#} } } @@ -124,17 +138,21 @@ impl ShuttleInit for ShuttleInitAxum { get_dependency_version_fn, ); - set_inline_table_dependency_features( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-axum", dependencies, - vec!["web-axum".to_string()], + manifest_path, + url, + true, + get_dependency_version_fn, ); + set_key_value_dependency_version( - "sync_wrapper", + "tokio", dependencies, manifest_path, url, - false, + true, get_dependency_version_fn, ); } @@ -142,18 +160,16 @@ impl ShuttleInit for ShuttleInitAxum { fn get_boilerplate_code_for_framework(&self) -> &'static str { indoc! {r#" use axum::{routing::get, Router}; - use sync_wrapper::SyncWrapper; async fn hello_world() -> &'static str { "Hello, world!" } - #[shuttle_service::main] - async fn axum() -> shuttle_service::ShuttleAxum { + #[shuttle_runtime::main] + async fn axum() -> shuttle_axum::ShuttleAxum { let router = Router::new().route("/hello", get(hello_world)); - let sync_wrapper = SyncWrapper::new(router); - Ok(sync_wrapper) + Ok(router.into()) }"#} } } @@ -177,10 +193,22 @@ impl ShuttleInit for ShuttleInitRocket { get_dependency_version_fn, ); - set_inline_table_dependency_features( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-rocket", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "tokio", dependencies, - vec!["web-rocket".to_string()], + manifest_path, + url, + true, + get_dependency_version_fn, ); } @@ -194,11 +222,11 @@ impl ShuttleInit for ShuttleInitRocket { "Hello, world!" } - #[shuttle_service::main] - async fn rocket() -> shuttle_service::ShuttleRocket { + #[shuttle_runtime::main] + async fn rocket() -> shuttle_rocket::ShuttleRocket { let rocket = rocket::build().mount("/hello", routes![index]); - Ok(rocket) + Ok(rocket.into()) }"#} } } @@ -213,10 +241,22 @@ impl ShuttleInit for ShuttleInitTide { url: &Url, get_dependency_version_fn: GetDependencyVersionFn, ) { - set_inline_table_dependency_features( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-tide", dependencies, - vec!["web-tide".to_string()], + manifest_path, + url, + true, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "tokio", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, ); set_key_value_dependency_version( @@ -231,14 +271,14 @@ impl ShuttleInit for ShuttleInitTide { fn get_boilerplate_code_for_framework(&self) -> &'static str { indoc! {r#" - #[shuttle_service::main] - async fn tide() -> shuttle_service::ShuttleTide<()> { + #[shuttle_runtime::main] + async fn tide() -> shuttle_tide::ShuttleTide<()> { let mut app = tide::new(); app.with(tide::log::LogMiddleware::new()); app.at("/hello").get(|_| async { Ok("Hello, world!") }); - Ok(app) + Ok(app.into()) }"#} } } @@ -253,18 +293,30 @@ impl ShuttleInit for ShuttleInitPoem { url: &Url, get_dependency_version_fn: GetDependencyVersionFn, ) { - set_inline_table_dependency_features( - "shuttle-service", + set_key_value_dependency_version( + "poem", dependencies, - vec!["web-poem".to_string()], + manifest_path, + url, + false, + get_dependency_version_fn, ); set_key_value_dependency_version( - "poem", + "shuttle-poem", dependencies, manifest_path, url, - false, + true, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "tokio", + dependencies, + manifest_path, + url, + true, get_dependency_version_fn, ); } @@ -272,17 +324,18 @@ impl ShuttleInit for ShuttleInitPoem { fn get_boilerplate_code_for_framework(&self) -> &'static str { indoc! {r#" use poem::{get, handler, Route}; + use shuttle_poem::ShuttlePoem; #[handler] fn hello_world() -> &'static str { "Hello, world!" } - #[shuttle_service::main] - async fn poem() -> shuttle_service::ShuttlePoem { + #[shuttle_runtime::main] + async fn poem() -> ShuttlePoem { let app = Route::new().at("/hello", get(hello_world)); - Ok(app) + Ok(app.into()) }"#} } } @@ -297,18 +350,30 @@ impl ShuttleInit for ShuttleInitSalvo { url: &Url, get_dependency_version_fn: GetDependencyVersionFn, ) { - set_inline_table_dependency_features( - "shuttle-service", + set_key_value_dependency_version( + "salvo", dependencies, - vec!["web-salvo".to_string()], + manifest_path, + url, + false, + get_dependency_version_fn, ); set_key_value_dependency_version( - "salvo", + "shuttle-salvo", dependencies, manifest_path, url, - false, + true, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "tokio", + dependencies, + manifest_path, + url, + true, get_dependency_version_fn, ); } @@ -319,14 +384,14 @@ impl ShuttleInit for ShuttleInitSalvo { #[handler] async fn hello_world(res: &mut Response) { - res.render(Text::Plain("Hello, World!")); + res.render(Text::Plain("Hello, world!")); } - #[shuttle_service::main] - async fn salvo() -> shuttle_service::ShuttleSalvo { - let router = Router::new().get(hello_world); + #[shuttle_runtime::main] + async fn salvo() -> shuttle_salvo::ShuttleSalvo { + let router = Router::with_path("hello").get(hello_world); - Ok(router) + Ok(router.into()) }"#} } } @@ -341,12 +406,6 @@ impl ShuttleInit for ShuttleInitSerenity { url: &Url, get_dependency_version_fn: GetDependencyVersionFn, ) { - set_inline_table_dependency_features( - "shuttle-service", - dependencies, - vec!["bot-serenity".to_string()], - ); - set_key_value_dependency_version( "anyhow", dependencies, @@ -387,6 +446,24 @@ impl ShuttleInit for ShuttleInitSerenity { get_dependency_version_fn, ); + set_key_value_dependency_version( + "shuttle-serenity", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "tokio", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); + set_key_value_dependency_version( "tracing", dependencies, @@ -424,10 +501,10 @@ impl ShuttleInit for ShuttleInitSerenity { } } - #[shuttle_service::main] + #[shuttle_runtime::main] async fn serenity( #[shuttle_secrets::Secrets] secret_store: SecretStore, - ) -> shuttle_service::ShuttleSerenity { + ) -> shuttle_serenity::ShuttleSerenity { // Get the discord token set in `Secrets.toml` let token = if let Some(token) = secret_store.get("DISCORD_TOKEN") { token @@ -443,7 +520,7 @@ impl ShuttleInit for ShuttleInitSerenity { .await .expect("Err creating client"); - Ok(client) + Ok(client.into()) }"#} } } @@ -458,12 +535,6 @@ impl ShuttleInit for ShuttleInitPoise { url: &Url, get_dependency_version_fn: GetDependencyVersionFn, ) { - set_inline_table_dependency_features( - "shuttle-service", - dependencies, - vec!["bot-poise".to_string()], - ); - set_key_value_dependency_version( "anyhow", dependencies, @@ -482,6 +553,15 @@ impl ShuttleInit for ShuttleInitPoise { get_dependency_version_fn, ); + set_key_value_dependency_version( + "shuttle-poise", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); + set_key_value_dependency_version( "shuttle-secrets", dependencies, @@ -491,6 +571,15 @@ impl ShuttleInit for ShuttleInitPoise { get_dependency_version_fn, ); + set_key_value_dependency_version( + "tokio", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); + set_key_value_dependency_version( "tracing", dependencies, @@ -504,47 +593,47 @@ impl ShuttleInit for ShuttleInitPoise { fn get_boilerplate_code_for_framework(&self) -> &'static str { indoc! {r#" use anyhow::Context as _; - use poise::serenity_prelude as serenity; - use shuttle_secrets::SecretStore; - use shuttle_service::ShuttlePoise; - - struct Data {} // User data, which is stored and accessible in all command invocations - type Error = Box; - type Context<'a> = poise::Context<'a, Data, Error>; - - /// Responds with "world!" - #[poise::command(slash_command)] - async fn hello(ctx: Context<'_>) -> Result<(), Error> { - ctx.say("world!").await?; - Ok(()) - } - - #[shuttle_service::main] - async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { - // Get the discord token set in `Secrets.toml` - let discord_token = secret_store - .get("DISCORD_TOKEN") - .context("'DISCORD_TOKEN' was not found")?; - - let framework = poise::Framework::builder() - .options(poise::FrameworkOptions { - commands: vec![hello()], - ..Default::default() - }) - .token(discord_token) - .intents(serenity::GatewayIntents::non_privileged()) - .setup(|ctx, _ready, framework| { - Box::pin(async move { - poise::builtins::register_globally(ctx, &framework.options().commands).await?; - Ok(Data {}) - }) - }) - .build() - .await - .map_err(shuttle_service::error::CustomError::new)?; - - Ok(framework) - }"#} + use poise::serenity_prelude as serenity; + use shuttle_secrets::SecretStore; + use shuttle_poise::ShuttlePoise; + + struct Data {} // User data, which is stored and accessible in all command invocations + type Error = Box; + type Context<'a> = poise::Context<'a, Data, Error>; + + /// Responds with "world!" + #[poise::command(slash_command)] + async fn hello(ctx: Context<'_>) -> Result<(), Error> { + ctx.say("world!").await?; + Ok(()) + } + + #[shuttle_runtime::main] + async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { + // Get the discord token set in `Secrets.toml` + let discord_token = secret_store + .get("DISCORD_TOKEN") + .context("'DISCORD_TOKEN' was not found")?; + + let framework = poise::Framework::builder() + .options(poise::FrameworkOptions { + commands: vec![hello()], + ..Default::default() + }) + .token(discord_token) + .intents(serenity::GatewayIntents::non_privileged()) + .setup(|ctx, _ready, framework| { + Box::pin(async move { + poise::builtins::register_globally(ctx, &framework.options().commands).await?; + Ok(Data {}) + }) + }) + .build() + .await + .map_err(shuttle_runtime::CustomError::new)?; + + Ok(framework.into()) + }"#} } } @@ -558,25 +647,37 @@ impl ShuttleInit for ShuttleInitTower { url: &Url, get_dependency_version_fn: GetDependencyVersionFn, ) { - set_inline_table_dependency_features( - "shuttle-service", + set_inline_table_dependency_version( + "hyper", dependencies, - vec!["web-tower".to_string()], + manifest_path, + url, + false, + get_dependency_version_fn, ); - set_inline_table_dependency_version( - "tower", + set_inline_table_dependency_features("hyper", dependencies, vec!["full".to_string()]); + + set_key_value_dependency_version( + "shuttle-tower", dependencies, manifest_path, url, - false, + true, get_dependency_version_fn, ); - set_inline_table_dependency_features("tower", dependencies, vec!["full".to_string()]); + set_key_value_dependency_version( + "tokio", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); set_inline_table_dependency_version( - "hyper", + "tower", dependencies, manifest_path, url, @@ -584,7 +685,7 @@ impl ShuttleInit for ShuttleInitTower { get_dependency_version_fn, ); - set_inline_table_dependency_features("hyper", dependencies, vec!["full".to_string()]); + set_inline_table_dependency_features("tower", dependencies, vec!["full".to_string()]); } fn get_boilerplate_code_for_framework(&self) -> &'static str { @@ -619,9 +720,11 @@ impl ShuttleInit for ShuttleInitTower { } } - #[shuttle_service::main] - async fn tower() -> Result { - Ok(HelloWorld) + #[shuttle_runtime::main] + async fn tower() -> shuttle_tower::ShuttleTower { + let service = HelloWorld; + + Ok(service.into()) }"#} } } @@ -636,10 +739,22 @@ impl ShuttleInit for ShuttleInitWarp { url: &Url, get_dependency_version_fn: GetDependencyVersionFn, ) { - set_inline_table_dependency_features( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-warp", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); + + set_key_value_dependency_version( + "tokio", dependencies, - vec!["web-warp".to_string()], + manifest_path, + url, + true, + get_dependency_version_fn, ); set_key_value_dependency_version( @@ -654,13 +769,13 @@ impl ShuttleInit for ShuttleInitWarp { fn get_boilerplate_code_for_framework(&self) -> &'static str { indoc! {r#" - use warp::Filter; - use warp::Reply; - - #[shuttle_service::main] - async fn warp() -> shuttle_service::ShuttleWarp<(impl Reply,)> { - let route = warp::any().map(|| "Hello, World"); - Ok(route.boxed()) + use warp::Filter; + use warp::Reply; + + #[shuttle_runtime::main] + async fn warp() -> shuttle_warp::ShuttleWarp<(impl Reply,)> { + let route = warp::any().map(|| "Hello, World!"); + Ok(route.boxed().into()) }"#} } } @@ -675,10 +790,13 @@ impl ShuttleInit for ShuttleInitThruster { url: &Url, get_dependency_version_fn: GetDependencyVersionFn, ) { - set_inline_table_dependency_features( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-thruster", dependencies, - vec!["web-thruster".to_string()], + manifest_path, + url, + true, + get_dependency_version_fn, ); set_inline_table_dependency_version( @@ -695,6 +813,15 @@ impl ShuttleInit for ShuttleInitThruster { dependencies, vec!["hyper_server".to_string()], ); + + set_key_value_dependency_version( + "tokio", + dependencies, + manifest_path, + url, + true, + get_dependency_version_fn, + ); } fn get_boilerplate_code_for_framework(&self) -> &'static str { @@ -703,20 +830,21 @@ impl ShuttleInit for ShuttleInitThruster { context::basic_hyper_context::{generate_context, BasicHyperContext as Ctx, HyperRequest}, m, middleware_fn, App, HyperServer, MiddlewareNext, MiddlewareResult, ThrusterServer, }; - + #[middleware_fn] async fn hello(mut context: Ctx, _next: MiddlewareNext) -> MiddlewareResult { context.body("Hello, World!"); Ok(context) } - - #[shuttle_service::main] - async fn thruster() -> shuttle_service::ShuttleThruster> { - Ok(HyperServer::new( + + #[shuttle_runtime::main] + async fn thruster() -> shuttle_thruster::ShuttleThruster> { + let server = HyperServer::new( App::::create(generate_context, ()).get("/hello", m![hello]), - )) - } - "#} + ); + + Ok(server.into()) + }"#} } } @@ -736,9 +864,9 @@ impl ShuttleInit for ShuttleInitNoOp { } } -/// Interoprates with `cargo` crate and calls `cargo init --libs [path]`. +/// Interoprates with `cargo` crate and calls `cargo init [path]`. pub fn cargo_init(path: PathBuf) -> Result<()> { - let opts = NewOptions::new(None, false, true, path, None, None, None)?; + let opts = NewOptions::new(None, true, false, path, None, None, None)?; let cargo_config = cargo::util::config::Config::default()?; let init_result = cargo::ops::init(&opts, &cargo_config)?; @@ -750,7 +878,7 @@ pub fn cargo_init(path: PathBuf) -> Result<()> { Ok(()) } -/// Performs shuttle init on the existing files generated by `cargo init --libs [path]`. +/// Performs shuttle init on the existing files generated by `cargo init [path]`. pub fn cargo_shuttle_init(path: PathBuf, framework: Framework) -> Result<()> { let cargo_toml_path = path.join("Cargo.toml"); let mut cargo_doc = read_to_string(cargo_toml_path.clone()) @@ -758,33 +886,28 @@ pub fn cargo_shuttle_init(path: PathBuf, framework: Framework) -> Result<()> { .parse::() .unwrap(); - // Remove empty dependencies table to re-insert after the lib table is inserted - cargo_doc.remove("dependencies"); - - // Create an empty `[lib]` table - cargo_doc["lib"] = Item::Table(Table::new()); - // Add publish: false to avoid accidental `cargo publish` cargo_doc["package"]["publish"] = value(false); - // Create `[dependencies]` table - let mut dependencies = Table::new(); + // Get `[dependencies]` table + let mut dependencies = cargo_doc["dependencies"] + .as_table_mut() + .expect("manifest to have a dependencies table"); - // Set "shuttle-service" version to `[dependencies]` table let manifest_path = find(Some(path.as_path())).unwrap(); let url = registry_url(manifest_path.as_path(), None).expect("Could not find registry URL"); - set_inline_table_dependency_version( - "shuttle-service", - &mut dependencies, + let init_config = framework.init_config(); + + set_key_value_dependency_version( + "shuttle-runtime", + dependencies, &manifest_path, &url, - false, + true, // TODO: disallow pre-release when releasing 0.12? get_latest_dependency_version, ); - let init_config = framework.init_config(); - // Set framework-specific dependencies to the `dependencies` table init_config.set_cargo_dependencies( &mut dependencies, @@ -796,14 +919,13 @@ pub fn cargo_shuttle_init(path: PathBuf, framework: Framework) -> Result<()> { // Truncate Cargo.toml and write the updated `Document` to it let mut cargo_toml = File::create(cargo_toml_path)?; - cargo_doc["dependencies"] = Item::Table(dependencies); cargo_toml.write_all(cargo_doc.to_string().as_bytes())?; - // Write boilerplate to `src/lib.rs` file - let lib_path = path.join("src").join("lib.rs"); + // Write boilerplate to `src/main.rs` file + let main_path = path.join("src").join("main.rs"); let boilerplate = init_config.get_boilerplate_code_for_framework(); if !boilerplate.is_empty() { - write_lib_file(boilerplate, &lib_path)?; + write_main_file(boilerplate, &main_path)?; } Ok(()) @@ -871,10 +993,10 @@ fn get_latest_dependency_version( latest_version.to_string() } -/// Writes `boilerplate` code to the specified `lib.rs` file path. -pub fn write_lib_file(boilerplate: &'static str, lib_path: &Path) -> Result<()> { - let mut lib_file = File::create(lib_path)?; - lib_file.write_all(boilerplate.as_bytes())?; +/// Writes `boilerplate` code to the specified `main.rs` file path. +pub fn write_main_file(boilerplate: &'static str, main_path: &Path) -> Result<()> { + let mut main_file = File::create(main_path)?; + main_file.write_all(boilerplate.as_bytes())?; Ok(()) } @@ -908,12 +1030,12 @@ mod shuttle_init_tests { set_inline_table_dependency_features( "shuttle-service", dependencies, - vec!["test-feature".to_string()], + vec!["builder".to_string()], ); let expected = indoc! {r#" [dependencies] - shuttle-service = { features = ["test-feature"] } + shuttle-service = { features = ["builder"] } "#}; assert_eq!(cargo_toml.to_string(), expected); @@ -973,12 +1095,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -991,8 +1113,10 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-actix-web"] } + shuttle-runtime = "1.0" actix-web = "1.0" + shuttle-actix-web = "1.0" + tokio = "1.0" "#}; assert_eq!(cargo_toml.to_string(), expected); @@ -1005,12 +1129,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1023,9 +1147,10 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-axum"] } + shuttle-runtime = "1.0" axum = "1.0" - sync_wrapper = "1.0" + shuttle-axum = "1.0" + tokio = "1.0" "#}; assert_eq!(cargo_toml.to_string(), expected); @@ -1038,12 +1163,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1056,8 +1181,10 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-rocket"] } + shuttle-runtime = "1.0" rocket = "1.0" + shuttle-rocket = "1.0" + tokio = "1.0" "#}; assert_eq!(cargo_toml.to_string(), expected); @@ -1070,12 +1197,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1088,7 +1215,9 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-tide"] } + shuttle-runtime = "1.0" + shuttle-tide = "1.0" + tokio = "1.0" tide = "1.0" "#}; @@ -1102,12 +1231,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1120,9 +1249,11 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-tower"] } - tower = { version = "1.0", features = ["full"] } + shuttle-runtime = "1.0" hyper = { version = "1.0", features = ["full"] } + shuttle-tower = "1.0" + tokio = "1.0" + tower = { version = "1.0", features = ["full"] } "#}; assert_eq!(cargo_toml.to_string(), expected); @@ -1135,12 +1266,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1153,8 +1284,10 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-poem"] } + shuttle-runtime = "1.0" poem = "1.0" + shuttle-poem = "1.0" + tokio = "1.0" "#}; assert_eq!(cargo_toml.to_string(), expected); @@ -1167,12 +1300,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1185,8 +1318,10 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-salvo"] } + shuttle-runtime = "1.0" salvo = "1.0" + shuttle-salvo = "1.0" + tokio = "1.0" "#}; assert_eq!(cargo_toml.to_string(), expected); @@ -1199,12 +1334,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1217,10 +1352,12 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["bot-serenity"] } + shuttle-runtime = "1.0" anyhow = "1.0" serenity = { version = "1.0", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } shuttle-secrets = "1.0" + shuttle-serenity = "1.0" + tokio = "1.0" tracing = "1.0" "#}; @@ -1234,12 +1371,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1251,12 +1388,14 @@ mod shuttle_init_tests { ); let expected = indoc! {r#" - [dependencies] - shuttle-service = { version = "1.0", features = ["bot-poise"] } - anyhow = "1.0" - poise = "1.0" - shuttle-secrets = "1.0" - tracing = "1.0" + [dependencies] + shuttle-runtime = "1.0" + anyhow = "1.0" + poise = "1.0" + shuttle-poise = "1.0" + shuttle-secrets = "1.0" + tokio = "1.0" + tracing = "1.0" "#}; assert_eq!(cargo_toml.to_string(), expected); @@ -1269,12 +1408,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1287,7 +1426,9 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-warp"] } + shuttle-runtime = "1.0" + shuttle-warp = "1.0" + tokio = "1.0" warp = "1.0" "#}; @@ -1301,12 +1442,12 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://shuttle.rs").unwrap(); - set_inline_table_dependency_version( - "shuttle-service", + set_key_value_dependency_version( + "shuttle-runtime", dependencies, &manifest_path, &url, - false, + true, mock_get_latest_dependency_version, ); @@ -1319,13 +1460,17 @@ mod shuttle_init_tests { let expected = indoc! {r#" [dependencies] - shuttle-service = { version = "1.0", features = ["web-thruster"] } + shuttle-runtime = "1.0" + shuttle-thruster = "1.0" thruster = { version = "1.0", features = ["hyper_server"] } + tokio = "1.0" "#}; assert_eq!(cargo_toml.to_string(), expected); } + // TODO: unignore this test when we publish shuttle-rocket + #[ignore] #[test] /// Makes sure that Rocket uses allow_prerelease flag when fetching the latest version fn test_get_latest_dependency_version_rocket() { @@ -1334,6 +1479,15 @@ mod shuttle_init_tests { let manifest_path = PathBuf::new(); let url = Url::parse("https://github.com/rust-lang/crates.io-index").unwrap(); + set_key_value_dependency_version( + "shuttle-runtime", + dependencies, + &manifest_path, + &url, + true, + mock_get_latest_dependency_version, + ); + ShuttleInitRocket.set_cargo_dependencies( dependencies, &manifest_path, diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 2194391db..20e6195c0 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -157,11 +157,17 @@ impl Shuttle { // 3. Confirm the project directory let path = if interactive { + let path = args + .path + .to_str() + .context("path arg should always be set")?; + println!("Where should we create this project?"); let directory_str: String = Input::with_theme(&theme) .with_prompt("Directory") - .default(".".to_owned()) + .default(path.to_owned()) .interact()?; + println!(); args::parse_init_path(OsString::from(directory_str))? } else { diff --git a/cargo-shuttle/tests/integration/init.rs b/cargo-shuttle/tests/integration/init.rs index 45551314a..432c3d945 100644 --- a/cargo-shuttle/tests/integration/init.rs +++ b/cargo-shuttle/tests/integration/init.rs @@ -27,11 +27,14 @@ async fn non_interactive_basic_init() { Shuttle::new().unwrap().run(args).await.unwrap(); let cargo_toml = read_to_string(temp_dir_path.join("Cargo.toml")).unwrap(); + // Expected: name = "basic-initRANDOM_CHARS" assert!(cargo_toml.contains("name = \"basic-init")); - assert!(cargo_toml.contains("shuttle-service = { version = ")); + assert!(cargo_toml.contains("shuttle-service = ")); } +// TODO: unignore when shuttle-rocket is published +#[ignore] #[tokio::test] async fn non_interactive_rocket_init() { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -54,6 +57,8 @@ async fn non_interactive_rocket_init() { assert_valid_rocket_project(temp_dir_path.as_path(), "rocket-init"); } +// TODO: unignore when shuttle-rocket is published +#[ignore] #[test] fn interactive_rocket_init() -> Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -93,6 +98,8 @@ fn interactive_rocket_init() -> Result<(), Box> { Ok(()) } +// TODO: unignore when shuttle-rocket is published +#[ignore] #[test] fn interactive_rocket_init_dont_prompt_framework() -> Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -128,6 +135,8 @@ fn interactive_rocket_init_dont_prompt_framework() -> Result<(), Box Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); From db09323424ea516b242d66d2279d900162bbf128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 14 Mar 2023 12:17:23 +0000 Subject: [PATCH 58/74] fix: codegen clippy (#709) * fix: codegen clippy * fix: clippy --- cargo-shuttle/src/client.rs | 2 +- cargo-shuttle/src/init.rs | 8 ++++---- cargo-shuttle/src/provisioner_server.rs | 4 ++-- codegen/src/shuttle_main/mod.rs | 16 ++++++---------- common/src/models/project.rs | 5 ++--- common/src/models/secret.rs | 3 +-- common/src/models/service.rs | 7 +++---- common/src/project.rs | 3 +-- 8 files changed, 20 insertions(+), 28 deletions(-) diff --git a/cargo-shuttle/src/client.rs b/cargo-shuttle/src/client.rs index 28ded40ee..048c441b4 100644 --- a/cargo-shuttle/src/client.rs +++ b/cargo-shuttle/src/client.rs @@ -200,7 +200,7 @@ impl Client { async fn ws_get(&self, path: String) -> Result>> { let ws_scheme = self.api_url.clone().replace("http", "ws"); - let url = format!("{}{}", ws_scheme, path); + let url = format!("{ws_scheme}{path}"); let mut request = url.into_client_request()?; if let Some(ref api_key) = self.api_key { diff --git a/cargo-shuttle/src/init.rs b/cargo-shuttle/src/init.rs index 8f5aed878..2926a08ac 100644 --- a/cargo-shuttle/src/init.rs +++ b/cargo-shuttle/src/init.rs @@ -873,7 +873,7 @@ pub fn cargo_init(path: PathBuf) -> Result<()> { // Mimic `cargo init` behavior and log status or error to shell cargo_config .shell() - .status("Created", format!("{} (shuttle) package", init_result))?; + .status("Created", format!("{init_result} (shuttle) package"))?; Ok(()) } @@ -890,7 +890,7 @@ pub fn cargo_shuttle_init(path: PathBuf, framework: Framework) -> Result<()> { cargo_doc["package"]["publish"] = value(false); // Get `[dependencies]` table - let mut dependencies = cargo_doc["dependencies"] + let dependencies = cargo_doc["dependencies"] .as_table_mut() .expect("manifest to have a dependencies table"); @@ -910,7 +910,7 @@ pub fn cargo_shuttle_init(path: PathBuf, framework: Framework) -> Result<()> { // Set framework-specific dependencies to the `dependencies` table init_config.set_cargo_dependencies( - &mut dependencies, + dependencies, &manifest_path, &url, get_latest_dependency_version, @@ -985,7 +985,7 @@ fn get_latest_dependency_version( ) -> String { let latest_version = get_latest_dependency(crate_name, flag_allow_prerelease, manifest_path, Some(url)) - .unwrap_or_else(|_| panic!("Could not query the latest version of {}", crate_name)); + .unwrap_or_else(|_| panic!("Could not query the latest version of {crate_name}")); let latest_version = latest_version .version() .expect("No latest shuttle-service version available"); diff --git a/cargo-shuttle/src/provisioner_server.rs b/cargo-shuttle/src/provisioner_server.rs index 960f6621a..3981c70f2 100644 --- a/cargo-shuttle/src/provisioner_server.rs +++ b/cargo-shuttle/src/provisioner_server.rs @@ -68,7 +68,7 @@ impl LocalProvisioner { env, is_ready_cmd, } = db_type_to_config(db_type); - let container_name = format!("shuttle_{}_{}", service_name, r#type); + let container_name = format!("shuttle_{service_name}_{type}"); let container = match self.docker.inspect_container(&container_name, None).await { Ok(container) => { @@ -297,7 +297,7 @@ fn print_layers(layers: &Vec) { (Some(status), _) => status.to_string(), _ => "Unknown".to_string(), }; - println!("[{id} {}]", text); + println!("[{id} {text}]"); } else { println!( "{}", diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 741c5f0cf..3d49794d8 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -93,7 +93,7 @@ impl Loader { pub(crate) fn from_item_fn(item_fn: &mut ItemFn) -> Option { let fn_ident = item_fn.sig.ident.clone(); - if fn_ident.clone().to_string() == "main".to_string() { + if fn_ident.to_string().as_str() == "main" { emit_error!( fn_ident, "shuttle_runtime::main functions cannot be named `main`" @@ -127,15 +127,11 @@ impl Loader { }) .collect(); - if let Some(type_path) = check_return_type(item_fn.sig.clone()) { - Some(Self { - fn_ident: fn_ident.clone(), - fn_inputs: inputs, - fn_return: type_path, - }) - } else { - None - } + check_return_type(item_fn.sig.clone()).map(|type_path| Self { + fn_ident: fn_ident.clone(), + fn_inputs: inputs, + fn_return: type_path, + }) } } diff --git a/common/src/models/project.rs b/common/src/models/project.rs index eac73b113..70f14e137 100644 --- a/common/src/models/project.rs +++ b/common/src/models/project.rs @@ -135,7 +135,7 @@ impl Display for State { State::Destroyed => write!(f, "{}", "destroyed".blue()), State::Errored { message } => { writeln!(f, "{}", "errored".red())?; - write!(f, "\tmessage: {}", message) + write!(f, "\tmessage: {message}") } } } @@ -199,9 +199,8 @@ pub fn get_table(projects: &Vec) -> String { format!( r#" These projects are linked to this account -{} +{table} "#, - table, ) } } diff --git a/common/src/models/secret.rs b/common/src/models/secret.rs index 2f9cddf6d..a89dfa1d0 100644 --- a/common/src/models/secret.rs +++ b/common/src/models/secret.rs @@ -38,9 +38,8 @@ pub fn get_table(secrets: &Vec) -> String { format!( r#"These secrets are linked to this service -{} +{table} "#, - table ) } } diff --git a/common/src/models/service.rs b/common/src/models/service.rs index 5537567b4..2dfef55a6 100644 --- a/common/src/models/service.rs +++ b/common/src/models/service.rs @@ -46,7 +46,7 @@ impl Display for Detailed { let resources = get_resources_table(&self.resources); let secrets = secret::get_table(&self.secrets); - write!(f, "{}{}{}", deploys, resources, secrets) + write!(f, "{deploys}{resources}{secrets}") } } @@ -82,7 +82,7 @@ URI: {} let resources = get_resources_table(&self.resources); - write!(f, "{}{}", deployment, resources) + write!(f, "{deployment}{resources}") } } @@ -150,9 +150,8 @@ fn get_resources_table(resources: &Vec) -> String { format!( r#"These resources are linked to this service -{} +{table} "#, - table ) } } diff --git a/common/src/project.rs b/common/src/project.rs index d4816c50b..5846de6f8 100644 --- a/common/src/project.rs +++ b/common/src/project.rs @@ -99,13 +99,12 @@ impl Display for ProjectNameError { ProjectNameError::InvalidName(name) => write!( f, r#" -`{}` is an invalid project name. project name must +`{name}` is an invalid project name. project name must 1. start and end with alphanumeric characters. 2. only contain characters inside of the alphanumeric range, except for `-`, or `_`. 3. not be empty., 4. not contain profanity. 5. not be a reserved word."#, - name ), } } From 9f73d61f330b0f66ce926081581703f115629d59 Mon Sep 17 00:00:00 2001 From: Pieter Date: Tue, 14 Mar 2023 17:12:34 +0200 Subject: [PATCH 59/74] misc: v0.12.0-rc1 (#708) * misc: v0.12.0-rc1 * misc: publish proto * refactor: remove relative from build.rs * refactor: add description to proto * refactor: make runtime publishable * refactor: make actix publishable * feat: make shuttle-axum publishable * feat: make poem publishable * feat: make poise publishable * feat: make shuttle-rocket publishable * refactor: make warp publishable * refactor: make tower publishable * refactor: make tide publishable * refactor: make thruster publishable * refactor: make serenity publishable * refactor: make salvo publishable --------- Co-authored-by: oddgrd <29732646+oddgrd@users.noreply.github.com> --- Cargo.lock | 24 +++++++++---------- Cargo.toml | 10 ++++---- admin/Cargo.toml | 2 +- cargo-shuttle/Cargo.toml | 4 ++-- cargo-shuttle/README.md | 2 +- codegen/Cargo.toml | 2 +- common/Cargo.toml | 2 +- deployer/Cargo.toml | 2 +- .../tests/deploy_layer/bind-panic/Cargo.toml | 2 +- .../tests/deploy_layer/main-panic/Cargo.toml | 2 +- .../tests/deploy_layer/self-stop/Cargo.toml | 2 +- .../tests/deploy_layer/sleep-async/Cargo.toml | 2 +- examples | 2 +- gateway/Cargo.toml | 2 +- proto/Cargo.toml | 3 ++- proto/build.rs | 5 +--- resources/aws-rds/Cargo.toml | 4 ++-- resources/persist/Cargo.toml | 6 ++--- resources/secrets/Cargo.toml | 4 ++-- resources/shared-db/Cargo.toml | 4 ++-- resources/static-folder/Cargo.toml | 4 ++-- runtime/Cargo.toml | 5 ++-- service/Cargo.toml | 2 +- service/src/lib.rs | 4 ++-- services/shuttle-actix-web/Cargo.toml | 7 ++++-- services/shuttle-axum/Cargo.toml | 7 ++++-- services/shuttle-poem/Cargo.toml | 7 ++++-- services/shuttle-poise/Cargo.toml | 7 ++++-- services/shuttle-rocket/Cargo.toml | 7 ++++-- services/shuttle-salvo/Cargo.toml | 7 ++++-- services/shuttle-serenity/Cargo.toml | 7 ++++-- services/shuttle-thruster/Cargo.toml | 7 ++++-- services/shuttle-tide/Cargo.toml | 7 ++++-- services/shuttle-tower/Cargo.toml | 7 ++++-- services/shuttle-warp/Cargo.toml | 7 ++++-- 35 files changed, 105 insertions(+), 73 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ace53bce..058004ef8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -971,7 +971,7 @@ dependencies = [ [[package]] name = "cargo-shuttle" -version = "0.11.2" +version = "0.12.0-rc1" dependencies = [ "anyhow", "assert_cmd", @@ -4537,7 +4537,7 @@ dependencies = [ [[package]] name = "shuttle-admin" -version = "0.11.0" +version = "0.12.0-rc1" dependencies = [ "anyhow", "clap 4.0.27", @@ -4554,7 +4554,7 @@ dependencies = [ [[package]] name = "shuttle-auth" -version = "0.11.0" +version = "0.12.0-rc1" dependencies = [ "anyhow", "async-trait", @@ -4583,7 +4583,7 @@ dependencies = [ [[package]] name = "shuttle-codegen" -version = "0.11.0" +version = "0.12.0-rc1" dependencies = [ "pretty_assertions", "proc-macro-error", @@ -4595,7 +4595,7 @@ dependencies = [ [[package]] name = "shuttle-common" -version = "0.11.2" +version = "0.12.0-rc1" dependencies = [ "anyhow", "async-trait", @@ -4640,7 +4640,7 @@ dependencies = [ [[package]] name = "shuttle-deployer" -version = "0.11.1" +version = "0.12.0-rc1" dependencies = [ "anyhow", "async-trait", @@ -4688,7 +4688,7 @@ dependencies = [ [[package]] name = "shuttle-gateway" -version = "0.11.2" +version = "0.12.0-rc1" dependencies = [ "acme2", "anyhow", @@ -4753,7 +4753,7 @@ dependencies = [ [[package]] name = "shuttle-proto" -version = "0.11.0" +version = "0.12.0-rc1" dependencies = [ "anyhow", "chrono", @@ -4770,7 +4770,7 @@ dependencies = [ [[package]] name = "shuttle-provisioner" -version = "0.11.0" +version = "0.12.0-rc1" dependencies = [ "aws-config", "aws-sdk-rds", @@ -4796,7 +4796,7 @@ dependencies = [ [[package]] name = "shuttle-runtime" -version = "0.1.0" +version = "0.12.0-rc1" dependencies = [ "anyhow", "async-trait", @@ -4828,7 +4828,7 @@ dependencies = [ [[package]] name = "shuttle-secrets" -version = "0.11.0" +version = "0.12.0-rc1" dependencies = [ "async-trait", "shuttle-service", @@ -4836,7 +4836,7 @@ dependencies = [ [[package]] name = "shuttle-service" -version = "0.11.0" +version = "0.12.0-rc1" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index 86627999b..5d9f5960b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,17 +26,17 @@ exclude = [ ] [workspace.package] -version = "0.11.0" +version = "0.12.0-rc1" edition = "2021" license = "Apache-2.0" repository = "https://github.com/shuttle-hq/shuttle" # https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacedependencies-table [workspace.dependencies] -shuttle-codegen = { path = "codegen", version = "0.11.0" } -shuttle-common = { path = "common", version = "0.11.2" } -shuttle-proto = { path = "proto", version = "0.11.0" } -shuttle-service = { path = "service", version = "0.11.0" } +shuttle-codegen = { path = "codegen", version = "0.12.0-rc1" } +shuttle-common = { path = "common", version = "0.12.0-rc1" } +shuttle-proto = { path = "proto", version = "0.12.0-rc1" } +shuttle-service = { path = "service", version = "0.12.0-rc1" } anyhow = "1.0.66" async-trait = "0.1.58" diff --git a/admin/Cargo.toml b/admin/Cargo.toml index 20b4127a7..8177eba5a 100644 --- a/admin/Cargo.toml +++ b/admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-admin" -version = "0.11.0" +version = "0.12.0-rc1" edition = "2021" [dependencies] diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index d053b2860..efccd1efb 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-shuttle" -version = "0.11.2" +version = "0.12.0-rc1" edition.workspace = true license.workspace = true repository.workspace = true @@ -63,7 +63,7 @@ features = ["models"] workspace = true [dependencies.shuttle-secrets] -version = "0.11.0" +version = "0.12.0-rc1" path = "../resources/secrets" [dependencies.shuttle-service] diff --git a/cargo-shuttle/README.md b/cargo-shuttle/README.md index ae1da5f10..d81ae7a43 100644 --- a/cargo-shuttle/README.md +++ b/cargo-shuttle/README.md @@ -105,7 +105,7 @@ cargo shuttle init --rocket my-rocket-app This should generate the following dependency in `Cargo.toml`: ```toml -shuttle-service = { version = "0.11.0", features = ["web-rocket"] } +shuttle-service = { version = "0.12.0-rc1", features = ["web-rocket"] } ``` The following boilerplate code should be generated into `src/lib.rs`: diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index faff07977..1a270570b 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-codegen" -version = "0.11.0" +version = "0.12.0-rc1" edition.workspace = true license.workspace = true repository.workspace = true diff --git a/common/Cargo.toml b/common/Cargo.toml index 49c4f736f..c7678719a 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-common" -version = "0.11.2" +version = "0.12.0-rc1" edition.workspace = true license.workspace = true repository.workspace = true diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index 9c6f7ab23..f1cde9eb1 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-deployer" -version = "0.11.1" +version = "0.12.0-rc1" edition.workspace = true license.workspace = true description = "Service with instances created per project for handling the compilation, loading, and execution of Shuttle services" diff --git a/deployer/tests/deploy_layer/bind-panic/Cargo.toml b/deployer/tests/deploy_layer/bind-panic/Cargo.toml index 632c09176..be2f6ab65 100644 --- a/deployer/tests/deploy_layer/bind-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/bind-panic/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = "0.1.0" +shuttle-runtime = "0.12.0-rc1" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/main-panic/Cargo.toml b/deployer/tests/deploy_layer/main-panic/Cargo.toml index 9632a72d7..098c09b10 100644 --- a/deployer/tests/deploy_layer/main-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/main-panic/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = "0.1.0" +shuttle-runtime = "0.12.0-rc1" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/self-stop/Cargo.toml b/deployer/tests/deploy_layer/self-stop/Cargo.toml index bab0ac511..4ae9c37fe 100644 --- a/deployer/tests/deploy_layer/self-stop/Cargo.toml +++ b/deployer/tests/deploy_layer/self-stop/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = "0.1.0" +shuttle-runtime = "0.12.0-rc1" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/sleep-async/Cargo.toml b/deployer/tests/deploy_layer/sleep-async/Cargo.toml index ed33c2630..e9cbb4ae9 100644 --- a/deployer/tests/deploy_layer/sleep-async/Cargo.toml +++ b/deployer/tests/deploy_layer/sleep-async/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = "0.1.0" +shuttle-runtime = "0.12.0-rc1" tokio = { version = "1.0", features = ["time"]} diff --git a/examples b/examples index c35653890..330d3488e 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit c35653890aa7b0d8e4cb70131027990d4ed6afa6 +Subproject commit 330d3488ede46b4449fd219574620bd4a712a319 diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 9f3c867dd..1819b87b5 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-gateway" -version = "0.11.2" +version = "0.12.0-rc1" edition.workspace = true license.workspace = true publish = false diff --git a/proto/Cargo.toml b/proto/Cargo.toml index bb6725807..44e2d990c 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -3,7 +3,8 @@ name = "shuttle-proto" version.workspace = true edition.workspace = true license.workspace = true -publish = false +description = "Library for all the gRPC definitions used by shuttle" + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] diff --git a/proto/build.rs b/proto/build.rs index 0edbacf8c..685a01573 100644 --- a/proto/build.rs +++ b/proto/build.rs @@ -1,8 +1,5 @@ fn main() -> Result<(), Box> { - tonic_build::configure().compile( - &["../proto/provisioner.proto", "../proto/runtime.proto"], - &["../proto"], - )?; + tonic_build::configure().compile(&["./provisioner.proto", "./runtime.proto"], &["./"])?; Ok(()) } diff --git a/resources/aws-rds/Cargo.toml b/resources/aws-rds/Cargo.toml index 951ced4d5..c1d92ec52 100644 --- a/resources/aws-rds/Cargo.toml +++ b/resources/aws-rds/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-aws-rds" -version = "0.11.0" +version = "0.12.0-rc1" edition = "2021" license = "Apache-2.0" description = "Plugin to provision AWS RDS resources" @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "rds"] [dependencies] async-trait = "0.1.56" paste = "1.0.7" -shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"] } [features] diff --git a/resources/persist/Cargo.toml b/resources/persist/Cargo.toml index dd0ed1860..590e0235a 100644 --- a/resources/persist/Cargo.toml +++ b/resources/persist/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-persist" -version = "0.11.0" +version = "0.12.0-rc1" edition = "2021" license = "Apache-2.0" description = "Plugin for persist objects" @@ -11,6 +11,6 @@ keywords = ["shuttle-service", "persistence"] async-trait = "0.1.56" bincode = "1.2.1" serde = { version = "1.0.0", features = ["derive"] } -shuttle-common = { path = "../../common", version = "0.11.0", default-features = false } -shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } +shuttle-common = { path = "../../common", version = "0.12.0-rc1", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } thiserror = "1.0.32" diff --git a/resources/secrets/Cargo.toml b/resources/secrets/Cargo.toml index 599ce1a82..582867062 100644 --- a/resources/secrets/Cargo.toml +++ b/resources/secrets/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-secrets" -version = "0.11.0" +version = "0.12.0-rc1" edition = "2021" license = "Apache-2.0" description = "Plugin to for managing secrets on shuttle" @@ -9,4 +9,4 @@ keywords = ["shuttle-service", "secrets"] [dependencies] async-trait = "0.1.56" -shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } diff --git a/resources/shared-db/Cargo.toml b/resources/shared-db/Cargo.toml index 3d78638e5..9e8ce42a5 100644 --- a/resources/shared-db/Cargo.toml +++ b/resources/shared-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-shared-db" -version = "0.11.0" +version = "0.12.0-rc1" edition = "2021" license = "Apache-2.0" description = "Plugin for managing shared databases on shuttle" @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "database"] [dependencies] async-trait = "0.1.56" mongodb = { version = "2.3.0", optional = true } -shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"], optional = true } [features] diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml index 23a200eec..de8002f6c 100644 --- a/resources/static-folder/Cargo.toml +++ b/resources/static-folder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-static-folder" -version = "0.11.3" +version = "0.12.0-rc1" edition = "2021" license = "Apache-2.0" description = "Plugin to get a static folder at runtime on shuttle" @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "static-folder"] [dependencies] async-trait = "0.1.56" fs_extra = "1.3.0" -shuttle-service = { path = "../../service", version = "0.11.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } tracing = "0.1.37" [dev-dependencies] diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 0a417f502..23f13a28d 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "shuttle-runtime" -version = "0.1.0" +version = "0.12.0-rc1" edition.workspace = true license.workspace = true -publish = false +description = "Runtime to start and manage any service that runs on shuttle" + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [[bin]] diff --git a/service/Cargo.toml b/service/Cargo.toml index 64178f863..69f30b7ff 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-service" -version = "0.11.0" +version = "0.12.0-rc1" edition.workspace = true license.workspace = true repository.workspace = true diff --git a/service/src/lib.rs b/service/src/lib.rs index 030a4c9ae..b67937eee 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -27,7 +27,7 @@ //! be a library crate with a `shuttle-service` dependency with the `web-rocket` feature on the `shuttle-service` dependency. //! //! ```toml -//! shuttle-service = { version = "0.11.0", features = ["web-rocket"] } +//! shuttle-service = { version = "0.12.0-rc1", features = ["web-rocket"] } //! ``` //! //! A boilerplate code for your rocket project can also be found in `src/lib.rs`: @@ -107,7 +107,7 @@ //! Add `shuttle-shared-db` as a dependency with the `postgres` feature, and add `sqlx` as a dependency with the `runtime-tokio-native-tls` and `postgres` features inside `Cargo.toml`: //! //! ```toml -//! shuttle-shared-db = { version = "0.11.0", features = ["postgres"] } +//! shuttle-shared-db = { version = "0.12.0-rc1", features = ["postgres"] } //! sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } //! ``` //! diff --git a/services/shuttle-actix-web/Cargo.toml b/services/shuttle-actix-web/Cargo.toml index b80256c5c..6b0d262a6 100644 --- a/services/shuttle-actix-web/Cargo.toml +++ b/services/shuttle-actix-web/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-actix-web" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run an actix webserver on shuttle" +keywords = ["shuttle-service", "actix"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] actix-web = { version = "4.3.1" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } num_cpus = "1.15.0" [dev-dependencies] diff --git a/services/shuttle-axum/Cargo.toml b/services/shuttle-axum/Cargo.toml index dc7002c3d..0de287235 100644 --- a/services/shuttle-axum/Cargo.toml +++ b/services/shuttle-axum/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-axum" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run an axum webserver on shuttle" +keywords = ["shuttle-service", "axum"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] axum = { version = "0.6.10" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-poem/Cargo.toml b/services/shuttle-poem/Cargo.toml index 9b68f4cee..fccef51da 100644 --- a/services/shuttle-poem/Cargo.toml +++ b/services/shuttle-poem/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-poem" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a poem webserver on shuttle" +keywords = ["shuttle-service", "poem"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] poem = { version = "1.3.55" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-poise/Cargo.toml b/services/shuttle-poise/Cargo.toml index 8f153217d..4da1a48ac 100644 --- a/services/shuttle-poise/Cargo.toml +++ b/services/shuttle-poise/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-poise" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a poise discord bot on shuttle" +keywords = ["shuttle-service", "poise", "discord-bot", "serenity"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] poise = { version = "0.5.2" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } [dev-dependencies] shuttle-secrets = { path = "../../resources/secrets" } diff --git a/services/shuttle-rocket/Cargo.toml b/services/shuttle-rocket/Cargo.toml index ac2337964..821d3223d 100644 --- a/services/shuttle-rocket/Cargo.toml +++ b/services/shuttle-rocket/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-rocket" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a rocket webserver on shuttle" +keywords = ["shuttle-service", "rocket"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] rocket = { version = "0.5.0-rc.2" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-salvo/Cargo.toml b/services/shuttle-salvo/Cargo.toml index 4568225fe..d71780480 100644 --- a/services/shuttle-salvo/Cargo.toml +++ b/services/shuttle-salvo/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-salvo" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a salvo webserver on shuttle" +keywords = ["shuttle-service", "salvo"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] salvo = { version = "0.37.5" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-serenity/Cargo.toml b/services/shuttle-serenity/Cargo.toml index c1e768f5a..5c504cbe8 100644 --- a/services/shuttle-serenity/Cargo.toml +++ b/services/shuttle-serenity/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-serenity" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a serenity server on shuttle" +keywords = ["shuttle-service", "serenity"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } [dev-dependencies] anyhow = "1.0.69" diff --git a/services/shuttle-thruster/Cargo.toml b/services/shuttle-thruster/Cargo.toml index af839c677..a77df0029 100644 --- a/services/shuttle-thruster/Cargo.toml +++ b/services/shuttle-thruster/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-thruster" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a thruster webserver on shuttle" +keywords = ["shuttle-service", "thruster"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] thruster = { version = "1.3.0" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } [dev-dependencies] thruster = { version = "1.3.0", features = ["hyper_server"] } diff --git a/services/shuttle-tide/Cargo.toml b/services/shuttle-tide/Cargo.toml index 41ec5df63..e1a78e2dd 100644 --- a/services/shuttle-tide/Cargo.toml +++ b/services/shuttle-tide/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-tide" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a tide webserver on shuttle" +keywords = ["shuttle-service", "tide"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] tide = { version = "0.16.0" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } # Tide does not have tokio support. So make sure async-std is compatible with tokio # https://github.com/http-rs/tide/issues/791 diff --git a/services/shuttle-tower/Cargo.toml b/services/shuttle-tower/Cargo.toml index 162508255..fc676c468 100644 --- a/services/shuttle-tower/Cargo.toml +++ b/services/shuttle-tower/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-tower" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a tower webserver on shuttle" +keywords = ["shuttle-service", "tower"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] hyper = { version = "0.14.23", features = ["server", "tcp", "http1"] } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } tower = { version = "0.4.13", features = ["make"] } [dev-dependencies] diff --git a/services/shuttle-warp/Cargo.toml b/services/shuttle-warp/Cargo.toml index 7953981a2..004110884 100644 --- a/services/shuttle-warp/Cargo.toml +++ b/services/shuttle-warp/Cargo.toml @@ -1,14 +1,17 @@ [package] name = "shuttle-warp" -version = "0.1.0" +version = "0.12.0-rc1" edition = "2021" +license = "Apache-2.0" +description = "Service implementation to run a warp webserver on shuttle" +keywords = ["shuttle-service", "warp"] [workspace] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] warp = { version = "0.3.3" } -shuttle-runtime = { path = "../../runtime", version = "0.1.0" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } From add6a8e8e3b4df04697bf5e02517de5beb43dfc6 Mon Sep 17 00:00:00 2001 From: Pieter Date: Tue, 14 Mar 2023 18:08:48 +0200 Subject: [PATCH 60/74] [next] refactor: update runtime manager (#711) * refactor: allow multiple runtimes to run at the same time This is needed so that a new deployment can enter the loading state without killing currently running runtimes. * refactor: extra comment --- deployer/src/deployment/run.rs | 2 +- deployer/src/runtime_manager.rs | 248 +++++++++++++------------------- 2 files changed, 97 insertions(+), 153 deletions(-) diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index 5f520b06f..aeff36140 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -208,7 +208,7 @@ impl Built { let runtime_client = runtime_manager .lock() .await - .get_runtime_client(legacy_runtime_path.clone()) + .get_runtime_client(self.id, legacy_runtime_path.clone()) .await .map_err(Error::Runtime)?; diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index 14638d155..529228032 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -1,4 +1,4 @@ -use std::{convert::TryInto, path::PathBuf, sync::Arc}; +use std::{collections::HashMap, convert::TryInto, path::PathBuf, sync::Arc}; use anyhow::Context; use shuttle_proto::runtime::{ @@ -6,19 +6,18 @@ use shuttle_proto::runtime::{ }; use tokio::{process, sync::Mutex}; use tonic::transport::Channel; -use tracing::{debug, info, instrument, trace}; +use tracing::{debug, info, trace}; use uuid::Uuid; use crate::deployment::deploy_layer; const MANIFEST_DIR: &str = env!("CARGO_MANIFEST_DIR"); +/// Manager that can start up mutliple runtimes. This is needed so that two runtimes can be up when a new deployment is made: +/// One runtime for the new deployment being loaded; another for the currently active deployment #[derive(Clone)] pub struct RuntimeManager { - legacy: Option>, - legacy_process: Option>>, - next: Option>, - next_process: Option>>, + runtimes: Arc)>>>, artifacts_path: PathBuf, provisioner_address: String, log_sender: crossbeam_channel::Sender, @@ -31,10 +30,7 @@ impl RuntimeManager { log_sender: crossbeam_channel::Sender, ) -> Arc> { Arc::new(Mutex::new(Self { - legacy: None, - legacy_process: None, - next: None, - next_process: None, + runtimes: Arc::new(std::sync::Mutex::new(HashMap::new())), artifacts_path, provisioner_address, log_sender, @@ -43,157 +39,109 @@ impl RuntimeManager { pub async fn get_runtime_client( &mut self, + id: Uuid, legacy_runtime_path: Option, ) -> anyhow::Result> { - if legacy_runtime_path.is_none() { - debug!("Getting shuttle-next runtime client"); - - Self::get_runtime_client_helper( - &mut self.next, - &mut self.next_process, - None, - self.artifacts_path.clone(), - &self.provisioner_address, - self.log_sender.clone(), - ) - .await - } else { - debug!("Getting legacy runtime client"); - - Self::get_runtime_client_helper( - &mut self.legacy, - &mut self.legacy_process, - legacy_runtime_path, - self.artifacts_path.clone(), - &self.provisioner_address, - self.log_sender.clone(), - ) - .await - } - } + trace!("making new client"); - /// Send a kill / stop signal for a deployment to any runtimes currently running - pub async fn kill(&mut self, id: &Uuid) -> bool { - let success_legacy = if let Some(legacy_client) = &mut self.legacy { - trace!(%id, "sending stop signal to legacy for deployment"); + let port = portpicker::pick_unused_port().context("failed to find available port")?; + let is_next = legacy_runtime_path.is_none(); - let stop_request = tonic::Request::new(StopRequest {}); - let response = legacy_client.stop(stop_request).await.unwrap(); + let get_runtime_executable = || { + if let Some(legacy_runtime) = legacy_runtime_path { + debug!( + "Starting legacy runtime at: {}", + legacy_runtime + .clone() + .into_os_string() + .into_string() + .unwrap_or_default() + ); + legacy_runtime + } else { + if cfg!(debug_assertions) { + debug!("Installing shuttle-next runtime in debug mode from local source"); + // If we're running deployer natively, install shuttle-runtime using the + // version of runtime from the calling repo. + let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")); + + // The path will not be valid if we are in a deployer container, in which + // case we don't try to install and use the one installed in deploy.sh. + if let Ok(path) = path { + std::process::Command::new("cargo") + .arg("install") + .arg("shuttle-runtime") + .arg("--path") + .arg(path) + .arg("--bin") + .arg("shuttle-next") + .arg("--features") + .arg("next") + .output() + .expect("failed to install the local version of shuttle-runtime"); + } + } - response.into_inner().success - } else { - trace!("no legacy client running"); - true + debug!("Returning path to shuttle-next runtime",); + // If we're in a deployer built with the containerfile, the runtime will have + // been installed in deploy.sh. + home::cargo_home() + .expect("failed to find path to cargo home") + .join("bin/shuttle-next") + } }; - let success_next = if let Some(next_client) = &mut self.next { - trace!(%id, "sending stop signal to next for deployment"); + let (process, runtime_client) = runtime::start( + is_next, + runtime::StorageManagerType::Artifacts(self.artifacts_path.clone()), + &self.provisioner_address, + port, + get_runtime_executable, + ) + .await + .context("failed to start shuttle runtime")?; + + let sender = self.log_sender.clone(); + let mut stream = runtime_client + .clone() + .subscribe_logs(tonic::Request::new(SubscribeLogsRequest {})) + .await + .context("subscribing to runtime logs stream")? + .into_inner(); - let stop_request = tonic::Request::new(StopRequest {}); - let response = next_client.stop(stop_request).await.unwrap(); + tokio::spawn(async move { + while let Ok(Some(log)) = stream.message().await { + if let Ok(log) = log.try_into() { + sender.send(log).expect("to send log to persistence"); + } + } + }); - response.into_inner().success - } else { - trace!("no next client running"); - true - }; + self.runtimes + .lock() + .unwrap() + .insert(id, (process, runtime_client.clone())); - success_legacy && success_next + Ok(runtime_client) } - #[instrument(skip(runtime_option, process_option, log_sender))] - async fn get_runtime_client_helper( - runtime_option: &mut Option>, - process_option: &mut Option>>, - legacy_runtime_path: Option, - artifacts_path: PathBuf, - provisioner_address: &str, - log_sender: crossbeam_channel::Sender, - ) -> anyhow::Result> { - if let Some(runtime_client) = runtime_option { - trace!("returning previous client"); - Ok(runtime_client.clone()) - } else { - trace!("making new client"); - - let port = portpicker::pick_unused_port().context("failed to find available port")?; - let is_next = legacy_runtime_path.is_none(); - - let get_runtime_executable = || { - if let Some(legacy_runtime) = legacy_runtime_path { - debug!( - "Starting legacy runtime at: {}", - legacy_runtime - .clone() - .into_os_string() - .into_string() - .unwrap_or_default() - ); - legacy_runtime - } else { - if cfg!(debug_assertions) { - debug!("Installing shuttle-next runtime in debug mode from local source"); - // If we're running deployer natively, install shuttle-runtime using the - // version of runtime from the calling repo. - let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")); - - // The path will not be valid if we are in a deployer container, in which - // case we don't try to install and use the one installed in deploy.sh. - if let Ok(path) = path { - std::process::Command::new("cargo") - .arg("install") - .arg("shuttle-runtime") - .arg("--path") - .arg(path) - .arg("--bin") - .arg("shuttle-next") - .arg("--features") - .arg("next") - .output() - .expect("failed to install the local version of shuttle-runtime"); - } - } + /// Send a kill / stop signal for a deployment to its running runtime + pub async fn kill(&mut self, id: &Uuid) -> bool { + let value = self.runtimes.lock().unwrap().remove(id); - debug!("Returning path to shuttle-next runtime",); - // If we're in a deployer built with the containerfile, the runtime will have - // been installed in deploy.sh. - home::cargo_home() - .expect("failed to find path to cargo home") - .join("bin/shuttle-next") - } - }; - - let (process, runtime_client) = runtime::start( - is_next, - runtime::StorageManagerType::Artifacts(artifacts_path), - provisioner_address, - port, - get_runtime_executable, - ) - .await - .context("failed to start shuttle runtime")?; - - let sender = log_sender; - let mut stream = runtime_client - .clone() - .subscribe_logs(tonic::Request::new(SubscribeLogsRequest {})) - .await - .context("subscribing to runtime logs stream")? - .into_inner(); - - tokio::spawn(async move { - while let Ok(Some(log)) = stream.message().await { - if let Ok(log) = log.try_into() { - sender.send(log).expect("to send log to persistence"); - } - } - }); + if let Some((mut process, mut runtime_client)) = value { + trace!(%id, "sending stop signal for deployment"); + + let stop_request = tonic::Request::new(StopRequest {}); + let response = runtime_client.stop(stop_request).await.unwrap(); - *runtime_option = Some(runtime_client.clone()); - *process_option = Some(Arc::new(std::sync::Mutex::new(process))); + let result = response.into_inner().success; + let _ = process.start_kill(); - // Safe to unwrap as it was just set - Ok(runtime_client) + result + } else { + trace!("no client running"); + true } } } @@ -202,12 +150,8 @@ impl Drop for RuntimeManager { fn drop(&mut self) { info!("runtime manager shutting down"); - if let Some(ref process) = self.legacy_process.take() { - let _ = process.lock().unwrap().start_kill(); - } - - if let Some(ref process) = self.next_process.take() { - let _ = process.lock().unwrap().start_kill(); + for (process, _runtime_client) in self.runtimes.lock().unwrap().values_mut() { + let _ = process.start_kill(); } } } From f21d0dde37eeaf02f660b832964edac94aef0160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 14 Mar 2023 17:57:58 +0000 Subject: [PATCH 61/74] Feature: eng 497 update or remove the docs in shuttle (#710) * docs: update service docs * docs: move service crate-docs to runtime * docs: update main readme * tests: fix init test --- README.md | 4 +- cargo-shuttle/tests/integration/init.rs | 2 +- runtime/Cargo.toml | 3 + runtime/src/lib.rs | 216 +++++++++++++++++++ service/src/lib.rs | 263 +++--------------------- 5 files changed, 248 insertions(+), 240 deletions(-) diff --git a/README.md b/README.md index 03b30c12b..537e6bd22 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@


    - + docs @@ -72,7 +72,7 @@ And that's... it. ```bash $ cargo shuttle deploy - Finished dev [unoptimized + debuginfo] target(s) in 1m 01s + Finished release [optimized + debuginfo] target(s) in 1m 01s Project: hello-world Deployment Id: 3d08ac34-ad63-41c1-836b-99afdc90af9f diff --git a/cargo-shuttle/tests/integration/init.rs b/cargo-shuttle/tests/integration/init.rs index 432c3d945..75ac846fa 100644 --- a/cargo-shuttle/tests/integration/init.rs +++ b/cargo-shuttle/tests/integration/init.rs @@ -30,7 +30,7 @@ async fn non_interactive_basic_init() { // Expected: name = "basic-initRANDOM_CHARS" assert!(cargo_toml.contains("name = \"basic-init")); - assert!(cargo_toml.contains("shuttle-service = ")); + assert!(cargo_toml.contains("shuttle-runtime = ")); } // TODO: unignore when shuttle-rocket is published diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 23f13a28d..2035f34a8 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -11,6 +11,9 @@ description = "Runtime to start and manage any service that runs on shuttle" name = "shuttle-next" required-features = ["next"] +[lib] +doctest = false + [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 573a3c6f8..5509506fa 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,3 +1,219 @@ +#![doc( + html_logo_url = "https://raw.githubusercontent.com/shuttle-hq/shuttle/main/assets/logo-square-transparent.png", + html_favicon_url = "https://raw.githubusercontent.com/shuttle-hq/shuttle/main/assets/favicon.ico" +)] +//! # Shuttle - Deploy Rust apps with a single Cargo subcommand +//!

    +//! +//! Hello, and welcome to the shuttle API documentation! +//! +//! Shuttle is an open-source app platform that uses traits and annotations to configure your backend deployments. +//! +//! ## Usage +//! Start by installing the [`cargo shuttle`](https://docs.rs/crate/cargo-shuttle/latest) subcommand by running the following in a terminal: +//! +//! ```bash +//! $ cargo install cargo-shuttle +//! ``` +//! +//! Now that shuttle is installed, you can initialize a project with Axum boilerplate: +//! ```bash +//! $ cargo shuttle init --axum my-axum-app +//! ``` +//! +//! By looking at the `Cargo.toml` file of the generated `my-axum-app` project you will see it has been made to +//! be a binary crate with a few dependencies including `shuttle-runtime` and `shuttle-axum`. +//! +//! ```toml +//! shuttle-runtime = "0.12.0" +//! axum = "0.6.10" +//! shuttle-axum = "0.12.0" +//! tokio = "1.26" +//! ``` +//! +//! A boilerplate code for your axum project can also be found in `src/main.rs`: +//! +//! ```rust,no_run +//! use axum::{routing::get, Router}; +//! +//! async fn hello_world() -> &'static str { +//! "Hello, world!" +//! } +//! +//! #[shuttle_runtime::main] +//! async fn axum() -> shuttle_axum::ShuttleAxum { +//! let router = Router::new().route("/hello", get(hello_world)); +//! +//! Ok(router.into()) +//! } +//! ``` +//! +//! Check out [our docs](https://docs.shuttle.rs/introduction/welcome) to see all the frameworks we support, or +//! our [examples](https://github.com/shuttle-hq/examples) if you prefer that format. +//! +//! ## Running locally +//! To test your app locally before deploying, use: +//! +//! ```bash +//! $ cargo shuttle run +//! ``` +//! +//! You should see your app build and start on the default port 8000. You can test this using; +//! +//! ```bash +//! $ curl http://localhost:8000/hello +//! +//! Hello, world! +//! ``` +//! +//! ## Deploying +//! +//! You can deploy your service with the [`cargo shuttle`](https://docs.rs/crate/cargo-shuttle/latest) subcommand too. +//! But, you will need to authenticate with the shuttle service first using: +//! +//! ```bash +//! $ cargo shuttle login +//! ``` +//! +//! This will open a browser window and prompt you to connect using your GitHub account. +//! +//! Before you can deploy, you have to create a project. This will start a deployer container for your +//! project under the hood, ensuring isolation from other users' projects. PS. you don't have to do this +//! now if you did in in the `cargo shuttle init` flow. +//! +//! ```bash +//! $ cargo shuttle project new +//! ``` +//! +//! Then, deploy the service with: +//! +//! ```bash +//! $ cargo shuttle deploy +//! ``` +//! +//! Your service will immediately be available at `{crate_name}.shuttleapp.rs`. For example: +//! +//! ```bash +//! $ curl https://my-axum-app.shuttleapp.rs/hello +//! Hello, world! +//! ``` +//! +//! ## Using `sqlx` +//! +//! Here is a quick example to deploy a rocket service that uses a postgres database and [sqlx](http://docs.rs/sqlx): +//! +//! Initialize a project with Rocket boilerplate: +//! ```bash +//! $ cargo shuttle init --rocket my-rocket-app +//! ``` +//! +//! Add `shuttle-shared-db` as a dependency with the `postgres` feature, and add `sqlx` as a dependency with the +//! `runtime-tokio-native-tls` and `postgres` features inside `Cargo.toml`: +//! +//! ```toml +//! shuttle-shared-db = { version = "0.12.0", features = ["postgres"] } +//! sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } +//! ``` +//! +//! Now update the `#[shuttle_runtime::main]` function to take in a `PgPool`: +//! +//! ```rust,no_run +//! #[macro_use] +//! extern crate rocket; +//! +//! use rocket::State; +//! use sqlx::PgPool; +//! use shuttle_rocket::ShuttleRocket; +//! +//! struct MyState(PgPool); +//! +//! #[get("/hello")] +//! fn hello(state: &State) -> &'static str { +//! // Do things with `state.0`... +//! "Hello, Postgres!" +//! } +//! +//! #[shuttle_runtime::main] +//! async fn rocket(#[shuttle_shared_db::Postgres] pool: PgPool) -> ShuttleRocket { +//! let state = MyState(pool); +//! let rocket = rocket::build().manage(state).mount("/", routes![hello]); +//! +//! Ok(rocket.into()) +//! } +//! ``` +//! +//! For a local run, shuttle will automatically provision a Postgres instance inside a [Docker](https://www.docker.com/) container on your machine and connect it to the `PgPool`. +//! +//! For deploys, shuttle will provision a database for your application and connect it to the `PgPool` on your behalf. +//! +//! To learn more about shuttle managed resources, see our [resource docs](https://docs.shuttle.rs/resources/shuttle-shared-db). +//! +//! ## Configuration +//! +//! The `cargo shuttle` command can be customized by creating a `Shuttle.toml` in the same location as your `Cargo.toml`. +//! +//! ##### Change the name of your service +//! +//! To have your service deployed with a different name, add a `name` entry in the `Shuttle.toml`: +//! +//! ```toml +//! name = "hello-world" +//! ``` +//! +//! If the `name` key is not specified, the service's name will be the same as the crate's name. +//! +//! Alternatively, you can override the project name on the command-line, by passing the --name argument to any subcommand like so: +//! +//! ```bash +//! $ cargo shuttle deploy --name=$PROJECT_NAME +//! ``` +//! +//! ##### Using Podman instead of Docker +//! If you are using [Podman](https://podman.io/) instead of Docker, then `cargo shuttle run` will give +//! `got unexpected error while inspecting docker container: error trying to connect: No such file or directory` error. +//! +//! To fix this error you will need to expose a rootless socket for Podman first. This can be done using: +//! +//! ```bash +//! podman system service --time=0 unix:///tmp/podman.sock +//! ``` +//! +//! Now set the `DOCKER_HOST` environment variable to point to this socket using: +//! +//! ```bash +//! export DOCKER_HOST=unix:///tmp/podman.sock +//! ``` +//! +//! Now all `cargo shuttle run` commands will work against Podman. +//! +//! ## Getting API keys +//! +//! After you've installed the [cargo-shuttle](https://docs.rs/crate/cargo-shuttle/latest) command, run: +//! +//! ```bash +//! $ cargo shuttle login +//! ``` +//! +//! this will open a browser window and prompt you to connect using your GitHub account. +//! +//! ## We're in alpha 🤗 +//! +//! Thanks for using shuttle! We're very happy to have you with us! +//! +//! During our alpha period, API keys are completely free and you can deploy as many services as you want. +//! +//! Just keep in mind that there may be some kinks that require us to take all deployments down once in a while. In certain circumstances we may also have to delete all the data associated with those deployments. +//! +//! To stay updated with the release status of shuttle, [join our Discord](https://discord.gg/shuttle)! +//! +//! ## Join Discord +//! +//! If you have any questions, [join our Discord server](https://discord.gg/shuttle). There's always someone on there that can help! +//! +//! You can also [open an issue or a discussion on GitHub](https://github.com/shuttle-hq/shuttle). +//! mod legacy; mod logger; #[cfg(feature = "next")] diff --git a/service/src/lib.rs b/service/src/lib.rs index b67937eee..36439ae54 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -1,214 +1,3 @@ -#![doc( - html_logo_url = "https://raw.githubusercontent.com/shuttle-hq/shuttle/main/assets/logo-square-transparent.png", - html_favicon_url = "https://raw.githubusercontent.com/shuttle-hq/shuttle/main/assets/favicon.ico" -)] -//! # Shuttle - Deploy Rust apps with a single Cargo subcommand -//!
    -//! -//!
    -//! -//! Hello, and welcome to the shuttle API documentation! -//! -//! Shuttle is an open-source app platform that uses traits and annotations to configure your backend deployments. -//! -//! ## Usage -//! Start by installing the [`cargo shuttle`](https://docs.rs/crate/cargo-shuttle/latest) subcommand by running the following in a terminal: -//! -//! ```bash -//! $ cargo install cargo-shuttle -//! ``` -//! -//! Now that shuttle is installed, you can initialize a project with Rocket boilerplate: -//! ```bash -//! $ cargo shuttle init --rocket my-rocket-app -//! ``` -//! -//! By looking at the `Cargo.toml` file of the generated `my-rocket-app` project you will see it has been made to -//! be a library crate with a `shuttle-service` dependency with the `web-rocket` feature on the `shuttle-service` dependency. -//! -//! ```toml -//! shuttle-service = { version = "0.12.0-rc1", features = ["web-rocket"] } -//! ``` -//! -//! A boilerplate code for your rocket project can also be found in `src/lib.rs`: -//! -//! ```rust,no_run -//! #[macro_use] -//! extern crate rocket; -//! -//! use shuttle_service::ShuttleRocket; -//! -//! #[get("/hello")] -//! fn hello() -> &'static str { -//! "Hello, world!" -//! } -//! -//! #[shuttle_service::main] -//! async fn init() -> ShuttleRocket { -//! let rocket = rocket::build().mount("/", routes![hello]); -//! -//! Ok(rocket) -//! } -//! ``` -//! -//! See the [shuttle_service::main][main] macro for more information on supported services - such as `axum`. -//! Or look at [more complete examples](https://github.com/shuttle-hq/examples), but -//! take note that the examples may update before official releases. -//! -//! ## Running locally -//! To test your app locally before deploying, use: -//! -//! ```bash -//! $ cargo shuttle run -//! ``` -//! -//! You should see your app build and start on the default port 8000. You can test this using; -//! -//! ```bash -//! $ curl http://localhost:8000/hello -//! Hello, world! -//! ``` -//! -//! ## Deploying -//! -//! You can deploy your service with the [`cargo shuttle`](https://docs.rs/crate/cargo-shuttle/latest) subcommand too. -//! But, you will need to authenticate with the shuttle service first using: -//! -//! ```bash -//! $ cargo shuttle login -//! ``` -//! -//! this will open a browser window and prompt you to connect using your GitHub account. -//! -//! Before you can deploy, you have to create a project. This will start a deployer container for your -//! project under the hood, ensuring isolation from other users' projects. -//! -//! ```bash -//! $ cargo shuttle project new -//! ``` -//! -//! Then, deploy the service with: -//! -//! ```bash -//! $ cargo shuttle deploy -//! ``` -//! -//! Your service will immediately be available at `{crate_name}.shuttleapp.rs`. For example: -//! -//! ```bash -//! $ curl https://my-rocket-app.shuttleapp.rs/hello -//! Hello, world! -//! ``` -//! -//! ## Using `sqlx` -//! -//! Here is a quick example to deploy a service that uses a postgres database and [sqlx](http://docs.rs/sqlx): -//! -//! Add `shuttle-shared-db` as a dependency with the `postgres` feature, and add `sqlx` as a dependency with the `runtime-tokio-native-tls` and `postgres` features inside `Cargo.toml`: -//! -//! ```toml -//! shuttle-shared-db = { version = "0.12.0-rc1", features = ["postgres"] } -//! sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres"] } -//! ``` -//! -//! Now update the `#[shuttle_service::main]` function to take in a `PgPool`: -//! -//! ```rust,no_run -//! #[macro_use] -//! extern crate rocket; -//! -//! use rocket::State; -//! use sqlx::PgPool; -//! use shuttle_service::ShuttleRocket; -//! -//! struct MyState(PgPool); -//! -//! #[get("/hello")] -//! fn hello(state: &State) -> &'static str { -//! // Do things with `state.0`... -//! "Hello, Postgres!" -//! } -//! -//! #[shuttle_service::main] -//! async fn rocket(#[shuttle_shared_db::Postgres] pool: PgPool) -> ShuttleRocket { -//! let state = MyState(pool); -//! let rocket = rocket::build().manage(state).mount("/", routes![hello]); -//! -//! Ok(rocket) -//! } -//! ``` -//! -//! For a local run, shuttle will automatically provision a Postgres instance inside a [Docker](https://www.docker.com/) container on your machine and connect it to the `PgPool`. -//! -//! For deploys, shuttle will provision a database for your application and connect it to the `PgPool` on your behalf. -//! -//! To learn more about shuttle managed resources, see [shuttle_service::main][main#getting-shuttle-managed-resources]. -//! -//! ## Configuration -//! -//! The `cargo shuttle` command can be customised by creating a `Shuttle.toml` in the same location as your `Cargo.toml`. -//! -//! ##### Change the name of your service -//! -//! To have your service deployed with a different name, add a `name` entry in the `Shuttle.toml`: -//! -//! ```toml -//! name = "hello-world" -//! ``` -//! -//! If the `name` key is not specified, the service's name will be the same as the crate's name. -//! -//! Alternatively, you can override the project name on the command-line, by passing the --name argument to any subcommand like so: -//! -//! ```bash -//! cargo shuttle deploy --name=$PROJECT_NAME -//! ``` -//! -//! ##### Using Podman instead of Docker -//! If you are using [Podman](https://podman.io/) instead of Docker, then `cargo shuttle run` will give -//! `got unexpected error while inspecting docker container: error trying to connect: No such file or directory` error. -//! -//! To fix this error you will need to expose a rootless socket for Podman first. This can be done using: -//! -//! ```bash -//! podman system service --time=0 unix:///tmp/podman.sock -//! ``` -//! -//! Now set the `DOCKER_HOST` environment variable to point to this socket using: -//! -//! ```bash -//! export DOCKER_HOST=unix:///tmp/podman.sock -//! ``` -//! -//! Now all `cargo shuttle run` commands will work against Podman. -//! -//! ## Getting API keys -//! -//! After you've installed the [cargo-shuttle](https://docs.rs/crate/cargo-shuttle/latest) command, run: -//! -//! ```bash -//! $ cargo shuttle login -//! ``` -//! -//! this will open a browser window and prompt you to connect using your GitHub account. -//! -//! ## We're in alpha 🤗 -//! -//! Thanks for using shuttle! We're very happy to have you with us! -//! -//! During our alpha period, API keys are completely free and you can deploy as many services as you want. -//! -//! Just keep in mind that there may be some kinks that require us to take all deployments down once in a while. In certain circumstances we may also have to delete all the data associated with those deployments. -//! -//! To stay updated with the release status of shuttle, [join our Discord](https://discord.gg/shuttle)! -//! -//! ## Join Discord -//! -//! If you have any questions, [join our Discord server](https://discord.gg/shuttle). There's always someone on there that can help! -//! -//! You can also [open an issue or a discussion on GitHub](https://github.com/shuttle-hq/shuttle). -//! - use std::collections::BTreeMap; use std::net::SocketAddr; use std::path::PathBuf; @@ -229,46 +18,46 @@ extern crate shuttle_codegen; /// The simplest usage is when your service does not require any shuttle managed resources, so you only need to return a shuttle supported service: /// /// ```rust,no_run -/// use shuttle_service::ShuttleRocket; +/// use shuttle_rocket::ShuttleRocket; /// -/// #[shuttle_service::main] +/// #[shuttle_rocket::main] /// async fn rocket() -> ShuttleRocket { /// let rocket = rocket::build(); /// -/// Ok(rocket) +/// Ok(rocket.into()) /// } /// ``` /// /// ## shuttle supported services -/// The following types can be returned from a `#[shuttle_service::main]` function and enjoy first class service support in shuttle. Be sure to also enable the correct feature on -/// `shuttle-service` in `Cargo.toml` for the type to be recognized. -/// -/// | Return type | Feature flag | Service | Version | Example | -/// | ------------------------------------- | ------------ | ------------------------------------------- | ---------- | ----------------------------------------------------------------------------------- | -/// | `ShuttleRocket` | web-rocket | [rocket](https://docs.rs/rocket/0.5.0-rc.2) | 0.5.0-rc.2 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/rocket/hello-world) | -/// | `ShuttleAxum` | web-axum | [axum](https://docs.rs/axum/0.5) | 0.5 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/axum/hello-world) | -/// | `ShuttleSalvo` | web-salvo | [salvo](https://docs.rs/salvo/0.34.3) | 0.34.3 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/salvo/hello-world) | -/// | `ShuttleTide` | web-tide | [tide](https://docs.rs/tide/0.16.0) | 0.16.0 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/tide/hello-world) | -/// | `ShuttlePoem` | web-poem | [poem](https://docs.rs/poem/1.3.35) | 1.3.35 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/poem/hello-world) | -/// | `Result` | web-tower | [tower](https://docs.rs/tower/0.4.12) | 0.14.12 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/tower/hello-world) | -/// | `ShuttleSerenity` | bot-serenity | [serenity](https://docs.rs/serenity/0.11.5) | 0.11.5 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/serenity/hello-world) | -/// | `ShuttlePoise` | bot-poise | [poise](https://docs.rs/poise/0.5.2) | 0.5.2 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/poise/hello-world) | -/// | `ShuttleActixWeb` | web-actix-web| [actix-web](https://docs.rs/actix-web/4.2.1)| 4.2.1 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/actix-web/hello-world) | +/// The following types can be returned from a `#[shuttle_service::main]` function and enjoy first class service support in shuttle. +/// +/// | Return type | Crate | Service | Version | Example | +/// | ------------------------------------- |-------------------------------------------------------------- | ------------------------------------------- | ---------- | ----------------------------------------------------------------------------------- | +/// | `ShuttleActixWeb` |[shuttle-actix-web](https://crates.io/crates/shuttle-actix-web)| [actix-web](https://docs.rs/actix-web/4.3) | 4.3 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/actix-web/hello-world) | +/// | `ShuttleAxum` |[shuttle-axum](https://crates.io/crates/shuttle-axum) | [axum](https://docs.rs/axum/0.6) | 0.5 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/axum/hello-world) | +/// | `ShuttlePoem` |[shuttle-poem](https://crates.io/crates/shuttle-poem) | [poem](https://docs.rs/poem/1.3) | 1.3 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/poem/hello-world) | +/// | `ShuttlePoise` |[shuttle-poise](https://crates.io/crates/shuttle-poise) | [poise](https://docs.rs/poise/0.5) | 0.5 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/poise/hello-world) | +/// | `ShuttleRocket` |[shuttle-rocket](https://crates.io/crates/shuttle-rocket) | [rocket](https://docs.rs/rocket/0.5.0-rc.2) | 0.5.0-rc.2 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/rocket/hello-world) | +/// | `ShuttleSalvo` |[shuttle-salvo](https://crates.io/crates/shuttle-salvo) | [salvo](https://docs.rs/salvo/0.37) | 0.37 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/salvo/hello-world) | +/// | `ShuttleSerenity` |[shuttle-serenity](https://crates.io/crates/shuttle-serenity | [serenity](https://docs.rs/serenity/0.11) | 0.11 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/serenity/hello-world) | +/// | `ShuttleThruster` |[shuttle-thruster](https://crates.io/crates/shuttle-thruster) | [thruster](https://docs.rs/thruster/1.3) | 1.3 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/thruster/hello-world) | +/// | `ShuttleTower` |[shuttle-tower](https://crates.io/crates/shuttle-tower) | [tower](https://docs.rs/tower/0.4) | 0.4 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/tower/hello-world) | +/// | `ShuttleTide` |[shuttle-tide](https://crates.io/crates/shuttle-tide) | [tide](https://docs.rs/tide/0.16) | 0.16 | [GitHub](https://github.com/shuttle-hq/examples/tree/main/tide/hello-world) | /// /// # Getting shuttle managed resources -/// Shuttle is able to manage resource dependencies for you. These resources are passed in as inputs to your `#[shuttle_service::main]` function and are configured using attributes: +/// Shuttle is able to manage resource dependencies for you. These resources are passed in as inputs to your `#[shuttle_runtime::main]` function and are configured using attributes: /// ```rust,no_run /// use sqlx::PgPool; -/// use shuttle_service::ShuttleRocket; +/// use shuttle_rocket::ShuttleRocket; /// /// struct MyState(PgPool); /// -/// #[shuttle_service::main] +/// #[shuttle_runtime::main] /// async fn rocket(#[shuttle_shared_db::Postgres] pool: PgPool) -> ShuttleRocket { /// let state = MyState(pool); /// let rocket = rocket::build().manage(state); /// -/// Ok(rocket) +/// Ok(rocket.into()) /// } /// ``` /// @@ -319,11 +108,11 @@ pub trait Factory: Send + Sync { /// You may want to create your own managed resource by implementing this trait for some builder `B` to construct resource `T`. [`Factory`] can be used to provision resources /// on shuttle's servers if your resource will need any. /// -/// Your resource will be available on a [shuttle_service::main][main] function as follow: +/// Your resource will be available on a [shuttle_runtime::main][main] function as follow: /// ``` -/// #[shuttle_service::main] +/// #[shuttle_runtime::main] /// async fn my_service([custom_resource_crate::namespace::B] custom_resource: T) -/// -> shuttle_service::ShuttleAxum {} +/// -> shuttle_axum::ShuttleAxum {} /// ``` /// /// Here `custom_resource_crate::namespace` is the crate and namespace to a builder `B` that implements [`ResourceBuilder`] to create resource `T`. @@ -366,11 +155,11 @@ pub trait Factory: Send + Sync { /// /// Then using this resource in a service: /// ``` -/// #[shuttle_service::main] +/// #[shuttle_runtime::main] /// async fn my_service( /// [custom_resource_crate::Builder(name = "John")] resource: custom_resource_crate::Resource /// ) -/// -> shuttle_service::ShuttleAxum {} +/// -> shuttle_axum::ShuttleAxum {} /// ``` #[async_trait] pub trait ResourceBuilder { From ff2ba8a6db4ea9488c1ad64e083acbd5684b0b5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Tue, 14 Mar 2023 18:22:27 +0000 Subject: [PATCH 62/74] refactor: rename legacy runtime to alpha (#713) * refactor: rename legacy runtime to alpha --- cargo-shuttle/src/lib.rs | 2 +- deployer/src/deployment/queue.rs | 6 +++--- deployer/src/deployment/run.rs | 6 +++--- deployer/src/runtime_manager.rs | 12 ++++++------ runtime/README.md | 10 +++++----- runtime/src/{legacy => alpha}/args.rs | 0 runtime/src/{legacy => alpha}/mod.rs | 16 ++++++++-------- runtime/src/lib.rs | 4 ++-- runtime/tests/integration/helpers.rs | 2 +- service/src/builder.rs | 6 +++--- service/tests/integration/build_crate.rs | 2 +- 11 files changed, 33 insertions(+), 33 deletions(-) rename runtime/src/{legacy => alpha}/args.rs (100%) rename runtime/src/{legacy => alpha}/mod.rs (97%) diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 20e6195c0..058a0eca5 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -457,7 +457,7 @@ impl Shuttle { let (is_wasm, executable_path) = match runtime { Runtime::Next(path) => (true, path), - Runtime::Legacy(path) => (false, path), + Runtime::Alpha(path) => (false, path), }; let provisioner = LocalProvisioner::new()?; diff --git a/deployer/src/deployment/queue.rs b/deployer/src/deployment/queue.rs index c48a20306..0087531be 100644 --- a/deployer/src/deployment/queue.rs +++ b/deployer/src/deployment/queue.rs @@ -397,7 +397,7 @@ async fn run_pre_deploy_tests( } /// This will store the path to the executable for each runtime, which will be the users project with -/// an embedded runtime for legacy, and a .wasm file for shuttle-next. +/// an embedded runtime for alpha, and a .wasm file for shuttle-next. #[instrument(skip(storage_manager, runtime, id))] async fn store_executable( storage_manager: &ArtifactsStorageManager, @@ -406,7 +406,7 @@ async fn store_executable( ) -> Result<()> { let executable_path = match runtime { Runtime::Next(path) => path, - Runtime::Legacy(path) => path, + Runtime::Alpha(path) => path, }; let new_executable_path = storage_manager.deployment_executable_path(id)?; @@ -559,7 +559,7 @@ ff0e55bda1ff01000000000000000000e0079c01ff12a55500280000", let build_p = storage_manager.builds_path().unwrap(); let executable_path = build_p.join("xyz"); - let runtime = Runtime::Legacy(executable_path.clone()); + let runtime = Runtime::Alpha(executable_path.clone()); let id = Uuid::new_v4(); fs::write(&executable_path, "barfoo").await.unwrap(); diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index aeff36140..b98d59416 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -182,7 +182,7 @@ impl Built { kill_old_deployments: impl futures::Future>, cleanup: impl FnOnce(SubscribeStopResponse) + Send + 'static, ) -> Result<()> { - // For legacy this is the path to the users project with an embedded runtime. + // For alpha this is the path to the users project with an embedded runtime. // For shuttle-next this is the path to the compiled .wasm file, which will be // used in the load request. let executable_path = storage_manager.deployment_executable_path(&self.id)?; @@ -198,7 +198,7 @@ impl Built { let address = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); - let legacy_runtime_path = if self.is_next { + let alpha_runtime_path = if self.is_next { // The runtime client for next is the installed shuttle-next bin None } else { @@ -208,7 +208,7 @@ impl Built { let runtime_client = runtime_manager .lock() .await - .get_runtime_client(self.id, legacy_runtime_path.clone()) + .get_runtime_client(self.id, alpha_runtime_path.clone()) .await .map_err(Error::Runtime)?; diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index 529228032..5eaed5c6e 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -40,24 +40,24 @@ impl RuntimeManager { pub async fn get_runtime_client( &mut self, id: Uuid, - legacy_runtime_path: Option, + alpha_runtime_path: Option, ) -> anyhow::Result> { trace!("making new client"); let port = portpicker::pick_unused_port().context("failed to find available port")?; - let is_next = legacy_runtime_path.is_none(); + let is_next = alpha_runtime_path.is_none(); let get_runtime_executable = || { - if let Some(legacy_runtime) = legacy_runtime_path { + if let Some(alpha_runtime) = alpha_runtime_path { debug!( - "Starting legacy runtime at: {}", - legacy_runtime + "Starting alpha runtime at: {}", + alpha_runtime .clone() .into_os_string() .into_string() .unwrap_or_default() ); - legacy_runtime + alpha_runtime } else { if cfg!(debug_assertions) { debug!("Installing shuttle-next runtime in debug mode from local source"); diff --git a/runtime/README.md b/runtime/README.md index 6299f996a..1939551ca 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -1,7 +1,7 @@ # How to run ## The easy way -Both the legacy and next examples can be run using the local client: +Both the alpha and next examples can be run using the local client: ``` bash cd path/to/example @@ -56,7 +56,7 @@ curl localhost:8000/hello curl localhost:8000/goodbye ``` -## shuttle-legacy +## shuttle-alpha This will no longer load a `.so` file, the code to start the runtime will be codegened for all services. @@ -86,16 +86,16 @@ cargo build Then in another shell, load the service and start it up: ``` bash -# load +# load the service grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//examples/rocket/hello-world/target/debug/libhello_world.so", "secrets": {"MY_API_KEY": "test"}}' localhost:6001 runtime.Runtime/Load -# run (this deployment id is default uuid encoded as base64) +# start the service grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start # subscribe to logs grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs -# stop (the service started in the legacy runtime can't currently be stopped) +# stop the service grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{}' localhost:6001 runtime.Runtime/Stop ``` diff --git a/runtime/src/legacy/args.rs b/runtime/src/alpha/args.rs similarity index 100% rename from runtime/src/legacy/args.rs rename to runtime/src/alpha/args.rs diff --git a/runtime/src/legacy/mod.rs b/runtime/src/alpha/mod.rs similarity index 97% rename from runtime/src/legacy/mod.rs rename to runtime/src/alpha/mod.rs index 521669051..3ff48029f 100644 --- a/runtime/src/legacy/mod.rs +++ b/runtime/src/alpha/mod.rs @@ -56,7 +56,7 @@ pub async fn start(loader: impl Loader + Send + 'static) { Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); // We wrap the StorageManager trait object in an Arc rather than a Box, since we need - // to clone it in the `ProvisionerFactory::new` call in the legacy runtime `load` method. + // to clone it in the `ProvisionerFactory::new` call in the alpha runtime `load` method. // We might be able to optimize this by implementing clone for a Box // or by using static dispatch instead. let storage_manager: Arc = match args.storage_manager_type { @@ -69,21 +69,21 @@ pub async fn start(loader: impl Loader + Send + 'static) { }; let router = { - let legacy = Legacy::new( + let alpha = Alpha::new( provisioner_address, loader, storage_manager, Environment::Local, ); - let svc = RuntimeServer::new(legacy); + let svc = RuntimeServer::new(alpha); server_builder.add_service(svc) }; router.serve(addr).await.unwrap(); } -pub struct Legacy { +pub struct Alpha { // Mutexes are for interior mutability logs_rx: Mutex>>, logs_tx: UnboundedSender, @@ -96,7 +96,7 @@ pub struct Legacy { env: Environment, } -impl Legacy { +impl Alpha { pub fn new( provisioner_address: Endpoint, loader: L, @@ -154,7 +154,7 @@ where } #[async_trait] -impl Runtime for Legacy +impl Runtime for Alpha where L: Loader + Send + 'static, S: Service + Send + 'static, @@ -165,7 +165,7 @@ where secrets, service_name, } = request.into_inner(); - trace!(path, "loading legacy project"); + trace!(path, "loading alpha project"); let secrets = BTreeMap::from_iter(secrets.into_iter()); @@ -255,7 +255,7 @@ where &self, request: Request, ) -> Result, Status> { - trace!("legacy starting"); + trace!("alpha starting"); let service = self.service.lock().unwrap().deref_mut().take(); let service = service.unwrap(); diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 5509506fa..31c11a7fa 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -214,14 +214,14 @@ //! //! You can also [open an issue or a discussion on GitHub](https://github.com/shuttle-hq/shuttle). //! -mod legacy; +mod alpha; mod logger; #[cfg(feature = "next")] mod next; mod provisioner_factory; +pub use alpha::{start, Alpha}; pub use async_trait::async_trait; -pub use legacy::{start, Legacy}; pub use logger::Logger; #[cfg(feature = "next")] pub use next::{AxumWasm, NextArgs}; diff --git a/runtime/tests/integration/helpers.rs b/runtime/tests/integration/helpers.rs index a894aec06..3b13eff51 100644 --- a/runtime/tests/integration/helpers.rs +++ b/runtime/tests/integration/helpers.rs @@ -42,7 +42,7 @@ pub async fn spawn_runtime(project_path: String, service_name: &str) -> Result (true, path), - Runtime::Legacy(path) => (false, path), + Runtime::Alpha(path) => (false, path), }; start_provisioner(DummyProvisioner, provisioner_address); diff --git a/service/src/builder.rs b/service/src/builder.rs index baf0082d8..5c5265130 100644 --- a/service/src/builder.rs +++ b/service/src/builder.rs @@ -17,7 +17,7 @@ use crate::NEXT_NAME; /// How to run/build the project pub enum Runtime { Next(PathBuf), - Legacy(PathBuf), + Alpha(PathBuf), } /// Given a project directory path, builds the crate @@ -70,7 +70,7 @@ pub async fn build_crate( Ok(if is_next { Runtime::Next(compilation.cdylibs[0].path.clone()) } else { - Runtime::Legacy(compilation.binaries[0].path.clone()) + Runtime::Alpha(compilation.binaries[0].path.clone()) }) } @@ -176,7 +176,7 @@ fn is_next(summary: &Summary) -> bool { .any(|dependency| dependency.package_name() == NEXT_NAME) } -/// Make sure the project is a binary for legacy projects. +/// Make sure the project is a binary for alpha projects. fn ensure_binary(manifest: &Manifest) -> anyhow::Result<()> { if manifest.targets().iter().any(|target| target.is_bin()) { Ok(()) diff --git a/service/tests/integration/build_crate.rs b/service/tests/integration/build_crate.rs index f36a46d5a..3e608fba4 100644 --- a/service/tests/integration/build_crate.rs +++ b/service/tests/integration/build_crate.rs @@ -30,7 +30,7 @@ async fn is_bin() { assert!(matches!( build_crate(Path::new(&project_path), false, tx).await, - Ok(Runtime::Legacy(_)) + Ok(Runtime::Alpha(_)) )); assert!(PathBuf::from(project_path) .join("target/debug/is-bin") From 95fe7ad29275b82b04483a8e0331288ffcb795b6 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 15 Mar 2023 07:15:15 +0200 Subject: [PATCH 63/74] refactor: move next to services (#714) * refactor: move next to services * ci: correct next * refactor: align folder --- .circleci/config.yml | 2 +- Cargo.lock | 14 ----------- Cargo.toml | 1 - examples | 2 +- next/Cargo.toml | 27 ---------------------- services/shuttle-next/Cargo.toml | 23 ++++++++++++++++++ {next => services/shuttle-next}/src/lib.rs | 0 7 files changed, 25 insertions(+), 44 deletions(-) delete mode 100644 next/Cargo.toml create mode 100644 services/shuttle-next/Cargo.toml rename {next => services/shuttle-next}/src/lib.rs (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4bbc03100..646569151 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -90,7 +90,6 @@ commands: shuttle-service = { path = "$PWD/service" } shuttle-aws-rds = { path = "$PWD/resources/aws-rds" } shuttle-persist = { path = "$PWD/resources/persist" } - shuttle-next = { path = "$PWD/next" } shuttle-runtime = { path = "$PWD/runtime" } shuttle-shared-db = { path = "$PWD/resources/shared-db" } shuttle-secrets = { path = "$PWD/resources/secrets" } @@ -390,6 +389,7 @@ workflows: - resources/static-folder - services/shuttle-actix-web - services/shuttle-axum + - services/shuttle-next - services/shuttle-poem - services/shuttle-poise - services/shuttle-rocket diff --git a/Cargo.lock b/Cargo.lock index 058004ef8..82b627936 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4737,20 +4737,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "shuttle-next" -version = "0.8.0" -dependencies = [ - "axum", - "futures-executor", - "http", - "rmp-serde", - "shuttle-codegen", - "shuttle-common", - "tower-service", - "tracing-subscriber", -] - [[package]] name = "shuttle-proto" version = "0.12.0-rc1" diff --git a/Cargo.toml b/Cargo.toml index 5d9f5960b..e62e59242 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,6 @@ members = [ "common", "deployer", "gateway", - "next", "proto", "provisioner", "runtime", diff --git a/examples b/examples index 330d3488e..d4443c89e 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 330d3488ede46b4449fd219574620bd4a712a319 +Subproject commit d4443c89efeac4a355c4e1d6dbd8973407d0515e diff --git a/next/Cargo.toml b/next/Cargo.toml deleted file mode 100644 index 214eaed0e..000000000 --- a/next/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "shuttle-next" -version = "0.8.0" -edition.workspace = true -license.workspace = true -description = "Macros and aliases to deploy wasm on the shuttle platform (https://www.shuttle.rs/)" -homepage = "https://www.shuttle.rs" - -[lib] - -[dependencies] -# most axum features can be enabled, but "tokio" and "ws" depend on socket2 -# via "hyper/tcp" which is not compatible with wasi -axum = { workspace = true } -futures-executor = "0.3.21" -http = "0.2.7" -rmp-serde = "1.1.1" -tower-service = "0.3.1" -tracing-subscriber = { workspace = true } - -[dependencies.shuttle-codegen] -workspace = true -features = ["next"] - -[dependencies.shuttle-common] -workspace = true -features = ["wasm"] diff --git a/services/shuttle-next/Cargo.toml b/services/shuttle-next/Cargo.toml new file mode 100644 index 000000000..0f3be18d9 --- /dev/null +++ b/services/shuttle-next/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "shuttle-next" +version = "0.12.0-rc1" +edition = "2021" +license = "Apache-2.0" +description = "Macros and aliases to deploy wasm on the shuttle platform (https://www.shuttle.rs/)" +homepage = "https://www.shuttle.rs" + +[workspace] + +[lib] + +[dependencies] +# most axum features can be enabled, but "tokio" and "ws" depend on socket2 +# via "hyper/tcp" which is not compatible with wasi +axum = { version = "0.6.0", default-features = false } +futures-executor = "0.3.21" +http = "0.2.7" +rmp-serde = "1.1.1" +tower-service = "0.3.1" +shuttle-common = { path = "../../common", version = "0.12.0-rc1", features = ["wasm"] } +shuttle-codegen = { path = "../../codegen", version = "0.12.0-rc1", features = ["next"] } +tracing-subscriber = { version = "0.3.16", default-features = false, features = ["registry", "std"] } diff --git a/next/src/lib.rs b/services/shuttle-next/src/lib.rs similarity index 100% rename from next/src/lib.rs rename to services/shuttle-next/src/lib.rs From 2ea253ae66a39537b55bebf1c4c3ccb82b2d11c6 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 15 Mar 2023 07:46:37 +0200 Subject: [PATCH 64/74] [next] refactor: remove ids from runtime (#712) * refactor: remove deployment id * refactor: create proto LogItem directly * refactor: more tracing for local binary * misc: add kondo to env * refactor: clippy suggestion * tests: update --- Cargo.lock | 3 +- cargo-shuttle/src/lib.rs | 8 +-- common/src/storage_manager.rs | 25 ++-------- deployer/src/deployment/deploy_layer.rs | 22 +-------- deployer/src/deployment/run.rs | 1 - deployer/src/runtime_manager.rs | 12 +++-- proto/Cargo.toml | 1 - proto/runtime.proto | 18 +------ proto/src/lib.rs | 66 ++++++------------------- provisioner/tests/provisioner.rs | 2 +- runtime/Cargo.toml | 2 +- runtime/src/alpha/mod.rs | 11 ++--- runtime/src/logger.rs | 30 +++++------ runtime/src/next/mod.rs | 55 +++++++-------------- runtime/src/provisioner_factory.rs | 6 +-- runtime/tests/integration/loader.rs | 2 - shell.nix | 1 + 17 files changed, 75 insertions(+), 190 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 82b627936..edc521e1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4751,7 +4751,6 @@ dependencies = [ "tonic", "tonic-build", "tracing", - "uuid", ] [[package]] @@ -4793,6 +4792,7 @@ dependencies = [ "futures", "hyper", "portpicker", + "prost-types", "rmp-serde", "serde_json", "shuttle-common", @@ -4806,7 +4806,6 @@ dependencies = [ "tower", "tracing", "tracing-subscriber", - "uuid", "wasi-common", "wasmtime", "wasmtime-wasi", diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 058a0eca5..ee118d331 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -37,7 +37,7 @@ use shuttle_service::builder::{build_crate, Runtime}; use std::fmt::Write; use strum::IntoEnumIterator; use tar::Builder; -use tracing::trace; +use tracing::{trace, warn}; use uuid::Uuid; use crate::args::{DeploymentCommand, ProjectCommand}; @@ -477,6 +477,8 @@ impl Shuttle { let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")) .expect("path to shuttle-runtime does not exist or is invalid"); + trace!(?path, "installing runtime from local filesystem"); + // TODO: Add --features next here when https://github.com/shuttle-hq/shuttle/pull/688 is merged std::process::Command::new("cargo") .arg("install") @@ -494,7 +496,7 @@ impl Shuttle { // or it isn't installed, try to install shuttle-runtime from the production // branch. if let Err(err) = check_version(&runtime_path) { - trace!("{}", err); + warn!("{}", err); trace!("installing shuttle-runtime"); // TODO: Add --features next here when https://github.com/shuttle-hq/shuttle/pull/688 is merged @@ -516,6 +518,7 @@ impl Shuttle { runtime_path } else { + trace!(path = ?executable_path, "using alpha runtime"); executable_path.clone() } }; @@ -580,7 +583,6 @@ impl Shuttle { let addr = SocketAddr::new(addr, run_args.port); let start_request = StartRequest { - deployment_id: Uuid::default().as_bytes().to_vec(), ip: addr.to_string(), }; diff --git a/common/src/storage_manager.rs b/common/src/storage_manager.rs index 22ac50c4e..51a0fe892 100644 --- a/common/src/storage_manager.rs +++ b/common/src/storage_manager.rs @@ -6,12 +6,8 @@ pub trait StorageManager: Sync + Send { /// Path for a specific service build files fn service_build_path(&self, service_name: &str) -> Result; - /// Path to folder for storing deployment files - fn deployment_storage_path( - &self, - service_name: &str, - deployment_id: &Uuid, - ) -> Result; + /// Path to folder for storing service files + fn service_storage_path(&self, service_name: &str) -> Result; } /// Manager to take care of directories for storing project, services and deployment files for deployer @@ -65,15 +61,8 @@ impl StorageManager for ArtifactsStorageManager { Ok(builds_path) } - fn deployment_storage_path( - &self, - service_name: &str, - deployment_id: &Uuid, - ) -> Result { - let storage_path = self - .storage_path()? - .join(service_name) - .join(deployment_id.to_string()); + fn service_storage_path(&self, service_name: &str) -> Result { + let storage_path = self.storage_path()?.join(service_name); fs::create_dir_all(&storage_path)?; Ok(storage_path) @@ -97,11 +86,7 @@ impl StorageManager for WorkingDirStorageManager { Ok(self.working_dir.clone()) } - fn deployment_storage_path( - &self, - _service_name: &str, - _deployment_id: &Uuid, - ) -> Result { + fn service_storage_path(&self, _service_name: &str) -> Result { Ok(self.working_dir.clone()) } } diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index f756a56de..a46441950 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -117,10 +117,8 @@ impl TryFrom for Log { fn try_from(log: runtime::LogItem) -> Result { Ok(Self { - id: Uuid::from_slice(&log.id)?, - state: runtime::LogState::from_i32(log.state) - .unwrap_or_default() - .into(), + id: Default::default(), + state: State::Running, level: runtime::LogLevel::from_i32(log.level) .unwrap_or_default() .into(), @@ -134,22 +132,6 @@ impl TryFrom for Log { } } -impl From for State { - fn from(state: runtime::LogState) -> Self { - match state { - runtime::LogState::Queued => Self::Queued, - runtime::LogState::Building => Self::Building, - runtime::LogState::Built => Self::Built, - runtime::LogState::Loading => Self::Loading, - runtime::LogState::Running => Self::Running, - runtime::LogState::Completed => Self::Completed, - runtime::LogState::Stopped => Self::Stopped, - runtime::LogState::Crashed => Self::Crashed, - runtime::LogState::Unknown => Self::Unknown, - } - } -} - impl From for LogLevel { fn from(level: runtime::LogLevel) -> Self { match level { diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index b98d59416..766cfe923 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -308,7 +308,6 @@ async fn run( .expect("to set deployment address"); let start_request = tonic::Request::new(StartRequest { - deployment_id: id.as_bytes().to_vec(), ip: address.to_string(), }); diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index 5eaed5c6e..825a4ade5 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, convert::TryInto, path::PathBuf, sync::Arc}; +use std::{collections::HashMap, path::PathBuf, sync::Arc}; use anyhow::Context; use shuttle_proto::runtime::{ @@ -13,11 +13,13 @@ use crate::deployment::deploy_layer; const MANIFEST_DIR: &str = env!("CARGO_MANIFEST_DIR"); +type Runtimes = Arc)>>>; + /// Manager that can start up mutliple runtimes. This is needed so that two runtimes can be up when a new deployment is made: /// One runtime for the new deployment being loaded; another for the currently active deployment #[derive(Clone)] pub struct RuntimeManager { - runtimes: Arc)>>>, + runtimes: Runtimes, artifacts_path: PathBuf, provisioner_address: String, log_sender: crossbeam_channel::Sender, @@ -30,7 +32,7 @@ impl RuntimeManager { log_sender: crossbeam_channel::Sender, ) -> Arc> { Arc::new(Mutex::new(Self { - runtimes: Arc::new(std::sync::Mutex::new(HashMap::new())), + runtimes: Default::default(), artifacts_path, provisioner_address, log_sender, @@ -111,7 +113,9 @@ impl RuntimeManager { tokio::spawn(async move { while let Ok(Some(log)) = stream.message().await { - if let Ok(log) = log.try_into() { + if let Ok(mut log) = deploy_layer::Log::try_from(log) { + log.id = id; + sender.send(log).expect("to send log to persistence"); } } diff --git a/proto/Cargo.toml b/proto/Cargo.toml index 44e2d990c..eb633ae31 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -16,7 +16,6 @@ prost-types = { workspace = true } tokio = { version = "1.22.0", features = ["process"] } tonic = { workspace = true } tracing = { workspace = true } -uuid = { workspace = true, features = ["v4"] } [dependencies.shuttle-common] workspace = true diff --git a/proto/runtime.proto b/proto/runtime.proto index 8a0ee293d..57a4895df 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -39,10 +39,8 @@ message LoadResponse { } message StartRequest { - // Id to associate with the deployment being started - bytes deployment_id = 1; // Address and port to start the service on - string ip = 3; + string ip = 1; } message StartResponse { @@ -81,9 +79,7 @@ enum StopReason { message SubscribeLogsRequest {} message LogItem { - bytes id = 1; google.protobuf.Timestamp timestamp = 2; - LogState state = 3; LogLevel level = 4; optional string file = 5; optional uint32 line = 6; @@ -91,18 +87,6 @@ message LogItem { bytes fields = 8; } -enum LogState { - Queued = 0; - Building = 1; - Built = 2; - Loading = 3; - Running = 4; - Completed = 5; - Stopped = 6; - Crashed = 7; - Unknown = 50; -} - enum LogLevel { Trace = 0; Debug = 1; diff --git a/proto/src/lib.rs b/proto/src/lib.rs index 39275985d..fd2e81caf 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -108,7 +108,6 @@ pub mod runtime { use tokio::process; use tonic::transport::{Channel, Endpoint}; use tracing::info; - use uuid::Uuid; pub enum StorageManagerType { Artifacts(PathBuf), @@ -117,37 +116,6 @@ pub mod runtime { tonic::include_proto!("runtime"); - impl From for LogItem { - fn from(log: shuttle_common::LogItem) -> Self { - Self { - id: log.id.into_bytes().to_vec(), - timestamp: Some(Timestamp::from(SystemTime::from(log.timestamp))), - state: LogState::from(log.state) as i32, - level: LogLevel::from(log.level) as i32, - file: log.file, - line: log.line, - target: log.target, - fields: log.fields, - } - } - } - - impl From for LogState { - fn from(state: shuttle_common::deployment::State) -> Self { - match state { - shuttle_common::deployment::State::Queued => Self::Queued, - shuttle_common::deployment::State::Building => Self::Building, - shuttle_common::deployment::State::Built => Self::Built, - shuttle_common::deployment::State::Loading => Self::Loading, - shuttle_common::deployment::State::Running => Self::Running, - shuttle_common::deployment::State::Completed => Self::Completed, - shuttle_common::deployment::State::Stopped => Self::Stopped, - shuttle_common::deployment::State::Crashed => Self::Crashed, - shuttle_common::deployment::State::Unknown => Self::Unknown, - } - } - } - impl From for LogLevel { fn from(level: shuttle_common::log::Level) -> Self { match level { @@ -165,9 +133,9 @@ pub mod runtime { fn try_from(log: LogItem) -> Result { Ok(Self { - id: Uuid::from_slice(&log.id)?, + id: Default::default(), timestamp: DateTime::from(SystemTime::try_from(log.timestamp.unwrap_or_default())?), - state: LogState::from_i32(log.state).unwrap_or_default().into(), + state: shuttle_common::deployment::State::Running, level: LogLevel::from_i32(log.level).unwrap_or_default().into(), file: log.file, line: log.line, @@ -177,22 +145,6 @@ pub mod runtime { } } - impl From for shuttle_common::deployment::State { - fn from(state: LogState) -> Self { - match state { - LogState::Queued => Self::Queued, - LogState::Building => Self::Building, - LogState::Built => Self::Built, - LogState::Loading => Self::Loading, - LogState::Running => Self::Running, - LogState::Completed => Self::Completed, - LogState::Stopped => Self::Stopped, - LogState::Crashed => Self::Crashed, - LogState::Unknown => Self::Unknown, - } - } - } - impl From for shuttle_common::log::Level { fn from(level: LogLevel) -> Self { match level { @@ -216,9 +168,7 @@ pub mod runtime { let line = if log.line == 0 { None } else { Some(log.line) }; Self { - id: Default::default(), timestamp: Some(Timestamp::from(SystemTime::from(log.timestamp))), - state: LogState::Running as i32, level: LogLevel::from(log.level) as i32, file, line, @@ -240,6 +190,18 @@ pub mod runtime { } } + impl From<&tracing::Level> for LogLevel { + fn from(level: &tracing::Level) -> Self { + match *level { + tracing::Level::TRACE => Self::Trace, + tracing::Level::DEBUG => Self::Debug, + tracing::Level::INFO => Self::Info, + tracing::Level::WARN => Self::Warn, + tracing::Level::ERROR => Self::Error, + } + } + } + pub async fn start( wasm: bool, storage_manager_type: StorageManagerType, diff --git a/provisioner/tests/provisioner.rs b/provisioner/tests/provisioner.rs index 5b2a7a912..3c9d103d1 100644 --- a/provisioner/tests/provisioner.rs +++ b/provisioner/tests/provisioner.rs @@ -168,7 +168,7 @@ async fn shared_mongodb_role_does_not_exist() { .unwrap(); let user = exec_mongosh("db.getUser(\"user-not_exist\")", Some("mongodb-not_exist")); - assert_eq!(user, "null"); + assert_eq!(user, ""); provisioner .request_shared_db("not_exist", shared::Engine::Mongodb(String::new())) diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 2035f34a8..632c5ee16 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -19,6 +19,7 @@ anyhow = { workspace = true } async-trait = { workspace = true } chrono = { workspace = true } clap = { workspace = true } +prost-types = { workspace = true } serde_json = { workspace = true } strfmt = "0.2.2" thiserror = { workspace = true } @@ -28,7 +29,6 @@ tonic = { workspace = true } tower = { workspace = true } tracing = { workspace = true, features = ["default"] } tracing-subscriber = { workspace = true, features = ["default", "env-filter", "fmt"] } -uuid = { workspace = true, features = ["v4"] } # TODO: bump these crates to 6.0 when we bump rust to >= 1.66 cap-std = { version = "1.0.2", optional = true } diff --git a/runtime/src/alpha/mod.rs b/runtime/src/alpha/mod.rs index 3ff48029f..a00054092 100644 --- a/runtime/src/alpha/mod.rs +++ b/runtime/src/alpha/mod.rs @@ -15,14 +15,13 @@ use core::future::Future; use shuttle_common::{ claims::{ClaimLayer, InjectPropagationLayer}, storage_manager::{ArtifactsStorageManager, StorageManager, WorkingDirStorageManager}, - LogItem, }; use shuttle_proto::{ provisioner::provisioner_client::ProvisionerClient, runtime::{ self, runtime_server::{Runtime, RuntimeServer}, - LoadRequest, LoadResponse, StartRequest, StartResponse, StopReason, StopRequest, + LoadRequest, LoadResponse, LogItem, StartRequest, StartResponse, StopReason, StopRequest, StopResponse, SubscribeLogsRequest, SubscribeStopRequest, SubscribeStopResponse, }, }; @@ -39,7 +38,6 @@ use tonic::{ }; use tower::ServiceBuilder; use tracing::{error, info, trace}; -use uuid::Uuid; use crate::{provisioner_factory::ProvisionerFactory, Logger}; @@ -186,12 +184,9 @@ where let service_name = ServiceName::from_str(service_name.as_str()) .map_err(|err| Status::from_error(Box::new(err)))?; - let deployment_id = Uuid::new_v4(); - let factory = ProvisionerFactory::new( provisioner_client, service_name, - deployment_id, secrets, self.storage_manager.clone(), self.env, @@ -199,7 +194,7 @@ where trace!("got factory"); let logs_tx = self.logs_tx.clone(); - let logger = Logger::new(logs_tx, deployment_id); + let logger = Logger::new(logs_tx); let loader = self.loader.lock().unwrap().deref_mut().take().unwrap(); @@ -380,7 +375,7 @@ where // Move logger items into stream to be returned tokio::spawn(async move { while let Some(log) = logs_rx.recv().await { - tx.send(Ok(log.into())).await.expect("to send log"); + tx.send(Ok(log)).await.expect("to send log"); } }); diff --git a/runtime/src/logger.rs b/runtime/src/logger.rs index 8a82c2508..b3608e301 100644 --- a/runtime/src/logger.rs +++ b/runtime/src/logger.rs @@ -1,17 +1,20 @@ +use std::time::SystemTime; + use chrono::Utc; -use shuttle_common::{deployment::State, tracing::JsonVisitor, DeploymentId, LogItem}; +use prost_types::Timestamp; +use shuttle_common::tracing::JsonVisitor; +use shuttle_proto::runtime::{LogItem, LogLevel}; use tokio::sync::mpsc::UnboundedSender; use tracing::Subscriber; use tracing_subscriber::Layer; pub struct Logger { - deployment_id: DeploymentId, tx: UnboundedSender, } impl Logger { - pub fn new(tx: UnboundedSender, deployment_id: DeploymentId) -> Self { - Self { tx, deployment_id } + pub fn new(tx: UnboundedSender) -> Self { + Self { tx } } } @@ -33,10 +36,8 @@ where event.record(&mut visitor); LogItem { - id: self.deployment_id, - state: State::Running, - level: metadata.level().into(), - timestamp: datetime, + level: LogLevel::from(metadata.level()) as i32, + timestamp: Some(Timestamp::from(SystemTime::from(datetime))), file: visitor.file.or_else(|| metadata.file().map(str::to_string)), line: visitor.line.or_else(|| metadata.line()), target: visitor @@ -54,7 +55,6 @@ where mod tests { use super::*; - use shuttle_common::log::Level; use tokio::sync::mpsc; use tracing_subscriber::prelude::*; @@ -62,7 +62,7 @@ mod tests { fn logging() { let (s, mut r) = mpsc::unbounded_channel(); - let logger = Logger::new(s, Default::default()); + let logger = Logger::new(s); let _guard = tracing_subscriber::registry().with(logger).set_default(); @@ -73,23 +73,23 @@ mod tests { assert_eq!( r.blocking_recv().map(to_tuple), - Some(("this is".to_string(), Level::Debug)) + Some(("this is".to_string(), LogLevel::Debug as i32)) ); assert_eq!( r.blocking_recv().map(to_tuple), - Some(("hi".to_string(), Level::Info)) + Some(("hi".to_string(), LogLevel::Info as i32)) ); assert_eq!( r.blocking_recv().map(to_tuple), - Some(("from".to_string(), Level::Warn)) + Some(("from".to_string(), LogLevel::Warn as i32)) ); assert_eq!( r.blocking_recv().map(to_tuple), - Some(("logger".to_string(), Level::Error)) + Some(("logger".to_string(), LogLevel::Error as i32)) ); } - fn to_tuple(log: LogItem) -> (String, Level) { + fn to_tuple(log: LogItem) -> (String, i32) { let fields: serde_json::Map = serde_json::from_slice(&log.fields).unwrap(); diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index 060c7b4b9..8b4152b51 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -101,7 +101,7 @@ impl Runtime for AxumWasm { &self, request: tonic::Request, ) -> Result, Status> { - let StartRequest { deployment_id, ip } = request.into_inner(); + let StartRequest { ip } = request.into_inner(); let address = SocketAddr::from_str(&ip) .context("invalid socket address") @@ -121,13 +121,7 @@ impl Runtime for AxumWasm { .context("tried to start a service that was not loaded") .map_err(|err| Status::internal(err.to_string()))?; - tokio::spawn(run_until_stopped( - router, - deployment_id, - address, - logs_tx, - kill_rx, - )); + tokio::spawn(run_until_stopped(router, address, logs_tx, kill_rx)); let message = StartResponse { success: true }; @@ -235,7 +229,6 @@ impl Router { /// Send a HTTP request with body to given endpoint on the axum-wasm router and return the response async fn handle_request( &mut self, - deployment_id: Vec, req: hyper::Request, logs_tx: Sender>, ) -> anyhow::Result> { @@ -274,10 +267,7 @@ impl Router { let mut iter = logs_stream.bytes().filter_map(Result::ok); while let Some(log) = Log::from_bytes(&mut iter) { - let mut log: runtime::LogItem = log.into(); - log.id = deployment_id.clone(); - - logs_tx.blocking_send(Ok(log)).expect("to send log"); + logs_tx.blocking_send(Ok(log.into())).expect("to send log"); } }); @@ -360,33 +350,28 @@ impl Router { /// and a kill receiver for stopping the server. async fn run_until_stopped( router: Router, - deployment_id: Vec, address: SocketAddr, logs_tx: Sender>, kill_rx: tokio::sync::oneshot::Receiver, ) { let make_service = make_service_fn(move |_conn| { - let deployment_id = deployment_id.clone(); let router = router.clone(); let logs_tx = logs_tx.clone(); async move { Ok::<_, Infallible>(service_fn(move |req: Request| { - let deployment_id = deployment_id.clone(); let mut router = router.clone(); let logs_tx = logs_tx.clone(); async move { - Ok::<_, Infallible>( - match router.handle_request(deployment_id, req, logs_tx).await { - Ok(res) => res, - Err(err) => { - error!("error sending request: {}", err); - Response::builder() - .status(hyper::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(Body::empty()) - .expect("building request with empty body should not fail") - } - }, - ) + Ok::<_, Infallible>(match router.handle_request(req, logs_tx).await { + Ok(res) => res, + Err(err) => { + error!("error sending request: {}", err); + Response::builder() + .status(hyper::http::StatusCode::INTERNAL_SERVER_ERROR) + .body(Body::empty()) + .expect("building request with empty body should not fail") + } + }) } })) } @@ -414,7 +399,6 @@ pub mod tests { use super::*; use hyper::{http::HeaderValue, Method, Request, StatusCode, Version}; - use uuid::Uuid; // Compile axum wasm module fn compile_module() { @@ -439,7 +423,6 @@ pub mod tests { .build() .unwrap(); - let id = Uuid::default().as_bytes().to_vec(); let (tx, mut rx) = mpsc::channel(1); tokio::spawn(async move { @@ -458,7 +441,7 @@ pub mod tests { let res = router .clone() - .handle_request(id.clone(), request, tx.clone()) + .handle_request(request, tx.clone()) .await .unwrap(); @@ -485,7 +468,7 @@ pub mod tests { let res = router .clone() - .handle_request(id.clone(), request, tx.clone()) + .handle_request(request, tx.clone()) .await .unwrap(); @@ -512,7 +495,7 @@ pub mod tests { let res = router .clone() - .handle_request(id.clone(), request, tx.clone()) + .handle_request(request, tx.clone()) .await .unwrap(); @@ -527,11 +510,7 @@ pub mod tests { .body("this should be uppercased".into()) .unwrap(); - let res = router - .clone() - .handle_request(id, request, tx) - .await - .unwrap(); + let res = router.clone().handle_request(request, tx).await.unwrap(); assert_eq!(res.status(), StatusCode::OK); assert_eq!( diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs index 56d91e94c..a2ccba6b3 100644 --- a/runtime/src/provisioner_factory.rs +++ b/runtime/src/provisioner_factory.rs @@ -13,12 +13,10 @@ use shuttle_proto::provisioner::{ use shuttle_service::{Environment, Factory, ServiceName}; use tonic::{transport::Channel, Request}; use tracing::{debug, info, trace}; -use uuid::Uuid; /// A factory (service locator) which goes through the provisioner crate pub struct ProvisionerFactory { service_name: ServiceName, - deployment_id: Uuid, storage_manager: Arc, provisioner_client: ProvisionerClient>>, info: Option, @@ -30,7 +28,6 @@ impl ProvisionerFactory { pub(crate) fn new( provisioner_client: ProvisionerClient>>, service_name: ServiceName, - deployment_id: Uuid, secrets: BTreeMap, storage_manager: Arc, env: Environment, @@ -38,7 +35,6 @@ impl ProvisionerFactory { Self { provisioner_client, service_name, - deployment_id, storage_manager, info: None, secrets, @@ -100,7 +96,7 @@ impl Factory for ProvisionerFactory { fn get_storage_path(&self) -> Result { self.storage_manager - .deployment_storage_path(self.service_name.as_str(), &self.deployment_id) + .service_storage_path(self.service_name.as_str()) .map_err(Into::into) } diff --git a/runtime/tests/integration/loader.rs b/runtime/tests/integration/loader.rs index 3ef17f059..fb62d6878 100644 --- a/runtime/tests/integration/loader.rs +++ b/runtime/tests/integration/loader.rs @@ -1,5 +1,4 @@ use shuttle_proto::runtime::{LoadRequest, StartRequest, StopReason, SubscribeStopRequest}; -use uuid::Uuid; use crate::helpers::{spawn_runtime, TestRuntime}; @@ -30,7 +29,6 @@ async fn bind_panic() { .into_inner(); let start_request = StartRequest { - deployment_id: Uuid::default().as_bytes().to_vec(), ip: runtime_address.to_string(), }; diff --git a/shell.nix b/shell.nix index 2a53950a8..53928fbe1 100644 --- a/shell.nix +++ b/shell.nix @@ -29,6 +29,7 @@ in sqlite fastmod pebble + kondo ]; PROTOC = "${protobuf}/bin/protoc"; From a588e2564674d3bc9c2df20bc1b843577d458c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Wed, 15 Mar 2023 09:48:37 +0000 Subject: [PATCH 65/74] feat: embed protoc in shuttle-proto (#715) * feat: embed protoc in shuttle-proto * fix: path to shuttle-next in runtime next-resource --- Cargo.lock | 51 +++++++++++++++++++ proto/Cargo.toml | 1 + proto/build.rs | 6 +++ .../resources/axum-wasm-expanded/Cargo.toml | 2 +- 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index edc521e1c..29f72be6e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3826,6 +3826,56 @@ dependencies = [ "prost", ] +[[package]] +name = "protoc-bin-vendored" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "005ca8623e5633e298ad1f917d8be0a44bcf406bf3cde3b80e63003e49a3f27d" +dependencies = [ + "protoc-bin-vendored-linux-aarch_64", + "protoc-bin-vendored-linux-ppcle_64", + "protoc-bin-vendored-linux-x86_32", + "protoc-bin-vendored-linux-x86_64", + "protoc-bin-vendored-macos-x86_64", + "protoc-bin-vendored-win32", +] + +[[package]] +name = "protoc-bin-vendored-linux-aarch_64" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb9fc9cce84c8694b6ea01cc6296617b288b703719b725b8c9c65f7c5874435" + +[[package]] +name = "protoc-bin-vendored-linux-ppcle_64" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d2a07dcf7173a04d49974930ccbfb7fd4d74df30ecfc8762cf2f895a094516" + +[[package]] +name = "protoc-bin-vendored-linux-x86_32" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54fef0b04fcacba64d1d80eed74a20356d96847da8497a59b0a0a436c9165b0" + +[[package]] +name = "protoc-bin-vendored-linux-x86_64" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8782f2ce7d43a9a5c74ea4936f001e9e8442205c244f7a3d4286bd4c37bc924" + +[[package]] +name = "protoc-bin-vendored-macos-x86_64" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5de656c7ee83f08e0ae5b81792ccfdc1d04e7876b1d9a38e6876a9e09e02537" + +[[package]] +name = "protoc-bin-vendored-win32" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9653c3ed92974e34c5a6e0a510864dab979760481714c172e0a34e437cb98804" + [[package]] name = "psm" version = "0.1.21" @@ -4746,6 +4796,7 @@ dependencies = [ "home", "prost", "prost-types", + "protoc-bin-vendored", "shuttle-common", "tokio", "tonic", diff --git a/proto/Cargo.toml b/proto/Cargo.toml index eb633ae31..11a2836f5 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -22,4 +22,5 @@ workspace = true features = ["error", "service", "wasm"] [build-dependencies] +protoc-bin-vendored = "3.0.0" tonic-build = "0.8.3" diff --git a/proto/build.rs b/proto/build.rs index 685a01573..3761649ff 100644 --- a/proto/build.rs +++ b/proto/build.rs @@ -1,4 +1,10 @@ fn main() -> Result<(), Box> { + let protoc = protoc_bin_vendored::protoc_bin_path().unwrap(); + let protoc_include = protoc_bin_vendored::include_path().unwrap(); + + std::env::set_var("PROTOC", protoc); + std::env::set_var("PROTOC_INCLUDE", protoc_include); + tonic_build::configure().compile(&["./provisioner.proto", "./runtime.proto"], &["./"])?; Ok(()) diff --git a/runtime/tests/resources/axum-wasm-expanded/Cargo.toml b/runtime/tests/resources/axum-wasm-expanded/Cargo.toml index 7972f7b6c..45f77cbe1 100644 --- a/runtime/tests/resources/axum-wasm-expanded/Cargo.toml +++ b/runtime/tests/resources/axum-wasm-expanded/Cargo.toml @@ -10,5 +10,5 @@ crate-type = [ "cdylib" ] [dependencies] futures = "0.3.25" -shuttle-next = { path = "../../../../next" } +shuttle-next = { path = "../../../../services/shuttle-next" } tracing = "0.1.37" From 6c021353c29144f23e9e13ac6bdf26acce24617a Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 16 Mar 2023 08:22:49 +0200 Subject: [PATCH 66/74] [next] bug: communicating resources (#716) * refactor: send claim to provisioner * feat: recording of provisioned resources This returns provisioned resources from runtime so that they can be recorded by deployer. Closes #ENG-252. * refactor: restore resources for idle containers waking up * tests: next tests using wrong folder * tests: swap rocket for the more stable poem * refactor: pass auth_uri to runtime * misc: update all patches --- .circleci/config.yml | 5 +- CONTRIBUTING.md | 17 ++++- Cargo.lock | 1 + cargo-shuttle/src/lib.rs | 2 + cargo-shuttle/tests/integration/run.rs | 2 +- common/Cargo.toml | 13 ++-- common/src/database.rs | 6 +- common/src/lib.rs | 2 +- common/src/models/mod.rs | 1 - common/src/models/service.rs | 10 +-- common/src/{models => }/resource.rs | 27 ++++++- deployer/src/deployment/deploy_layer.rs | 23 +++++- deployer/src/deployment/mod.rs | 20 ++++- deployer/src/deployment/run.rs | 96 ++++++++++++++++++------ deployer/src/lib.rs | 1 + deployer/src/main.rs | 1 + deployer/src/persistence/resource/mod.rs | 15 +++- deployer/src/runtime_manager.rs | 19 ++++- e2e/tests/integration/helpers/mod.rs | 76 +++++++++++++++++-- gateway/src/project.rs | 2 +- proto/Cargo.toml | 3 +- proto/runtime.proto | 7 +- proto/src/lib.rs | 31 ++++++-- runtime/Cargo.toml | 2 +- runtime/src/alpha/args.rs | 6 +- runtime/src/alpha/mod.rs | 51 ++++++++++++- runtime/src/next/mod.rs | 1 + runtime/src/provisioner_factory.rs | 52 ++++++++----- runtime/tests/integration/helpers.rs | 4 +- runtime/tests/integration/loader.rs | 1 + 30 files changed, 395 insertions(+), 102 deletions(-) rename common/src/{models => }/resource.rs (57%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 646569151..f21e0a9e5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -88,14 +88,17 @@ commands: cat\<< EOF > ~/.cargo/config.toml [patch.crates-io] shuttle-service = { path = "$PWD/service" } + shuttle-runtime = { path = "$PWD/runtime" } + shuttle-aws-rds = { path = "$PWD/resources/aws-rds" } shuttle-persist = { path = "$PWD/resources/persist" } - shuttle-runtime = { path = "$PWD/runtime" } shuttle-shared-db = { path = "$PWD/resources/shared-db" } shuttle-secrets = { path = "$PWD/resources/secrets" } shuttle-static-folder = { path = "$PWD/resources/static-folder" } + shuttle-axum = { path = "$PWD/services/shuttle-axum" } shuttle-actix-web = { path = "$PWD/services/shuttle-actix-web" } + shuttle-next = { path = "$PWD/services/shuttle-next" } shuttle-poem = { path = "$PWD/services/shuttle-poem" } shuttle-poise = { path = "$PWD/services/shuttle-poise" } shuttle-rocket = { path = "$PWD/services/shuttle-rocket" } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c60695da7..e4569995c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -56,13 +56,26 @@ In order to test local changes to the library crates, you may want to add the be ```toml [patch.crates-io] shuttle-service = { path = "[base]/shuttle/service" } -shuttle-common = { path = "[base]/shuttle/common" } -shuttle-proto = { path = "[base]/shuttle/proto" } +shuttle-runtime = { path = "[base]/shuttle/runtime" } + shuttle-aws-rds = { path = "[base]/shuttle/resources/aws-rds" } shuttle-persist = { path = "[base]/shuttle/resources/persist" } shuttle-shared-db = { path = "[base]/shuttle/resources/shared-db" } shuttle-secrets = { path = "[base]/shuttle/resources/secrets" } shuttle-static-folder = { path = "[base]/shuttle/resources/static-folder" } + +shuttle-axum = { path = "[base]/shuttle/services/shuttle-axum" } +shuttle-actix-web = { path = "[base]/shuttle/services/shuttle-actix-web" } +shuttle-next = { path = "[base]/shuttle/services/shuttle-next" } +shuttle-poem = { path = "[base]/shuttle/services/shuttle-poem" } +shuttle-poise = { path = "[base]/shuttle/services/shuttle-poise" } +shuttle-rocket = { path = "[base]/shuttle/services/shuttle-rocket" } +shuttle-salvo = { path = "[base]/shuttle/services/shuttle-salvo" } +shuttle-serenity = { path = "[base]/shuttle/services/shuttle-serenity" } +shuttle-thruster = { path = "[base]/shuttle/services/shuttle-thruster" } +shuttle-tide = { path = "[base]/shuttle/services/shuttle-tide" } +shuttle-tower = { path = "[base]/shuttle/services/shuttle-tower" } +shuttle-warp = { path = "[base]/shuttle/services/shuttle-warp" } ``` Before we can login to our local instance of shuttle, we need to create a user. diff --git a/Cargo.lock b/Cargo.lock index 29f72be6e..4d56b0bdb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4801,6 +4801,7 @@ dependencies = [ "tokio", "tonic", "tonic-build", + "tower", "tracing", ] diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index ee118d331..dcfa746c6 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -527,6 +527,7 @@ impl Shuttle { is_wasm, runtime::StorageManagerType::WorkingDir(working_directory.to_path_buf()), &format!("http://localhost:{}", run_args.port + 1), + None, run_args.port + 2, runtime_path, ) @@ -543,6 +544,7 @@ impl Shuttle { .into_string() .expect("to convert path to string"), service_name: service_name.clone(), + resources: Default::default(), secrets, }); trace!("loading service"); diff --git a/cargo-shuttle/tests/integration/run.rs b/cargo-shuttle/tests/integration/run.rs index cc2244520..eab40488a 100644 --- a/cargo-shuttle/tests/integration/run.rs +++ b/cargo-shuttle/tests/integration/run.rs @@ -92,6 +92,7 @@ async fn rocket_secrets() { // This example uses a shared Postgres. Thus local runs should create a docker container for it. #[tokio::test(flavor = "multi_thread")] +#[ignore] async fn rocket_postgres() { let url = cargo_shuttle_run("../examples/rocket/postgres", false).await; let client = reqwest::Client::new(); @@ -281,7 +282,6 @@ async fn poem_hello_world() { // This example uses a shared Postgres. Thus local runs should create a docker container for it. #[tokio::test(flavor = "multi_thread")] -#[ignore] async fn poem_postgres() { let url = cargo_shuttle_run("../examples/poem/postgres", false).await; let client = reqwest::Client::new(); diff --git a/common/Cargo.toml b/common/Cargo.toml index c7678719a..ec5b0af67 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -31,8 +31,8 @@ reqwest = { version = "0.11.13", optional = true } rmp-serde = { version = "1.1.1", optional = true } rustrict = { version = "0.5.5", optional = true } serde = { workspace = true, features = ["derive", "std"] } -serde_json = { workspace = true, optional = true } -strum = { workspace = true, features = ["derive"], optional = true } +serde_json = { workspace = true } +strum = { workspace = true, features = ["derive"] } thiserror = { workspace = true, optional = true } tonic = { version = "0.8.3", optional = true } tower = { workspace = true, optional = true } @@ -47,10 +47,10 @@ uuid = { workspace = true, features = ["v4", "serde"], optional = true } backend = ["async-trait", "axum/matched-path", "claims", "hyper/client", "opentelemetry-otlp", "thiserror", "tower-http", "tracing-subscriber/env-filter", "tracing-subscriber/fmt", "ttl_cache"] claims = ["bytes", "chrono/clock", "headers", "http", "http-body", "jsonwebtoken", "opentelemetry", "opentelemetry-http", "pin-project", "tower", "tracing", "tracing-opentelemetry"] display = ["chrono/clock", "comfy-table", "crossterm"] -error = ["prost-types", "serde_json", "thiserror", "uuid"] -models = ["anyhow", "async-trait", "display", "http", "reqwest", "serde_json", "service"] -service = ["chrono/serde", "once_cell", "rustrict", "serde/derive", "strum", "uuid"] -tracing = ["serde_json"] +error = ["prost-types", "thiserror", "uuid"] +models = ["anyhow", "async-trait", "display", "http", "reqwest", "service"] +service = ["chrono/serde", "once_cell", "rustrict", "serde/derive", "uuid"] +tracing = [] wasm = ["chrono/clock", "http-serde", "http", "rmp-serde", "tracing", "tracing-subscriber"] [dev-dependencies] @@ -59,7 +59,6 @@ base64 = "0.13.1" cap-std = "1.0.2" hyper = { workspace = true } ring = { workspace = true } -serde_json = { workspace = true } tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } tower = { workspace = true, features = ["util"] } tracing-fluent-assertions = "0.3.0" diff --git a/common/src/database.rs b/common/src/database.rs index c1617b47d..1d3956ea0 100644 --- a/common/src/database.rs +++ b/common/src/database.rs @@ -3,14 +3,14 @@ use std::fmt::Display; use serde::{Deserialize, Serialize}; use strum::Display; -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] #[serde(rename_all = "lowercase")] pub enum Type { AwsRds(AwsRdsEngine), Shared(SharedEngine), } -#[derive(Clone, Debug, Deserialize, Display, Serialize)] +#[derive(Clone, Debug, Deserialize, Display, Serialize, Eq, PartialEq)] #[serde(rename_all = "lowercase")] #[strum(serialize_all = "lowercase")] pub enum AwsRdsEngine { @@ -19,7 +19,7 @@ pub enum AwsRdsEngine { MariaDB, } -#[derive(Clone, Debug, Deserialize, Display, Serialize)] +#[derive(Clone, Debug, Deserialize, Display, Serialize, Eq, PartialEq)] #[serde(rename_all = "lowercase")] #[strum(serialize_all = "lowercase")] pub enum SharedEngine { diff --git a/common/src/lib.rs b/common/src/lib.rs index a68067084..9d8162e9b 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -2,7 +2,6 @@ pub mod backends; #[cfg(feature = "claims")] pub mod claims; -#[cfg(feature = "service")] pub mod database; #[cfg(feature = "service")] pub mod deployment; @@ -12,6 +11,7 @@ pub mod log; pub mod models; #[cfg(feature = "service")] pub mod project; +pub mod resource; #[cfg(feature = "service")] pub mod storage_manager; #[cfg(feature = "tracing")] diff --git a/common/src/models/mod.rs b/common/src/models/mod.rs index 328a33cf8..463e04192 100644 --- a/common/src/models/mod.rs +++ b/common/src/models/mod.rs @@ -1,7 +1,6 @@ pub mod deployment; pub mod error; pub mod project; -pub mod resource; pub mod secret; pub mod service; pub mod stats; diff --git a/common/src/models/service.rs b/common/src/models/service.rs index 2dfef55a6..68d569050 100644 --- a/common/src/models/service.rs +++ b/common/src/models/service.rs @@ -1,6 +1,6 @@ use crate::{ - models::{deployment, resource, resource::ResourceInfo, secret}, - DatabaseReadyInfo, + models::{deployment, secret}, + resource::{self, ResourceInfo}, }; use comfy_table::{ @@ -34,12 +34,6 @@ pub struct Summary { pub uri: String, } -impl ResourceInfo for DatabaseReadyInfo { - fn connection_string_public(&self) -> String { - self.connection_string_public() - } -} - impl Display for Detailed { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let deploys = get_deployments_table(&self.deployments, &self.name); diff --git a/common/src/models/resource.rs b/common/src/resource.rs similarity index 57% rename from common/src/models/resource.rs rename to common/src/resource.rs index 3b97bfb75..976020729 100644 --- a/common/src/models/resource.rs +++ b/common/src/resource.rs @@ -2,13 +2,11 @@ use std::fmt::Display; use serde::{Deserialize, Serialize}; use serde_json::Value; -use uuid::Uuid; use crate::{database, DatabaseReadyInfo}; -#[derive(Deserialize, Serialize)] +#[derive(Clone, Deserialize, Serialize)] pub struct Response { - pub service_id: Uuid, pub r#type: Type, pub data: Value, } @@ -17,9 +15,22 @@ pub struct Response { pub trait ResourceInfo { /// String to connect to this resource from a public location fn connection_string_public(&self) -> String; + + /// String to connect to this resource from within shuttle + fn connection_string_private(&self) -> String; +} + +impl ResourceInfo for DatabaseReadyInfo { + fn connection_string_public(&self) -> String { + self.connection_string_public() + } + + fn connection_string_private(&self) -> String { + self.connection_string_private() + } } -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] #[serde(rename_all = "lowercase")] pub enum Type { Database(database::Type), @@ -33,6 +44,14 @@ impl Response { } } } + + pub fn into_bytes(self) -> Vec { + serde_json::to_vec(&self).expect("to turn resource into a vec") + } + + pub fn from_bytes(bytes: Vec) -> Self { + serde_json::from_slice(&bytes).expect("to turn bytes into a resource") + } } impl Display for Type { diff --git a/deployer/src/deployment/deploy_layer.rs b/deployer/src/deployment/deploy_layer.rs index a46441950..f38823a13 100644 --- a/deployer/src/deployment/deploy_layer.rs +++ b/deployer/src/deployment/deploy_layer.rs @@ -310,7 +310,10 @@ mod tests { time::Duration, }; - use crate::{persistence::DeploymentUpdater, RuntimeManager}; + use crate::{ + persistence::{DeploymentUpdater, Resource, ResourceManager}, + RuntimeManager, + }; use async_trait::async_trait; use axum::body::Bytes; use ctor::ctor; @@ -467,7 +470,7 @@ mod tests { let path = tmp_dir.into_path(); let (tx, _rx) = crossbeam_channel::unbounded(); - RuntimeManager::new(path, format!("http://{}", provisioner_addr), tx) + RuntimeManager::new(path, format!("http://{}", provisioner_addr), None, tx) } #[async_trait::async_trait] @@ -553,6 +556,21 @@ mod tests { } } + #[derive(Clone)] + struct StubResourceManager; + + #[async_trait::async_trait] + impl ResourceManager for StubResourceManager { + type Err = std::io::Error; + + async fn insert_resource(&self, _resource: &Resource) -> Result<(), Self::Err> { + Ok(()) + } + async fn get_resources(&self, _service_id: &Uuid) -> Result, Self::Err> { + Ok(Vec::new()) + } + } + async fn test_states(id: &Uuid, expected_states: Vec) { loop { let states = RECORDER.lock().unwrap().get_deployment_states(id); @@ -861,6 +879,7 @@ mod tests { .active_deployment_getter(StubActiveDeploymentGetter) .artifacts_path(PathBuf::from("/tmp")) .secret_getter(StubSecretGetter) + .resource_manager(StubResourceManager) .runtime(get_runtime_manager()) .deployment_updater(StubDeploymentUpdater) .queue_client(StubBuildQueueClient) diff --git a/deployer/src/deployment/mod.rs b/deployer/src/deployment/mod.rs index 09ceeaba2..fe5aca313 100644 --- a/deployer/src/deployment/mod.rs +++ b/deployer/src/deployment/mod.rs @@ -12,7 +12,7 @@ use tracing::{instrument, Span}; use tracing_opentelemetry::OpenTelemetrySpanExt; use crate::{ - persistence::{DeploymentUpdater, SecretGetter, SecretRecorder, State}, + persistence::{DeploymentUpdater, ResourceManager, SecretGetter, SecretRecorder, State}, RuntimeManager, }; use tokio::sync::{mpsc, Mutex}; @@ -23,7 +23,7 @@ use self::{deploy_layer::LogRecorder, gateway_client::BuildQueueClient}; const QUEUE_BUFFER_SIZE: usize = 100; const RUN_BUFFER_SIZE: usize = 100; -pub struct DeploymentManagerBuilder { +pub struct DeploymentManagerBuilder { build_log_recorder: Option, secret_recorder: Option, active_deployment_getter: Option, @@ -31,16 +31,18 @@ pub struct DeploymentManagerBuilder { runtime_manager: Option>>, deployment_updater: Option, secret_getter: Option, + resource_manager: Option, queue_client: Option, } -impl DeploymentManagerBuilder +impl DeploymentManagerBuilder where LR: LogRecorder, SR: SecretRecorder, ADG: ActiveDeploymentsGetter, DU: DeploymentUpdater, SG: SecretGetter, + RM: ResourceManager, QC: BuildQueueClient, { pub fn build_log_recorder(mut self, build_log_recorder: LR) -> Self { @@ -79,6 +81,12 @@ where self } + pub fn resource_manager(mut self, resource_manager: RM) -> Self { + self.resource_manager = Some(resource_manager); + + self + } + pub fn runtime(mut self, runtime_manager: Arc>) -> Self { self.runtime_manager = Some(runtime_manager); @@ -110,6 +118,7 @@ where .deployment_updater .expect("a deployment updater to be set"); let secret_getter = self.secret_getter.expect("a secret getter to be set"); + let resource_manager = self.resource_manager.expect("a resource manager to be set"); let (queue_send, queue_recv) = mpsc::channel(QUEUE_BUFFER_SIZE); let (run_send, run_recv) = mpsc::channel(RUN_BUFFER_SIZE); @@ -132,6 +141,7 @@ where deployment_updater, active_deployment_getter, secret_getter, + resource_manager, storage_manager.clone(), )); @@ -169,7 +179,8 @@ pub struct DeploymentManager { impl DeploymentManager { /// Create a new deployment manager. Manages one or more 'pipelines' for /// processing service building, loading, and deployment. - pub fn builder() -> DeploymentManagerBuilder { + pub fn builder( + ) -> DeploymentManagerBuilder { DeploymentManagerBuilder { build_log_recorder: None, secret_recorder: None, @@ -178,6 +189,7 @@ impl DeploymentManager { runtime_manager: None, deployment_updater: None, secret_getter: None, + resource_manager: None, queue_client: None, } } diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index 766cfe923..b3ae00815 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -8,7 +8,11 @@ use std::{ use async_trait::async_trait; use opentelemetry::global; use portpicker::pick_unused_port; -use shuttle_common::{claims::Claim, storage_manager::ArtifactsStorageManager}; +use shuttle_common::{ + claims::{Claim, ClaimService, InjectPropagation}, + resource, + storage_manager::ArtifactsStorageManager, +}; use shuttle_proto::runtime::{ runtime_client::RuntimeClient, LoadRequest, StartRequest, StopReason, SubscribeStopRequest, @@ -23,7 +27,7 @@ use uuid::Uuid; use super::{RunReceiver, State}; use crate::{ error::{Error, Result}, - persistence::{DeploymentUpdater, SecretGetter}, + persistence::{DeploymentUpdater, Resource, ResourceManager, SecretGetter}, RuntimeManager, }; @@ -35,6 +39,7 @@ pub async fn task( deployment_updater: impl DeploymentUpdater, active_deployment_getter: impl ActiveDeploymentsGetter, secret_getter: impl SecretGetter, + resource_manager: impl ResourceManager, storage_manager: ArtifactsStorageManager, ) { info!("Run task started"); @@ -46,6 +51,7 @@ pub async fn task( let deployment_updater = deployment_updater.clone(); let secret_getter = secret_getter.clone(); + let resource_manager = resource_manager.clone(); let storage_manager = storage_manager.clone(); let old_deployments_killer = kill_old_deployments( @@ -79,6 +85,7 @@ pub async fn task( .handle( storage_manager, secret_getter, + resource_manager, runtime_manager, deployment_updater, old_deployments_killer, @@ -171,12 +178,13 @@ pub struct Built { } impl Built { - #[instrument(skip(self, storage_manager, secret_getter, runtime_manager, deployment_updater, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] + #[instrument(skip(self, storage_manager, secret_getter, resource_manager, runtime_manager, deployment_updater, kill_old_deployments, cleanup), fields(id = %self.id, state = %State::Loading))] #[allow(clippy::too_many_arguments)] async fn handle( self, storage_manager: ArtifactsStorageManager, secret_getter: impl SecretGetter, + resource_manager: impl ResourceManager, runtime_manager: Arc>, deployment_updater: impl DeploymentUpdater, kill_old_deployments: impl futures::Future>, @@ -214,14 +222,15 @@ impl Built { kill_old_deployments.await?; - info!("got handle for deployment"); // Execute loaded service load( self.service_name.clone(), self.service_id, executable_path.clone(), secret_getter, + resource_manager, runtime_client.clone(), + self.claim, ) .await?; @@ -243,7 +252,9 @@ async fn load( service_id: Uuid, executable_path: PathBuf, secret_getter: impl SecretGetter, - mut runtime_client: RuntimeClient, + resource_manager: impl ResourceManager, + mut runtime_client: RuntimeClient>>, + claim: Option, ) -> Result<()> { info!( "loading project from: {}", @@ -254,6 +265,20 @@ async fn load( .unwrap_or_default() ); + // Get resources from cache when a claim is not set (ie an idl project is started) + let resources = if claim.is_none() { + resource_manager + .get_resources(&service_id) + .await + .unwrap() + .into_iter() + .map(resource::Response::from) + .map(resource::Response::into_bytes) + .collect() + } else { + Default::default() + }; + let secrets = secret_getter .get_secrets(&service_id) .await @@ -262,15 +287,20 @@ async fn load( .map(|secret| (secret.key, secret.value)); let secrets = HashMap::from_iter(secrets); - let load_request = tonic::Request::new(LoadRequest { + let mut load_request = tonic::Request::new(LoadRequest { path: executable_path .into_os_string() .into_string() .unwrap_or_default(), service_name: service_name.clone(), + resources, secrets, }); + if let Some(claim) = claim { + load_request.extensions_mut().insert(claim); + } + debug!("loading service"); let response = runtime_client.load(load_request).await; @@ -279,6 +309,19 @@ async fn load( let response = response.into_inner(); info!(?response, "loading response"); + for resource in response.resources { + let resource: resource::Response = serde_json::from_slice(&resource).unwrap(); + let resource = Resource { + service_id, + r#type: resource.r#type.into(), + data: resource.data, + }; + resource_manager + .insert_resource(&resource) + .await + .expect("to add resource to persistence"); + } + if response.success { Ok(()) } else { @@ -297,7 +340,7 @@ async fn load( async fn run( id: Uuid, service_name: String, - mut runtime_client: RuntimeClient, + mut runtime_client: RuntimeClient>>, address: SocketAddr, deployment_updater: impl DeploymentUpdater, cleanup: impl FnOnce(SubscribeStopResponse) + Send + 'static, @@ -376,7 +419,7 @@ mod tests { use uuid::Uuid; use crate::{ - persistence::{DeploymentUpdater, Secret, SecretGetter}, + persistence::{DeploymentUpdater, Resource, ResourceManager, Secret, SecretGetter}, RuntimeManager, }; @@ -437,7 +480,7 @@ mod tests { } }); - RuntimeManager::new(path, format!("http://{}", provisioner_addr), tx) + RuntimeManager::new(path, format!("http://{}", provisioner_addr), None, tx) } #[derive(Clone)] @@ -452,8 +495,19 @@ mod tests { } } - fn get_secret_getter() -> StubSecretGetter { - StubSecretGetter + #[derive(Clone)] + struct StubResourceManager; + + #[async_trait] + impl ResourceManager for StubResourceManager { + type Err = std::io::Error; + + async fn insert_resource(&self, _resource: &Resource) -> Result<(), Self::Err> { + Ok(()) + } + async fn get_resources(&self, _service_id: &Uuid) -> Result, Self::Err> { + Ok(Vec::new()) + } } #[derive(Clone)] @@ -488,12 +542,11 @@ mod tests { _ => panic!("expected stop due to request"), }; - let secret_getter = get_secret_getter(); - built .handle( storage_manager, - secret_getter, + StubSecretGetter, + StubResourceManager, runtime_manager.clone(), StubDeploymentUpdater, kill_old_deployments(), @@ -529,12 +582,11 @@ mod tests { _ => panic!("expected stop due to self end"), }; - let secret_getter = get_secret_getter(); - built .handle( storage_manager, - secret_getter, + StubSecretGetter, + StubResourceManager, runtime_manager.clone(), StubDeploymentUpdater, kill_old_deployments(), @@ -569,12 +621,11 @@ mod tests { (_, mes) => panic!("expected stop due to crash: {mes}"), }; - let secret_getter = get_secret_getter(); - built .handle( storage_manager, - secret_getter, + StubSecretGetter, + StubResourceManager, runtime_manager.clone(), StubDeploymentUpdater, kill_old_deployments(), @@ -601,12 +652,11 @@ mod tests { let handle_cleanup = |_result| panic!("service should never be started"); - let secret_getter = get_secret_getter(); - built .handle( storage_manager, - secret_getter, + StubSecretGetter, + StubResourceManager, runtime_manager.clone(), StubDeploymentUpdater, kill_old_deployments(), diff --git a/deployer/src/lib.rs b/deployer/src/lib.rs index dc689820c..73912cb76 100644 --- a/deployer/src/lib.rs +++ b/deployer/src/lib.rs @@ -37,6 +37,7 @@ pub async fn start( .runtime(runtime_manager) .deployment_updater(persistence.clone()) .secret_getter(persistence.clone()) + .resource_manager(persistence.clone()) .queue_client(GatewayClient::new(args.gateway_uri)) .build(); diff --git a/deployer/src/main.rs b/deployer/src/main.rs index 8a249cb63..11d178b1a 100644 --- a/deployer/src/main.rs +++ b/deployer/src/main.rs @@ -24,6 +24,7 @@ async fn main() { let runtime_manager = RuntimeManager::new( args.artifacts_path.clone(), args.provisioner_address.uri().to_string(), + Some(args.auth_uri.to_string()), persistence.get_log_sender(), ); diff --git a/deployer/src/persistence/resource/mod.rs b/deployer/src/persistence/resource/mod.rs index 20069563d..36fcff4e4 100644 --- a/deployer/src/persistence/resource/mod.rs +++ b/deployer/src/persistence/resource/mod.rs @@ -25,10 +25,9 @@ pub struct Resource { pub data: serde_json::Value, } -impl From for shuttle_common::models::resource::Response { +impl From for shuttle_common::resource::Response { fn from(resource: Resource) -> Self { - shuttle_common::models::resource::Response { - service_id: resource.service_id, + shuttle_common::resource::Response { r#type: resource.r#type.into(), data: resource.data, } @@ -40,7 +39,7 @@ pub enum Type { Database(DatabaseType), } -impl From for shuttle_common::models::resource::Type { +impl From for shuttle_common::resource::Type { fn from(r#type: Type) -> Self { match r#type { Type::Database(r#type) => Self::Database(r#type.into()), @@ -48,6 +47,14 @@ impl From for shuttle_common::models::resource::Type { } } +impl From for Type { + fn from(r#type: shuttle_common::resource::Type) -> Self { + match r#type { + shuttle_common::resource::Type::Database(r#type) => Self::Database(r#type.into()), + } + } +} + impl Display for Type { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index 825a4ade5..7199f664c 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -1,6 +1,7 @@ use std::{collections::HashMap, path::PathBuf, sync::Arc}; use anyhow::Context; +use shuttle_common::claims::{ClaimService, InjectPropagation}; use shuttle_proto::runtime::{ self, runtime_client::RuntimeClient, StopRequest, SubscribeLogsRequest, }; @@ -13,7 +14,17 @@ use crate::deployment::deploy_layer; const MANIFEST_DIR: &str = env!("CARGO_MANIFEST_DIR"); -type Runtimes = Arc)>>>; +type Runtimes = Arc< + std::sync::Mutex< + HashMap< + Uuid, + ( + process::Child, + RuntimeClient>>, + ), + >, + >, +>; /// Manager that can start up mutliple runtimes. This is needed so that two runtimes can be up when a new deployment is made: /// One runtime for the new deployment being loaded; another for the currently active deployment @@ -22,6 +33,7 @@ pub struct RuntimeManager { runtimes: Runtimes, artifacts_path: PathBuf, provisioner_address: String, + auth_uri: Option, log_sender: crossbeam_channel::Sender, } @@ -29,12 +41,14 @@ impl RuntimeManager { pub fn new( artifacts_path: PathBuf, provisioner_address: String, + auth_uri: Option, log_sender: crossbeam_channel::Sender, ) -> Arc> { Arc::new(Mutex::new(Self { runtimes: Default::default(), artifacts_path, provisioner_address, + auth_uri, log_sender, })) } @@ -43,7 +57,7 @@ impl RuntimeManager { &mut self, id: Uuid, alpha_runtime_path: Option, - ) -> anyhow::Result> { + ) -> anyhow::Result>>> { trace!("making new client"); let port = portpicker::pick_unused_port().context("failed to find available port")?; @@ -97,6 +111,7 @@ impl RuntimeManager { is_next, runtime::StorageManagerType::Artifacts(self.artifacts_path.clone()), &self.provisioner_address, + self.auth_uri.as_ref(), port, get_runtime_executable, ) diff --git a/e2e/tests/integration/helpers/mod.rs b/e2e/tests/integration/helpers/mod.rs index 45a4e1dab..fe6e1e6c1 100644 --- a/e2e/tests/integration/helpers/mod.rs +++ b/e2e/tests/integration/helpers/mod.rs @@ -38,13 +38,29 @@ impl TempCargoHome { write!( config, r#"[patch.crates-io] -shuttle-service = {{ path = "{}" }} -shuttle-aws-rds = {{ path = "{}" }} -shuttle-persist = {{ path = "{}" }} -shuttle-shared-db = {{ path = "{}" }} -shuttle-secrets = {{ path = "{}" }} -shuttle-static-folder = {{ path = "{}" }}"#, +shuttle-service = { path = "{}" } +shuttle-runtime = { path = "{}" } + +shuttle-aws-rds = { path = "{}" } +shuttle-persist = { path = "{}" } +shuttle-shared-db = { path = "{}" } +shuttle-secrets = { path = "{}" } +shuttle-static-folder = { path = "{}" } + +shuttle-axum = { path = "{}" } +shuttle-actix-web = { path = "{}" } +shuttle-next = { path = "{}" } +shuttle-poem = { path = "{}" } +shuttle-poise = { path = "{}" } +shuttle-rocket = { path = "{}" } +shuttle-salvo = { path = "{}" } +shuttle-serenity = { path = "{}" } +shuttle-thruster = { path = "{}" } +shuttle-tide = { path = "{}" } +shuttle-tower = { path = "{}" } +shuttle-warp = { path = "{}" }"#, WORKSPACE_ROOT.join("service").display(), + WORKSPACE_ROOT.join("runtime").display(), WORKSPACE_ROOT.join("resources").join("aws-rds").display(), WORKSPACE_ROOT.join("resources").join("persist").display(), WORKSPACE_ROOT.join("resources").join("shared-db").display(), @@ -53,6 +69,54 @@ shuttle-static-folder = {{ path = "{}" }}"#, .join("resources") .join("static-folder") .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-axum") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-actix-web") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-next") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-poem") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-poise") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-rocket") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-salvo") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-serenity") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-thruster") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-tide") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-tower") + .display(), + WORKSPACE_ROOT + .join("services") + .join("shuttle-warp") + .display(), ) .unwrap(); diff --git a/gateway/src/project.rs b/gateway/src/project.rs index efc13ddf9..54e955935 100644 --- a/gateway/src/project.rs +++ b/gateway/src/project.rs @@ -717,7 +717,7 @@ impl ProjectCreating { auth_uri, ], "Env": [ - "RUST_LOG=debug,shuttle=trace", + "RUST_LOG=debug,shuttle=trace,h2=warn", ] }) }); diff --git a/proto/Cargo.toml b/proto/Cargo.toml index 11a2836f5..5180b1034 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -15,11 +15,12 @@ prost = "0.11.2" prost-types = { workspace = true } tokio = { version = "1.22.0", features = ["process"] } tonic = { workspace = true } +tower = { workspace = true } tracing = { workspace = true } [dependencies.shuttle-common] workspace = true -features = ["error", "service", "wasm"] +features = ["claims", "error", "service", "wasm"] [build-dependencies] protoc-bin-vendored = "3.0.0" diff --git a/proto/runtime.proto b/proto/runtime.proto index 57a4895df..2dee8806a 100644 --- a/proto/runtime.proto +++ b/proto/runtime.proto @@ -27,8 +27,11 @@ message LoadRequest { // Path to compiled file to load for service string path = 2; + // A cache of resource details to use instead when asked + repeated bytes resources = 10; + // Secrets that belong to this deployment - map secrets = 10; + map secrets = 20; } message LoadResponse { @@ -36,6 +39,8 @@ message LoadResponse { bool success = 1; // Error message if not successful string message = 2; + // Which resources where requested + repeated bytes resources = 10; } message StartRequest { diff --git a/proto/src/lib.rs b/proto/src/lib.rs index fd2e81caf..6f8602591 100644 --- a/proto/src/lib.rs +++ b/proto/src/lib.rs @@ -104,9 +104,13 @@ pub mod runtime { use anyhow::Context; use chrono::DateTime; use prost_types::Timestamp; - use shuttle_common::ParseError; + use shuttle_common::{ + claims::{ClaimLayer, ClaimService, InjectPropagation, InjectPropagationLayer}, + ParseError, + }; use tokio::process; use tonic::transport::{Channel, Endpoint}; + use tower::ServiceBuilder; use tracing::info; pub enum StorageManagerType { @@ -206,9 +210,13 @@ pub mod runtime { wasm: bool, storage_manager_type: StorageManagerType, provisioner_address: &str, + auth_uri: Option<&String>, port: u16, get_runtime_executable: impl FnOnce() -> PathBuf, - ) -> anyhow::Result<(process::Child, runtime_client::RuntimeClient)> { + ) -> anyhow::Result<( + process::Child, + runtime_client::RuntimeClient>>, + )> { let (storage_manager_type, storage_manager_path) = match storage_manager_type { StorageManagerType::Artifacts(path) => ("artifacts", path), StorageManagerType::WorkingDir(path) => ("working-dir", path), @@ -221,7 +229,7 @@ pub mod runtime { let args = if wasm { vec!["--port", port] } else { - vec![ + let mut args = vec![ "--port", port, "--provisioner-address", @@ -230,7 +238,13 @@ pub mod runtime { storage_manager_type, "--storage-manager-path", storage_manager_path, - ] + ]; + + if let Some(auth_uri) = auth_uri { + args.append(&mut vec!["--auth-uri", auth_uri]); + } + + args }; let runtime = process::Command::new(runtime_executable_path) @@ -247,9 +261,12 @@ pub mod runtime { .context("creating runtime client endpoint")? .connect_timeout(Duration::from_secs(5)); - let runtime_client = runtime_client::RuntimeClient::connect(conn) - .await - .context("connecting runtime client")?; + let channel = conn.connect().await.context("connecting runtime client")?; + let channel = ServiceBuilder::new() + .layer(ClaimLayer) + .layer(InjectPropagationLayer) + .service(channel); + let runtime_client = runtime_client::RuntimeClient::new(channel); Ok((runtime, runtime_client)) } diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 632c5ee16..58840a9dd 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -41,7 +41,7 @@ wasmtime-wasi = { version = "4.0.0", optional = true } [dependencies.shuttle-common] workspace = true -features = ["claims"] +features = ["claims", "backend"] [dependencies.shuttle-proto] workspace = true diff --git a/runtime/src/alpha/args.rs b/runtime/src/alpha/args.rs index 77af08cbd..21afa20f6 100644 --- a/runtime/src/alpha/args.rs +++ b/runtime/src/alpha/args.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use clap::{Parser, ValueEnum}; -use tonic::transport::Endpoint; +use tonic::transport::{Endpoint, Uri}; #[derive(Parser, Debug)] #[command(version)] @@ -21,6 +21,10 @@ pub struct Args { /// Path to use for storage manager #[arg(long)] pub storage_manager_path: PathBuf, + + /// Address to reach the authentication service at + #[arg(long, default_value = "http://127.0.0.1:8008")] + pub auth_uri: Uri, } #[derive(Clone, Debug, ValueEnum)] diff --git a/runtime/src/alpha/mod.rs b/runtime/src/alpha/mod.rs index a00054092..828ee421e 100644 --- a/runtime/src/alpha/mod.rs +++ b/runtime/src/alpha/mod.rs @@ -13,7 +13,12 @@ use async_trait::async_trait; use clap::Parser; use core::future::Future; use shuttle_common::{ - claims::{ClaimLayer, InjectPropagationLayer}, + backends::{ + auth::{AuthPublicKey, JwtAuthenticationLayer}, + tracing::ExtractPropagationLayer, + }, + claims::{Claim, ClaimLayer, InjectPropagationLayer}, + resource, storage_manager::{ArtifactsStorageManager, StorageManager, WorkingDirStorageManager}, }; use shuttle_proto::{ @@ -50,8 +55,12 @@ pub async fn start(loader: impl Loader + Send + 'static) { let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); let provisioner_address = args.provisioner_address; - let mut server_builder = - Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); + let mut server_builder = Server::builder() + .http2_keepalive_interval(Some(Duration::from_secs(60))) + .layer(JwtAuthenticationLayer::new(AuthPublicKey::new( + args.auth_uri, + ))) + .layer(ExtractPropagationLayer); // We wrap the StorageManager trait object in an Arc rather than a Box, since we need // to clone it in the `ProvisionerFactory::new` call in the alpha runtime `load` method. @@ -158,8 +167,11 @@ where S: Service + Send + 'static, { async fn load(&self, request: Request) -> Result, Status> { + let claim = request.extensions().get::().map(Clone::clone); + let LoadRequest { path, + resources, secrets, service_name, } = request.into_inner(); @@ -184,12 +196,21 @@ where let service_name = ServiceName::from_str(service_name.as_str()) .map_err(|err| Status::from_error(Box::new(err)))?; + let resources = resources + .into_iter() + .map(resource::Response::from_bytes) + .collect(); + let resources: Arc>> = + Arc::new(tokio::sync::Mutex::new(resources)); + let factory = ProvisionerFactory::new( provisioner_client, service_name, secrets, self.storage_manager.clone(), self.env, + claim, + resources.clone(), ); trace!("got factory"); @@ -207,11 +228,26 @@ where let message = LoadResponse { success: false, message: error.to_string(), + resources: resources + .lock() + .await + .clone() + .into_iter() + .map(resource::Response::into_bytes) + .collect(), }; return Ok(Response::new(message)); } }, Err(error) => { + let resources = resources + .lock() + .await + .clone() + .into_iter() + .map(resource::Response::into_bytes) + .collect(); + if error.is_panic() { let panic = error.into_panic(); let msg = panic @@ -224,6 +260,7 @@ where let message = LoadResponse { success: false, message: msg, + resources, }; return Ok(Response::new(message)); } else { @@ -231,6 +268,7 @@ where let message = LoadResponse { success: false, message: error.to_string(), + resources, }; return Ok(Response::new(message)); } @@ -242,6 +280,13 @@ where let message = LoadResponse { success: true, message: String::new(), + resources: resources + .lock() + .await + .clone() + .into_iter() + .map(resource::Response::into_bytes) + .collect(), }; Ok(Response::new(message)) } diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index 8b4152b51..7a6a6bbce 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -92,6 +92,7 @@ impl Runtime for AxumWasm { let message = LoadResponse { success: true, message: String::new(), + resources: Vec::new(), }; Ok(tonic::Response::new(message)) diff --git a/runtime/src/provisioner_factory.rs b/runtime/src/provisioner_factory.rs index a2ccba6b3..87d2f3a12 100644 --- a/runtime/src/provisioner_factory.rs +++ b/runtime/src/provisioner_factory.rs @@ -2,15 +2,15 @@ use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; use async_trait::async_trait; use shuttle_common::{ - claims::{ClaimService, InjectPropagation}, + claims::{Claim, ClaimService, InjectPropagation}, database, + resource::{self, ResourceInfo}, storage_manager::StorageManager, DatabaseReadyInfo, }; -use shuttle_proto::provisioner::{ - database_request::DbType, provisioner_client::ProvisionerClient, DatabaseRequest, -}; +use shuttle_proto::provisioner::{provisioner_client::ProvisionerClient, DatabaseRequest}; use shuttle_service::{Environment, Factory, ServiceName}; +use tokio::sync::Mutex; use tonic::{transport::Channel, Request}; use tracing::{debug, info, trace}; @@ -19,9 +19,10 @@ pub struct ProvisionerFactory { service_name: ServiceName, storage_manager: Arc, provisioner_client: ProvisionerClient>>, - info: Option, secrets: BTreeMap, env: Environment, + claim: Option, + resources: Arc>>, } impl ProvisionerFactory { @@ -31,14 +32,17 @@ impl ProvisionerFactory { secrets: BTreeMap, storage_manager: Arc, env: Environment, + claim: Option, + resources: Arc>>, ) -> Self { Self { provisioner_client, service_name, storage_manager, - info: None, secrets, env, + claim, + resources, } } } @@ -51,18 +55,28 @@ impl Factory for ProvisionerFactory { ) -> Result { info!("Provisioning a {db_type}. This can take a while..."); - if let Some(ref info) = self.info { + if let Some(info) = self + .resources + .lock() + .await + .iter() + .find(|resource| resource.r#type == resource::Type::Database(db_type.clone())) + { debug!("A database has already been provisioned for this deployment, so reusing it"); - return Ok(info.connection_string_private()); - } - let db_type: DbType = db_type.into(); + let resource = info.get_resource_info(); + return Ok(resource.connection_string_private()); + } - let request = Request::new(DatabaseRequest { + let mut request = Request::new(DatabaseRequest { project_name: self.service_name.to_string(), - db_type: Some(db_type), + db_type: Some(db_type.clone().into()), }); + if let Some(claim) = &self.claim { + request.extensions_mut().insert(claim.clone()); + } + let response = self .provisioner_client .provision_database(request) @@ -73,10 +87,14 @@ impl Factory for ProvisionerFactory { let info: DatabaseReadyInfo = response.into(); let conn_str = info.connection_string_private(); - self.info = Some(info); + self.resources.lock().await.push(resource::Response { + r#type: resource::Type::Database(db_type), + data: serde_json::to_value(&info).expect("to convert DB info"), + }); info!("Done provisioning database"); trace!("giving a DB connection string: {}", conn_str); + Ok(conn_str) } @@ -88,6 +106,10 @@ impl Factory for ProvisionerFactory { self.service_name.clone() } + fn get_environment(&self) -> shuttle_service::Environment { + self.env + } + fn get_build_path(&self) -> Result { self.storage_manager .service_build_path(self.service_name.as_str()) @@ -99,8 +121,4 @@ impl Factory for ProvisionerFactory { .service_storage_path(self.service_name.as_str()) .map_err(Into::into) } - - fn get_environment(&self) -> shuttle_service::Environment { - self.env - } } diff --git a/runtime/tests/integration/helpers.rs b/runtime/tests/integration/helpers.rs index 3b13eff51..0f2330237 100644 --- a/runtime/tests/integration/helpers.rs +++ b/runtime/tests/integration/helpers.rs @@ -6,6 +6,7 @@ use std::{ use anyhow::Result; use async_trait::async_trait; +use shuttle_common::claims::{ClaimService, InjectPropagation}; use shuttle_proto::{ provisioner::{ provisioner_server::{Provisioner, ProvisionerServer}, @@ -20,7 +21,7 @@ use tonic::{ }; pub struct TestRuntime { - pub runtime_client: RuntimeClient, + pub runtime_client: RuntimeClient>>, pub bin_path: String, pub service_name: String, pub runtime_address: SocketAddr, @@ -54,6 +55,7 @@ pub async fn spawn_runtime(project_path: String, service_name: &str) -> Result Date: Thu, 16 Mar 2023 08:28:45 +0000 Subject: [PATCH 67/74] feat(local): don't install next-runtime from git (#718) --- cargo-shuttle/src/lib.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index dcfa746c6..5ffe10f2f 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -479,7 +479,6 @@ impl Shuttle { trace!(?path, "installing runtime from local filesystem"); - // TODO: Add --features next here when https://github.com/shuttle-hq/shuttle/pull/688 is merged std::process::Command::new("cargo") .arg("install") .arg("shuttle-runtime") @@ -493,22 +492,16 @@ impl Shuttle { .expect("failed to install the shuttle runtime"); } else { // If the version of cargo-shuttle is different from shuttle-runtime, - // or it isn't installed, try to install shuttle-runtime from the production - // branch. + // or it isn't installed, try to install shuttle-runtime from crates.io. if let Err(err) = check_version(&runtime_path) { warn!("{}", err); trace!("installing shuttle-runtime"); - // TODO: Add --features next here when https://github.com/shuttle-hq/shuttle/pull/688 is merged std::process::Command::new("cargo") .arg("install") .arg("shuttle-runtime") .arg("--bin") .arg("shuttle-next") - .arg("--git") - .arg("https://github.com/shuttle-hq/shuttle") - .arg("--branch") - .arg("production") .arg("--features") .arg("next") .output() From 3cff60d67f4672b5eb9b9db01920238c26fb19c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Thu, 16 Mar 2023 08:31:02 +0000 Subject: [PATCH 68/74] fix: static folder local run clearing file contents, add missing tests in cargo-shuttle (#717) * fix: static folder local run clearing file contents * fix: clippy * fix: cargo shuttle init tests not logging in * fix: bail if non-interactive and --new without api-key * fix: update codegen tests --- cargo-shuttle/src/lib.rs | 4 +- cargo-shuttle/tests/integration/init.rs | 23 ++++------- cargo-shuttle/tests/integration/run.rs | 52 +++++++++++++++++++++++++ codegen/src/shuttle_main/mod.rs | 6 +-- resources/static-folder/src/lib.rs | 4 ++ runtime/src/lib.rs | 2 +- 6 files changed, 69 insertions(+), 22 deletions(-) diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 5ffe10f2f..a305056ec 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -136,9 +136,9 @@ impl Shuttle { println!("First, let's log in to your Shuttle account."); self.login(args.login_args.clone()).await?; println!(); - } else if args.new && args.login_args.api_key.is_some() { + } else if args.login_args.api_key.is_some() { self.login(args.login_args.clone()).await?; - } else { + } else if args.new { bail!("Tried to login to create a Shuttle environment, but no API key was set.") } } diff --git a/cargo-shuttle/tests/integration/init.rs b/cargo-shuttle/tests/integration/init.rs index 75ac846fa..223987b5b 100644 --- a/cargo-shuttle/tests/integration/init.rs +++ b/cargo-shuttle/tests/integration/init.rs @@ -33,8 +33,6 @@ async fn non_interactive_basic_init() { assert!(cargo_toml.contains("shuttle-runtime = ")); } -// TODO: unignore when shuttle-rocket is published -#[ignore] #[tokio::test] async fn non_interactive_rocket_init() { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -57,8 +55,6 @@ async fn non_interactive_rocket_init() { assert_valid_rocket_project(temp_dir_path.as_path(), "rocket-init"); } -// TODO: unignore when shuttle-rocket is published -#[ignore] #[test] fn interactive_rocket_init() -> Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -98,8 +94,6 @@ fn interactive_rocket_init() -> Result<(), Box> { Ok(()) } -// TODO: unignore when shuttle-rocket is published -#[ignore] #[test] fn interactive_rocket_init_dont_prompt_framework() -> Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -135,8 +129,6 @@ fn interactive_rocket_init_dont_prompt_framework() -> Result<(), Box Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -176,11 +168,10 @@ fn interactive_rocket_init_dont_prompt_name() -> Result<(), Box shuttle_service::ShuttleRocket { + #[shuttle_runtime::main] + async fn rocket() -> shuttle_rocket::ShuttleRocket { let rocket = rocket::build().mount("/hello", routes![index]); - Ok(rocket) + Ok(rocket.into()) }"#}; - assert_eq!(lib_file, expected); + assert_eq!(main_file, expected); } diff --git a/cargo-shuttle/tests/integration/run.rs b/cargo-shuttle/tests/integration/run.rs index eab40488a..311b78385 100644 --- a/cargo-shuttle/tests/integration/run.rs +++ b/cargo-shuttle/tests/integration/run.rs @@ -121,6 +121,58 @@ async fn rocket_postgres() { assert_eq!(request_text, "{\"id\":1,\"note\":\"Deploy to shuttle\"}"); } +#[tokio::test(flavor = "multi_thread")] +async fn axum_static_files() { + let url = cargo_shuttle_run("../examples/axum/static-files", false).await; + let client = reqwest::Client::new(); + + let request_text = client + .get(format!("{url}/hello")) + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + + assert_eq!(request_text, "Hello, world!"); + + let request_text = client.get(url).send().await.unwrap().text().await.unwrap(); + + assert!( + request_text.contains("This is an example of serving static files with axum and shuttle.") + ); +} + +#[tokio::test(flavor = "multi_thread")] +async fn shuttle_next() { + let url = cargo_shuttle_run("../examples/next/hello-world", false).await; + let client = reqwest::Client::new(); + + let request_text = client + .get(format!("{url}/hello")) + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + + assert_eq!(request_text, "Hello, World!"); + + let post_text = client + .post(format!("{url}/uppercase")) + .body("uppercase this") + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + + assert_eq!(post_text, "UPPERCASE THIS"); +} + #[tokio::test(flavor = "multi_thread")] #[ignore] async fn rocket_authentication() { diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 3d49794d8..49d67101f 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -232,7 +232,7 @@ impl ToTokens for Loader { None } else { Some(parse_quote!( - use shuttle_runtime::ResourceBuilder; + use shuttle_runtime::{Factory, ResourceBuilder}; )) }; @@ -391,7 +391,7 @@ mod tests { ) -> ShuttleComplex { use shuttle_runtime::Context; use shuttle_runtime::tracing_subscriber::prelude::*; - use shuttle_runtime::ResourceBuilder; + use shuttle_runtime::{Factory, ResourceBuilder}; let filter_layer = shuttle_runtime::tracing_subscriber::EnvFilter::try_from_default_env() @@ -506,7 +506,7 @@ mod tests { ) -> ShuttleComplex { use shuttle_runtime::Context; use shuttle_runtime::tracing_subscriber::prelude::*; - use shuttle_runtime::ResourceBuilder; + use shuttle_runtime::{Factory, ResourceBuilder}; let filter_layer = shuttle_runtime::tracing_subscriber::EnvFilter::try_from_default_env() diff --git a/resources/static-folder/src/lib.rs b/resources/static-folder/src/lib.rs index 4d9abc944..4a3f3c775 100644 --- a/resources/static-folder/src/lib.rs +++ b/resources/static-folder/src/lib.rs @@ -65,6 +65,10 @@ impl<'a> ResourceBuilder for StaticFolder<'a> { trace!(output_directory = ?output_dir, "got output directory"); + if output_dir.join(self.folder) == input_dir { + return Ok(output_dir.join(self.folder)); + } + let copy_options = CopyOptions::new().overwrite(true); match copy(&input_dir, &output_dir, ©_options) { Ok(_) => Ok(output_dir.join(self.folder)), diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 31c11a7fa..8e1cf8e28 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -227,7 +227,7 @@ pub use logger::Logger; pub use next::{AxumWasm, NextArgs}; pub use provisioner_factory::ProvisionerFactory; pub use shuttle_common::storage_manager::StorageManager; -pub use shuttle_service::{main, CustomError, Error, ResourceBuilder, Service}; +pub use shuttle_service::{main, CustomError, Error, Factory, ResourceBuilder, Service}; // Dependencies required by the codegen pub use anyhow::Context; From 9471ed50e27f5434fc4c11e0c454679dc9736ad6 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 16 Mar 2023 11:04:29 +0200 Subject: [PATCH 69/74] [next] refactor: tracing (#719) * refactor: use tracing setup helper * refactor: better trace propagation * refactor: clippy suggestion --- cargo-shuttle/src/lib.rs | 2 ++ codegen/src/shuttle_main/mod.rs | 16 ++++++++-------- runtime/src/alpha/mod.rs | 4 +++- runtime/src/bin/shuttle-next.rs | 18 +++++------------- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index a305056ec..9463e6b30 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -472,6 +472,8 @@ impl Shuttle { .expect("failed to find cargo home dir") .join("bin/shuttle-next"); + println!("Installing shuttle runtime. This can take a while..."); + if cfg!(debug_assertions) { // Canonicalized path to shuttle-runtime for dev to work on windows let path = std::fs::canonicalize(format!("{MANIFEST_DIR}/../runtime")) diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 49d67101f..4db2fcde3 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -258,10 +258,10 @@ impl ToTokens for Loader { .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - shuttle_runtime::tracing_subscriber::registry() + let _guard = shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) - .init(); + .set_default(); // Scope our runtime logger to this thread scope only #vars #(let #fn_inputs = #fn_inputs_builder::new()#fn_inputs_builder_options.build(&mut #factory_ident).await.context(format!("failed to provision {}", stringify!(#fn_inputs_builder)))?;)* @@ -317,10 +317,10 @@ mod tests { .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - shuttle_runtime::tracing_subscriber::registry() + let _guard = shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) - .init(); + .set_default(); simple().await } @@ -398,10 +398,10 @@ mod tests { .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - shuttle_runtime::tracing_subscriber::registry() + let _guard = shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) - .init(); + .set_default(); let pool = shuttle_shared_db::Postgres::new().build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; let redis = shuttle_shared_db::Redis::new().build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Redis)))?; @@ -513,10 +513,10 @@ mod tests { .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - shuttle_runtime::tracing_subscriber::registry() + let _guard = shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) - .init(); + .set_default(); let vars = std::collections::HashMap::from_iter(factory.get_secrets().await?.into_iter().map(|(key, value)| (format!("secrets.{}", key), value))); let pool = shuttle_shared_db::Postgres::new().size(&shuttle_runtime::strfmt("10Gb", &vars)?).public(false).build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; diff --git a/runtime/src/alpha/mod.rs b/runtime/src/alpha/mod.rs index 828ee421e..3df2bd18a 100644 --- a/runtime/src/alpha/mod.rs +++ b/runtime/src/alpha/mod.rs @@ -15,7 +15,7 @@ use core::future::Future; use shuttle_common::{ backends::{ auth::{AuthPublicKey, JwtAuthenticationLayer}, - tracing::ExtractPropagationLayer, + tracing::{setup_tracing, ExtractPropagationLayer}, }, claims::{Claim, ClaimLayer, InjectPropagationLayer}, resource, @@ -54,6 +54,8 @@ pub async fn start(loader: impl Loader + Send + 'static) { let args = Args::parse(); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); + setup_tracing(tracing_subscriber::registry(), "shuttle-alpha"); + let provisioner_address = args.provisioner_address; let mut server_builder = Server::builder() .http2_keepalive_interval(Some(Duration::from_secs(60))) diff --git a/runtime/src/bin/shuttle-next.rs b/runtime/src/bin/shuttle-next.rs index 554cb882e..d375ab17f 100644 --- a/runtime/src/bin/shuttle-next.rs +++ b/runtime/src/bin/shuttle-next.rs @@ -4,33 +4,25 @@ use std::{ }; use clap::Parser; +use shuttle_common::backends::tracing::{setup_tracing, ExtractPropagationLayer}; use shuttle_proto::runtime::runtime_server::RuntimeServer; use shuttle_runtime::{AxumWasm, NextArgs}; use tonic::transport::Server; use tracing::trace; -use tracing_subscriber::{fmt, prelude::*, EnvFilter}; #[tokio::main(flavor = "multi_thread")] async fn main() { let args = NextArgs::parse(); - // TODO: replace with tracing helper from main branch - let fmt_layer = fmt::layer(); - let filter_layer = EnvFilter::try_from_default_env() - .or_else(|_| EnvFilter::try_new("info")) - .unwrap(); - - tracing_subscriber::registry() - .with(filter_layer) - .with(fmt_layer) - .init(); + setup_tracing(tracing_subscriber::registry(), "shuttle-next"); trace!(args = ?args, "parsed args"); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); - let mut server_builder = - Server::builder().http2_keepalive_interval(Some(Duration::from_secs(60))); + let mut server_builder = Server::builder() + .http2_keepalive_interval(Some(Duration::from_secs(60))) + .layer(ExtractPropagationLayer); let axum = AxumWasm::default(); let svc = RuntimeServer::new(axum); From 2d7b126681c603db296b91da344da00386e2a840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Thu, 16 Mar 2023 14:52:41 +0000 Subject: [PATCH 70/74] fix: windows local run path bug (#721) --- Cargo.lock | 1 + cargo-shuttle/Cargo.toml | 1 + cargo-shuttle/src/args.rs | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d56b0bdb..d9b5b06c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -987,6 +987,7 @@ dependencies = [ "crossterm", "dialoguer", "dirs", + "dunce", "flate2", "futures", "git2", diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index efccd1efb..c71e9f842 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -22,6 +22,7 @@ crossbeam-channel = "0.5.6" crossterm = "0.25.0" dialoguer = { version = "0.10.2", features = ["fuzzy-select"] } dirs = "4.0.0" +dunce = "1.0.3" flate2 = "1.0.25" futures = "0.3.25" git2 = "0.14.2" diff --git a/cargo-shuttle/src/args.rs b/cargo-shuttle/src/args.rs index abb623fee..9810a7a21 100644 --- a/cargo-shuttle/src/args.rs +++ b/cargo-shuttle/src/args.rs @@ -1,6 +1,6 @@ use std::{ ffi::OsString, - fs::{canonicalize, create_dir_all}, + fs::create_dir_all, io::{self, ErrorKind}, path::PathBuf, }; @@ -241,7 +241,7 @@ impl InitArgs { // Helper function to parse and return the absolute path fn parse_path(path: OsString) -> Result { - canonicalize(&path).map_err(|e| format!("could not turn {path:?} into a real path: {e}")) + dunce::canonicalize(&path).map_err(|e| format!("could not turn {path:?} into a real path: {e}")) } // Helper function to parse, create if not exists, and return the absolute path From 5e1e527954c30b4f8bf4042d60c9c83df1e8f385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Fri, 17 Mar 2023 15:08:26 +0000 Subject: [PATCH 71/74] refactor: pull out vendored protoc from shuttle-proto (#726) * feat: use grpcio to avoid needing protoc * refactor: remove vendored protoc, revert to tonic otlp --- Cargo.lock | 55 ++---------------------------------------------- proto/Cargo.toml | 1 - proto/build.rs | 6 ------ 3 files changed, 2 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9b5b06c9..eca8b29e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3827,56 +3827,6 @@ dependencies = [ "prost", ] -[[package]] -name = "protoc-bin-vendored" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005ca8623e5633e298ad1f917d8be0a44bcf406bf3cde3b80e63003e49a3f27d" -dependencies = [ - "protoc-bin-vendored-linux-aarch_64", - "protoc-bin-vendored-linux-ppcle_64", - "protoc-bin-vendored-linux-x86_32", - "protoc-bin-vendored-linux-x86_64", - "protoc-bin-vendored-macos-x86_64", - "protoc-bin-vendored-win32", -] - -[[package]] -name = "protoc-bin-vendored-linux-aarch_64" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb9fc9cce84c8694b6ea01cc6296617b288b703719b725b8c9c65f7c5874435" - -[[package]] -name = "protoc-bin-vendored-linux-ppcle_64" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d2a07dcf7173a04d49974930ccbfb7fd4d74df30ecfc8762cf2f895a094516" - -[[package]] -name = "protoc-bin-vendored-linux-x86_32" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54fef0b04fcacba64d1d80eed74a20356d96847da8497a59b0a0a436c9165b0" - -[[package]] -name = "protoc-bin-vendored-linux-x86_64" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8782f2ce7d43a9a5c74ea4936f001e9e8442205c244f7a3d4286bd4c37bc924" - -[[package]] -name = "protoc-bin-vendored-macos-x86_64" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5de656c7ee83f08e0ae5b81792ccfdc1d04e7876b1d9a38e6876a9e09e02537" - -[[package]] -name = "protoc-bin-vendored-win32" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9653c3ed92974e34c5a6e0a510864dab979760481714c172e0a34e437cb98804" - [[package]] name = "psm" version = "0.1.21" @@ -4797,7 +4747,6 @@ dependencies = [ "home", "prost", "prost-types", - "protoc-bin-vendored", "shuttle-common", "tokio", "tonic", @@ -6001,9 +5950,9 @@ dependencies = [ [[package]] name = "urlencoding" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b90931029ab9b034b300b797048cf23723400aa757e8a2bfb9d748102f9821" +checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" [[package]] name = "utf-8" diff --git a/proto/Cargo.toml b/proto/Cargo.toml index 5180b1034..2a03c17b6 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -23,5 +23,4 @@ workspace = true features = ["claims", "error", "service", "wasm"] [build-dependencies] -protoc-bin-vendored = "3.0.0" tonic-build = "0.8.3" diff --git a/proto/build.rs b/proto/build.rs index 3761649ff..685a01573 100644 --- a/proto/build.rs +++ b/proto/build.rs @@ -1,10 +1,4 @@ fn main() -> Result<(), Box> { - let protoc = protoc_bin_vendored::protoc_bin_path().unwrap(); - let protoc_include = protoc_bin_vendored::include_path().unwrap(); - - std::env::set_var("PROTOC", protoc); - std::env::set_var("PROTOC_INCLUDE", protoc_include); - tonic_build::configure().compile(&["./provisioner.proto", "./runtime.proto"], &["./"])?; Ok(()) From ee0437618a114ee6a59f976bac14d733b046fdbe Mon Sep 17 00:00:00 2001 From: Pieter Date: Fri, 17 Mar 2023 17:25:43 +0200 Subject: [PATCH 72/74] [next] bug: misc fixes (#725) * bug: thread local logging breaking serenity * refactor: patch all crates * refactor: extend tokens to 15 minutes --- codegen/src/shuttle_main/mod.rs | 16 ++++---- common/src/claims.rs | 10 ++++- deployer/prepare.sh | 16 +++++++- gateway/src/api/auth_layer.rs | 70 +++++---------------------------- runtime/src/alpha/mod.rs | 4 +- 5 files changed, 42 insertions(+), 74 deletions(-) diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 4db2fcde3..49d67101f 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -258,10 +258,10 @@ impl ToTokens for Loader { .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - let _guard = shuttle_runtime::tracing_subscriber::registry() + shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) - .set_default(); // Scope our runtime logger to this thread scope only + .init(); #vars #(let #fn_inputs = #fn_inputs_builder::new()#fn_inputs_builder_options.build(&mut #factory_ident).await.context(format!("failed to provision {}", stringify!(#fn_inputs_builder)))?;)* @@ -317,10 +317,10 @@ mod tests { .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - let _guard = shuttle_runtime::tracing_subscriber::registry() + shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) - .set_default(); + .init(); simple().await } @@ -398,10 +398,10 @@ mod tests { .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - let _guard = shuttle_runtime::tracing_subscriber::registry() + shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) - .set_default(); + .init(); let pool = shuttle_shared_db::Postgres::new().build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; let redis = shuttle_shared_db::Redis::new().build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Redis)))?; @@ -513,10 +513,10 @@ mod tests { .or_else(|_| shuttle_runtime::tracing_subscriber::EnvFilter::try_new("INFO")) .unwrap(); - let _guard = shuttle_runtime::tracing_subscriber::registry() + shuttle_runtime::tracing_subscriber::registry() .with(filter_layer) .with(logger) - .set_default(); + .init(); let vars = std::collections::HashMap::from_iter(factory.get_secrets().await?.into_iter().map(|(key, value)| (format!("secrets.{}", key), value))); let pool = shuttle_shared_db::Postgres::new().size(&shuttle_runtime::strfmt("10Gb", &vars)?).public(false).build(&mut factory).await.context(format!("failed to provision {}", stringify!(shuttle_shared_db::Postgres)))?; diff --git a/common/src/claims.rs b/common/src/claims.rs index c9e4d35df..08d2c7806 100644 --- a/common/src/claims.rs +++ b/common/src/claims.rs @@ -19,7 +19,11 @@ use tower::{Layer, Service}; use tracing::{error, trace, Span}; use tracing_opentelemetry::OpenTelemetrySpanExt; -pub const EXP_MINUTES: i64 = 5; +/// Minutes before a claim expires +/// +/// We don't use the convention of 5 minutes because builds can take longer than 5 minutes. When this happens, requests +/// to provisioner will fail as the token expired. +pub const EXP_MINUTES: i64 = 15; const ISS: &str = "shuttle"; /// The scope of operations that can be performed on shuttle @@ -147,9 +151,11 @@ impl Claim { "failed to convert token to claim" ); match err.kind() { + jsonwebtoken::errors::ErrorKind::ExpiredSignature => { + StatusCode::from_u16(499).unwrap() // Expired status code which is safe to unwrap + } jsonwebtoken::errors::ErrorKind::InvalidSignature | jsonwebtoken::errors::ErrorKind::InvalidAlgorithmName - | jsonwebtoken::errors::ErrorKind::ExpiredSignature | jsonwebtoken::errors::ErrorKind::InvalidIssuer | jsonwebtoken::errors::ErrorKind::ImmatureSignature => { StatusCode::UNAUTHORIZED diff --git a/deployer/prepare.sh b/deployer/prepare.sh index 882f8d320..a7725531d 100755 --- a/deployer/prepare.sh +++ b/deployer/prepare.sh @@ -10,11 +10,25 @@ mkdir -p $CARGO_HOME; \ echo '[patch.crates-io] shuttle-service = { path = "/usr/src/shuttle/service" } shuttle-runtime = { path = "/usr/src/shuttle/runtime" } + shuttle-aws-rds = { path = "/usr/src/shuttle/resources/aws-rds" } shuttle-persist = { path = "/usr/src/shuttle/resources/persist" } shuttle-shared-db = { path = "/usr/src/shuttle/resources/shared-db" } shuttle-secrets = { path = "/usr/src/shuttle/resources/secrets" } -shuttle-static-folder = { path = "/usr/src/shuttle/resources/static-folder" }' > $CARGO_HOME/config.toml +shuttle-static-folder = { path = "/usr/src/shuttle/resources/static-folder" } + +shuttle-axum = { path = "/usr/src/shuttle/services/shuttle-axum" } +shuttle-actix-web = { path = "/usr/src/shuttle/services/shuttle-actix-web" } +shuttle-next = { path = "/usr/src/shuttle/services/shuttle-next" } +shuttle-poem = { path = "/usr/src/shuttle/services/shuttle-poem" } +shuttle-poise = { path = "/usr/src/shuttle/services/shuttle-poise" } +shuttle-rocket = { path = "/usr/src/shuttle/services/shuttle-rocket" } +shuttle-salvo = { path = "/usr/src/shuttle/services/shuttle-salvo" } +shuttle-serenity = { path = "/usr/src/shuttle/services/shuttle-serenity" } +shuttle-thruster = { path = "/usr/src/shuttle/services/shuttle-thruster" } +shuttle-tide = { path = "/usr/src/shuttle/services/shuttle-tide" } +shuttle-tower = { path = "/usr/src/shuttle/services/shuttle-tower" } +shuttle-warp = { path = "/usr/src/shuttle/services/shuttle-warp" }' > $CARGO_HOME/config.toml # Add the wasm32-wasi target rustup target add wasm32-wasi diff --git a/gateway/src/api/auth_layer.rs b/gateway/src/api/auth_layer.rs index 0e08d2587..b96b3a1a3 100644 --- a/gateway/src/api/auth_layer.rs +++ b/gateway/src/api/auth_layer.rs @@ -5,7 +5,6 @@ use axum::{ headers::{authorization::Bearer, Authorization, Cookie, Header, HeaderMapExt}, response::Response, }; -use chrono::{TimeZone, Utc}; use futures::future::BoxFuture; use http::{Request, StatusCode, Uri}; use hyper::{ @@ -24,6 +23,11 @@ use tracing_opentelemetry::OpenTelemetrySpanExt; static PROXY_CLIENT: Lazy>> = Lazy::new(|| ReverseProxy::new(Client::new())); +/// Time to cache tokens for. Currently tokens take 15 minutes to expire (see [EXP_MINUTES]) which leaves a 10 minutes +/// buffer (EXP_MINUTES - CACHE_MINUTES). We want the buffer to be atleast as long as the longest builds which has +/// been observed to be around 5 minutes. +const CACHE_MINUTES: u64 = 5; + /// The idea of this layer is to do two things: /// 1. Forward all user related routes (`/login`, `/logout`, `/users/*`, etc) to our auth service /// 2. Upgrade all Authorization Bearer keys and session cookies to JWT tokens for internal @@ -247,25 +251,11 @@ where } }; - match extract_token_expiration(response.token.clone()) { - Ok(expiration) => { - // Cache the token. - this.cache_manager.insert( - key.as_str(), - response.token.clone(), - expiration, - ); - } - Err(status) => { - error!( - "failed to extract token expiration before inserting into cache" - ); - return Ok(Response::builder() - .status(status) - .body(boxed(Body::empty())) - .unwrap()); - } - }; + this.cache_manager.insert( + key.as_str(), + response.token.clone(), + Duration::from_secs(CACHE_MINUTES * 60), + ); trace!("token inserted in cache, request proceeding"); req.headers_mut() @@ -290,46 +280,6 @@ where } } -fn extract_token_expiration(token: String) -> Result { - let (_header, rest) = token - .split_once('.') - .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?; - - let (claim, _sig) = rest - .split_once('.') - .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?; - - let claim = base64::decode_config(claim, base64::URL_SAFE_NO_PAD) - .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - - let claim: serde_json::Map = - serde_json::from_slice(&claim).map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - - let exp = claim["exp"] - .as_i64() - .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?; - - let expiration_timestamp = Utc - .timestamp_opt(exp, 0) - .single() - .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?; - - let duration = expiration_timestamp - Utc::now(); - - // We will use this duration to set the TTL for the JWT in the cache. We subtract 180 seconds - // to make sure a token from the cache will still be valid in cases where it will be used to - // authorize some operation, the operation takes some time, and then the token needs to be - // used again. - // - // This number should never be negative since the JWT has just been created, and so should be - // safe to cast to u64. However, if the number *is* negative it would wrap and the TTL duration - // would be near u64::MAX, so we use try_from to ensure that can't happen. - let duration_minus_buffer = u64::try_from(duration.num_seconds() - 180) - .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - - Ok(std::time::Duration::from_secs(duration_minus_buffer)) -} - fn make_token_request(uri: &str, header: impl Header) -> Request { let mut token_request = Request::builder().uri(uri); token_request diff --git a/runtime/src/alpha/mod.rs b/runtime/src/alpha/mod.rs index 3df2bd18a..828ee421e 100644 --- a/runtime/src/alpha/mod.rs +++ b/runtime/src/alpha/mod.rs @@ -15,7 +15,7 @@ use core::future::Future; use shuttle_common::{ backends::{ auth::{AuthPublicKey, JwtAuthenticationLayer}, - tracing::{setup_tracing, ExtractPropagationLayer}, + tracing::ExtractPropagationLayer, }, claims::{Claim, ClaimLayer, InjectPropagationLayer}, resource, @@ -54,8 +54,6 @@ pub async fn start(loader: impl Loader + Send + 'static) { let args = Args::parse(); let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), args.port); - setup_tracing(tracing_subscriber::registry(), "shuttle-alpha"); - let provisioner_address = args.provisioner_address; let mut server_builder = Server::builder() .http2_keepalive_interval(Some(Duration::from_secs(60))) From ba66b339c89e9bad34363996cc3e4903d6fdddf7 Mon Sep 17 00:00:00 2001 From: Pieter Date: Mon, 20 Mar 2023 11:33:35 +0200 Subject: [PATCH 73/74] bug: next runtime not sending stop signal (#728) * bug: next runtime not sending stop signal * refactor: better unwrap --- deployer/src/deployment/run.rs | 79 ++++++++++++++++++++------------- deployer/src/runtime_manager.rs | 2 + runtime/src/alpha/mod.rs | 6 ++- runtime/src/next/mod.rs | 55 ++++++++++++++++++----- 4 files changed, 98 insertions(+), 44 deletions(-) diff --git a/deployer/src/deployment/run.rs b/deployer/src/deployment/run.rs index b3ae00815..4bd26191d 100644 --- a/deployer/src/deployment/run.rs +++ b/deployer/src/deployment/run.rs @@ -60,15 +60,25 @@ pub async fn task( active_deployment_getter.clone(), runtime_manager.clone(), ); - let cleanup = move |response: SubscribeStopResponse| { + let cleanup = move |response: Option| { debug!(response = ?response, "stop client response: "); - match StopReason::from_i32(response.reason).unwrap_or_default() { - StopReason::Request => stopped_cleanup(&id), - StopReason::End => completed_cleanup(&id), - StopReason::Crash => { - crashed_cleanup(&id, Error::Run(anyhow::Error::msg(response.message).into())) + if let Some(response) = response { + match StopReason::from_i32(response.reason).unwrap_or_default() { + StopReason::Request => stopped_cleanup(&id), + StopReason::End => completed_cleanup(&id), + StopReason::Crash => crashed_cleanup( + &id, + Error::Run(anyhow::Error::msg(response.message).into()), + ), } + } else { + crashed_cleanup( + &id, + Error::Runtime(anyhow::anyhow!( + "stop subscribe channel stopped unexpectedly" + )), + ) } }; let runtime_manager = runtime_manager.clone(); @@ -188,7 +198,7 @@ impl Built { runtime_manager: Arc>, deployment_updater: impl DeploymentUpdater, kill_old_deployments: impl futures::Future>, - cleanup: impl FnOnce(SubscribeStopResponse) + Send + 'static, + cleanup: impl FnOnce(Option) + Send + 'static, ) -> Result<()> { // For alpha this is the path to the users project with an embedded runtime. // For shuttle-next this is the path to the compiled .wasm file, which will be @@ -343,7 +353,7 @@ async fn run( mut runtime_client: RuntimeClient>>, address: SocketAddr, deployment_updater: impl DeploymentUpdater, - cleanup: impl FnOnce(SubscribeStopResponse) + Send + 'static, + cleanup: impl FnOnce(Option) + Send + 'static, ) { deployment_updater .set_address(&id, &address) @@ -369,15 +379,15 @@ async fn run( info!(response = ?response.into_inner(), "start client response: "); // Wait for stop reason - let reason = stream.message().await.unwrap().unwrap(); + let reason = stream.message().await.expect("message from tonic stream"); cleanup(reason); } Err(ref status) if status.code() == Code::InvalidArgument => { - cleanup(SubscribeStopResponse { + cleanup(Some(SubscribeStopResponse { reason: StopReason::Crash as i32, message: status.to_string(), - }); + })); } Err(ref status) => { start_crashed_cleanup( @@ -534,12 +544,15 @@ mod tests { let runtime_manager = get_runtime_manager(); let (cleanup_send, cleanup_recv) = oneshot::channel(); - let handle_cleanup = |response: SubscribeStopResponse| match ( - StopReason::from_i32(response.reason).unwrap(), - response.message, - ) { - (StopReason::Request, mes) if mes.is_empty() => cleanup_send.send(()).unwrap(), - _ => panic!("expected stop due to request"), + let handle_cleanup = |response: Option| { + let response = response.unwrap(); + match ( + StopReason::from_i32(response.reason).unwrap(), + response.message, + ) { + (StopReason::Request, mes) if mes.is_empty() => cleanup_send.send(()).unwrap(), + _ => panic!("expected stop due to request"), + } }; built @@ -574,12 +587,15 @@ mod tests { let runtime_manager = get_runtime_manager(); let (cleanup_send, cleanup_recv) = oneshot::channel(); - let handle_cleanup = |response: SubscribeStopResponse| match ( - StopReason::from_i32(response.reason).unwrap(), - response.message, - ) { - (StopReason::End, mes) if mes.is_empty() => cleanup_send.send(()).unwrap(), - _ => panic!("expected stop due to self end"), + let handle_cleanup = |response: Option| { + let response = response.unwrap(); + match ( + StopReason::from_i32(response.reason).unwrap(), + response.message, + ) { + (StopReason::End, mes) if mes.is_empty() => cleanup_send.send(()).unwrap(), + _ => panic!("expected stop due to self end"), + } }; built @@ -611,14 +627,17 @@ mod tests { let runtime_manager = get_runtime_manager(); let (cleanup_send, cleanup_recv) = oneshot::channel(); - let handle_cleanup = |response: SubscribeStopResponse| match ( - StopReason::from_i32(response.reason).unwrap(), - response.message, - ) { - (StopReason::Crash, mes) if mes.contains("panic in bind") => { - cleanup_send.send(()).unwrap() + let handle_cleanup = |response: Option| { + let response = response.unwrap(); + match ( + StopReason::from_i32(response.reason).unwrap(), + response.message, + ) { + (StopReason::Crash, mes) if mes.contains("panic in bind") => { + cleanup_send.send(()).unwrap() + } + (_, mes) => panic!("expected stop due to crash: {mes}"), } - (_, mes) => panic!("expected stop due to crash: {mes}"), }; built diff --git a/deployer/src/runtime_manager.rs b/deployer/src/runtime_manager.rs index 7199f664c..80e769ef7 100644 --- a/deployer/src/runtime_manager.rs +++ b/deployer/src/runtime_manager.rs @@ -154,6 +154,8 @@ impl RuntimeManager { let stop_request = tonic::Request::new(StopRequest {}); let response = runtime_client.stop(stop_request).await.unwrap(); + trace!(?response, "stop deployment response"); + let result = response.into_inner().success; let _ = process.start_kill(); diff --git a/runtime/src/alpha/mod.rs b/runtime/src/alpha/mod.rs index 828ee421e..1c188c894 100644 --- a/runtime/src/alpha/mod.rs +++ b/runtime/src/alpha/mod.rs @@ -42,7 +42,7 @@ use tonic::{ Request, Response, Status, }; use tower::ServiceBuilder; -use tracing::{error, info, trace}; +use tracing::{error, info, trace, warn}; use crate::{provisioner_factory::ProvisionerFactory, Logger}; @@ -378,7 +378,9 @@ where Ok(Response::new(StopResponse { success: true })) } else { - Err(Status::internal("failed to stop deployment")) + warn!("failed to stop deployment"); + + Ok(tonic::Response::new(StopResponse { success: false })) } } diff --git a/runtime/src/next/mod.rs b/runtime/src/next/mod.rs index 7a6a6bbce..bc6a0ac5c 100644 --- a/runtime/src/next/mod.rs +++ b/runtime/src/next/mod.rs @@ -17,14 +17,14 @@ use hyper::{Body, Request, Response}; use shuttle_common::wasm::{Bytesable, Log, RequestWrapper, ResponseWrapper}; use shuttle_proto::runtime::runtime_server::Runtime; use shuttle_proto::runtime::{ - self, LoadRequest, LoadResponse, StartRequest, StartResponse, StopRequest, StopResponse, - SubscribeLogsRequest, SubscribeStopRequest, SubscribeStopResponse, + self, LoadRequest, LoadResponse, StartRequest, StartResponse, StopReason, StopRequest, + StopResponse, SubscribeLogsRequest, SubscribeStopRequest, SubscribeStopResponse, }; use tokio::sync::mpsc::{Receiver, Sender}; -use tokio::sync::{mpsc, oneshot}; +use tokio::sync::{broadcast, mpsc, oneshot}; use tokio_stream::wrappers::ReceiverStream; use tonic::Status; -use tracing::{error, trace}; +use tracing::{error, trace, warn}; use wasi_common::file::FileCaps; use wasmtime::{Engine, Linker, Module, Store}; use wasmtime_wasi::sync::net::UnixStream as WasiUnixStream; @@ -45,6 +45,7 @@ pub struct AxumWasm { logs_rx: Mutex>>>, logs_tx: Sender>, kill_tx: Mutex>>, + stopped_tx: broadcast::Sender<(StopReason, String)>, } impl AxumWasm { @@ -57,11 +58,14 @@ impl AxumWasm { // seems acceptable so going with double the number for some headroom let (tx, rx) = mpsc::channel(1 << 15); + let (stopped_tx, _stopped_rx) = broadcast::channel(10); + Self { router: Mutex::new(None), logs_rx: Mutex::new(Some(rx)), logs_tx: tx, kill_tx: Mutex::new(None), + stopped_tx, } } } @@ -122,7 +126,11 @@ impl Runtime for AxumWasm { .context("tried to start a service that was not loaded") .map_err(|err| Status::internal(err.to_string()))?; - tokio::spawn(run_until_stopped(router, address, logs_tx, kill_rx)); + let stopped_tx = self.stopped_tx.clone(); + + tokio::spawn(run_until_stopped( + router, address, logs_tx, kill_rx, stopped_tx, + )); let message = StartResponse { success: true }; @@ -160,9 +168,9 @@ impl Runtime for AxumWasm { Ok(tonic::Response::new(StopResponse { success: true })) } else { - Err(Status::internal( - "trying to stop a service that was not started", - )) + warn!("trying to stop a service that was not started"); + + Ok(tonic::Response::new(StopResponse { success: false })) } } @@ -172,8 +180,21 @@ impl Runtime for AxumWasm { &self, _request: tonic::Request, ) -> Result, Status> { - // Next does not really have a stopped state. Endpoints are loaded if and when needed until a request is done - let (_tx, rx) = mpsc::channel(1); + let mut stopped_rx = self.stopped_tx.subscribe(); + let (tx, rx) = mpsc::channel(1); + + // Move the stop channel into a stream to be returned + tokio::spawn(async move { + trace!("moved stop channel into thread"); + while let Ok((reason, message)) = stopped_rx.recv().await { + tx.send(Ok(SubscribeStopResponse { + reason: reason as i32, + message, + })) + .await + .unwrap(); + } + }); Ok(tonic::Response::new(ReceiverStream::new(rx))) } @@ -354,6 +375,7 @@ async fn run_until_stopped( address: SocketAddr, logs_tx: Sender>, kill_rx: tokio::sync::oneshot::Receiver, + stopped_tx: broadcast::Sender<(StopReason, String)>, ) { let make_service = make_service_fn(move |_conn| { let router = router.clone(); @@ -383,12 +405,21 @@ async fn run_until_stopped( trace!("starting hyper server on: {}", &address); tokio::select! { _ = server => { + stopped_tx.send((StopReason::End, String::new())).unwrap(); trace!("axum wasm server stopped"); }, message = kill_rx => { match message { - Ok(msg) => trace!("{msg}"), - Err(_) => trace!("the sender dropped") + Ok(msg) =>{ + stopped_tx.send((StopReason::Request, String::new())).unwrap(); + trace!("{msg}") + } , + Err(_) => { + stopped_tx + .send((StopReason::Crash, "the kill sender dropped".to_string())) + .unwrap(); + trace!("the sender dropped") + } } } }; From 72ce9b4a6031b4fb5e21b030fb6673294ff64c73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oddbj=C3=B8rn=20Gr=C3=B8dem?= <29732646+oddgrd@users.noreply.github.com> Date: Mon, 20 Mar 2023 09:39:49 +0000 Subject: [PATCH 74/74] chore: v0.12.0 (#727) * chore: v0.12.0 * chore: bump examples --- Cargo.lock | 24 ++-- Cargo.toml | 10 +- admin/Cargo.toml | 2 +- cargo-shuttle/Cargo.toml | 4 +- cargo-shuttle/README.md | 2 +- codegen/Cargo.toml | 2 +- common/Cargo.toml | 2 +- deployer/Cargo.toml | 2 +- .../tests/deploy_layer/bind-panic/Cargo.toml | 2 +- .../tests/deploy_layer/main-panic/Cargo.toml | 2 +- .../tests/deploy_layer/self-stop/Cargo.toml | 2 +- .../tests/deploy_layer/sleep-async/Cargo.toml | 2 +- examples | 2 +- gateway/Cargo.toml | 2 +- resources/aws-rds/Cargo.toml | 4 +- resources/persist/Cargo.toml | 6 +- resources/secrets/Cargo.toml | 4 +- resources/shared-db/Cargo.toml | 4 +- resources/static-folder/Cargo.toml | 4 +- runtime/Cargo.toml | 2 +- runtime/README.md | 111 ++---------------- runtime/developing.md | 105 +++++++++++++++++ service/Cargo.toml | 2 +- services/shuttle-actix-web/Cargo.toml | 4 +- services/shuttle-axum/Cargo.toml | 4 +- services/shuttle-next/Cargo.toml | 6 +- services/shuttle-poem/Cargo.toml | 4 +- services/shuttle-poise/Cargo.toml | 4 +- services/shuttle-rocket/Cargo.toml | 4 +- services/shuttle-salvo/Cargo.toml | 4 +- services/shuttle-serenity/Cargo.toml | 4 +- services/shuttle-thruster/Cargo.toml | 4 +- services/shuttle-tide/Cargo.toml | 4 +- services/shuttle-tower/Cargo.toml | 4 +- services/shuttle-warp/Cargo.toml | 4 +- 35 files changed, 184 insertions(+), 168 deletions(-) create mode 100644 runtime/developing.md diff --git a/Cargo.lock b/Cargo.lock index eca8b29e4..25fc411c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -971,7 +971,7 @@ dependencies = [ [[package]] name = "cargo-shuttle" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "anyhow", "assert_cmd", @@ -4538,7 +4538,7 @@ dependencies = [ [[package]] name = "shuttle-admin" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "anyhow", "clap 4.0.27", @@ -4555,7 +4555,7 @@ dependencies = [ [[package]] name = "shuttle-auth" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -4584,7 +4584,7 @@ dependencies = [ [[package]] name = "shuttle-codegen" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "pretty_assertions", "proc-macro-error", @@ -4596,7 +4596,7 @@ dependencies = [ [[package]] name = "shuttle-common" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -4641,7 +4641,7 @@ dependencies = [ [[package]] name = "shuttle-deployer" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -4689,7 +4689,7 @@ dependencies = [ [[package]] name = "shuttle-gateway" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "acme2", "anyhow", @@ -4740,7 +4740,7 @@ dependencies = [ [[package]] name = "shuttle-proto" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "anyhow", "chrono", @@ -4757,7 +4757,7 @@ dependencies = [ [[package]] name = "shuttle-provisioner" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "aws-config", "aws-sdk-rds", @@ -4783,7 +4783,7 @@ dependencies = [ [[package]] name = "shuttle-runtime" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -4815,7 +4815,7 @@ dependencies = [ [[package]] name = "shuttle-secrets" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "async-trait", "shuttle-service", @@ -4823,7 +4823,7 @@ dependencies = [ [[package]] name = "shuttle-service" -version = "0.12.0-rc1" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index e62e59242..b6d8b90bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,17 +25,17 @@ exclude = [ ] [workspace.package] -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" repository = "https://github.com/shuttle-hq/shuttle" # https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacedependencies-table [workspace.dependencies] -shuttle-codegen = { path = "codegen", version = "0.12.0-rc1" } -shuttle-common = { path = "common", version = "0.12.0-rc1" } -shuttle-proto = { path = "proto", version = "0.12.0-rc1" } -shuttle-service = { path = "service", version = "0.12.0-rc1" } +shuttle-codegen = { path = "codegen", version = "0.12.0" } +shuttle-common = { path = "common", version = "0.12.0" } +shuttle-proto = { path = "proto", version = "0.12.0" } +shuttle-service = { path = "service", version = "0.12.0" } anyhow = "1.0.66" async-trait = "0.1.58" diff --git a/admin/Cargo.toml b/admin/Cargo.toml index 8177eba5a..76e1996d0 100644 --- a/admin/Cargo.toml +++ b/admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-admin" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" [dependencies] diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index c71e9f842..75224a0cc 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-shuttle" -version = "0.12.0-rc1" +version = "0.12.0" edition.workspace = true license.workspace = true repository.workspace = true @@ -64,7 +64,7 @@ features = ["models"] workspace = true [dependencies.shuttle-secrets] -version = "0.12.0-rc1" +version = "0.12.0" path = "../resources/secrets" [dependencies.shuttle-service] diff --git a/cargo-shuttle/README.md b/cargo-shuttle/README.md index d81ae7a43..aee7b13b8 100644 --- a/cargo-shuttle/README.md +++ b/cargo-shuttle/README.md @@ -105,7 +105,7 @@ cargo shuttle init --rocket my-rocket-app This should generate the following dependency in `Cargo.toml`: ```toml -shuttle-service = { version = "0.12.0-rc1", features = ["web-rocket"] } +shuttle-service = { version = "0.12.0", features = ["web-rocket"] } ``` The following boilerplate code should be generated into `src/lib.rs`: diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index 1a270570b..9db8929d3 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-codegen" -version = "0.12.0-rc1" +version = "0.12.0" edition.workspace = true license.workspace = true repository.workspace = true diff --git a/common/Cargo.toml b/common/Cargo.toml index ec5b0af67..6ed9b21c4 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-common" -version = "0.12.0-rc1" +version = "0.12.0" edition.workspace = true license.workspace = true repository.workspace = true diff --git a/deployer/Cargo.toml b/deployer/Cargo.toml index f1cde9eb1..daa0eb193 100644 --- a/deployer/Cargo.toml +++ b/deployer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-deployer" -version = "0.12.0-rc1" +version = "0.12.0" edition.workspace = true license.workspace = true description = "Service with instances created per project for handling the compilation, loading, and execution of Shuttle services" diff --git a/deployer/tests/deploy_layer/bind-panic/Cargo.toml b/deployer/tests/deploy_layer/bind-panic/Cargo.toml index be2f6ab65..2db7c6427 100644 --- a/deployer/tests/deploy_layer/bind-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/bind-panic/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = "0.12.0-rc1" +shuttle-runtime = "0.12.0" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/main-panic/Cargo.toml b/deployer/tests/deploy_layer/main-panic/Cargo.toml index 098c09b10..a5274cbb5 100644 --- a/deployer/tests/deploy_layer/main-panic/Cargo.toml +++ b/deployer/tests/deploy_layer/main-panic/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = "0.12.0-rc1" +shuttle-runtime = "0.12.0" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/self-stop/Cargo.toml b/deployer/tests/deploy_layer/self-stop/Cargo.toml index 4ae9c37fe..8d97cf0b0 100644 --- a/deployer/tests/deploy_layer/self-stop/Cargo.toml +++ b/deployer/tests/deploy_layer/self-stop/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = "0.12.0-rc1" +shuttle-runtime = "0.12.0" tokio = "1.22" diff --git a/deployer/tests/deploy_layer/sleep-async/Cargo.toml b/deployer/tests/deploy_layer/sleep-async/Cargo.toml index e9cbb4ae9..f88136e11 100644 --- a/deployer/tests/deploy_layer/sleep-async/Cargo.toml +++ b/deployer/tests/deploy_layer/sleep-async/Cargo.toml @@ -8,5 +8,5 @@ edition = "2021" [workspace] [dependencies] -shuttle-runtime = "0.12.0-rc1" +shuttle-runtime = "0.12.0" tokio = { version = "1.0", features = ["time"]} diff --git a/examples b/examples index d4443c89e..1f6cbf93c 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit d4443c89efeac4a355c4e1d6dbd8973407d0515e +Subproject commit 1f6cbf93ca99676a54e937cb9e2ff88b7e7f9d4e diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 1819b87b5..a6a1ec7e9 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-gateway" -version = "0.12.0-rc1" +version = "0.12.0" edition.workspace = true license.workspace = true publish = false diff --git a/resources/aws-rds/Cargo.toml b/resources/aws-rds/Cargo.toml index c1d92ec52..0a5ab226d 100644 --- a/resources/aws-rds/Cargo.toml +++ b/resources/aws-rds/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-aws-rds" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Plugin to provision AWS RDS resources" @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "rds"] [dependencies] async-trait = "0.1.56" paste = "1.0.7" -shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"] } [features] diff --git a/resources/persist/Cargo.toml b/resources/persist/Cargo.toml index 590e0235a..158e3f1f8 100644 --- a/resources/persist/Cargo.toml +++ b/resources/persist/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-persist" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Plugin for persist objects" @@ -11,6 +11,6 @@ keywords = ["shuttle-service", "persistence"] async-trait = "0.1.56" bincode = "1.2.1" serde = { version = "1.0.0", features = ["derive"] } -shuttle-common = { path = "../../common", version = "0.12.0-rc1", default-features = false } -shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } +shuttle-common = { path = "../../common", version = "0.12.0", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0", default-features = false } thiserror = "1.0.32" diff --git a/resources/secrets/Cargo.toml b/resources/secrets/Cargo.toml index 582867062..f12f74ccc 100644 --- a/resources/secrets/Cargo.toml +++ b/resources/secrets/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-secrets" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Plugin to for managing secrets on shuttle" @@ -9,4 +9,4 @@ keywords = ["shuttle-service", "secrets"] [dependencies] async-trait = "0.1.56" -shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0", default-features = false } diff --git a/resources/shared-db/Cargo.toml b/resources/shared-db/Cargo.toml index 9e8ce42a5..c7e3388f4 100644 --- a/resources/shared-db/Cargo.toml +++ b/resources/shared-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-shared-db" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Plugin for managing shared databases on shuttle" @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "database"] [dependencies] async-trait = "0.1.56" mongodb = { version = "2.3.0", optional = true } -shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0", default-features = false } sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls"], optional = true } [features] diff --git a/resources/static-folder/Cargo.toml b/resources/static-folder/Cargo.toml index de8002f6c..fd5ff3b23 100644 --- a/resources/static-folder/Cargo.toml +++ b/resources/static-folder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-static-folder" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Plugin to get a static folder at runtime on shuttle" @@ -10,7 +10,7 @@ keywords = ["shuttle-service", "static-folder"] [dependencies] async-trait = "0.1.56" fs_extra = "1.3.0" -shuttle-service = { path = "../../service", version = "0.12.0-rc1", default-features = false } +shuttle-service = { path = "../../service", version = "0.12.0", default-features = false } tracing = "0.1.37" [dev-dependencies] diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 58840a9dd..9faaaeec0 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-runtime" -version = "0.12.0-rc1" +version = "0.12.0" edition.workspace = true license.workspace = true description = "Runtime to start and manage any service that runs on shuttle" diff --git a/runtime/README.md b/runtime/README.md index 1939551ca..919f96089 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -1,105 +1,16 @@ -# How to run +# shuttle-runtime -## The easy way -Both the alpha and next examples can be run using the local client: +[Shuttle](https://www.shuttle.rs/) is a Rust-native cloud development platform that lets you deploy your Rust apps for free. -``` bash -cd path/to/example -cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- run -``` +Shuttle is built for productivity, reliability and performance: -When a more fine controlled testing is needed, use the instructions below. +- Zero-Configuration support for Rust using annotations +- Automatic resource provisioning (databases, caches, subdomains, etc.) via [Infrastructure-From-Code](https://www.shuttle.rs/blog/2022/05/09/ifc) +- First-class support for popular Rust frameworks ([Actix](https://docs.shuttle.rs/examples/actix), [Rocket](https://docs.shuttle.rs/examples/rocket), [Axum](https://docs.shuttle.rs/examples/axum), + [Tide](https://docs.shuttle.rs/examples/tide), [Poem](https://docs.shuttle.rs/examples/poem) and [Tower](https://docs.shuttle.rs/examples/tower)) +- Support for deploying Discord bots using [Serenity](https://docs.shuttle.rs/examples/serenity) +- Scalable hosting (with optional self-hosting) -## axum-wasm +📖 Check out our documentation to get started quickly: [docs.shuttle.rs](https://docs.shuttle.rs) -Compile the wasm axum router: - -```bash -make axum -``` - -Run the test: - -```bash -cargo test --features next axum -- --nocapture - -# or, run tests -make test -``` - -Load and run: - -```bash -cargo run --features next --bin next -- --port 6001 -``` - -In another terminal: - -``` bash -# load -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//runtime/axum.wasm"}' localhost:6001 runtime.Runtime/Load - -# start -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start - -# subscribe to logs -grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs - -# stop -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{}' localhost:6001 runtime.Runtime/Stop -``` - -Curl the service: -```bash -curl localhost:8000/hello - -curl localhost:8000/goodbye -``` - -## shuttle-alpha - -This will no longer load a `.so` file, the code to start the runtime will be -codegened for all services. - -An example can be found in `src/bin/rocket.rs` which contains the secrets rocket example at the bottom and the codegen at the top. - -To test, first start a provisioner from the root directory using: - -```bash -docker-compose -f docker-compose.rendered.yml up provisioner -``` - -Then in another shell, start the wrapped runtime using the clap CLI: - -```bash -cargo run --bin rocket -- --port 6001 --storage-manager-type working-dir --storage-manager-path ./ -``` - -Or directly (this is the path hardcoded in `deployer::start`): -```bash -# first, make sure the shuttle-runtime binary is built -cargo build -# then -/home//target/debug/shuttle-runtime --port 6001 --storage-manager-type working-dir --storage-manager-path ./ -``` - -Then in another shell, load the service and start it up: - -``` bash -# load the service -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//examples/rocket/hello-world/target/debug/libhello_world.so", "secrets": {"MY_API_KEY": "test"}}' localhost:6001 runtime.Runtime/Load - -# start the service -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start - -# subscribe to logs -grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs - -# stop the service -grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{}' localhost:6001 runtime.Runtime/Stop -``` - -## Running the tests -```bash -$ cd ..; make test -``` +🙋‍♂️ If you have any questions, join our [Discord](https://discord.gg/shuttle) server. diff --git a/runtime/developing.md b/runtime/developing.md new file mode 100644 index 000000000..1939551ca --- /dev/null +++ b/runtime/developing.md @@ -0,0 +1,105 @@ +# How to run + +## The easy way +Both the alpha and next examples can be run using the local client: + +``` bash +cd path/to/example +cargo run --manifest-path ../../../Cargo.toml --bin cargo-shuttle -- run +``` + +When a more fine controlled testing is needed, use the instructions below. + +## axum-wasm + +Compile the wasm axum router: + +```bash +make axum +``` + +Run the test: + +```bash +cargo test --features next axum -- --nocapture + +# or, run tests +make test +``` + +Load and run: + +```bash +cargo run --features next --bin next -- --port 6001 +``` + +In another terminal: + +``` bash +# load +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//runtime/axum.wasm"}' localhost:6001 runtime.Runtime/Load + +# start +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start + +# subscribe to logs +grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs + +# stop +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{}' localhost:6001 runtime.Runtime/Stop +``` + +Curl the service: +```bash +curl localhost:8000/hello + +curl localhost:8000/goodbye +``` + +## shuttle-alpha + +This will no longer load a `.so` file, the code to start the runtime will be +codegened for all services. + +An example can be found in `src/bin/rocket.rs` which contains the secrets rocket example at the bottom and the codegen at the top. + +To test, first start a provisioner from the root directory using: + +```bash +docker-compose -f docker-compose.rendered.yml up provisioner +``` + +Then in another shell, start the wrapped runtime using the clap CLI: + +```bash +cargo run --bin rocket -- --port 6001 --storage-manager-type working-dir --storage-manager-path ./ +``` + +Or directly (this is the path hardcoded in `deployer::start`): +```bash +# first, make sure the shuttle-runtime binary is built +cargo build +# then +/home//target/debug/shuttle-runtime --port 6001 --storage-manager-type working-dir --storage-manager-path ./ +``` + +Then in another shell, load the service and start it up: + +``` bash +# load the service +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"service_name": "Tonic", "path": "/home//examples/rocket/hello-world/target/debug/libhello_world.so", "secrets": {"MY_API_KEY": "test"}}' localhost:6001 runtime.Runtime/Load + +# start the service +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{"deployment_id": "MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw", "ip": "127.0.0.1:8000"}' localhost:6001 runtime.Runtime/Start + +# subscribe to logs +grpcurl -plaintext -import-path ../proto -proto runtime.proto localhost:6001 runtime.Runtime/SubscribeLogs + +# stop the service +grpcurl -plaintext -import-path ../proto -proto runtime.proto -d '{}' localhost:6001 runtime.Runtime/Stop +``` + +## Running the tests +```bash +$ cd ..; make test +``` diff --git a/service/Cargo.toml b/service/Cargo.toml index 69f30b7ff..604d5775b 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-service" -version = "0.12.0-rc1" +version = "0.12.0" edition.workspace = true license.workspace = true repository.workspace = true diff --git a/services/shuttle-actix-web/Cargo.toml b/services/shuttle-actix-web/Cargo.toml index 6b0d262a6..2cfae9bf7 100644 --- a/services/shuttle-actix-web/Cargo.toml +++ b/services/shuttle-actix-web/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-actix-web" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run an actix webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "actix"] [dependencies] actix-web = { version = "4.3.1" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } num_cpus = "1.15.0" [dev-dependencies] diff --git a/services/shuttle-axum/Cargo.toml b/services/shuttle-axum/Cargo.toml index 0de287235..652d7fdc4 100644 --- a/services/shuttle-axum/Cargo.toml +++ b/services/shuttle-axum/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-axum" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run an axum webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "axum"] [dependencies] axum = { version = "0.6.10" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-next/Cargo.toml b/services/shuttle-next/Cargo.toml index 0f3be18d9..3f42e57a1 100644 --- a/services/shuttle-next/Cargo.toml +++ b/services/shuttle-next/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-next" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Macros and aliases to deploy wasm on the shuttle platform (https://www.shuttle.rs/)" @@ -18,6 +18,6 @@ futures-executor = "0.3.21" http = "0.2.7" rmp-serde = "1.1.1" tower-service = "0.3.1" -shuttle-common = { path = "../../common", version = "0.12.0-rc1", features = ["wasm"] } -shuttle-codegen = { path = "../../codegen", version = "0.12.0-rc1", features = ["next"] } +shuttle-common = { path = "../../common", version = "0.12.0", features = ["wasm"] } +shuttle-codegen = { path = "../../codegen", version = "0.12.0", features = ["next"] } tracing-subscriber = { version = "0.3.16", default-features = false, features = ["registry", "std"] } diff --git a/services/shuttle-poem/Cargo.toml b/services/shuttle-poem/Cargo.toml index fccef51da..c534cb076 100644 --- a/services/shuttle-poem/Cargo.toml +++ b/services/shuttle-poem/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-poem" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a poem webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "poem"] [dependencies] poem = { version = "1.3.55" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-poise/Cargo.toml b/services/shuttle-poise/Cargo.toml index 4da1a48ac..3aaf9a900 100644 --- a/services/shuttle-poise/Cargo.toml +++ b/services/shuttle-poise/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-poise" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a poise discord bot on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "poise", "discord-bot", "serenity"] [dependencies] poise = { version = "0.5.2" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } [dev-dependencies] shuttle-secrets = { path = "../../resources/secrets" } diff --git a/services/shuttle-rocket/Cargo.toml b/services/shuttle-rocket/Cargo.toml index 821d3223d..1b4149476 100644 --- a/services/shuttle-rocket/Cargo.toml +++ b/services/shuttle-rocket/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-rocket" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a rocket webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "rocket"] [dependencies] rocket = { version = "0.5.0-rc.2" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-salvo/Cargo.toml b/services/shuttle-salvo/Cargo.toml index d71780480..24e35a4a6 100644 --- a/services/shuttle-salvo/Cargo.toml +++ b/services/shuttle-salvo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-salvo" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a salvo webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "salvo"] [dependencies] salvo = { version = "0.37.5" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } diff --git a/services/shuttle-serenity/Cargo.toml b/services/shuttle-serenity/Cargo.toml index 5c504cbe8..1e224a3f5 100644 --- a/services/shuttle-serenity/Cargo.toml +++ b/services/shuttle-serenity/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-serenity" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a serenity server on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "serenity"] [dependencies] serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } [dev-dependencies] anyhow = "1.0.69" diff --git a/services/shuttle-thruster/Cargo.toml b/services/shuttle-thruster/Cargo.toml index a77df0029..14b82adfd 100644 --- a/services/shuttle-thruster/Cargo.toml +++ b/services/shuttle-thruster/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-thruster" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a thruster webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "thruster"] [dependencies] thruster = { version = "1.3.0" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } [dev-dependencies] thruster = { version = "1.3.0", features = ["hyper_server"] } diff --git a/services/shuttle-tide/Cargo.toml b/services/shuttle-tide/Cargo.toml index e1a78e2dd..b58993dbb 100644 --- a/services/shuttle-tide/Cargo.toml +++ b/services/shuttle-tide/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-tide" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a tide webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "tide"] [dependencies] tide = { version = "0.16.0" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } # Tide does not have tokio support. So make sure async-std is compatible with tokio # https://github.com/http-rs/tide/issues/791 diff --git a/services/shuttle-tower/Cargo.toml b/services/shuttle-tower/Cargo.toml index fc676c468..80ed9792d 100644 --- a/services/shuttle-tower/Cargo.toml +++ b/services/shuttle-tower/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-tower" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a tower webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "tower"] [dependencies] hyper = { version = "0.14.23", features = ["server", "tcp", "http1"] } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } tower = { version = "0.4.13", features = ["make"] } [dev-dependencies] diff --git a/services/shuttle-warp/Cargo.toml b/services/shuttle-warp/Cargo.toml index 004110884..c7e84f5c7 100644 --- a/services/shuttle-warp/Cargo.toml +++ b/services/shuttle-warp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shuttle-warp" -version = "0.12.0-rc1" +version = "0.12.0" edition = "2021" license = "Apache-2.0" description = "Service implementation to run a warp webserver on shuttle" @@ -11,7 +11,7 @@ keywords = ["shuttle-service", "warp"] [dependencies] warp = { version = "0.3.3" } -shuttle-runtime = { path = "../../runtime", version = "0.12.0-rc1" } +shuttle-runtime = { path = "../../runtime", version = "0.12.0" } [dev-dependencies] tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] }

    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 Re_EiYjyoSKK5{YPe*nq#*J}U( diff --git a/www/public/images/blog/shuttle-logo-square.png b/www/public/images/blog/shuttle-logo-square.png deleted file mode 100644 index c73c2ec0ee6394b06730e7ec4f840736ac371503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183588 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

    x87QWMHXVHi*-h_)b-kovVNdSsr* zzHJ-2vMMgUtOT31K2+}jQs$OwX$XV4WZ~bxM_M@Hoa3?3sao_Cij*Jpr0(Mp zW`=(l)yl2c?ql&2N-6$eVdT!}2kP69zhH34e7E7wsiqFf)WiTe5&E(Ad>Kx5p1QNx zdvxbCts~7dV_py`rPHUtqb9~g`GN%WpOBh9<3)SwH#c{}62i>ttW@qT z^e4~Lz5s9rE2(Eh-{raqba%b0&xs_+DQ6rKHA@U5B1L$860C!ZoK3*&&Ai#i-!q`y zo&PbD7{5r=sZ$ZRi|C@0b4U4WJq_^W8|#92hD8as!liME%k`z6O^kv~Av$BAylucy zpVyz|-+?cC&|C-z#F1gurF{J`W|%Ji zpm%MaI3Ua%`n^jMH8v|^XIAx&ilkPlEc9p6{jlSqbZ=W@INDAA(bntSzs#*pUH~r4 zkDsnWG6CVyb{nE|nRF6;KBE*NgRe5vD({}J$V{Hjb>;0EG-A};P*%zzGIzl;xcAdD zkT&9ghWNM)ZrTpe2dipQ$d`5VmdXF98)`W_8#}r6gl#1iHKKK1+%+nEBV4ep2iEwO zue_|$=6R7^D`daqAhYQ-*WKzhV8Osem`Cyj57@%7zqYkU5*lA)0|tYkZ~dz0WZNkI zIcr>A@lfa2c<@iY=k_yPFc5>$Uk80KZPx-#=+l~%Wg9I@2;o?Ew?+~wFvB?;GcK~P ziOP3lmqLQRv(beCh>LsrRhEUEftC!n7^j#_GVtyK2j{Olvl0?W2yD@>0Z6pLo*uRl zGtv4A5dOwhnu8#l6Ba-(_rLL&k1(_C78w>D_)BVeN?E&xny$S6A;O!G^tfQ<$MZ)R zD`mC7*NVa zo6~AXQq}V)>S`l&OsH__SBban$A31ed)e{39H%c=ApBB?d?wuQQ>fNvXxDnx#w-iX zHaz#%lsi&kY|0F~4vhQ~pkB!7UUMFs1r|)FZW7I@0-lG>UC70 z2F!2JKFlK*Qq5Ak|8Co6;;$M~h%ZXsog4F1h(N+T zyqUC4J=fGHSjxGl*6*$aP3#083QzoP2}DbxC?ZzAnel@g{mq9+4#vI^C%Cd%3~%*7 zj4VHNpGuC;f`O40)>6{oZtpIW1IU-Pb(h_-NfDNBPd~LS&3<+J6K|pm7M924Hg1Ng zPyFa6aXxG?bj;x}dP|?*%8VJzt`csbR)k_^)SU$Hie*BwxA8Md_Au&hGi(M*UJfh3CWeq2X+0T*xY;=w8R$BFR5+YG%3LyT69)8@=v|#dV^BPn_Q%RBds-Aq;pP zFv*ELPA4u3`McbM@c(1EDX|vrR-9TM$N5nMEb;M|y7TTH5agwJ@oW_jew*h6KQWTk zWvu6--ZO}Zi}wuzrMe1xZb$bRA2Tmy≀170OgmUAKHGVA%TkngMx`rTY={YrrF! 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%0DK%*Q4+WOCE6Ij38+9z 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
    hUf}Cw?tc zOl z(R*67oCn@^*qUN}`7)J*b8*$*{JcXe@N1sW*WQOs9(Fvb;4 zE*Ld=)JvO1k!6`FsAtEkX&1m1Ys(9}YXzNjF%u?_A0bhkx<53m{oG#RyunCi_0x{T zn{*1wsWrgk-lQH3_C7S&Ux{%Cht=okOL-biVT3zw3gc zP6{QG5D3$7|HN8-!iH00-H4SvN@3saw>BPr;aoIf&x{;opkeqm%Vcs--rn=pZRuDx z$_w^3<5)P^;u0wf;KN6~Gfy}V!xl#u_%3G#=z9$Dl-W*%f4;?)s;dc~um3|NZg1Yw zc%fRndbK%Cu_XjG`YV$z{{-nhKE z`H{z2zWSq=-z9m!$_DA&Fhiulkq9( z6`noNa*HI~5mRb~9>5bdThz8g_kA*` zQjQl?!LzoWqmu_UPd@xY9;w*RD9DW_MlvQUB_6f{HXRlU=w(e&-Y$5Ty?N#S?Vn0A zbFGk;XgkKLa*P`N{Vjq~uS|;oPS;8iENh%fK?aptsknD!bR-3;D;c@rEwSV<4SW$P znesd|vfI${j@3&zti51)%(qmnl(W6z*UKd1ool5l%i#m&-}Z9xl2BySI20N{)_=bi zXBQyY=&+R8i8X~TPwd;4W8jF1U~t>~fc0P6a$X(D@NqPn6i58tj3{dG{xN3SqaHw` zI=Awg;9k1hvb|nz2RX_F>!hFXkkXHMhetXwW@k}5lN2RM-L=y##pml6j|l!c%=av$ zptB(@Yp*smWsjh>y)Q8~PjS{w2<#DL*c51WAr2&D`a7U+wq%&;hCvNSGt(l3mU|?u z&eXk=GZNcybIHN2y=%YZU&dpphC<@IikUK#AVh-y@R&FF4$XB-W3@<+hhp@rNnnEg0P zT$$whEo>vgy?(f$PN5B%V=@%7(bS(NYou>u@878zw17yT(Ad++ zsFEfpRc`%TAQq1$sP9+M?e}=3V`d@!rP2dsTWr{LDoSCT6K<85~tOB;%P^@Fjh4 zNAPMIHq?mNg}oDqO+(kiGMW(b=OeIybZ^DwPx3;Ym52C(?)b~a@k%(~;HJT*&`;08 z(;YiyXE0Yl&ZnUgesooZSiTO9#F7tKsgxu0&a53vl10`-US(|P1q&Ju6y}3bTaK5) zdW-_x$;_{0tWsd1v&?&0 zcE)h|wLMDolOEzPN5G-D1vOCtH$oi4=iaq0E3hkh?|JHCTWD+9drn-MzS>^F$b018 zJ|=2N+THNi56TCkRqbiQ)ZCZ^V4S!m?5r8_8EliD{oju2dC-WDiN3duPmn$VOoD%a zt5OoN$9uM;=Sugw-W^*AQZNiRjxDm¨Yd#;Ahr3I8^?bQB9Iz^zgc!9N)I`_u(8 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≧ZYc#xMg@;5 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 QCqSi(r>mdKI;Vst0Jcm}3jhEB diff --git a/www/public/images/blog/discord-bot-screenshots/application_id.png b/www/public/images/blog/discord-bot-screenshots/application_id.png deleted file mode 100644 index 10417f91953870832c73fa331df01db51b338b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226135 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

  • $ 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 z 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