mirror of
https://github.com/kreuzwerker/terraform-provider-docker.git
synced 2025-12-20 22:59:42 -05:00
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:
parent
6d6f9bb905
commit
faa3ec5a39
3 changed files with 37 additions and 15 deletions
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.*`),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue