Skip to content

Commit

Permalink
feat(cdk): supply arch tag on publish if not set (#3080)
Browse files Browse the repository at this point in the history
The presence of `arch` tag is required for multi-arch packaging. If it is not specified in `package-meta.yaml` we supply it before publishing (to be precise, before the package assembling).
  • Loading branch information
Alexander Galibey committed Mar 20, 2023
1 parent e1d0575 commit a84df7e
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 10 deletions.
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
125 changes: 120 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,18 @@ 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();
if let Some(target) = target {
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 +509,25 @@ pub fn package_verify_with_readio<R: std::io::Read + std::io::Seek>(
Ok(())
}

fn augment_arch(package_meta: &mut PackageMeta, target: &str) {
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,85 @@ 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_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_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_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()
})
)
}
}
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

0 comments on commit a84df7e

Please sign in to comment.