diff --git a/lib/bencher_json/src/system/mod.rs b/lib/bencher_json/src/system/mod.rs index 8d215a3de..79ed81878 100644 --- a/lib/bencher_json/src/system/mod.rs +++ b/lib/bencher_json/src/system/mod.rs @@ -2,4 +2,4 @@ pub mod auth; pub mod backup; pub mod config; pub mod restart; -pub mod version; +pub mod version; \ No newline at end of file diff --git a/services/cli/src/bencher/sub/project/report/mod.rs b/services/cli/src/bencher/sub/project/report/mod.rs index ecb8049ef..c8b8d2c99 100644 --- a/services/cli/src/bencher/sub/project/report/mod.rs +++ b/services/cli/src/bencher/sub/project/report/mod.rs @@ -5,12 +5,14 @@ use crate::{bencher::sub::SubCmd, cli::project::report::CliReport, CliError}; mod list; mod view; +mod upload; #[derive(Debug)] pub enum Report { List(list::List), Create(Box), View(view::View), + Upload(upload::Upload) } impl TryFrom for Report { @@ -21,6 +23,7 @@ impl TryFrom for Report { CliReport::List(list) => Self::List(list.try_into()?), CliReport::Create(create) => Self::Create(Box::new((*create).try_into()?)), CliReport::View(view) => Self::View(view.try_into()?), + CliReport::Upload(upload) => Self::Upload(upload.try_into()?), }) } } @@ -32,6 +35,7 @@ impl SubCmd for Report { Self::List(list) => list.exec().await, Self::Create(create) => create.exec().await, Self::View(create) => create.exec().await, + Self::Upload(upload) => upload.exec().await } } } diff --git a/services/cli/src/bencher/sub/project/report/upload.rs b/services/cli/src/bencher/sub/project/report/upload.rs new file mode 100644 index 000000000..fca7267f5 --- /dev/null +++ b/services/cli/src/bencher/sub/project/report/upload.rs @@ -0,0 +1,53 @@ +use std::{convert::TryFrom, path::PathBuf}; + +use async_trait::async_trait; +use bencher_json::{ResourceId}; +use serde_json::json; +use uuid::Uuid; + +use crate::{ + bencher::{backend::Backend, sub::SubCmd}, + cli::project::report::CliReportUpload, + CliError, +}; + +#[derive(Debug)] +pub struct Upload{ + pub project: ResourceId, + pub report: Uuid, + pub backend: Backend, + pub perf_data_path: PathBuf +} + +impl TryFrom for Upload { + type Error = CliError; + + fn try_from(upload: CliReportUpload) -> Result { + let CliReportUpload{ + project, + report, + backend, + perf_data_path + } = upload; + Ok(Self { + project, + report, + backend: backend.try_into()?, + perf_data_path + }) + } +} + +#[async_trait] +impl SubCmd for Upload { + async fn exec(&self) -> Result<(), CliError> { + let perf_data_json = json!(self.perf_data_path); + self.backend + .post(&format!( + "/v0/projects/{}/reports/{}", + self.project, self.report + ), &perf_data_json) + .await?; + Ok(()) + } +} diff --git a/services/cli/src/cli/project/report.rs b/services/cli/src/cli/project/report.rs index d4149dcdc..87fbf842e 100644 --- a/services/cli/src/cli/project/report.rs +++ b/services/cli/src/cli/project/report.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use bencher_json::ResourceId; use clap::{Parser, Subcommand}; use uuid::Uuid; @@ -15,6 +17,8 @@ pub enum CliReport { Create(Box), /// View a report View(CliReportView), + /// Upload report + Upload(CliReportUpload) } #[derive(Parser, Debug)] @@ -39,3 +43,19 @@ pub struct CliReportView { #[clap(flatten)] pub backend: CliBackend, } + +#[derive(Parser, Debug)] +pub struct CliReportUpload { + /// Project slug or UUID + #[clap(long)] + pub project: ResourceId, + + /// Report UUID + pub report: Uuid, + + #[clap(flatten)] + pub backend: CliBackend, + + /// Perf data file path + pub perf_data_path: PathBuf +} \ No newline at end of file