fix: Generate correct image names based on user supplied arguments

This commit is contained in:
Gerald Pinder 2024-09-07 01:47:37 -04:00
parent e6cce3d542
commit 2f3edeb1a5
7 changed files with 66 additions and 75 deletions

View file

@ -5,6 +5,7 @@
//! labels for an image.
use std::{
borrow::Borrow,
collections::{hash_map::Entry, HashMap},
fmt::Debug,
process::{ExitStatus, Output},
@ -17,7 +18,7 @@ use log::{debug, info, trace};
use miette::{miette, Result};
use oci_distribution::Reference;
use once_cell::sync::Lazy;
use opts::GenerateTagsOpts;
use opts::{GenerateImageNameOpts, GenerateTagsOpts};
#[cfg(feature = "sigstore")]
use sigstore_driver::SigstoreDriver;
use typed_builder::TypedBuilder;
@ -402,10 +403,10 @@ impl CiDriver for Driver {
impl_ci_driver!(get_registry())
}
fn generate_image_name<S>(name: S) -> Result<Reference>
fn generate_image_name<'a, O>(opts: O) -> Result<Reference>
where
S: AsRef<str>,
O: Borrow<GenerateImageNameOpts<'a>>,
{
impl_ci_driver!(generate_image_name(name))
impl_ci_driver!(generate_image_name(opts))
}
}

View file

@ -1,7 +1,6 @@
use blue_build_utils::string_vec;
use log::trace;
use miette::{bail, Context, IntoDiagnostic};
use oci_distribution::Reference;
use miette::bail;
use super::{opts::GenerateTagsOpts, CiDriver, Driver};
@ -37,19 +36,6 @@ impl CiDriver for LocalDriver {
))
}
fn generate_image_name<S>(name: S) -> miette::Result<Reference>
where
S: AsRef<str>,
{
fn inner(name: &str) -> miette::Result<Reference> {
trace!("LocalDriver::generate_image_name({name})");
name.parse()
.into_diagnostic()
.with_context(|| format!("Unable to parse {name}"))
}
inner(&name.as_ref().trim().to_lowercase())
}
fn get_repo_url() -> miette::Result<String> {
trace!("LocalDriver::get_repo_url()");
Ok(String::new())
@ -57,6 +43,6 @@ impl CiDriver for LocalDriver {
fn get_registry() -> miette::Result<String> {
trace!("LocalDriver::get_registry()");
Ok(String::new())
Ok(String::from("localhost"))
}
}

View file

@ -10,3 +10,15 @@ pub struct GenerateTagsOpts<'scope> {
#[builder(default, setter(into))]
pub alt_tags: Option<Vec<Cow<'scope, str>>>,
}
#[derive(Debug, Clone, TypedBuilder)]
pub struct GenerateImageNameOpts<'scope> {
#[builder(default, setter(into))]
pub name: Cow<'scope, str>,
#[builder(default, setter(into))]
pub registry: Option<Cow<'scope, str>>,
#[builder(default, setter(into))]
pub registry_namespace: Option<Cow<'scope, str>>,
}

View file

@ -1,4 +1,5 @@
use std::{
borrow::Borrow,
path::PathBuf,
process::{ExitStatus, Output},
};
@ -14,9 +15,9 @@ use crate::drivers::{functions::get_private_key, types::CiDriverType, Driver};
use super::{
image_metadata::ImageMetadata,
opts::{
BuildOpts, BuildTagPushOpts, CheckKeyPairOpts, GenerateKeyPairOpts, GenerateTagsOpts,
GetMetadataOpts, PushOpts, RunOpts, SignOpts, SignVerifyOpts, TagOpts, VerifyOpts,
VerifyType,
BuildOpts, BuildTagPushOpts, CheckKeyPairOpts, GenerateImageNameOpts, GenerateKeyPairOpts,
GenerateTagsOpts, GetMetadataOpts, PushOpts, RunOpts, SignOpts, SignVerifyOpts, TagOpts,
VerifyOpts, VerifyType,
},
};
@ -308,27 +309,34 @@ pub trait CiDriver {
///
/// # Errors
/// Will error if the environment variables aren't set.
fn generate_tags(oci_ref: &GenerateTagsOpts) -> Result<Vec<String>>;
fn generate_tags(opts: &GenerateTagsOpts) -> Result<Vec<String>>;
/// Generates the image name based on CI.
///
/// # Errors
/// Will error if the environment variables aren't set.
fn generate_image_name<S>(name: S) -> Result<Reference>
fn generate_image_name<'a, O>(opts: O) -> Result<Reference>
where
S: AsRef<str>,
O: Borrow<GenerateImageNameOpts<'a>>,
{
fn inner(name: &str, registry: &str) -> Result<Reference> {
let image = format!("{registry}/{name}");
fn inner(opts: &GenerateImageNameOpts, driver_registry: &str) -> Result<Reference> {
let image = match (&opts.registry, &opts.registry_namespace) {
(Some(registry), Some(registry_namespace)) => {
format!("{registry}/{registry_namespace}/{}", &opts.name)
}
(Some(registry), None) => {
format!("{registry}/{}", &opts.name)
}
_ => {
format!("{}/{}", driver_registry, &opts.name)
}
};
image
.parse()
.into_diagnostic()
.with_context(|| format!("Unable to parse image {image}"))
}
inner(
&name.as_ref().trim().to_lowercase(),
&Self::get_registry()?.to_lowercase(),
)
inner(opts.borrow(), &Self::get_registry()?)
}
/// Get the URL for the repository.