fix: Improve searchLocalImages error handling. (#407)

* fix: Improve searchLocalImages error handling.

* fix: Fix wrong sha format in docker image tests
This commit is contained in:
Martin 2022-07-14 14:30:29 +02:00 committed by GitHub
parent 6d6f9bb905
commit faa3ec5a39
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 15 deletions

View file

@ -44,7 +44,10 @@ func dataSourceDockerImageRead(ctx context.Context, d *schema.ResourceData, meta
imageName := d.Get("name").(string)
foundImage := searchLocalImages(ctx, client, data, imageName)
foundImage, err := searchLocalImages(ctx, client, data, imageName)
if err != nil {
return diag.Errorf("dataSourceDockerImageRead: error looking up local image %q: %s", imageName, err)
}
if foundImage == nil {
return diag.Errorf("did not find docker image '%s'", imageName)
}

View file

@ -140,7 +140,7 @@ func TestAccDockerImageDataSource_withNonExistentImage(t *testing.T) {
{
Config: `
data "docker_image" "foo" {
name = "nginx@shaDoesNotExist"
name = "nginx@sha256:3614ca5eacf0a3a1bcc361c939202a974b4902b9334ff36eb29ffe9011aaad83"
}
`,
ExpectError: regexp.MustCompile(`.*did not find docker image.*`),
@ -148,7 +148,7 @@ func TestAccDockerImageDataSource_withNonExistentImage(t *testing.T) {
{
Config: `
data "docker_image" "foo" {
name = "nginx:1.19.1@shaDoesNotExist"
name = "nginx:1.19.1@sha256:3614ca5eacf0a3a1bcc361c939202a974b4902b9334ff36eb29ffe9011aaad83"
}
`,
ExpectError: regexp.MustCompile(`.*did not find docker image.*`),

View file

@ -17,6 +17,7 @@ import (
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/versions"
"github.com/docker/docker/client"
"github.com/docker/docker/errdefs"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/jsonmessage"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@ -63,7 +64,10 @@ func resourceDockerImageRead(ctx context.Context, d *schema.ResourceData, meta i
imageName := d.Get("name").(string)
foundImage := searchLocalImages(ctx, client, data, imageName)
foundImage, err := searchLocalImages(ctx, client, data, imageName)
if err != nil {
return diag.Errorf("resourceDockerImageRead: error looking up local image %q: %s", imageName, err)
}
if foundImage == nil {
log.Printf("[DEBUG] did not find image with name: %v", imageName)
d.SetId("")
@ -106,20 +110,26 @@ func resourceDockerImageDelete(ctx context.Context, d *schema.ResourceData, meta
}
// Helpers
func searchLocalImages(ctx context.Context, client *client.Client, data Data, imageName string) *types.ImageSummary {
func searchLocalImages(ctx context.Context, client *client.Client, data Data, imageName string) (*types.ImageSummary, error) {
imageInspect, _, err := client.ImageInspectWithRaw(ctx, imageName)
if err != nil {
return nil
if errdefs.IsNotFound(err) {
return nil, nil
}
return nil, fmt.Errorf("unable to inspect image %s: %w", imageName, err)
}
jsonObj, _ := json.MarshalIndent(imageInspect, "", "\t")
jsonObj, err := json.MarshalIndent(imageInspect, "", "\t")
if err != nil {
return nil, fmt.Errorf("error parsing inspect response: %w", err)
}
log.Printf("[DEBUG] Docker image inspect from readFunc: %s", jsonObj)
if apiImage, ok := data.DockerImages[imageInspect.ID]; ok {
log.Printf("[DEBUG] found local image via imageName: %v", imageName)
return apiImage
return apiImage, nil
}
return nil
return nil, nil
}
func removeImage(ctx context.Context, d *schema.ResourceData, client *client.Client) error {
@ -138,7 +148,10 @@ func removeImage(ctx context.Context, d *schema.ResourceData, client *client.Cli
return fmt.Errorf("empty image name is not allowed")
}
foundImage := searchLocalImages(ctx, client, data, imageName)
foundImage, err := searchLocalImages(ctx, client, data, imageName)
if err != nil {
return fmt.Errorf("removeImage: error looking up local image %q: %w", imageName, err)
}
if foundImage != nil {
imageDeleteResponseItems, err := client.ImageRemove(ctx, imageName, types.ImageRemoveOptions{
@ -157,7 +170,7 @@ func removeImage(ctx context.Context, d *schema.ResourceData, client *client.Cli
func fetchLocalImages(ctx context.Context, data *Data, client *client.Client) error {
images, err := client.ImageList(ctx, types.ImageListOptions{All: false})
if err != nil {
return fmt.Errorf("unable to list Docker images: %s", err)
return fmt.Errorf("unable to list Docker images: %w", err)
}
if data.DockerImages == nil {
@ -199,14 +212,14 @@ func pullImage(ctx context.Context, data *Data, client *client.Client, authConfi
encodedJSON, err := json.Marshal(auth)
if err != nil {
return fmt.Errorf("error creating auth config: %s", err)
return fmt.Errorf("error creating auth config: %w", err)
}
out, err := client.ImagePull(ctx, image, types.ImagePullOptions{
RegistryAuth: base64.URLEncoding.EncodeToString(encodedJSON),
})
if err != nil {
return fmt.Errorf("error pulling image %s: %s", image, err)
return fmt.Errorf("error pulling image %s: %w", image, err)
}
defer out.Close()
@ -272,7 +285,10 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut
return nil, err
}
foundImage := searchLocalImages(ctx, client, data, imageName)
foundImage, err := searchLocalImages(ctx, client, data, imageName)
if err != nil {
return nil, fmt.Errorf("findImage1: error looking up local image %q: %w", imageName, err)
}
if foundImage != nil {
return foundImage, nil
}
@ -286,7 +302,10 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut
return nil, err
}
foundImage = searchLocalImages(ctx, client, data, imageName)
foundImage, err = searchLocalImages(ctx, client, data, imageName)
if err != nil {
return nil, fmt.Errorf("findImage2: error looking up local image %q: %w", imageName, err)
}
if foundImage != nil {
return foundImage, nil
}