diff --git a/.dockerignore b/.dockerignore index 223a8a80a..c269c7eaf 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,4 @@ /target -/config_example \ No newline at end of file +/config_example +config.* +.env \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 11d80dcd4..d765b6423 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -26,7 +26,7 @@ "label": "rust: cargo run", "options": { "cwd": "${workspaceFolder}/core" - }, + } }, { "type": "cargo", @@ -34,7 +34,7 @@ "label": "run core", "options": { "cwd": "${workspaceFolder}/core" - }, + } }, { "type": "cargo", @@ -42,7 +42,7 @@ "label": "run periphery", "options": { "cwd": "${workspaceFolder}/periphery" - }, + } }, { "type": "cargo", @@ -50,7 +50,7 @@ "label": "run cli", "options": { "cwd": "${workspaceFolder}/cli" - }, + } }, { "type": "cargo", @@ -58,7 +58,7 @@ "label": "run tests", "options": { "cwd": "${workspaceFolder}/tests" - }, + } }, { "type": "cargo", @@ -66,7 +66,7 @@ "label": "publish monitor types", "options": { "cwd": "${workspaceFolder}/lib/types" - }, + } }, { "type": "cargo", @@ -74,17 +74,24 @@ "label": "publish monitor client", "options": { "cwd": "${workspaceFolder}/lib/monitor_client" + } + }, + { + "type": "shell", + "command": "docker compose up -d", + "label": "docker compose up", + "options": { + "cwd": "${workspaceFolder}/tests" }, + "problemMatcher": [] }, { "type": "shell", - "command": "docker build -t monitor_periphery -f Dockerfile.periphery .", - "label": "docker build periphery" - }, - { - "type": "shell", - "command": "docker build -t monitor_core -f Dockerfile.core .", - "label": "docker build core" + "command": "docker compose down", + "label": "docker compose down", + "options": { + "cwd": "${workspaceFolder}/tests" + } } ] } \ No newline at end of file diff --git a/core/src/api/build.rs b/core/src/api/build.rs index 35562a679..81c69834f 100644 --- a/core/src/api/build.rs +++ b/core/src/api/build.rs @@ -1,11 +1,11 @@ use anyhow::Context; use axum::{ - extract::Path, + extract::{Path, Query}, routing::{delete, get, patch, post}, Extension, Json, Router, }; use helpers::handle_anyhow_error; -use mungos::Deserialize; +use mungos::{Deserialize, Document}; use types::{traits::Permissioned, Build, PermissionLevel}; use crate::{ @@ -30,24 +30,25 @@ pub fn router() -> Router { .route( "/:id", get( - |Extension(state): StateExtension, Extension(user): RequestUserExtension, Path(build_id): Path| async move { + |Extension(state): StateExtension, + Extension(user): RequestUserExtension, + Path(build_id): Path| async move { let build = state - .get_build_check_permissions( - &build_id.id, - &user, - PermissionLevel::Read - ).await + .get_build_check_permissions(&build_id.id, &user, PermissionLevel::Read) + .await .map_err(handle_anyhow_error)?; response!(Json(build)) - } - ) + }, + ), ) .route( "/list", get( - |Extension(state): StateExtension, Extension(user): RequestUserExtension| async move { + |Extension(state): StateExtension, + Extension(user): RequestUserExtension, + Query(query): Query| async move { let builds = state - .list_builds(&user) + .list_builds(&user, query) .await .map_err(handle_anyhow_error)?; response!(Json(builds)) @@ -127,11 +128,15 @@ pub fn router() -> Router { } impl State { - async fn list_builds(&self, user: &RequestUser) -> anyhow::Result> { + async fn list_builds( + &self, + user: &RequestUser, + query: impl Into>, + ) -> anyhow::Result> { let mut builds: Vec = self .db .builds - .get_some(None, None) + .get_some(query, None) .await .context("failed at get all builds query")? .into_iter() diff --git a/core/src/api/deployment.rs b/core/src/api/deployment.rs index 96af42b5d..45725c9ad 100644 --- a/core/src/api/deployment.rs +++ b/core/src/api/deployment.rs @@ -1,11 +1,11 @@ use anyhow::Context; use axum::{ - extract::Path, + extract::{Path, Query}, routing::{delete, get, patch, post}, Extension, Json, Router, }; use helpers::handle_anyhow_error; -use mungos::Deserialize; +use mungos::{Deserialize, Document}; use types::{traits::Permissioned, Deployment, PermissionLevel}; use crate::{ @@ -30,24 +30,29 @@ pub fn router() -> Router { .route( "/:id", get( - |Extension(state): StateExtension, Extension(user): RequestUserExtension, Path(deployment_id): Path| async move { + |Extension(state): StateExtension, + Extension(user): RequestUserExtension, + Path(deployment_id): Path| async move { let deployment = state .get_deployment_check_permissions( &deployment_id.id, &user, - PermissionLevel::Read - ).await + PermissionLevel::Read, + ) + .await .map_err(handle_anyhow_error)?; response!(Json(deployment)) - } - ) + }, + ), ) .route( "/list", get( - |Extension(state): StateExtension, Extension(user): RequestUserExtension| async move { + |Extension(state): StateExtension, + Extension(user): RequestUserExtension, + Query(query): Query| async move { let deployments = state - .list_deployments(&user) + .list_deployments(&user, query) .await .map_err(handle_anyhow_error)?; response!(Json(deployments)) @@ -127,11 +132,15 @@ pub fn router() -> Router { } impl State { - async fn list_deployments(&self, user: &RequestUser) -> anyhow::Result> { + async fn list_deployments( + &self, + user: &RequestUser, + query: impl Into>, + ) -> anyhow::Result> { let mut deployments: Vec = self .db .deployments - .get_some(None, None) + .get_some(query, None) .await .context("failed at get all deployments query")? .into_iter() diff --git a/core/src/api/server.rs b/core/src/api/server.rs index 6385ae264..59b3c26d4 100644 --- a/core/src/api/server.rs +++ b/core/src/api/server.rs @@ -1,11 +1,11 @@ use anyhow::Context; use axum::{ - extract::Path, + extract::{Path, Query}, routing::{delete, get, patch, post}, Extension, Json, Router, }; use helpers::handle_anyhow_error; -use mungos::Deserialize; +use mungos::{Deserialize, Document}; use types::{traits::Permissioned, PermissionLevel, Server, SystemStats}; use crate::{ @@ -30,24 +30,25 @@ pub fn router() -> Router { .route( "/:id", get( - |Extension(state): StateExtension, Extension(user): RequestUserExtension, Path(server_id): Path| async move { + |Extension(state): StateExtension, + Extension(user): RequestUserExtension, + Path(server_id): Path| async move { let server = state - .get_server_check_permissions( - &server_id.id, - &user, - PermissionLevel::Read - ).await + .get_server_check_permissions(&server_id.id, &user, PermissionLevel::Read) + .await .map_err(handle_anyhow_error)?; response!(Json(server)) - } - ) + }, + ), ) .route( "/list", get( - |Extension(state): StateExtension, Extension(user): RequestUserExtension| async move { + |Extension(state): StateExtension, + Extension(user): RequestUserExtension, + Query(query): Query| async move { let servers = state - .list_servers(&user) + .list_servers(&user, query) .await .map_err(handle_anyhow_error)?; response!(Json(servers)) @@ -58,8 +59,8 @@ pub fn router() -> Router { "/create", post( |Extension(state): StateExtension, - Extension(user): RequestUserExtension, - Json(server): Json| async move { + Extension(user): RequestUserExtension, + Json(server): Json| async move { let server = state .create_server(&server.name, server.address, &user) .await @@ -72,8 +73,8 @@ pub fn router() -> Router { "/delete/:id", delete( |Extension(state): StateExtension, - Extension(user): RequestUserExtension, - Path(server): Path| async move { + Extension(user): RequestUserExtension, + Path(server): Path| async move { let server = state .delete_server(&server.id, &user) .await @@ -86,8 +87,8 @@ pub fn router() -> Router { "/update", patch( |Extension(state): StateExtension, - Extension(user): RequestUserExtension, - Json(server): Json| async move { + Extension(user): RequestUserExtension, + Json(server): Json| async move { let server = state .update_server(server, &user) .await @@ -99,23 +100,29 @@ pub fn router() -> Router { .route( "/stats/:id", get( - |Extension(state): StateExtension, - Extension(user): RequestUserExtension, - Path(ServerId { id }): Path| async move { - let stats = state.get_server_stats(&user, &id) - .await - .map_err(handle_anyhow_error)?; - response!(Json(stats)) - }) + |Extension(state): StateExtension, + Extension(user): RequestUserExtension, + Path(ServerId { id }): Path| async move { + let stats = state + .get_server_stats(&user, &id) + .await + .map_err(handle_anyhow_error)?; + response!(Json(stats)) + }, + ), ) } impl State { - async fn list_servers(&self, user: &RequestUser) -> anyhow::Result> { + async fn list_servers( + &self, + user: &RequestUser, + query: impl Into>, + ) -> anyhow::Result> { let mut servers: Vec = self .db .servers - .get_some(None, None) + .get_some(query, None) .await .context("failed at get all servers query")? .into_iter() diff --git a/install_periphery_dependencies.sh b/install_periphery_dependencies.sh index 6eb248464..f5ee963c3 100644 --- a/install_periphery_dependencies.sh +++ b/install_periphery_dependencies.sh @@ -2,4 +2,7 @@ apt-get update apt-get install ca-certificates curl gnupg lsb-release -y curl -fsSL https://get.docker.com | sh apt-get update -apt-get install git -y \ No newline at end of file +apt-get install git -y +git config pull.rebase false +curl -fsSL https://deb.nodesource.com/setup_19.x | bash - && apt-get install -y nodejs +corepack enable \ No newline at end of file diff --git a/lib/monitor_client/src/build.rs b/lib/monitor_client/src/build.rs index 98bcf1a71..0e390d126 100644 --- a/lib/monitor_client/src/build.rs +++ b/lib/monitor_client/src/build.rs @@ -1,12 +1,13 @@ use anyhow::Context; use monitor_types::{Build, SystemStats, Update}; -use serde_json::json; +use serde::Serialize; +use serde_json::{json, Value}; use crate::MonitorClient; impl MonitorClient { - pub async fn list_builds(&self) -> anyhow::Result> { - self.get("/api/build/list") + pub async fn list_builds(&self, query: impl Into>) -> anyhow::Result> { + self.get("/api/build/list", query.into()) .await .context("failed at list builds") } diff --git a/lib/monitor_client/src/deployment.rs b/lib/monitor_client/src/deployment.rs index f6013eb7e..9855f4718 100644 --- a/lib/monitor_client/src/deployment.rs +++ b/lib/monitor_client/src/deployment.rs @@ -1,12 +1,16 @@ use anyhow::Context; use monitor_types::{Deployment, SystemStats, Update}; -use serde_json::json; +use serde::Serialize; +use serde_json::{json, Value}; use crate::MonitorClient; impl MonitorClient { - pub async fn list_deployments(&self) -> anyhow::Result> { - self.get("/api/deployment/list") + pub async fn list_deployments( + &self, + query: impl Into>, + ) -> anyhow::Result> { + self.get("/api/deployment/list", query.into()) .await .context("failed at list deployments") } diff --git a/lib/monitor_client/src/lib.rs b/lib/monitor_client/src/lib.rs index a9e5aaf77..d8d4e4e31 100644 --- a/lib/monitor_client/src/lib.rs +++ b/lib/monitor_client/src/lib.rs @@ -63,11 +63,28 @@ impl MonitorClient { Ok(client) } - async fn get(&self, endpoint: &str) -> anyhow::Result { + async fn create_user( + &self, + username: impl Into, + password: impl Into, + ) -> anyhow::Result { + self.post_string( + "/auth/local/create_user", + json!({ "username": username.into(), "password": password.into() }), + ) + .await + } + + async fn get( + &self, + endpoint: &str, + query: impl Serialize, + ) -> anyhow::Result { let res = self .http_client .get(format!("{}{endpoint}", self.url)) .header("Authorization", format!("Bearer {}", self.token)) + .query(&query) .send() .await .context("failed to reach monitor api")?; @@ -85,11 +102,12 @@ impl MonitorClient { } } - async fn get_string(&self, endpoint: &str) -> anyhow::Result { + async fn get_string(&self, endpoint: &str, query: impl Serialize) -> anyhow::Result { let res = self .http_client .get(format!("{}{endpoint}", self.url)) .header("Authorization", format!("Bearer {}", self.token)) + .query(&query) .send() .await .context("failed to reach monitor api")?; diff --git a/lib/monitor_client/src/server.rs b/lib/monitor_client/src/server.rs index a06bfee42..0559b521c 100644 --- a/lib/monitor_client/src/server.rs +++ b/lib/monitor_client/src/server.rs @@ -1,12 +1,16 @@ use anyhow::Context; use monitor_types::{Server, SystemStats}; -use serde_json::json; +use serde::Serialize; +use serde_json::{json, Value}; use crate::MonitorClient; impl MonitorClient { - pub async fn list_servers(&self) -> anyhow::Result> { - self.get("/api/server/list") + pub async fn list_servers( + &self, + query: impl Into>, + ) -> anyhow::Result> { + self.get("/api/server/list", query.into()) .await .context("failed at list servers") } @@ -35,7 +39,7 @@ impl MonitorClient { } pub async fn get_server_stats(&self, id: &str) -> anyhow::Result { - self.get(&format!("/api/server/stats/{id}")) + self.get(&format!("/api/server/stats/{id}"), Option::<()>::None) .await .context(format!("failed to get server stats at id {id}")) } diff --git a/periphery/Users/max/monitor_repos/periphery b/periphery/Users/max/monitor_repos/periphery new file mode 160000 index 000000000..b1e2328d5 --- /dev/null +++ b/periphery/Users/max/monitor_repos/periphery @@ -0,0 +1 @@ +Subproject commit b1e2328d54a41c213681d2012dff439d25dbe95e diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml new file mode 100644 index 000000000..f1c9e62e4 --- /dev/null +++ b/tests/docker-compose.yml @@ -0,0 +1,43 @@ +version: "3.9" +services: + core: + image: core + build: + context: .. + dockerfile: Dockerfile.core + ports: + - "9000:9000" + networks: + - monitor-network + environment: + - CONFIG_PATH=/config/config.toml + volumes: + - "/Users/max/monitor/core:/config" + depends_on: + - mongo + + periphery: + image: periphery + build: + context: .. + dockerfile: Dockerfile.periphery + ports: + - "9001:9001" + networks: + - monitor-network + environment: + - CONFIG_PATH=/config/config.toml + volumes: + - "/Users/max/monitor/periphery:/config" + - "/Users/max/monitor/repos:/repos" + - "/var/run/docker.sock:/var/run/docker.sock" + + mongo: + image: mongo + ports: + - "27019:27017" + networks: + - monitor-network + +networks: + monitor-network: {} \ No newline at end of file diff --git a/tests/src/main.rs b/tests/src/main.rs index e1993a170..3d8bd360b 100644 --- a/tests/src/main.rs +++ b/tests/src/main.rs @@ -17,6 +17,9 @@ async fn main() -> anyhow::Result<()> { let start_ts = unix_timestamp_ms(); + // let stats = get_server_stats(&monitor).await?; + // println!("{stats:#?}"); + // let (server, deployment, build) = create_test_setup(&monitor, "test").await?; // let update = deploy_mongo(&monitor).await?; diff --git a/tests/src/tests.rs b/tests/src/tests.rs index ee9cd7356..ffb60d1ec 100644 --- a/tests/src/tests.rs +++ b/tests/src/tests.rs @@ -9,7 +9,7 @@ pub async fn create_test_setup( group_name: &str, ) -> anyhow::Result<(Server, Deployment, Build)> { let server = monitor - .create_server(&format!("{group_name}_server"), "http://localhost:9001") + .create_server(&format!("{group_name}_server"), "http://periphery") .await .context("failed at create server")?; let deployment = monitor @@ -25,7 +25,7 @@ pub async fn create_test_setup( pub async fn get_server_stats(monitor: &MonitorClient) -> anyhow::Result { let servers = monitor - .list_servers() + .list_servers(None) .await .context("failed at list servers")?; let server = servers.get(0).ok_or(anyhow!("no servers"))?; @@ -38,7 +38,7 @@ pub async fn get_server_stats(monitor: &MonitorClient) -> anyhow::Result anyhow::Result { let servers = monitor - .list_servers() + .list_servers(None) .await .context("failed at list servers")?; let server = servers.get(0).ok_or(anyhow!("no servers"))?; @@ -58,7 +58,7 @@ pub async fn deploy_mongo(monitor: &MonitorClient) -> anyhow::Result { pub async fn test_build(monitor: &MonitorClient) -> anyhow::Result { let servers = monitor - .list_servers() + .list_servers(None) .await .context("failed at list servers")?; let server = servers.get(0).ok_or(anyhow!("no servers"))?; @@ -67,7 +67,7 @@ pub async fn test_build(monitor: &MonitorClient) -> anyhow::Result { println!("created build"); build.repo = Some("mbecker20/monitor".to_string()); build.on_clone = Some(Command { - path: "/".to_string(), + path: ".".to_string(), command: "yarn".to_string(), }); build.pre_build = Some(Command {