Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add: sdf publish support #4053

Merged
merged 4 commits into from
Jun 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions crates/fluvio-hub-protocol/src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ pub const HUB_API_LIST_META: &str = concatcp!(HUB_API_V, "/list_with_meta");
pub const HUB_API_CONN_PKG: &str = concatcp!(HUB_API_V, "/connector/pkg");
pub const HUB_API_CONN_LIST: &str = concatcp!(HUB_API_V, "/connector/list");

// sdf specific api
pub const HUB_API_SDF_PKG: &str = concatcp!(HUB_API_V, "/sdf/pkg");
pub const HUB_API_SDF_LIST: &str = concatcp!(HUB_API_V, "/sdf/list");
pub const HUB_API_SDF_PKG_PUB: &str = concatcp!(HUB_API_V, "/sdf/pkg/pub/pkg");
pub const HUB_API_SDF_DATAFLOW_PUB: &str = concatcp!(HUB_API_V, "/sdf/pkg/pub/dataflow");

pub const HUB_MANIFEST_BLOB: &str = "manifest.tar.gz";
pub const HUB_PACKAGE_EXT: &str = "ipkg";
pub const HUB_PACKAGE_META: &str = "package-meta.yaml";
Expand All @@ -27,3 +33,8 @@ pub const HUB_SIGNFILE_BASE: &str = "signature";
pub const DEF_CARGO_TOML_PATH: &str = "Cargo.toml";
pub const DEF_HUB_INIT_DIR: &str = ".hub";
pub const DEF_HUB_PKG_META: &str = concatcp!(DEF_HUB_INIT_DIR, "/", HUB_PACKAGE_META); // .hub/package-meta.yaml

// This is required in sdf hub package_meta manifests
pub const SDF_PKG_KIND: &str = "sdf-kind";
pub const SDF_PKG_KIND_DATAFLOW: &str = "dataflow";
pub const SDF_PKG_KIND_PACKAGE: &str = "pkg";
3 changes: 2 additions & 1 deletion crates/fluvio-hub-protocol/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ pub mod constants;
pub mod infinyon_tok;

pub use errors::{Result, HubError};
pub use package_meta::{PackageMeta, PkgTag, PkgVisibility, validate_noleading_punct};
pub use package_meta::{PackageMeta, PkgTag, PkgVisibility};
pub use package_meta::{validate_allowedchars, validate_noleading_punct};
4 changes: 2 additions & 2 deletions crates/fluvio-hub-protocol/src/package_meta.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,10 +236,10 @@ pub fn validate_lowercase(val: &str, name: &str) -> String {
pub fn validate_allowedchars(val: &str, name: &str) -> String {
let good_chars = val
.chars()
.all(|ch| matches!(ch, 'a'..='z' | '0'..='9' | '-' | '_'));
.all(|ch| matches!(ch, 'a'..='z' | '0'..='9' | ':' | '-' | '_'));

if !good_chars {
format!("{name} {val} should be alphanumeric, '-' or '_'\n")
format!("{name} {val} should be alphanumeric, ':', '-' or '_'\n")
} else {
String::new()
}
Expand Down
13 changes: 1 addition & 12 deletions crates/fluvio-hub-util/src/package_meta_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use tracing::debug;

use fluvio_hub_protocol::{PackageMeta, HubError};
use fluvio_hub_protocol::constants::HUB_PACKAGE_META;
use fluvio_hub_protocol::validate_allowedchars;

use crate::package_get_topfile;

Expand Down Expand Up @@ -85,18 +86,6 @@ pub fn validate_lowercase(val: &str, name: &str) -> String {
}
}

pub fn validate_allowedchars(val: &str, name: &str) -> String {
let good_chars = val
.chars()
.all(|ch| matches!(ch, 'a'..='z' | '0'..='9' | '-' | '_'));

if !good_chars {
format!("{name} {val} should be alphanumeric, '-' or '_'\n")
} else {
String::new()
}
}

/// certain output files are transformed in name vs their package name
/// eg. a cargo package named example-smartmodule generates
/// a release file of example_smartmodule.wasm
Expand Down
33 changes: 32 additions & 1 deletion crates/fluvio-hub-util/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,35 @@ pub async fn push_package_conn(pkgpath: &str, access: &HubAccess, target: &str)
push_package_api(&url, pkgpath, access).await
}

async fn push_package_api(put_url: &str, pkgpath: &str, access: &HubAccess) -> Result<()> {
/// push package to connector api
pub async fn push_package_sdf(pkgpath: &str, access: &HubAccess) -> Result<()> {
use crate::{
SDF_PKG_KIND, SDF_PKG_KIND_DATAFLOW, SDF_PKG_KIND_PACKAGE, HUB_API_SDF_DATAFLOW_PUB,
HUB_API_SDF_PKG_PUB,
};

info!("sdf package push form: {pkgpath}");
let pm = package_get_meta(pkgpath)?;
let Some(sdf_kind) = pm.tag_get(SDF_PKG_KIND) else {
let msg = format!("Invalid sdf hub package_meta: missing tag for {SDF_PKG_KIND}");
return Err(HubError::PackagePublish(msg));
};
let sdf_kind = sdf_kind.first().cloned().unwrap_or_default().value;
let endpoint = match sdf_kind.as_str() {
SDF_PKG_KIND_DATAFLOW => HUB_API_SDF_DATAFLOW_PUB,
SDF_PKG_KIND_PACKAGE => HUB_API_SDF_PKG_PUB,
_ => {
let msg = format!("Invalid sdf hub package_meta {SDF_PKG_KIND}: {sdf_kind}");
return Err(HubError::PackagePublish(msg));
}
};
let host = &access.remote;
let url = format!("{host}/{endpoint}/{}/{}/{}", pm.group, pm.name, pm.version);
debug!(url, "package url");
push_package_api(&url, pkgpath, access).await
}

pub async fn push_package_api(put_url: &str, pkgpath: &str, access: &HubAccess) -> Result<()> {
let pm = package_get_meta(pkgpath)?;
packagename_validate(&pm.name)?;

Expand All @@ -185,8 +213,11 @@ async fn push_package_api(put_url: &str, pkgpath: &str, access: &HubAccess) -> R
)));
}

tracing::debug!("get action token");
let pkg_bytes = std::fs::read(pkgpath)?;
let actiontoken = access.get_publish_token().await?;

tracing::debug!(url = put_url, "put package");
let req = http::Request::put(put_url)
.header("Authorization", &actiontoken)
.header(http::header::CONTENT_TYPE, mime::OCTET_STREAM.as_str())
Expand Down
Loading