Skip to content

Commit

Permalink
rm libpod & shell out to podman binary
Browse files Browse the repository at this point in the history
  • Loading branch information
wagoodman committed Nov 8, 2019
1 parent 61ad1f2 commit 3fbc016
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 710 deletions.
8 changes: 6 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@ run-large: build
$(BUILD_PATH) amir20/clashleaders:latest

run-podman: build
$(BUILD_PATH) localhost/dive-example:latest --source podman

run-podman-build: build
podman build -t dive-example:latest -f .data/Dockerfile.example .
$(BUILD_PATH) localhost/dive-example:latest --engine podman
$(BUILD_PATH) localhost/dive-example:latest --source podman


run-podman-large: build
$(BUILD_PATH) docker.io/amir20/clashleaders:latest --engine podman
$(BUILD_PATH) docker.io/amir20/clashleaders:latest --source podman

run-ci: build
CI=true $(BUILD_PATH) dive-example:latest --ci-config .data/.dive-ci
Expand Down
20 changes: 20 additions & 0 deletions dive/image/podman/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package podman
import (
"fmt"
"github.com/wagoodman/dive/utils"
"io"
"os"
"os/exec"
)
Expand All @@ -27,6 +28,25 @@ func runPodmanCmd(cmdStr string, args ...string) error {
return cmd.Run()
}

func streamPodmanCmd(args ...string) (error, io.Reader) {
if !isPodmanClientBinaryAvailable() {
return fmt.Errorf("cannot find podman client executable"), nil
}

cmd := exec.Command("podman", utils.CleanArgs(args)...)
cmd.Env = os.Environ()

reader, writer, err := os.Pipe()
if err != nil {
return err, nil
}

cmd.Stdout = writer
cmd.Stderr = os.Stderr

return cmd.Start(), reader
}

func isPodmanClientBinaryAvailable() bool {
_, err := exec.LookPath("podman")
return err == nil
Expand Down
128 changes: 0 additions & 128 deletions dive/image/podman/image_directory.go

This file was deleted.

78 changes: 0 additions & 78 deletions dive/image/podman/layer.go

This file was deleted.

92 changes: 4 additions & 88 deletions dive/image/podman/resolver_linux.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package podman

import (
"bufio"
"context"
"fmt"
"github.com/containers/libpod/libpod"
"github.com/wagoodman/dive/dive/image"
"github.com/wagoodman/dive/dive/image/docker"
"io/ioutil"
"os"
)

type resolver struct{}
Expand All @@ -26,105 +22,25 @@ func (r *resolver) Build(args []string) (*image.Image, error) {
}

func (r *resolver) Fetch(id string) (*image.Image, error) {
// todo: there are still a number of bugs remaining with this approach --stick with the docker archive for now
// img, err := r.resolveFromDisk(id)
// if err == nil {
// return img, err
// }
// todo: add podman fetch attempt via varlink first...

img, err := r.resolveFromDockerArchive(id)
if err == nil {
return img, err
}

return nil, fmt.Errorf("unable to resolve image '%s'", id)
return nil, fmt.Errorf("unable to resolve image '%s': %+v", id, err)
}

// func (r *resolver) resolveFromDisk(id string) (*image.Image, error) {
// var img *ImageDirectoryRef
// var err error
//
// runtime, err := libpod.NewRuntime(context.TODO())
// if err != nil {
// return nil, err
// }
//
// images, err := runtime.ImageRuntime().GetImages()
// if err != nil {
// return nil, err
// }
//
// ImageLoop:
// for _, candidateImage := range images {
// for _, name := range candidateImage.Names() {
// if name == id {
// img, err = NewImageDirectoryRef(candidateImage)
// if err != nil {
// return nil, err
// }
// break ImageLoop
// }
// }
// }
//
// if img == nil {
// return nil, fmt.Errorf("could not find image by name: '%s'", id)
// }
//
// return img.ToImage()
// }

func (r *resolver) resolveFromDockerArchive(id string) (*image.Image, error) {
path, err := r.fetchDockerArchive(id)
if err != nil {
return nil, err
}
defer os.Remove(path)

file, err := os.Open(path)
err, reader := streamPodmanCmd("image", "save", id)
if err != nil {
return nil, err
}
defer file.Close()

img, err := docker.NewImageArchive(ioutil.NopCloser(bufio.NewReader(file)))
img, err := docker.NewImageArchive(ioutil.NopCloser(reader))
if err != nil {
return nil, err
}
return img.ToImage()
}

func (r *resolver) fetchDockerArchive(id string) (string, error) {
var err error
var ctx = context.Background()

runtime, err := libpod.NewRuntime(ctx)
if err != nil {
return "", err
}

images, err := runtime.ImageRuntime().GetImages()
if err != nil {
return "", err
}

for _, item := range images {
for _, name := range item.Names() {
if name == id {
file, err := ioutil.TempFile(os.TempDir(), "dive-resolver-tar")
if err != nil {
return "", err
}

err = item.Save(ctx, "dive-export", "docker-archive", file.Name(), []string{}, false, false)
if err != nil {
return "", err
}

return file.Name(), nil
}
}
}

return "", fmt.Errorf("image could not be found")
}

0 comments on commit 3fbc016

Please sign in to comment.