diff --git a/tembo-cli/Cargo.lock b/tembo-cli/Cargo.lock index 8cb7f982b..693581a18 100644 --- a/tembo-cli/Cargo.lock +++ b/tembo-cli/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -194,7 +194,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -347,7 +347,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -365,7 +365,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" dependencies = [ - "nix", + "nix 0.27.1", "rand", ] @@ -381,9 +381,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ + "futures-core", "getrandom", "instant", + "pin-project-lite", "rand", + "tokio", ] [[package]] @@ -508,6 +511,37 @@ dependencies = [ "bytes", ] +[[package]] +name = "camino" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + [[package]] name = "cc" version = "1.0.83" @@ -616,7 +650,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -667,6 +701,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "clipboard-win" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + [[package]] name = "colorchoice" version = "1.0.0" @@ -699,6 +744,19 @@ dependencies = [ "memchr", ] +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode 0.3.6", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -853,7 +911,7 @@ dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", + "memoffset 0.9.0", "scopeguard", ] @@ -1007,7 +1065,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -1029,7 +1087,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -1206,6 +1264,12 @@ dependencies = [ "serde", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -1221,6 +1285,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + [[package]] name = "enum-as-inner" version = "0.5.1" @@ -1260,6 +1330,16 @@ dependencies = [ "libc", ] +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] + [[package]] name = "etcetera" version = "0.8.0" @@ -1292,6 +1372,29 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "fd-lock" +version = "3.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" +dependencies = [ + "cfg-if", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", +] + [[package]] name = "finl_unicode" version = "1.2.0" @@ -1431,7 +1534,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -2309,6 +2412,15 @@ version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + [[package]] name = "memoffset" version = "0.9.0" @@ -2412,6 +2524,28 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + [[package]] name = "nix" version = "0.27.1" @@ -2574,7 +2708,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -2782,7 +2916,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -2851,7 +2985,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -2948,7 +3082,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" dependencies = [ "csv", - "encode_unicode", + "encode_unicode 1.0.0", "is-terminal", "lazy_static", "term", @@ -2987,9 +3121,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] @@ -3009,6 +3143,15 @@ dependencies = [ "thiserror", ] +[[package]] +name = "promptly" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9acbc6c5a5b029fe58342f58445acb00ccfe24624e538894bc2f04ce112980ba" +dependencies = [ + "rustyline", +] + [[package]] name = "protobuf" version = "2.28.0" @@ -3039,13 +3182,23 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + [[package]] name = "rand" version = "0.8.5" @@ -3095,7 +3248,7 @@ checksum = "8b86292cf41ccfc96c5de7165c1c53d5b4ac540c5bab9d1857acbe9eba5f1a0b" dependencies = [ "proc-macro-hack", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -3329,7 +3482,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.37", + "syn 2.0.65", "unicode-ident", ] @@ -3377,6 +3530,30 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[package]] +name = "rustyline" +version = "9.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "clipboard-win", + "dirs-next", + "fd-lock", + "libc", + "log", + "memchr", + "nix 0.23.2", + "radix_trie", + "scopeguard", + "smallvec", + "unicode-segmentation", + "unicode-width", + "utf8parse", + "winapi", +] + [[package]] name = "ryu" version = "1.0.15" @@ -3470,12 +3647,15 @@ name = "semver" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" +dependencies = [ + "serde", +] [[package]] name = "serde" -version = "1.0.188" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] @@ -3492,13 +3672,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -3570,7 +3750,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -3792,6 +3972,32 @@ dependencies = [ "sqlx-sqlite", ] +[[package]] +name = "sqlx-cli" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b941ddc37071bb01d001ec479885a493021f1ca39142d754a05a780a77fff99" +dependencies = [ + "anyhow", + "async-trait", + "backoff", + "cargo_metadata", + "chrono", + "clap", + "clap_complete", + "console", + "dotenvy", + "filetime", + "futures", + "glob", + "promptly", + "serde", + "serde_json", + "sqlx", + "tokio", + "url", +] + [[package]] name = "sqlx-core" version = "0.7.3" @@ -3981,6 +4187,12 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + [[package]] name = "stringprep" version = "0.1.4" @@ -4017,7 +4229,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -4039,9 +4251,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -4095,6 +4307,7 @@ dependencies = [ "simplelog", "spinoff", "sqlx", + "sqlx-cli", "tembo-stacks", "temboclient", "tembodataclient", @@ -4257,7 +4470,7 @@ checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -4361,7 +4574,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -4543,7 +4756,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -4895,7 +5108,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] @@ -4981,7 +5194,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", "wasm-bindgen-shared", ] @@ -5015,7 +5228,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5339,7 +5552,7 @@ checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.65", ] [[package]] diff --git a/tembo-cli/Cargo.toml b/tembo-cli/Cargo.toml index a1ae6464c..baf58ac2c 100644 --- a/tembo-cli/Cargo.toml +++ b/tembo-cli/Cargo.toml @@ -82,6 +82,7 @@ test-case = "=2.0.0-rc2" clap-markdown = { git = "https://github.com/tembo-io/clap-markdown.git", branch = "main", version = "0.1.3" } url = "2.5.0" rand = "0.8.5" +sqlx-cli = "0.7.3" [target.aarch64-unknown-linux-musl.dependencies] openssl = { version = "0.10", features = ["vendored"] } diff --git a/tembo-cli/examples/migrations-1/.gitignore b/tembo-cli/examples/migrations-1/.gitignore new file mode 100644 index 000000000..6863dad9a --- /dev/null +++ b/tembo-cli/examples/migrations-1/.gitignore @@ -0,0 +1,2 @@ +docker-compose.yml +migration-test/* \ No newline at end of file diff --git a/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052301_create_users_table.sql b/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052301_create_users_table.sql new file mode 100644 index 000000000..2741ac59d --- /dev/null +++ b/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052301_create_users_table.sql @@ -0,0 +1,5 @@ +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + name TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); \ No newline at end of file diff --git a/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052302_add_email_to_users.sql b/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052302_add_email_to_users.sql new file mode 100644 index 000000000..d98a24b6d --- /dev/null +++ b/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052302_add_email_to_users.sql @@ -0,0 +1,2 @@ +ALTER TABLE users +ADD COLUMN email TEXT; \ No newline at end of file diff --git a/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052303_insert_sample_data.sql b/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052303_insert_sample_data.sql new file mode 100644 index 000000000..8b5f7b444 --- /dev/null +++ b/tembo-cli/examples/migrations-1/tembo-migrations/migration-test/2024052303_insert_sample_data.sql @@ -0,0 +1,4 @@ +INSERT INTO users (name, email) +VALUES ('Alice', 'alice@example.com'), + ('Bob', 'bob@example.com'), + ('Charlie', 'charlie@example.com'); \ No newline at end of file diff --git a/tembo-cli/examples/migrations-1/tembo.toml b/tembo-cli/examples/migrations-1/tembo.toml new file mode 100644 index 000000000..21f6e7b07 --- /dev/null +++ b/tembo-cli/examples/migrations-1/tembo.toml @@ -0,0 +1,4 @@ +[migration-test] +environment = "dev" +instance_name = "migration-test" +stack_type = "Standard" diff --git a/tembo-cli/src/cmd/apply.rs b/tembo-cli/src/cmd/apply.rs index 0c9ca99e7..913de0d14 100644 --- a/tembo-cli/src/cmd/apply.rs +++ b/tembo-cli/src/cmd/apply.rs @@ -13,6 +13,7 @@ use itertools::Itertools; use log::info; use spinoff::spinners; use spinoff::Spinner; +use sqlx::{migrate::Migrator, PgPool}; use std::fmt::Write; use std::path::PathBuf; use std::{ @@ -155,7 +156,7 @@ fn tembo_cloud_apply( if instance_setting.stack_file.is_some() { error("Stack File is only available for local testing."); } - let result = tembo_cloud_apply_instance(&env, instance_setting); + let result = tembo_cloud_apply_instance(&env, instance_setting, _key.to_string()); match result { Ok(i) => i, @@ -181,10 +182,7 @@ fn docker_apply( for (_key, instance_setting) in instance_settings.iter_mut() { let final_instance_setting = docker_apply_instance(verbose, instance_setting.to_owned())?; - final_instance_settings.insert( - final_instance_setting.instance_name.clone(), - final_instance_setting, - ); + final_instance_settings.insert(_key.to_string(), final_instance_setting); } let rendered_dockercompose: String = @@ -226,14 +224,29 @@ fn docker_apply( .bold() )); - // If all of the above was successful, we can print the url to user - instance_started( - &format!( - "postgres://postgres:postgres@{}.local.tembo.io:{}", - instance_setting.instance_name, port - ), - "local", + let database_url = &format!( + "postgres://postgres:postgres@{}.local.tembo.io:{}", + instance_setting.instance_name, port ); + + let migrations_dir = PathBuf::from("tembo-migrations").join(_key); + + // Apply SQLx migrations if the tembo-migrations directory exists + if migrations_dir.exists() && migrations_dir.is_dir() { + let mut sp = Spinner::new(spinners::Dots, "Applying migrations", spinoff::Color::White); + tokio::runtime::Runtime::new()? + .block_on(apply_migrations(database_url.to_string(), migrations_dir))?; + sp.stop_with_message(&format!( + "{} {}", + "✓".color(colors::indicator_good()).bold(), + format!("Migrations applied for Key {}", _key) + .color(colorful::Color::White) + .bold() + )); + } + + // If all of the above was successful, we can print the url to user + instance_started(database_url, "local"); } Ok(()) } @@ -356,6 +369,7 @@ fn process_app_services( pub fn tembo_cloud_apply_instance( env: &Environment, instance_settings: &InstanceSettings, + key: String, ) -> Result<(), anyhow::Error> { let profile = env .selected_profile @@ -412,6 +426,15 @@ pub fn tembo_cloud_apply_instance( )); clean_console(); let connection_string = construct_connection_string(conn_info, password); + + let migrations_dir = PathBuf::from("tembo-migrations").join(key); + if migrations_dir.exists() && migrations_dir.is_dir() { + tokio::runtime::Runtime::new()?.block_on(apply_migrations( + connection_string.to_string(), + migrations_dir, + ))?; + } + instance_started( &connection_string, &instance_settings.stack_type.clone().unwrap(), @@ -424,6 +447,24 @@ pub fn tembo_cloud_apply_instance( Ok(()) } +async fn apply_migrations( + database_url: String, + migrations_dir: PathBuf, +) -> Result<(), anyhow::Error> { + let pool = PgPool::connect(&database_url).await?; + + for entry in fs::read_dir(&migrations_dir)? { + let entry = entry?; + let path = entry.path(); + if path.is_file() { + let migrator = Migrator::new(migrations_dir.clone()).await?; + migrator.run(&pool).await?; + } + } + + Ok(()) +} + fn get_conn_info_with_creds( profile: Profile, instance_id: Option, diff --git a/tembo-cli/tests/integration_tests_docker.rs b/tembo-cli/tests/integration_tests_docker.rs index 23eaadfeb..aba4fd429 100644 --- a/tembo-cli/tests/integration_tests_docker.rs +++ b/tembo-cli/tests/integration_tests_docker.rs @@ -181,6 +181,45 @@ async fn vector() -> Result<(), anyhow::Error> { Ok(()) } +#[tokio::test] +async fn migrations() -> Result<(), anyhow::Error> { + let root_dir = env!("CARGO_MANIFEST_DIR"); + let test_dir = PathBuf::from(root_dir) + .join("examples") + .join("migrations-1"); + + env::set_current_dir(&test_dir)?; + + // tembo init + let mut cmd = Command::cargo_bin(CARGO_BIN)?; + cmd.arg("init"); + cmd.assert().success(); + + // tembo context set --name local + let mut cmd = Command::cargo_bin(CARGO_BIN)?; + cmd.arg("context"); + cmd.arg("set"); + cmd.arg("--name"); + cmd.arg("local"); + cmd.assert().success(); + + // tembo apply + let mut cmd = Command::cargo_bin(CARGO_BIN)?; + cmd.arg("--verbose"); + cmd.arg("apply"); + cmd.assert().success(); + + // tembo delete + let mut cmd = Command::cargo_bin(CARGO_BIN)?; + cmd.arg("delete"); + let _ = cmd.ok(); + + // check can't connect + assert!(assert_can_connect("migration-test".to_str()).await.is_err()); + + Ok(()) +} + #[tokio::test] async fn data_warehouse() -> Result<(), anyhow::Error> { let instance_name = "data-warehouse";