...

Source file src/github.com/docker/distribution/testutil/manifests.go

Documentation: github.com/docker/distribution/testutil

     1  package testutil
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/docker/distribution"
     7  	"github.com/docker/distribution/context"
     8  	"github.com/docker/distribution/manifest"
     9  	"github.com/docker/distribution/manifest/manifestlist"
    10  	"github.com/docker/distribution/manifest/schema1"
    11  	"github.com/docker/distribution/manifest/schema2"
    12  	"github.com/docker/libtrust"
    13  	"github.com/opencontainers/go-digest"
    14  )
    15  
    16  // MakeManifestList constructs a manifest list out of a list of manifest digests
    17  func MakeManifestList(blobstatter distribution.BlobStatter, manifestDigests []digest.Digest) (*manifestlist.DeserializedManifestList, error) {
    18  	ctx := context.Background()
    19  
    20  	var manifestDescriptors []manifestlist.ManifestDescriptor
    21  	for _, manifestDigest := range manifestDigests {
    22  		descriptor, err := blobstatter.Stat(ctx, manifestDigest)
    23  		if err != nil {
    24  			return nil, err
    25  		}
    26  		platformSpec := manifestlist.PlatformSpec{
    27  			Architecture: "atari2600",
    28  			OS:           "CP/M",
    29  			Variant:      "ternary",
    30  			Features:     []string{"VLIW", "superscalaroutoforderdevnull"},
    31  		}
    32  		manifestDescriptor := manifestlist.ManifestDescriptor{
    33  			Descriptor: descriptor,
    34  			Platform:   platformSpec,
    35  		}
    36  		manifestDescriptors = append(manifestDescriptors, manifestDescriptor)
    37  	}
    38  
    39  	return manifestlist.FromDescriptors(manifestDescriptors)
    40  }
    41  
    42  // MakeSchema1Manifest constructs a schema 1 manifest from a given list of digests and returns
    43  // the digest of the manifest
    44  func MakeSchema1Manifest(digests []digest.Digest) (distribution.Manifest, error) {
    45  	manifest := schema1.Manifest{
    46  		Versioned: manifest.Versioned{
    47  			SchemaVersion: 1,
    48  		},
    49  		Name: "who",
    50  		Tag:  "cares",
    51  	}
    52  
    53  	for _, digest := range digests {
    54  		manifest.FSLayers = append(manifest.FSLayers, schema1.FSLayer{BlobSum: digest})
    55  		manifest.History = append(manifest.History, schema1.History{V1Compatibility: ""})
    56  	}
    57  
    58  	pk, err := libtrust.GenerateECP256PrivateKey()
    59  	if err != nil {
    60  		return nil, fmt.Errorf("unexpected error generating private key: %v", err)
    61  	}
    62  
    63  	signedManifest, err := schema1.Sign(&manifest, pk)
    64  	if err != nil {
    65  		return nil, fmt.Errorf("error signing manifest: %v", err)
    66  	}
    67  
    68  	return signedManifest, nil
    69  }
    70  
    71  // MakeSchema2Manifest constructs a schema 2 manifest from a given list of digests and returns
    72  // the digest of the manifest
    73  func MakeSchema2Manifest(repository distribution.Repository, digests []digest.Digest) (distribution.Manifest, error) {
    74  	ctx := context.Background()
    75  	blobStore := repository.Blobs(ctx)
    76  	builder := schema2.NewManifestBuilder(blobStore, schema2.MediaTypeImageConfig, []byte{})
    77  	for _, digest := range digests {
    78  		builder.AppendReference(distribution.Descriptor{Digest: digest})
    79  	}
    80  
    81  	manifest, err := builder.Build(ctx)
    82  	if err != nil {
    83  		return nil, fmt.Errorf("unexpected error generating manifest: %v", err)
    84  	}
    85  
    86  	return manifest, nil
    87  }
    88  

View as plain text