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

[Merged by Bors] - feat(cdk): supply arch tag on publish if not set #3080

Closed
Closed
Show file tree
Hide file tree
Changes from 1 commit
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
8 changes: 4 additions & 4 deletions crates/cdk/src/publish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ impl PublishCmd {
.package_meta
.clone()
.unwrap_or_else(|| hubutil::DEF_HUB_PKG_META.to_string());
let pkgdata = package_assemble(&pkgmetapath, &access)?;
let pkgdata = package_assemble(&pkgmetapath, &self.target, &access)?;
package_push(self, &pkgdata, &access)?;
}

Expand All @@ -73,7 +73,7 @@ impl PublishCmd {
.package_meta
.clone()
.unwrap_or_else(|| hubutil::DEF_HUB_PKG_META.to_string());
package_assemble(&pkgmetapath, &access)?;
package_assemble(&pkgmetapath, &self.target, &access)?;
}

// --push only, needs ipkg file
Expand All @@ -90,8 +90,8 @@ impl PublishCmd {
}
}

pub fn package_assemble(pkgmeta: &str, access: &HubAccess) -> Result<String> {
let pkgname = hubutil::package_assemble_and_sign(pkgmeta, access, None)?;
pub fn package_assemble(pkgmeta: &str, target: &str, access: &HubAccess) -> Result<String> {
let pkgname = hubutil::package_assemble_and_sign(pkgmeta, access, None, Some(target))?;
println!("Package {pkgname} created");
Ok(pkgname)
}
Expand Down
154 changes: 149 additions & 5 deletions crates/fluvio-hub-util/src/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use std::path::Path;
use flate2::Compression;
use flate2::GzBuilder;
use flate2::read::GzDecoder;
use fluvio_hub_protocol::PkgTag;
use serde::{Deserialize, Serialize};
use sha2::{Digest, Sha512};
use tracing::{debug, warn};
Expand All @@ -21,6 +22,8 @@ use crate::PackageMetaExt;
use crate::keymgmt::{Keypair, PublicKey, Signature};
use crate::HubAccess;

pub(crate) const ARCH_TAG_NAME: &str = "arch";

/// assemble files into an unsigned fluvio package, a file will be created named
/// packagename-A.B.C.tar after signing it's called an ipkg
///
Expand All @@ -31,8 +34,9 @@ pub fn package_assemble_and_sign<P: AsRef<Path>>(
pkgmeta: P,
access: &HubAccess,
outdir: Option<&str>,
target: Option<&str>,
) -> Result<String> {
let tarname = package_assemble(pkgmeta, outdir)?;
let tarname = package_assemble(pkgmeta, outdir, target)?;
let ipkgname = tar_to_ipkg(&tarname);
let keypair = access.keypair()?;
package_sign(&tarname, &keypair, &ipkgname)?;
Expand All @@ -53,11 +57,16 @@ fn tar_to_ipkg(fname: &str) -> String {
/// * outdir: optional output directory
///
/// # Returns: staging tarfilename
fn package_assemble<P: AsRef<Path>>(pkgmeta: P, outdir: Option<&str>) -> Result<String> {
fn package_assemble<P: AsRef<Path>>(
pkgmeta: P,
outdir: Option<&str>,
target: Option<&str>,
) -> Result<String> {
debug!(target: "package_assemble", "opening");
let pm = PackageMeta::read_from_file(pkgmeta)?;
let mut pm_clean = pm.clone();
pm_clean.manifest = Vec::new();
augment_arch(&mut pm_clean, target);

let outdir = outdir.unwrap_or(DEF_HUB_INIT_DIR);
let pkgtarname = outdir.to_string() + "/" + &pm.packagefile_name_unsigned();
Expand Down Expand Up @@ -498,6 +507,27 @@ pub fn package_verify_with_readio<R: std::io::Read + std::io::Seek>(
Ok(())
}

fn augment_arch(package_meta: &mut PackageMeta, target: Option<&str>) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't augment_arch just accept a target instead of Option. Why call it at all if target is None? Or is this a useful pattern? Thinking about this because we may other optional package tags in the future...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, moving a if outside and making augment_arch accept target looks nicer. I changed it. Thanks.

if let Some(target) = target {
if package_meta
.tags
.as_ref()
.and_then(|tags| tags.iter().find(|t| t.tag.eq(ARCH_TAG_NAME)))
.is_none()
{
let arch_tag = PkgTag {
tag: String::from(ARCH_TAG_NAME),
value: target.to_owned(),
};
if let Some(ref mut tags) = package_meta.tags {
tags.push(arch_tag);
} else {
package_meta.tags = Some(vec![arch_tag]);
}
}
}
}

#[cfg(test)]
mod tests {
use std::fs::read;
Expand Down Expand Up @@ -535,8 +565,12 @@ mod tests {
#[test]
fn hubutil_package_get_meta() {
let testfile: &str = "tests/apackage/package-meta.yaml";
let pkgfile =
package_assemble(testfile, Some("tests/apackage")).expect("package assemble fail");
let pkgfile = package_assemble(
testfile,
Some("tests/apackage"),
Some("aarch64-unknown-linux-gnu"),
)
.expect("package assemble fail");

let pm_from_inner =
package_get_meta(pkgfile).expect("couldn't get meta file from package file");
Expand Down Expand Up @@ -566,7 +600,7 @@ mod tests {
fn hubutil_package_assemble() {
rust_log_init();
let testfile: &str = "tests/apackage/package-meta.yaml";
let res = package_assemble(testfile, Some("tests"));
let res = package_assemble(testfile, Some("tests"), None);
assert!(res.is_ok());
let outpath = std::path::Path::new("tests/example-0.0.1.tar");
assert!(outpath.exists());
Expand Down Expand Up @@ -643,4 +677,114 @@ mod tests {

assert!(result.is_err());
}

#[test]
fn test_augment_arch_if_not_present() {
//given
let mut package_meta = PackageMeta::default();

//when
augment_arch(&mut package_meta, Some("some_arch"));

//then
let tag = package_meta
.tags
.as_ref()
.and_then(|tags| tags.iter().find(|t| t.tag.eq(ARCH_TAG_NAME)));

assert_eq!(
tag,
Some(&PkgTag {
tag: ARCH_TAG_NAME.to_owned(),
value: "some_arch".to_owned()
})
)
}

#[test]
fn test_augment_arch_if_not_present_and_tags_not_empty() {
//given
let mut package_meta = PackageMeta {
tags: Some(vec![PkgTag {
tag: "other_tag".to_owned(),
value: "value".to_owned(),
}]),
..PackageMeta::default()
};

//when
augment_arch(&mut package_meta, Some("some_arch"));

//then
let tag = package_meta
.tags
.as_ref()
.and_then(|tags| tags.iter().find(|t| t.tag.eq(ARCH_TAG_NAME)));

assert_eq!(
tag,
Some(&PkgTag {
tag: ARCH_TAG_NAME.to_owned(),
value: "some_arch".to_owned()
})
)
}

#[test]
fn test_augment_arch_if_present() {
//given
let mut package_meta = PackageMeta {
tags: Some(vec![PkgTag {
tag: ARCH_TAG_NAME.to_owned(),
value: "present_arch".to_owned(),
}]),
..PackageMeta::default()
};

//when
augment_arch(&mut package_meta, Some("some_arch"));

//then
let tag = package_meta
.tags
.as_ref()
.and_then(|tags| tags.iter().find(|t| t.tag.eq(ARCH_TAG_NAME)));

assert_eq!(
tag,
Some(&PkgTag {
tag: ARCH_TAG_NAME.to_owned(),
value: "present_arch".to_owned()
})
)
}

#[test]
fn test_augment_arch_untouched_if_target_is_none() {
//given
let mut package_meta = PackageMeta {
tags: Some(vec![PkgTag {
tag: ARCH_TAG_NAME.to_owned(),
value: "present_arch".to_owned(),
}]),
..PackageMeta::default()
};

//when
augment_arch(&mut package_meta, None);

//then
let tag = package_meta
.tags
.as_ref()
.and_then(|tags| tags.iter().find(|t| t.tag.eq(ARCH_TAG_NAME)));

assert_eq!(
tag,
Some(&PkgTag {
tag: ARCH_TAG_NAME.to_owned(),
value: "present_arch".to_owned()
})
)
}
}
4 changes: 4 additions & 0 deletions crates/fluvio-hub-util/src/package_meta_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,10 @@ fn hub_package_meta_t_read() {
name: "example".into(),
version: "0.0.1".into(),
manifest: ["tests/apackage/module.wasm".into()].to_vec(),
tags: Some(vec![fluvio_hub_protocol::PkgTag {
tag: "arch".to_owned(),
value: "aarch64-unknown-linux-gnu".to_owned(),
}]),
..PackageMeta::default()
};

Expand Down
2 changes: 2 additions & 0 deletions crates/fluvio-hub-util/tests/apackage/package-meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ visibility: private
manifest:
- tests/apackage/module.wasm
tags:
- tag: arch
value: aarch64-unknown-linux-gnu
2 changes: 1 addition & 1 deletion crates/smartmodule-development-kit/src/publish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ impl PublishCmd {
}

pub fn package_assemble(pkgmeta: &str, access: &HubAccess) -> Result<String> {
let pkgname = hubutil::package_assemble_and_sign(pkgmeta, access, None)?;
let pkgname = hubutil::package_assemble_and_sign(pkgmeta, access, None, None)?;
println!("Package {pkgname} created");
Ok(pkgname)
}
Expand Down