From 16ac95891e0cb6c4ad7c906050d631d866a5eae6 Mon Sep 17 00:00:00 2001 From: Julien Garcia Gonzalez Date: Wed, 7 Mar 2018 15:28:51 +0100 Subject: [PATCH 1/2] Fix temporary file path Signed-off-by: Julien Garcia Gonzalez --- docker/dockercli/dockercli.go | 49 +++++++++++++++--------------- docker/dockercli/dockercli_test.go | 45 +++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 25 deletions(-) create mode 100644 docker/dockercli/dockercli_test.go diff --git a/docker/dockercli/dockercli.go b/docker/dockercli/dockercli.go index d8d5f98..750f09f 100644 --- a/docker/dockercli/dockercli.go +++ b/docker/dockercli/dockercli.go @@ -25,12 +25,11 @@ import ( var log = capnslog.NewPackageLogger("github.com/jgsqware/clairctl", "dockercli") -//GetLocalManifest retrieve manifest for local image -func GetLocalManifest(imageName string, withExport bool) (reference.NamedTagged, distribution.Manifest, error) { +func parseImage(imageName string) (reference.NamedTagged, error) { n, err := reference.ParseNamed(imageName) if err != nil { - return nil, nil, err + return nil, err } var image reference.NamedTagged if reference.IsNameOnly(n) { @@ -38,14 +37,27 @@ func GetLocalManifest(imageName string, withExport bool) (reference.NamedTagged, } else { image = n.(reference.NamedTagged) } + + return image, nil + +} + +func tempImagePath(image reference.NamedTagged) string { + + return strings.Replace(strings.Replace(fmt.Sprintf("%s/%s", image.FullName(), image.Tag()), ".", "", -1), ":", "", -1) +} + +//GetLocalManifest retrieve manifest for local image +func GetLocalManifest(imageName string, withExport bool) (reference.NamedTagged, distribution.Manifest, error) { + image, err := parseImage(imageName) if err != nil { return nil, nil, err } var manifest distribution.Manifest if withExport { - manifest, err = save(image.Name() + ":" + image.Tag()) + manifest, err = save(image) } else { - manifest, err = historyFromCommand(image.Name() + ":" + image.Tag()) + manifest, err = historyFromCommand(image) } if err != nil { @@ -57,22 +69,9 @@ func GetLocalManifest(imageName string, withExport bool) (reference.NamedTagged, return image, m, err } -func saveImage(imageName string, fo *os.File) error { - - return nil - // save.Stderr = &stderr - - // save.Stdout = writer - // err := save.Run() - // if err != nil { - // return errors.New(stderr.String()) - // } - - // return nil -} +func save(image reference.NamedTagged) (distribution.Manifest, error) { -func save(imageName string) (distribution.Manifest, error) { - path := config.TmpLocal() + "/" + strings.Split(imageName, ":")[0] + "/blobs" + path := config.TmpLocal() + "/" + tempImagePath(image) + "/blobs" if _, err := os.Stat(path); os.IsExist(err) { err := os.RemoveAll(path) @@ -86,7 +85,7 @@ func save(imageName string) (distribution.Manifest, error) { return nil, err } - log.Debug("docker image to save: ", imageName) + log.Debug("docker image to save: ", image.String()) log.Debug("saving in: ", path) cli, err := client.NewEnvClient() @@ -94,9 +93,9 @@ func save(imageName string) (distribution.Manifest, error) { panic(err) } - img, err := cli.ImageSave(context.Background(), []string{imageName}) + img, err := cli.ImageSave(context.Background(), []string{image.String()}) if err != nil { - return nil, fmt.Errorf("cannot save image %s: %s", imageName, err) + return nil, fmt.Errorf("cannot save image %s: %s", image.String(), err) } defer img.Close() @@ -188,13 +187,13 @@ func historyFromManifest(path string) (distribution.Manifest, error) { return m, nil } -func historyFromCommand(imageName string) (schema1.SignedManifest, error) { +func historyFromCommand(image reference.NamedTagged) (schema1.SignedManifest, error) { client, err := client.NewEnvClient() if err != nil { return schema1.SignedManifest{}, err } - histories, err := client.ImageHistory(context.Background(), imageName) + histories, err := client.ImageHistory(context.Background(), image.String()) manifest := schema1.SignedManifest{} for _, history := range histories { diff --git a/docker/dockercli/dockercli_test.go b/docker/dockercli/dockercli_test.go new file mode 100644 index 0000000..7aa47c1 --- /dev/null +++ b/docker/dockercli/dockercli_test.go @@ -0,0 +1,45 @@ +package dockercli + +import ( + "fmt" + "testing" + + "github.com/docker/docker/reference" +) + +func TestImageParsing(t *testing.T) { + images := map[string]string{ + "ubuntu:14.04": "dockerio/library/ubuntu/1404", + "ubuntu/ubuntu:14.04": "dockerio/ubuntu/ubuntu/1404", + "registry.com/ubuntu:14.04": "registrycom/ubuntu/1404", + "registry.com/ubuntu/ubuntu:14.04": "registrycom/ubuntu/ubuntu/1404", + "registry.com:5000/ubuntu:14.04": "registrycom5000/ubuntu/1404", + "registry.com:5000/ubuntu/ubuntu:14.04": "registrycom5000/ubuntu/ubuntu/1404", + } + + for value, expected := range images { + + n, err := reference.ParseNamed(value) + if err != nil { + t.Error("Error:", err, expected) + } + var image reference.NamedTagged + if reference.IsNameOnly(n) { + image = reference.WithDefaultTag(n).(reference.NamedTagged) + } else { + image = n.(reference.NamedTagged) + } + fmt.Println("Name(): ", image.Name()) + fmt.Println("String(): ", image.String()) + fmt.Println("FullName(): ", image.FullName()) + fmt.Println("Hostname(): ", image.Hostname()) + fmt.Println("RemoteName(): ", image.RemoteName()) + fmt.Println("Tag(): ", image.Tag()) + + result := tempImagePath(image) + + if result != expected { + t.Errorf("Expecting %s, got %s", expected, result) + } + } +} From fc30ae52c3f746c94cac8f25e6099653c63abba8 Mon Sep 17 00:00:00 2001 From: Julien Garcia Gonzalez Date: Wed, 7 Mar 2018 15:32:38 +0100 Subject: [PATCH 2/2] Fix temporary file path Signed-off-by: Julien Garcia Gonzalez --- docker/dockercli/dockercli.go | 2 +- docker/dockercli/dockercli_test.go | 19 ++++++------------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/docker/dockercli/dockercli.go b/docker/dockercli/dockercli.go index 750f09f..42348df 100644 --- a/docker/dockercli/dockercli.go +++ b/docker/dockercli/dockercli.go @@ -44,7 +44,7 @@ func parseImage(imageName string) (reference.NamedTagged, error) { func tempImagePath(image reference.NamedTagged) string { - return strings.Replace(strings.Replace(fmt.Sprintf("%s/%s", image.FullName(), image.Tag()), ".", "", -1), ":", "", -1) + return strings.Replace(strings.Replace(fmt.Sprintf("%s/%s", image.FullName(), image.Tag()), ".", "_", -1), ":", "_", -1) } //GetLocalManifest retrieve manifest for local image diff --git a/docker/dockercli/dockercli_test.go b/docker/dockercli/dockercli_test.go index 7aa47c1..a2d0d9c 100644 --- a/docker/dockercli/dockercli_test.go +++ b/docker/dockercli/dockercli_test.go @@ -1,7 +1,6 @@ package dockercli import ( - "fmt" "testing" "github.com/docker/docker/reference" @@ -9,12 +8,12 @@ import ( func TestImageParsing(t *testing.T) { images := map[string]string{ - "ubuntu:14.04": "dockerio/library/ubuntu/1404", - "ubuntu/ubuntu:14.04": "dockerio/ubuntu/ubuntu/1404", - "registry.com/ubuntu:14.04": "registrycom/ubuntu/1404", - "registry.com/ubuntu/ubuntu:14.04": "registrycom/ubuntu/ubuntu/1404", - "registry.com:5000/ubuntu:14.04": "registrycom5000/ubuntu/1404", - "registry.com:5000/ubuntu/ubuntu:14.04": "registrycom5000/ubuntu/ubuntu/1404", + "ubuntu:14.04": "docker_io/library/ubuntu/14_04", + "ubuntu/ubuntu:14.04": "docker_io/ubuntu/ubuntu/14_04", + "registry.com/ubuntu:14.04": "registry_com/ubuntu/14_04", + "registry.com/ubuntu/ubuntu:14.04": "registry_com/ubuntu/ubuntu/14_04", + "registry.com:5000/ubuntu:14.04": "registry_com_5000/ubuntu/14_04", + "registry.com:5000/ubuntu/ubuntu:14.04": "registry_com_5000/ubuntu/ubuntu/14_04", } for value, expected := range images { @@ -29,12 +28,6 @@ func TestImageParsing(t *testing.T) { } else { image = n.(reference.NamedTagged) } - fmt.Println("Name(): ", image.Name()) - fmt.Println("String(): ", image.String()) - fmt.Println("FullName(): ", image.FullName()) - fmt.Println("Hostname(): ", image.Hostname()) - fmt.Println("RemoteName(): ", image.RemoteName()) - fmt.Println("Tag(): ", image.Tag()) result := tempImagePath(image)