mirror of
https://github.com/kreuzwerker/terraform-provider-docker.git
synced 2025-12-24 00:29:46 -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)
|
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 {
|
if foundImage == nil {
|
||||||
return diag.Errorf("did not find docker image '%s'", imageName)
|
return diag.Errorf("did not find docker image '%s'", imageName)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ func TestAccDockerImageDataSource_withNonExistentImage(t *testing.T) {
|
||||||
{
|
{
|
||||||
Config: `
|
Config: `
|
||||||
data "docker_image" "foo" {
|
data "docker_image" "foo" {
|
||||||
name = "nginx@shaDoesNotExist"
|
name = "nginx@sha256:3614ca5eacf0a3a1bcc361c939202a974b4902b9334ff36eb29ffe9011aaad83"
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
ExpectError: regexp.MustCompile(`.*did not find docker image.*`),
|
ExpectError: regexp.MustCompile(`.*did not find docker image.*`),
|
||||||
|
|
@ -148,7 +148,7 @@ func TestAccDockerImageDataSource_withNonExistentImage(t *testing.T) {
|
||||||
{
|
{
|
||||||
Config: `
|
Config: `
|
||||||
data "docker_image" "foo" {
|
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.*`),
|
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"
|
||||||
"github.com/docker/docker/api/types/versions"
|
"github.com/docker/docker/api/types/versions"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
|
"github.com/docker/docker/errdefs"
|
||||||
"github.com/docker/docker/pkg/archive"
|
"github.com/docker/docker/pkg/archive"
|
||||||
"github.com/docker/docker/pkg/jsonmessage"
|
"github.com/docker/docker/pkg/jsonmessage"
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
|
"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)
|
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 {
|
if foundImage == nil {
|
||||||
log.Printf("[DEBUG] did not find image with name: %v", imageName)
|
log.Printf("[DEBUG] did not find image with name: %v", imageName)
|
||||||
d.SetId("")
|
d.SetId("")
|
||||||
|
|
@ -106,20 +110,26 @@ func resourceDockerImageDelete(ctx context.Context, d *schema.ResourceData, meta
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helpers
|
// 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)
|
imageInspect, _, err := client.ImageInspectWithRaw(ctx, imageName)
|
||||||
if err != nil {
|
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)
|
log.Printf("[DEBUG] Docker image inspect from readFunc: %s", jsonObj)
|
||||||
|
|
||||||
if apiImage, ok := data.DockerImages[imageInspect.ID]; ok {
|
if apiImage, ok := data.DockerImages[imageInspect.ID]; ok {
|
||||||
log.Printf("[DEBUG] found local image via imageName: %v", imageName)
|
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 {
|
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")
|
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 {
|
if foundImage != nil {
|
||||||
imageDeleteResponseItems, err := client.ImageRemove(ctx, imageName, types.ImageRemoveOptions{
|
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 {
|
func fetchLocalImages(ctx context.Context, data *Data, client *client.Client) error {
|
||||||
images, err := client.ImageList(ctx, types.ImageListOptions{All: false})
|
images, err := client.ImageList(ctx, types.ImageListOptions{All: false})
|
||||||
if err != nil {
|
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 {
|
if data.DockerImages == nil {
|
||||||
|
|
@ -199,14 +212,14 @@ func pullImage(ctx context.Context, data *Data, client *client.Client, authConfi
|
||||||
|
|
||||||
encodedJSON, err := json.Marshal(auth)
|
encodedJSON, err := json.Marshal(auth)
|
||||||
if err != nil {
|
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{
|
out, err := client.ImagePull(ctx, image, types.ImagePullOptions{
|
||||||
RegistryAuth: base64.URLEncoding.EncodeToString(encodedJSON),
|
RegistryAuth: base64.URLEncoding.EncodeToString(encodedJSON),
|
||||||
})
|
})
|
||||||
if err != nil {
|
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()
|
defer out.Close()
|
||||||
|
|
||||||
|
|
@ -272,7 +285,10 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut
|
||||||
return nil, err
|
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 {
|
if foundImage != nil {
|
||||||
return foundImage, nil
|
return foundImage, nil
|
||||||
}
|
}
|
||||||
|
|
@ -286,7 +302,10 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut
|
||||||
return nil, err
|
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 {
|
if foundImage != nil {
|
||||||
return foundImage, nil
|
return foundImage, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue