Skip to content

Commit 3926fa8

Browse files
author
Rhyas
committed
Fix Image Destroy bug. hashicorp#3609 hashicorp#3771
1 parent fea6b60 commit 3926fa8

2 files changed

Lines changed: 69 additions & 17 deletions

File tree

builtin/providers/docker/resource_docker_image_funcs.go

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,49 @@ func resourceDockerImageUpdate(d *schema.ResourceData, meta interface{}) error {
4141
}
4242

4343
func resourceDockerImageDelete(d *schema.ResourceData, meta interface{}) error {
44+
client := meta.(*dc.Client)
45+
err := removeImage(d, client)
46+
if err != nil {
47+
return fmt.Errorf("Unable to remove Docker image: %s", err)
48+
}
4449
d.SetId("")
4550
return nil
4651
}
4752

53+
func searchLocalImages(data Data, imageName string) *dc.APIImages {
54+
if apiImage, ok := data.DockerImages[imageName]; ok {
55+
return apiImage
56+
}
57+
if apiImage, ok := data.DockerImages[imageName+":latest"]; ok {
58+
imageName = imageName + ":latest"
59+
return apiImage
60+
}
61+
return nil
62+
}
63+
64+
func removeImage(d *schema.ResourceData, client *dc.Client) error {
65+
var data Data
66+
if err := fetchLocalImages(&data, client); err != nil {
67+
return err
68+
}
69+
70+
imageName := d.Get("name").(string)
71+
if imageName == "" {
72+
return fmt.Errorf("Empty image name is not allowed")
73+
}
74+
75+
foundImage := searchLocalImages(data, imageName)
76+
77+
if foundImage != nil {
78+
err := client.RemoveImage(foundImage.ID)
79+
if err != nil {
80+
return err
81+
}
82+
}
83+
84+
return nil
85+
}
86+
4887
func fetchLocalImages(data *Data, client *dc.Client) error {
4988
images, err := client.ListImages(dc.ListImagesOptions{All: false})
5089
if err != nil {
@@ -146,26 +185,15 @@ func findImage(d *schema.ResourceData, client *dc.Client) (*dc.APIImages, error)
146185
return nil, fmt.Errorf("Empty image name is not allowed")
147186
}
148187

149-
searchLocal := func() *dc.APIImages {
150-
if apiImage, ok := data.DockerImages[imageName]; ok {
151-
return apiImage
152-
}
153-
if apiImage, ok := data.DockerImages[imageName+":latest"]; ok {
154-
imageName = imageName + ":latest"
155-
return apiImage
156-
}
157-
return nil
158-
}
159-
160-
foundImage := searchLocal()
188+
foundImage := searchLocalImages(data, imageName)
161189

162190
if d.Get("keep_updated").(bool) || foundImage == nil {
163191
if err := pullImage(&data, client, imageName); err != nil {
164192
return nil, fmt.Errorf("Unable to pull image %s: %s", imageName, err)
165193
}
166194
}
167195

168-
foundImage = searchLocal()
196+
foundImage = searchLocalImages(data, imageName)
169197
if foundImage != nil {
170198
return foundImage, nil
171199
}

builtin/providers/docker/resource_docker_image_test.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
package docker
22

33
import (
4+
"fmt"
45
"regexp"
56
"testing"
67

8+
dc "github.com/fsouza/go-dockerclient"
79
"github.com/hashicorp/terraform/helper/resource"
10+
"github.com/hashicorp/terraform/terraform"
811
)
912

1013
var contentDigestRegexp = regexp.MustCompile(`\A[A-Za-z0-9_\+\.-]+:[A-Fa-f0-9]+\z`)
1114

1215
func TestAccDockerImage_basic(t *testing.T) {
1316
resource.Test(t, resource.TestCase{
14-
PreCheck: func() { testAccPreCheck(t) },
15-
Providers: testAccProviders,
17+
PreCheck: func() { testAccPreCheck(t) },
18+
Providers: testAccProviders,
19+
CheckDestroy: testAccDockerImageDestroy,
1620
Steps: []resource.TestStep{
1721
resource.TestStep{
1822
Config: testAccDockerImageConfig,
@@ -26,8 +30,9 @@ func TestAccDockerImage_basic(t *testing.T) {
2630

2731
func TestAccDockerImage_private(t *testing.T) {
2832
resource.Test(t, resource.TestCase{
29-
PreCheck: func() { testAccPreCheck(t) },
30-
Providers: testAccProviders,
33+
PreCheck: func() { testAccPreCheck(t) },
34+
Providers: testAccProviders,
35+
CheckDestroy: testAccDockerImageDestroy,
3136
Steps: []resource.TestStep{
3237
resource.TestStep{
3338
Config: testAddDockerPrivateImageConfig,
@@ -39,6 +44,25 @@ func TestAccDockerImage_private(t *testing.T) {
3944
})
4045
}
4146

47+
func testAccDockerImageDestroy(s *terraform.State) error {
48+
//client := testAccProvider.Meta().(*dc.Client)
49+
50+
for _, rs := range s.RootModule().Resources {
51+
if rs.Type != "docker_image" {
52+
continue
53+
}
54+
55+
client := testAccProvider.Meta().(*dc.Client)
56+
_, err := client.InspectImage(rs.Primary.Attributes["latest"])
57+
if err == nil {
58+
return fmt.Errorf("Image still exists")
59+
} else if err != dc.ErrNoSuchImage {
60+
return err
61+
}
62+
}
63+
return nil
64+
}
65+
4266
const testAccDockerImageConfig = `
4367
resource "docker_image" "foo" {
4468
name = "alpine:3.1"

0 commit comments

Comments
 (0)