package clients import ( "fmt" "strings" "github.com/google/go-containerregistry/pkg/name" "edge-infra.dev/pkg/f8n/warehouse/oci" "edge-infra.dev/pkg/f8n/warehouse/oci/remote" ) //go:generate mockgen -destination=../mocks/mock_artifact_registry_client.go -package=mocks edge-infra.dev/pkg/edge/api/clients ArtifactRegistryClient type ArtifactRegistryClient interface { Get(project, artifactName, artifactVersion string) (oci.Artifact, error) } type artifactRegistryClient struct { registry string } func (a *artifactRegistryClient) Get(project, artifactName, artifactVersion string) (oci.Artifact, error) { ref, err := name.ParseReference( fmt.Sprintf("%s/%s/warehouse/%s", a.registry, project, imageString(artifactName, artifactVersion)), name.StrictValidation, ) if err != nil { return nil, err } return remote.Get(ref) } func NewArtifactRegistryClient(registry string) *artifactRegistryClient { //nolint: revive return &artifactRegistryClient{registry: registry} } // imageString takes an artifact name and version, which may represent either a tag or a digest. // E.g., `sha256:dd7b3d1a41e45f867441a27bd20f88980aee2a7d7bee3a5b7e0e925aeeea1474` is a digest and // `latest` or `0.12` are tags // Returns a properly formatted image string suitable for use in a registry reference func imageString(name, version string) string { if strings.Contains(version, ":") { // is a digest return fmt.Sprintf("%s@%s", name, version) } // is a tag return fmt.Sprintf("%s:%s", name, version) }