package release import ( v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/empty" gmutate "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/types" wh "edge-infra.dev/pkg/f8n/warehouse" "edge-infra.dev/pkg/f8n/warehouse/oci" "edge-infra.dev/pkg/f8n/warehouse/pallet" ) const ( ReleaseImageName = "edge-release" ) var _ oci.Artifact = (*EdgeRelease)(nil) // EdgeRelease is an OCI artifact that acts as an index of pallets (packages) // included in an Edge Release // // An EdgeRelease can be used to generate a set of packages and their accompanying // sha256 values + tags that can be promoted to an environment type EdgeRelease struct { // Artifact is the OCI artifact representing the release as an ImageIndex. oci.Artifact // Metadata Metadata Metadata // Pallets Pallets []pallet.Pallet } func New(meta Metadata, pallets []pallet.Pallet) EdgeRelease { rel := &EdgeRelease{Metadata: meta, Pallets: pallets} palletAddendums := buildAddendums(meta.Version, pallets) idx := gmutate.AppendManifests(empty.Index, palletAddendums...) rel.Artifact = gmutate.IndexMediaType( oci.Annotate(idx, rel.Metadata.OCIAnnotations()).(v1.ImageIndex), types.OCIImageIndex, ).(oci.Artifact) return *rel } // buildAddendums the artifacts requested in a PalletManifest from a source repository // and returns IndexAddendums that are used to add to the EdgeRelease manifests func buildAddendums(version string, pallets []pallet.Pallet) []gmutate.IndexAddendum { palletAddendums := []gmutate.IndexAddendum{} for _, pall := range pallets { descrAnnos := pall.Metadata().OCIAnnotations() descrAnnos[AnnotationReleaseVersion] = version descrAnnos[wh.AnnotationClusterProviders] = pall.Providers().String() descrAnnos[wh.AnnotationCapabilities] = pall.Capabilities().String() add := gmutate.IndexAddendum{Add: pall.Unwrap(), Descriptor: v1.Descriptor{Annotations: descrAnnos}} palletAddendums = append(palletAddendums, add) } return palletAddendums }