...

Source file src/edge-infra.dev/pkg/f8n/warehouse/release/release.go

Documentation: edge-infra.dev/pkg/f8n/warehouse/release

     1  package release
     2  
     3  import (
     4  	v1 "github.com/google/go-containerregistry/pkg/v1"
     5  
     6  	"github.com/google/go-containerregistry/pkg/v1/empty"
     7  	gmutate "github.com/google/go-containerregistry/pkg/v1/mutate"
     8  	"github.com/google/go-containerregistry/pkg/v1/types"
     9  
    10  	wh "edge-infra.dev/pkg/f8n/warehouse"
    11  	"edge-infra.dev/pkg/f8n/warehouse/oci"
    12  	"edge-infra.dev/pkg/f8n/warehouse/pallet"
    13  )
    14  
    15  const (
    16  	ReleaseImageName = "edge-release"
    17  )
    18  
    19  var _ oci.Artifact = (*EdgeRelease)(nil)
    20  
    21  // EdgeRelease is an OCI artifact that acts as an index of pallets (packages)
    22  // included in an Edge Release
    23  //
    24  // An EdgeRelease can be used to generate a set of packages and their accompanying
    25  // sha256 values + tags that can be promoted to an environment
    26  type EdgeRelease struct {
    27  	// Artifact is the OCI artifact representing the release as an ImageIndex.
    28  	oci.Artifact
    29  
    30  	// Metadata
    31  	Metadata Metadata
    32  
    33  	// Pallets
    34  	Pallets []pallet.Pallet
    35  }
    36  
    37  func New(meta Metadata, pallets []pallet.Pallet) EdgeRelease {
    38  	rel := &EdgeRelease{Metadata: meta, Pallets: pallets}
    39  	palletAddendums := buildAddendums(meta.Version, pallets)
    40  
    41  	idx := gmutate.AppendManifests(empty.Index, palletAddendums...)
    42  
    43  	rel.Artifact = gmutate.IndexMediaType(
    44  		oci.Annotate(idx, rel.Metadata.OCIAnnotations()).(v1.ImageIndex), types.OCIImageIndex,
    45  	).(oci.Artifact)
    46  
    47  	return *rel
    48  }
    49  
    50  // buildAddendums the artifacts requested in a PalletManifest from a source repository
    51  // and returns IndexAddendums that are used to add to the EdgeRelease manifests
    52  func buildAddendums(version string, pallets []pallet.Pallet) []gmutate.IndexAddendum {
    53  	palletAddendums := []gmutate.IndexAddendum{}
    54  	for _, pall := range pallets {
    55  		descrAnnos := pall.Metadata().OCIAnnotations()
    56  		descrAnnos[AnnotationReleaseVersion] = version
    57  		descrAnnos[wh.AnnotationClusterProviders] = pall.Providers().String()
    58  		descrAnnos[wh.AnnotationCapabilities] = pall.Capabilities().String()
    59  		add := gmutate.IndexAddendum{Add: pall.Unwrap(), Descriptor: v1.Descriptor{Annotations: descrAnnos}}
    60  		palletAddendums = append(palletAddendums, add)
    61  	}
    62  
    63  	return palletAddendums
    64  }
    65  

View as plain text