From 485f5fc50078e05a62f3f915ecd9f2994017d7ae Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Wed, 2 Oct 2019 14:25:19 -0400 Subject: [PATCH] import podman runtime approach --- .../{get_analyzer.go => get_image_handler.go} | 8 ++-- dive/image/docker/{analyzer.go => image.go} | 23 +++++------- utils/docker.go | 37 ------------------- 3 files changed, 14 insertions(+), 54 deletions(-) rename dive/{get_analyzer.go => get_image_handler.go} (56%) rename dive/image/docker/{analyzer.go => image.go} (90%) delete mode 100644 utils/docker.go diff --git a/dive/get_analyzer.go b/dive/get_image_handler.go similarity index 56% rename from dive/get_analyzer.go rename to dive/get_image_handler.go index 1b3d465..69c1f67 100644 --- a/dive/get_analyzer.go +++ b/dive/get_image_handler.go @@ -1,12 +1,14 @@ package dive import ( + "fmt" "github.com/wagoodman/dive/dive/image" "github.com/wagoodman/dive/dive/image/docker" + "net/url" ) func GetAnalyzer(imageID string) image.Analyzer { - // u, _ := url.Parse(imageID) - // fmt.Printf("\n\nurl: %+v\n", u.Scheme) - return docker.NewImageAnalyzer(imageID) + u, _ := url.Parse(imageID) + fmt.Printf("\n\nurl: %+v\n", u.Scheme) + return docker.NewDockerImage(imageID) } diff --git a/dive/image/docker/analyzer.go b/dive/image/docker/image.go similarity index 90% rename from dive/image/docker/analyzer.go rename to dive/image/docker/image.go index 75fb0bf..adbd076 100644 --- a/dive/image/docker/analyzer.go +++ b/dive/image/docker/image.go @@ -19,7 +19,7 @@ import ( var dockerVersion string -type imageAnalyzer struct { +type dockerImage struct { id string client *client.Client jsonFiles map[string][]byte @@ -28,8 +28,8 @@ type imageAnalyzer struct { layers []*dockerLayer } -func NewImageAnalyzer(imageId string) *imageAnalyzer { - return &imageAnalyzer{ +func NewDockerImage(imageId string) *dockerImage { + return &dockerImage{ // store discovered json files in a map so we can read the image in one pass jsonFiles: make(map[string][]byte), layerMap: make(map[string]*filetree.FileTree), @@ -37,7 +37,7 @@ func NewImageAnalyzer(imageId string) *imageAnalyzer { } } -func (img *imageAnalyzer) Fetch() (io.ReadCloser, error) { +func (img *dockerImage) Fetch() (io.ReadCloser, error) { var err error // pull the img if it does not exist @@ -79,14 +79,9 @@ func (img *imageAnalyzer) Fetch() (io.ReadCloser, error) { } _, _, err = img.client.ImageInspectWithRaw(ctx, img.id) if err != nil { - - if !utils.IsDockerClientAvailable() { - return nil, fmt.Errorf("cannot find docker client executable") - } - // don't use the API, the CLI has more informative output fmt.Println("Image not available locally. Trying to pull '" + img.id + "'...") - err = utils.RunDockerCmd("pull", img.id) + err = runDockerCmd("pull", img.id) if err != nil { return nil, err } @@ -100,7 +95,7 @@ func (img *imageAnalyzer) Fetch() (io.ReadCloser, error) { return readCloser, nil } -func (img *imageAnalyzer) Parse(tarFile io.ReadCloser) error { +func (img *dockerImage) Parse(tarFile io.ReadCloser) error { tarReader := tar.NewReader(tarFile) var currentLayer uint @@ -144,7 +139,7 @@ func (img *imageAnalyzer) Parse(tarFile io.ReadCloser) error { return nil } -func (img *imageAnalyzer) Analyze() (*image.AnalysisResult, error) { +func (img *dockerImage) Analyze() (*image.AnalysisResult, error) { img.trees = make([]*filetree.FileTree, 0) manifest := newDockerImageManifest(img.jsonFiles["manifest.json"]) @@ -223,7 +218,7 @@ func (img *imageAnalyzer) Analyze() (*image.AnalysisResult, error) { }, nil } -func (img *imageAnalyzer) processLayerTar(name string, layerIdx uint, reader *tar.Reader) error { +func (img *dockerImage) processLayerTar(name string, layerIdx uint, reader *tar.Reader) error { tree := filetree.NewFileTree() tree.Name = name @@ -245,7 +240,7 @@ func (img *imageAnalyzer) processLayerTar(name string, layerIdx uint, reader *ta return nil } -func (img *imageAnalyzer) getFileList(tarReader *tar.Reader) ([]filetree.FileInfo, error) { +func (img *dockerImage) getFileList(tarReader *tar.Reader) ([]filetree.FileInfo, error) { var files []filetree.FileInfo for { diff --git a/utils/docker.go b/utils/docker.go deleted file mode 100644 index b5b9c1c..0000000 --- a/utils/docker.go +++ /dev/null @@ -1,37 +0,0 @@ -package utils - -import ( - "os" - "os/exec" - "strings" -) - -func IsDockerClientAvailable() bool { - _, err := exec.LookPath("docker") - return err == nil -} - -// RunDockerCmd runs a given Docker command in the current tty -func RunDockerCmd(cmdStr string, args ...string) error { - allArgs := cleanArgs(append([]string{cmdStr}, args...)) - - cmd := exec.Command("docker", allArgs...) - cmd.Env = os.Environ() - - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Stdin = os.Stdin - - return cmd.Run() -} - -// cleanArgs trims the whitespace from the given set of strings. -func cleanArgs(s []string) []string { - var r []string - for _, str := range s { - if str != "" { - r = append(r, strings.Trim(str, " ")) - } - } - return r -}