internal/testutils/specialimage/random.go
package specialimage
import (
"math/rand"
"strconv"
"github.com/distribution/reference"
"github.com/opencontainers/go-digest"
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
)
func RandomSinglePlatform(dir string, platform ocispec.Platform, source rand.Source) (*ocispec.Index, error) {
r := rand.New(source) //nolint:gosec // Ignore G404: Use of weak random number generator (math/rand instead of crypto/rand)
imageRef := "random-" + strconv.FormatInt(r.Int63(), 10) + ":latest"
layerCount := r.Intn(8)
var layers []ocispec.Descriptor
for i := 0; i < layerCount; i++ {
layerDesc, err := writeLayerWithOneFile(dir, "layer-"+strconv.Itoa(i), []byte(strconv.Itoa(i)))
if err != nil {
return nil, err
}
layers = append(layers, layerDesc)
}
configDesc, err := writeJsonBlob(dir, ocispec.MediaTypeImageConfig, ocispec.Image{
Platform: platform,
Config: ocispec.ImageConfig{
Env: []string{"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"},
},
RootFS: ocispec.RootFS{
Type: "layers",
DiffIDs: layersToDigests(layers),
},
})
if err != nil {
return nil, err
}
manifest := ocispec.Manifest{
MediaType: ocispec.MediaTypeImageManifest,
Config: configDesc,
Layers: layers,
}
legacyManifests := []manifestItem{
{
Config: blobPath(configDesc),
RepoTags: []string{imageRef},
Layers: blobPaths(layers),
},
}
ref, err := reference.ParseNormalizedNamed(imageRef)
if err != nil {
return nil, err
}
return singlePlatformImage(dir, ref, manifest, legacyManifests)
}
func layersToDigests(layers []ocispec.Descriptor) []digest.Digest {
var digests []digest.Digest
for _, l := range layers {
digests = append(digests, l.Digest)
}
return digests
}
func blobPaths(descriptors []ocispec.Descriptor) []string {
var paths []string
for _, d := range descriptors {
paths = append(paths, blobPath(d))
}
return paths
}