Skip to content
This repository was archived by the owner on Jan 19, 2026. It is now read-only.

Commit 6a2a256

Browse files
feat: add gh release tag to ArtifactHubPkg
Signed-off-by: Fabrizio Sestito <fabrizio.sestito@suse.com>
1 parent a08e0c3 commit 6a2a256

File tree

1 file changed

+48
-10
lines changed

1 file changed

+48
-10
lines changed

src/policy_artifacthub.rs

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ impl ArtifactHubPkg {
155155
pub fn from_metadata(
156156
metadata: &Metadata,
157157
version: &str,
158+
gh_release_tag: Option<&str>,
158159
created_at: OffsetDateTime,
159160
questions: Option<&str>,
160161
) -> Result<Self> {
@@ -182,7 +183,7 @@ impl ArtifactHubPkg {
182183
let home_url = parse_home_url(metadata_annots)?;
183184
let containers_images = parse_containers_images(metadata_annots, &semver_version)?;
184185
let keywords = parse_keywords(metadata_annots)?;
185-
let links = parse_links(metadata_annots, &semver_version)?;
186+
let links = parse_links(metadata_annots, &semver_version, gh_release_tag)?;
186187
let install = parse_oci_url(metadata_annots, &semver_version)?.map(compose_install);
187188
let maintainers = parse_maintainers(metadata_annots)?;
188189
let annotations = parse_annotations(metadata_annots, metadata, questions)?;
@@ -327,6 +328,7 @@ fn parse_keywords(metadata_annots: &BTreeMap<String, String>) -> Result<Option<V
327328
fn parse_links(
328329
metadata_annots: &BTreeMap<String, String>,
329330
version: &Version,
331+
gh_release_tag: Option<&str>,
330332
) -> Result<Option<Vec<Link>>> {
331333
match metadata_annots.get(KUBEWARDEN_ANNOTATION_POLICY_SOURCE) {
332334
Some(s) => {
@@ -336,11 +338,17 @@ fn parse_links(
336338
})?;
337339
match policy_source.host_str() == Some("github.com") {
338340
true => {
341+
let release = if let Some(tag) = gh_release_tag {
342+
url::form_urlencoded::byte_serialize(tag.as_bytes()).collect::<String>()
343+
} else {
344+
format!("v{}", version)
345+
};
346+
339347
let url = Url::parse(
340348
format!(
341-
"{}/releases/download/v{}/policy.wasm",
349+
"{}/releases/download/{}/policy.wasm",
342350
policy_source.as_str(),
343-
version.to_string().as_str(),
351+
release
344352
)
345353
.as_str(),
346354
)
@@ -587,6 +595,7 @@ mod tests {
587595
let arthub = ArtifactHubPkg::from_metadata(
588596
&Metadata::default(),
589597
"0.2.1",
598+
None,
590599
OffsetDateTime::UNIX_EPOCH,
591600
None,
592601
);
@@ -597,14 +606,20 @@ mod tests {
597606
annotations: Some(BTreeMap::from([])),
598607
..Default::default()
599608
};
600-
let arthub =
601-
ArtifactHubPkg::from_metadata(&metadata, "0.2.1", OffsetDateTime::UNIX_EPOCH, None);
609+
let arthub = ArtifactHubPkg::from_metadata(
610+
&metadata,
611+
"0.2.1",
612+
None,
613+
OffsetDateTime::UNIX_EPOCH,
614+
None,
615+
);
602616
assert_eq!(arthub.unwrap_err(), ArtifactHubError::NoAnnotations);
603617

604618
// check version is semver
605619
let arthub = ArtifactHubPkg::from_metadata(
606620
&mock_metadata_with_minimum_required(),
607621
"not-semver",
622+
None,
608623
OffsetDateTime::UNIX_EPOCH,
609624
None,
610625
);
@@ -618,8 +633,13 @@ mod tests {
618633
annotations: Some(BTreeMap::from([(String::from("foo"), String::from("bar"))])),
619634
..Default::default()
620635
};
621-
let arthub =
622-
ArtifactHubPkg::from_metadata(&metadata, "0.2.1", OffsetDateTime::UNIX_EPOCH, Some(""));
636+
let arthub = ArtifactHubPkg::from_metadata(
637+
&metadata,
638+
"0.2.1",
639+
None,
640+
OffsetDateTime::UNIX_EPOCH,
641+
Some(""),
642+
);
623643
assert_eq!(arthub.unwrap_err(), ArtifactHubError::EmptyQuestionsUI);
624644

625645
Ok(())
@@ -681,7 +701,7 @@ mod tests {
681701
)]);
682702

683703
assert_eq!(
684-
parse_links(&source_annot, &semver_version).unwrap(),
704+
parse_links(&source_annot, &semver_version, None).unwrap(),
685705
Some(vec![
686706
Link {
687707
name: ConstLinkName::Policy,
@@ -695,14 +715,30 @@ mod tests {
695715
])
696716
);
697717
assert_eq!(
698-
parse_links(&source_annot_not_github, &semver_version).unwrap(),
718+
parse_links(&source_annot, &semver_version, Some("SomePolicy/v0.2.1")).unwrap(),
719+
Some(vec![
720+
Link {
721+
name: ConstLinkName::Policy,
722+
url: Url::parse(
723+
"https://github.com/repo/releases/download/SomePolicy%2Fv0.2.1/policy.wasm"
724+
)
725+
.unwrap(),
726+
},
727+
Link {
728+
name: ConstLinkName::Source,
729+
url: Url::parse("https://github.com/repo").unwrap(),
730+
}
731+
])
732+
);
733+
assert_eq!(
734+
parse_links(&source_annot_not_github, &semver_version, None).unwrap(),
699735
Some(vec![Link {
700736
name: ConstLinkName::Source,
701737
url: Url::parse("https://notgithub.com/repo").unwrap(),
702738
}])
703739
);
704740
assert!(matches!(
705-
parse_links(&source_annot_badurl, &semver_version).unwrap_err(),
741+
parse_links(&source_annot_badurl, &semver_version, None).unwrap_err(),
706742
ArtifactHubError::MalformedURL { .. }
707743
));
708744

@@ -795,6 +831,7 @@ mod tests {
795831
let artif = ArtifactHubPkg::from_metadata(
796832
&mock_metadata_with_minimum_required(),
797833
"0.2.1",
834+
None,
798835
OffsetDateTime::UNIX_EPOCH,
799836
None,
800837
)
@@ -845,6 +882,7 @@ kwctl scaffold manifest -t ClusterAdmissionPolicy registry://ghcr.io/ocirepo/nam
845882
let artif = ArtifactHubPkg::from_metadata(
846883
&mock_metadata_with_all(),
847884
"0.2.1",
885+
None,
848886
OffsetDateTime::UNIX_EPOCH,
849887
Some("questions contents"),
850888
)

0 commit comments

Comments
 (0)