manifests.go 2.7 KB

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