diff --git a/image/config.go b/image/config.go index d28b1bc..71d98a7 100644 --- a/image/config.go +++ b/image/config.go @@ -31,10 +31,8 @@ import ( "github.com/pkg/errors" ) -type config v1.Image - -func findConfig(w walker, d *v1.Descriptor) (*config, error) { - var c config +func findConfig(w walker, d *v1.Descriptor) (*v1.Image, error) { + var c v1.Image cpath := filepath.Join("blobs", string(d.Digest.Algorithm()), d.Digest.Hex()) switch err := w.walk(func(path string, info os.FileInfo, r io.Reader) error { @@ -65,7 +63,7 @@ func findConfig(w walker, d *v1.Descriptor) (*config, error) { } } -func (c *config) runtimeSpec(rootfs string) (*specs.Spec, error) { +func runtimeSpec(c *v1.Image, rootfs string) (*specs.Spec, error) { if c.OS != "linux" { return nil, fmt.Errorf("%s: unsupported OS", c.OS) } diff --git a/image/image.go b/image/image.go index e5c0fe1..e840a39 100644 --- a/image/image.go +++ b/image/image.go @@ -105,7 +105,7 @@ func validate(w walker, refs []string, out *log.Logger) error { return err } - if err := m.validate(w); err != nil { + if err := validateManifest(m, w); err != nil { return err } } @@ -131,7 +131,7 @@ func validate(w walker, refs []string, out *log.Logger) error { return err } - if err := m.validate(w); err != nil { + if err := validateManifest(m, w); err != nil { return err } } @@ -198,11 +198,11 @@ func unpack(w walker, dest, refName, platform string) error { return err } - if err := m.validate(w); err != nil { + if err := validateManifest(m, w); err != nil { return err } - return m.unpack(w, dest) + return unpackManifest(m, w, dest) } if ref.MediaType == validRefMediaTypes[1] { @@ -221,7 +221,7 @@ func unpack(w walker, dest, refName, platform string) error { } for _, m := range manifests { - return m.unpack(w, dest) + return unpackManifest(m, w, dest) } } @@ -281,7 +281,7 @@ func createRuntimeBundle(w walker, dest, refName, rootfs, platform string) error return err } - if err := m.validate(w); err != nil { + if err := validateManifest(m, w); err != nil { return err } @@ -311,7 +311,7 @@ func createRuntimeBundle(w walker, dest, refName, rootfs, platform string) error return nil } -func createBundle(w walker, m *manifest, dest, rootfs string) (retErr error) { +func createBundle(w walker, m *v1.Manifest, dest, rootfs string) (retErr error) { c, err := findConfig(w, &m.Config) if err != nil { return err @@ -334,11 +334,11 @@ func createBundle(w walker, m *manifest, dest, rootfs string) (retErr error) { } } - if err = m.unpack(w, filepath.Join(dest, rootfs)); err != nil { + if err = unpackManifest(m, w, filepath.Join(dest, rootfs)); err != nil { return err } - spec, err := c.runtimeSpec(rootfs) + spec, err := runtimeSpec(c, rootfs) if err != nil { return err } @@ -353,8 +353,8 @@ func createBundle(w walker, m *manifest, dest, rootfs string) (retErr error) { } // filertManifest returns a filtered list of manifests -func filterManifest(w walker, Manifests []v1.Descriptor, platform string) ([]*manifest, error) { - var manifests []*manifest +func filterManifest(w walker, Manifests []v1.Descriptor, platform string) ([]*v1.Manifest, error) { + var manifests []*v1.Manifest argsParts := strings.Split(platform, ":") if len(argsParts) != 2 { @@ -372,7 +372,7 @@ func filterManifest(w walker, Manifests []v1.Descriptor, platform string) ([]*ma return manifests, err } - if err := m.validate(w); err != nil { + if err := validateManifest(m, w); err != nil { return manifests, err } if strings.EqualFold(manifest.Platform.OS, argsParts[0]) && strings.EqualFold(manifest.Platform.Architecture, argsParts[1]) { diff --git a/image/manifest.go b/image/manifest.go index 2678c7f..833be7b 100644 --- a/image/manifest.go +++ b/image/manifest.go @@ -35,13 +35,8 @@ import ( "github.com/sirupsen/logrus" ) -type manifest struct { - Config v1.Descriptor `json:"config"` - Layers []v1.Descriptor `json:"layers"` -} - -func findManifest(w walker, d *v1.Descriptor) (*manifest, error) { - var m manifest +func findManifest(w walker, d *v1.Descriptor) (*v1.Manifest, error) { + var m v1.Manifest mpath := filepath.Join("blobs", string(d.Digest.Algorithm()), d.Digest.Hex()) switch err := w.walk(func(path string, info os.FileInfo, r io.Reader) error { @@ -73,7 +68,7 @@ func findManifest(w walker, d *v1.Descriptor) (*manifest, error) { } } -func (m *manifest) validate(w walker) error { +func validateManifest(m *v1.Manifest, w walker) error { if err := validateDescriptor(&m.Config, w, []string{v1.MediaTypeImageConfig}); err != nil { return errors.Wrap(err, "config validation failed") } @@ -94,7 +89,7 @@ func (m *manifest) validate(w walker) error { return nil } -func (m *manifest) unpack(w walker, dest string) (retErr error) { +func unpackManifest(m *v1.Manifest, w walker, dest string) (retErr error) { // error out if the dest directory is not empty s, err := ioutil.ReadDir(dest) if err != nil && !os.IsNotExist(err) { // We'll create the dir later diff --git a/image/manifest_test.go b/image/manifest_test.go index bb15870..bd79dce 100644 --- a/image/manifest_test.go +++ b/image/manifest_test.go @@ -141,7 +141,7 @@ func testUnpackLayer(t *testing.T, compression string, invalid bool) { mediatype += "+" + compression } - testManifest := manifest{ + testManifest := v1.Manifest{ Layers: []v1.Descriptor{ { MediaType: mediatype, @@ -149,7 +149,7 @@ func testUnpackLayer(t *testing.T, compression string, invalid bool) { }, }, } - err = testManifest.unpack(newPathWalker(tmp1), filepath.Join(tmp1, "rootfs")) + err = unpackManifest(&testManifest, newPathWalker(tmp1), filepath.Join(tmp1, "rootfs")) if err != nil { t.Fatal(errors.Wrapf(err, "%q / %s", blobPath, compression)) } @@ -212,7 +212,7 @@ func TestUnpackLayerRemovePartiallyUnpackedFile(t *testing.T) { t.Fatal(err) } - testManifest := manifest{ + testManifest := v1.Manifest{ Layers: []v1.Descriptor{ { MediaType: "application/vnd.oci.image.layer.v1.tar+gzip", @@ -220,7 +220,7 @@ func TestUnpackLayerRemovePartiallyUnpackedFile(t *testing.T) { }, }, } - err = testManifest.unpack(newPathWalker(tmp1), filepath.Join(tmp1, "rootfs")) + err = unpackManifest(&testManifest, newPathWalker(tmp1), filepath.Join(tmp1, "rootfs")) if err != nil && !strings.Contains(err.Error(), "duplicate entry for") { t.Fatal(err) }