From 79fbc61df7946c5e28106dad59e7867c03884043 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Wed, 4 Oct 2023 00:30:21 -0700 Subject: [PATCH 1/4] validate .env --- packages/cargo-pgml-components/Cargo.lock | 2 +- packages/cargo-pgml-components/Cargo.toml | 2 +- .../cargo-pgml-components/src/local_dev.rs | 91 ++++++++++++++++++- 3 files changed, 91 insertions(+), 4 deletions(-) diff --git a/packages/cargo-pgml-components/Cargo.lock b/packages/cargo-pgml-components/Cargo.lock index 724d159c8..d9e3aec63 100644 --- a/packages/cargo-pgml-components/Cargo.lock +++ b/packages/cargo-pgml-components/Cargo.lock @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cargo-pgml-components" -version = "0.1.18-alpha.1" +version = "0.1.18-alpha.2" dependencies = [ "anyhow", "assert_cmd", diff --git a/packages/cargo-pgml-components/Cargo.toml b/packages/cargo-pgml-components/Cargo.toml index d24201cc2..6b006482f 100644 --- a/packages/cargo-pgml-components/Cargo.toml +++ b/packages/cargo-pgml-components/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-pgml-components" -version = "0.1.18-alpha.1" +version = "0.1.18-alpha.2" edition = "2021" authors = ["PostgresML "] license = "MIT" diff --git a/packages/cargo-pgml-components/src/local_dev.rs b/packages/cargo-pgml-components/src/local_dev.rs index 8a8fd965b..6bd07fc1d 100644 --- a/packages/cargo-pgml-components/src/local_dev.rs +++ b/packages/cargo-pgml-components/src/local_dev.rs @@ -3,8 +3,12 @@ //! Code to handle the setup of our pretty complex local development //! environment. -use crate::util::{execute_command, info, ok_or_error, print, psql_output, unwrap_or_exit, warn}; -use std::process::Command; +use crate::util::{ + compare_files, error, execute_command, info, ok_or_error, print, psql_output, unwrap_or_exit, + warn, +}; +use std::path::Path; +use std::process::{exit, Command}; #[cfg(target_os = "macos")] static PG_INSTALL: &str = " @@ -155,6 +159,29 @@ fn dependencies() -> anyhow::Result<()> { BUILD_ESSENTIAL ); + #[cfg(target_os = "linux")] + let postgres_service = "postgresql"; + + #[cfg(target_os = "macos")] + let postgres_service = "postgresql@15"; + + print("checking if PostgreSQL is running..."); + if !check_service_running(postgres_service) { + error("error"); + + println!("\nPostgreSQL service is not running. To start PostgreSQL, run:\n"); + + #[cfg(target_os = "linux")] + println!("\tsudo service postgresql start\n"); + + #[cfg(target_os = "macos")] + println!("\tbrew service start postgresql@15\n"); + + exit(1); + } else { + info("ok"); + } + ok_or_error!( "checking for PostgreSQL connectivity", { @@ -219,6 +246,7 @@ fn dependencies() -> anyhow::Result<()> { let output = psql_output( "SELECT datname FROM pg_database WHERE datname = 'pgml_dashboard_development'", )?; + if !output.contains("pgml_dashboard_development") { warn("missing"); print("creating pgml_dashboard_development database..."); @@ -242,6 +270,55 @@ fn dependencies() -> anyhow::Result<()> { .arg("pgml_dashboard_development") )); info("ok"); + } else { + info("ok"); + print("running quick environment test..."); + unwrap_or_exit!(execute_command( + Command::new("dropdb") + .arg("--if-exists") + .arg("pgml_components_environment_test") + )); + unwrap_or_exit!(execute_command( + Command::new("createdb").arg("pgml_components_environment_test") + )); + unwrap_or_exit!(execute_command( + Command::new("psql") + .arg("-c") + .arg("CREATE EXTENSION vector") + .arg("pgml_components_environment_test") + )); + unwrap_or_exit!(execute_command( + Command::new("psql") + .arg("-c") + .arg("CREATE EXTENSION pgml") + .arg("pgml_components_environment_test") + )); + unwrap_or_exit!(execute_command( + Command::new("dropdb").arg("pgml_components_environment_test") + )); + info("ok"); + } + + print("checking .env file..."); + let env = Path::new(".env"); + let env_template = Path::new(".env.development"); + + if !env.exists() && env_template.exists() { + unwrap_or_exit!(execute_command( + Command::new("cp").arg(".env.development").arg(".env") + )); + info("ok"); + } else if env.exists() && env_template.exists() { + let identical = unwrap_or_exit!(compare_files(&env, &env_template)); + if !identical { + warn("different"); + warn(".env has been modified"); + } else { + info("ok"); + } + } else if !env_template.exists() { + warn("unknown"); + warn(".env.development not found, can't install or validate .env"); } else { info("ok"); } @@ -254,3 +331,13 @@ fn dependencies() -> anyhow::Result<()> { pub fn setup() { unwrap_or_exit!(dependencies()) } + +fn check_service_running(name: &str) -> bool { + #[cfg(target_os = "linux")] + let command = format!("service {} status", name); + + #[cfg(target_os = "macos")] + let command = format!("brew service status {}", name); + + execute_command(Command::new("bash").arg("-c").arg(&command)).is_ok() +} From a73999f69daf8d863a99a2f2a3b47ce599e67238 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Wed, 4 Oct 2023 00:33:39 -0700 Subject: [PATCH 2/4] brew --- packages/cargo-pgml-components/src/local_dev.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/cargo-pgml-components/src/local_dev.rs b/packages/cargo-pgml-components/src/local_dev.rs index 6bd07fc1d..6d7118d3c 100644 --- a/packages/cargo-pgml-components/src/local_dev.rs +++ b/packages/cargo-pgml-components/src/local_dev.rs @@ -159,6 +159,18 @@ fn dependencies() -> anyhow::Result<()> { BUILD_ESSENTIAL ); + #[cfg(target_os = "macos")] + { + print("checking for brew..."); + if execute_command(Command::new("which").arg("brew")).is_err() { + error("missing"); + println!("\nBrew is not installed. Install it from https://brew.sh/\n"); + exit(1); + } else { + info("ok"); + } + } + #[cfg(target_os = "linux")] let postgres_service = "postgresql"; From 1ca6652aa3aaa2578d44fd35e5f67d681b7c581d Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Wed, 4 Oct 2023 00:36:01 -0700 Subject: [PATCH 3/4] moar --- .../cargo-pgml-components/src/local_dev.rs | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/cargo-pgml-components/src/local_dev.rs b/packages/cargo-pgml-components/src/local_dev.rs index 6d7118d3c..f629742a5 100644 --- a/packages/cargo-pgml-components/src/local_dev.rs +++ b/packages/cargo-pgml-components/src/local_dev.rs @@ -194,18 +194,14 @@ fn dependencies() -> anyhow::Result<()> { info("ok"); } - ok_or_error!( - "checking for PostgreSQL connectivity", - { - if let Err(err) = psql_output("SELECT version()") { - error!("{}", err); - false - } else { - true - } - }, - postgres_running() - ); + print("checking for PostgreSQL connectivity..."); + if let Err(err) = psql_output("SELECT version()") { + error("error"); + error!("{}", err); + println!("{}", postgres_running()); + } else { + info("ok"); + } ok_or_error!( "checking for pgvector PostgreSQL extension", From 5fa72b0f5f090f533f68f9787964bcf25bd8dd32 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Wed, 4 Oct 2023 13:49:12 -0700 Subject: [PATCH 4/4] stuff --- .../cargo-pgml-components/src/local_dev.rs | 44 ++++++++++++++----- packages/cargo-pgml-components/src/main.rs | 15 ++++++- .../content/docs/guides/setup/developers.md | 2 +- .../docs/guides/setup/v2/installation.md | 4 +- 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/packages/cargo-pgml-components/src/local_dev.rs b/packages/cargo-pgml-components/src/local_dev.rs index f629742a5..da0762b2f 100644 --- a/packages/cargo-pgml-components/src/local_dev.rs +++ b/packages/cargo-pgml-components/src/local_dev.rs @@ -43,7 +43,7 @@ To install pg_stat_statements into your database: 2. Add pg_stat_statements into your shared_preload_libraries:\n \tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' 3. Restart PostgreSQL:\n -\tbrew service restart postgresql@15 +\tbrew services restart postgresql@15 "; #[cfg(target_os = "linux")] @@ -59,18 +59,20 @@ To install pg_stat_statements into your database: "; #[cfg(target_os = "macos")] -static PG_PGVECTOR: &str = "Install pgvector into your PostgreSQL database:\n -\tgit clone --branch v0.5.0 https://github.com/pgvector/pgvector && \\ -\tcd pgvector && \\ +static PG_PGVECTOR: &str = " +\t rm -rf /tmp/pgvector && \\ +\tgit clone --branch v0.5.0 https://github.com/pgvector/pgvector /tmp/pgvector && \\ +\tcd /tmp/pgvector && \\ \techo \"trusted = true\" >> vector.control && \\ \tmake && \\ \tmake install "; #[cfg(target_os = "linux")] -static PG_PGVECTOR: &str = "Install pgvector into your PostgreSQL database:\n -\tgit clone --branch v0.5.0 https://github.com/pgvector/pgvector && \\ -\tcd pgvector && \\ +static PG_PGVECTOR: &str = " +\t rm -rf /tmp/pgvector && \\ +\tgit clone --branch v0.5.0 https://github.com/pgvector/pgvector /tmp/pgvector && \\ +\tcd /tmp/pgvector && \\ \techo \"trusted = true\" >> vector.control && \\ \tmake && \\ \tsudo make install @@ -115,7 +117,7 @@ Is PostgreSQL running and accepting connections? let start = format!( " To start PostgreSQL, run:\n -\tbrew service start postgresql@15 +\tbrew services start postgresql@15 " ); @@ -187,7 +189,7 @@ fn dependencies() -> anyhow::Result<()> { println!("\tsudo service postgresql start\n"); #[cfg(target_os = "macos")] - println!("\tbrew service start postgresql@15\n"); + println!("\tbrew services start postgresql@15\n"); exit(1); } else { @@ -340,12 +342,34 @@ pub fn setup() { unwrap_or_exit!(dependencies()) } +pub fn install_pgvector() { + #[cfg(target_os = "linux")] + { + let check_sudo = execute_command(Command::new("sudo").arg("ls")); + if check_sudo.is_err() { + println!("Installing pgvector requires sudo permissions."); + exit(1); + } + } + + print("installing pgvector PostgreSQL extension..."); + + let result = execute_command(Command::new("bash").arg("-c").arg(PG_PGVECTOR)); + + if let Ok(_) = result { + info("ok"); + } else if let Err(ref err) = result { + error("error"); + error!("{}", err); + } +} + fn check_service_running(name: &str) -> bool { #[cfg(target_os = "linux")] let command = format!("service {} status", name); #[cfg(target_os = "macos")] - let command = format!("brew service status {}", name); + let command = format!("brew services list | grep {} | grep started", name); execute_command(Command::new("bash").arg("-c").arg(&command)).is_ok() } diff --git a/packages/cargo-pgml-components/src/main.rs b/packages/cargo-pgml-components/src/main.rs index 30711d700..e879d2bd1 100644 --- a/packages/cargo-pgml-components/src/main.rs +++ b/packages/cargo-pgml-components/src/main.rs @@ -65,7 +65,8 @@ enum Commands { Add(AddCommands), /// Setup local dev. - LocalDev {}, + #[command(subcommand)] + LocalDev(LocalDevCommands), } #[derive(Subcommand, Debug)] @@ -74,6 +75,13 @@ enum AddCommands { Component { name: String }, } +#[derive(Subcommand, Debug)] +enum LocalDevCommands { + /// Setup local dev. + Check {}, + InstallPgvector {}, +} + fn main() { let config = Config::load(); env_logger::init(); @@ -89,7 +97,10 @@ fn main() { crate::frontend::components::add(&Path::new(&name), pgml_commands.overwrite) } }, - Commands::LocalDev {} => local_dev::setup(), + Commands::LocalDev(command) => match command { + LocalDevCommands::Check {} => local_dev::setup(), + LocalDevCommands::InstallPgvector {} => local_dev::install_pgvector(), + }, } } } diff --git a/pgml-dashboard/content/docs/guides/setup/developers.md b/pgml-dashboard/content/docs/guides/setup/developers.md index 0ffc367fb..659e81424 100644 --- a/pgml-dashboard/content/docs/guides/setup/developers.md +++ b/pgml-dashboard/content/docs/guides/setup/developers.md @@ -70,7 +70,7 @@ Once there, you can initialize `pgrx` and get going: #### Pgrx command line and environments ```commandline -cargo install cargo-pgrx --version "0.9.8" --locked && \ +cargo install cargo-pgrx --version "0.10.0" --locked && \ cargo pgrx init # This will take a few minutes ``` diff --git a/pgml-dashboard/content/docs/guides/setup/v2/installation.md b/pgml-dashboard/content/docs/guides/setup/v2/installation.md index e5f128450..683ad7302 100644 --- a/pgml-dashboard/content/docs/guides/setup/v2/installation.md +++ b/pgml-dashboard/content/docs/guides/setup/v2/installation.md @@ -36,7 +36,7 @@ brew bundle PostgresML is written in Rust, so you'll need to install the latest compiler from [rust-lang.org](https://rust-lang.org). Additionally, we use the Rust PostgreSQL extension framework `pgrx`, which requires some initialization steps: ```bash -cargo install cargo-pgrx --version 0.9.8 && \ +cargo install cargo-pgrx --version 0.10.0 && \ cargo pgrx init ``` @@ -293,7 +293,7 @@ We use the `pgrx` Postgres Rust extension framework, which comes with its own in ```bash cd pgml-extension && \ -cargo install cargo-pgrx --version 0.9.8 && \ +cargo install cargo-pgrx --version 0.10.0 && \ cargo pgrx init ```