From b04b0f9a8d4c5df3e4e8dc0dcd5a56227c81c318 Mon Sep 17 00:00:00 2001 From: Esteban Borai Date: Thu, 16 Nov 2023 17:50:47 -0800 Subject: [PATCH] fix: parse `ApiError` from Hub and bubble up (#3692) --- crates/fluvio-hub-util/src/fvm/api/client.rs | 32 +++++++++++++++----- tests/cli/fvm_smoke_tests/fvm_basic.bats | 21 +++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/crates/fluvio-hub-util/src/fvm/api/client.rs b/crates/fluvio-hub-util/src/fvm/api/client.rs index 04ea2c0a96..a7f4858a48 100644 --- a/crates/fluvio-hub-util/src/fvm/api/client.rs +++ b/crates/fluvio-hub-util/src/fvm/api/client.rs @@ -1,10 +1,17 @@ //! Hub FVM API Client use anyhow::{Error, Result}; +use serde::{Deserialize, Serialize}; use url::Url; use crate::fvm::{Channel, PackageSet, PackageSetRecord}; +#[derive(Debug, Deserialize, Serialize)] +pub struct ApiError { + pub status: u16, + pub message: String, +} + /// HTTP Client for interacting with the Hub FVM API pub struct Client { api_url: Url, @@ -24,17 +31,26 @@ impl Client { let mut res = surf::get(url) .await .map_err(|err| Error::msg(err.to_string()))?; - let pkgset_record = res.body_json::().await.map_err(|err| { - tracing::error!(?err, "Failed to parse PackageSet from Hub"); - Error::msg(format!( - "Server responded with status code {}", - err.status() - )) + let res_status = res.status(); + + if res_status.is_success() { + let pkgset_record = res.body_json::().await.map_err(|err| { + tracing::debug!(?err, "Failed to parse PackageSet from Hub"); + Error::msg("Failed to parse server's response") + })?; + + tracing::info!(?pkgset_record, "Found PackageSet"); + return Ok(pkgset_record.into()); + } + + let error = res.body_json::().await.map_err(|err| { + tracing::debug!(?err, "Failed to parse API Error from Hub"); + Error::msg(format!("Server responded with status code {}", res_status)) })?; - tracing::info!(?pkgset_record, "Found PackageSet"); + tracing::debug!(?error, "Server responded with not successful status code"); - Ok(pkgset_record.into()) + Err(anyhow::anyhow!(error.message)) } /// Builds the URL to the Hub API for fetching a [`PackageSet`] using the diff --git a/tests/cli/fvm_smoke_tests/fvm_basic.bats b/tests/cli/fvm_smoke_tests/fvm_basic.bats index 0b831e0b33..6cab5a5eb7 100644 --- a/tests/cli/fvm_smoke_tests/fvm_basic.bats +++ b/tests/cli/fvm_smoke_tests/fvm_basic.bats @@ -791,3 +791,24 @@ setup_file() { rm -rf $FLUVIO_HOME_DIR assert_success } + +@test "Handles unexistent version error" { + run bash -c '$FVM_BIN self install' + assert_success + + # Sets `fvm` in the PATH using the "env" file included in the installation + source ~/.fvm/env + + # Attempts to install unexistent version + run bash -c 'fvm install 0.0.0' + assert_line --index 0 "Error: PackageSet 0.0.0 doest not exist" + assert_failure + + # Removes FVM + run bash -c 'fvm self uninstall --yes' + assert_success + + # Removes Fluvio + rm -rf $FLUVIO_HOME_DIR + assert_success +}