mirror of
https://github.com/kreuzwerker/terraform-provider-docker.git
synced 2025-12-18 23:06:10 -05:00
Some checks failed
Acc Tests / acc-test (TestAccDockerConfig, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerConfig, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerNetwork, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerNetwork, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerPlugin, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerPlugin, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerSecret, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerSecret, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerTag, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerTag, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerVolume, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (TestAccDockerVolume, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerContainer, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerContainer, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerImage, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerImage, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerRegistryImage, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerRegistryImage, 1.8.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerService, 0.15.x) (push) Has been cancelled
Acc Tests / acc-test (true, TestAccDockerService, 1.8.x) (push) Has been cancelled
Compile Binaries / compile-fast (push) Has been cancelled
Compile Binaries / compile (push) Has been cancelled
golangci-lint / lint (push) Has been cancelled
Unit Tests / unit-test (push) Has been cancelled
Website Checks / markdown-link-check (push) Has been cancelled
Docs and Website Lint / website-generation (push) Has been cancelled
Docs and Website Lint / website-lint-spellcheck-tffmt (push) Has been cancelled
Docs and Website Lint / markdown-lint (push) Has been cancelled
206 lines
6.3 KiB
Go
206 lines
6.3 KiB
Go
package provider
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os/exec"
|
|
"regexp"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/docker/docker/api/types/filters"
|
|
"github.com/docker/docker/api/types/image"
|
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
|
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
|
|
)
|
|
|
|
var imageRepoDigestRegexp = regexp.MustCompile(`^.*@sha256:[A-Fa-f0-9]+$`)
|
|
var imageNameWithTagAndDigestRegexp = regexp.MustCompile(`^.*:.*@sha256:[A-Fa-f0-9]+$`)
|
|
|
|
func TestAccDockerImageDataSource_withSpecificTag(t *testing.T) {
|
|
ctx := context.Background()
|
|
imageName := "busybox:1.34.0"
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
PreCheck: func() {
|
|
testAccPreCheck(t)
|
|
pullImageForTest(t, imageName)
|
|
},
|
|
ProviderFactories: providerFactories,
|
|
Steps: []resource.TestStep{
|
|
{
|
|
Config: loadTestConfiguration(t, DATA_SOURCE, "docker_image", "testAccDockerImageDataSourceWithSpecificTag"),
|
|
Check: resource.ComposeTestCheckFunc(
|
|
resource.TestCheckResourceAttr("data.docker_image.foo", "name", imageName),
|
|
resource.TestCheckResourceAttr("data.docker_image.foo", "repo_digest", "busybox@sha256:e8e5cca392e3cf056fcdb3093e7ac2bf83fcf28b3bcf5818fe8ae71cf360c231"),
|
|
),
|
|
},
|
|
},
|
|
CheckDestroy: func(state *terraform.State) error {
|
|
return removeImageForTest(ctx, state, imageName)
|
|
},
|
|
})
|
|
}
|
|
|
|
func TestAccDockerImageDataSource_withDefaultTag(t *testing.T) {
|
|
ctx := context.Background()
|
|
imageName := "busybox"
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
PreCheck: func() {
|
|
testAccPreCheck(t)
|
|
pullImageForTest(t, imageName)
|
|
},
|
|
ProviderFactories: providerFactories,
|
|
Steps: []resource.TestStep{
|
|
{
|
|
Config: loadTestConfiguration(t, DATA_SOURCE, "docker_image", "testAccDockerImageDataSourceWithDefaultTag"),
|
|
Check: resource.ComposeTestCheckFunc(
|
|
resource.TestCheckResourceAttr("data.docker_image.foo", "name", imageName),
|
|
resource.TestMatchResourceAttr("data.docker_image.foo", "repo_digest", imageRepoDigestRegexp),
|
|
),
|
|
},
|
|
},
|
|
CheckDestroy: func(state *terraform.State) error {
|
|
return removeImageForTest(ctx, state, imageName)
|
|
},
|
|
})
|
|
}
|
|
|
|
func TestAccDockerImageDataSource_withSha256Digest(t *testing.T) {
|
|
ctx := context.Background()
|
|
imageName := "busybox@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68"
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
PreCheck: func() {
|
|
testAccPreCheck(t)
|
|
pullImageForTest(t, imageName)
|
|
},
|
|
ProviderFactories: providerFactories,
|
|
Steps: []resource.TestStep{
|
|
{
|
|
Config: loadTestConfiguration(t, DATA_SOURCE, "docker_image", "testAccDockerImageDataSourceWithSha256Digest"),
|
|
Check: resource.ComposeTestCheckFunc(
|
|
resource.TestCheckResourceAttr("data.docker_image.foo", "name", imageName),
|
|
resource.TestMatchResourceAttr("data.docker_image.foo", "repo_digest", imageRepoDigestRegexp),
|
|
),
|
|
},
|
|
},
|
|
CheckDestroy: func(state *terraform.State) error {
|
|
return removeImageForTest(ctx, state, imageName)
|
|
},
|
|
})
|
|
}
|
|
func TestAccDockerImageDataSource_withTagAndSha256Digest(t *testing.T) {
|
|
ctx := context.Background()
|
|
imageName := "busybox:1.35.0@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68"
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
PreCheck: func() {
|
|
testAccPreCheck(t)
|
|
pullImageForTest(t, imageName)
|
|
},
|
|
ProviderFactories: providerFactories,
|
|
Steps: []resource.TestStep{
|
|
{
|
|
Config: loadTestConfiguration(t, DATA_SOURCE, "docker_image", "testAccDockerImageDataSourceWithTagAndSha256Digest"),
|
|
Check: resource.ComposeTestCheckFunc(
|
|
resource.TestCheckResourceAttr("data.docker_image.foo", "name", imageName),
|
|
resource.TestMatchResourceAttr("data.docker_image.foo", "repo_digest", imageRepoDigestRegexp),
|
|
),
|
|
},
|
|
},
|
|
CheckDestroy: func(state *terraform.State) error {
|
|
return removeImageForTest(ctx, state, imageName)
|
|
},
|
|
})
|
|
}
|
|
|
|
func TestAccDockerImageDataSource_withNonExistentImage(t *testing.T) {
|
|
resource.Test(t, resource.TestCase{
|
|
PreCheck: func() { testAccPreCheck(t) },
|
|
ProviderFactories: providerFactories,
|
|
Steps: []resource.TestStep{
|
|
{
|
|
Config: `
|
|
data "docker_image" "foo" {
|
|
name = "image-does-not-exist"
|
|
}
|
|
`,
|
|
ExpectError: regexp.MustCompile(`.*did not find docker image.*`),
|
|
},
|
|
{
|
|
Config: `
|
|
data "docker_image" "foo" {
|
|
name = "nginx:tag-does-not-exist"
|
|
}
|
|
`,
|
|
ExpectError: regexp.MustCompile(`.*did not find docker image.*`),
|
|
},
|
|
{
|
|
Config: `
|
|
data "docker_image" "foo" {
|
|
name = "nginx@sha256:3614ca5eacf0a3a1bcc361c939202a974b4902b9334ff36eb29ffe9011aaad83"
|
|
}
|
|
`,
|
|
ExpectError: regexp.MustCompile(`.*did not find docker image.*`),
|
|
},
|
|
{
|
|
Config: `
|
|
data "docker_image" "foo" {
|
|
name = "nginx:1.19.1@sha256:3614ca5eacf0a3a1bcc361c939202a974b4902b9334ff36eb29ffe9011aaad83"
|
|
}
|
|
`,
|
|
ExpectError: regexp.MustCompile(`.*did not find docker image.*`),
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
// Helpers
|
|
func pullImageForTest(t *testing.T, imageName string) {
|
|
cmd := exec.Command("docker", "pull", imageName)
|
|
if err := cmd.Run(); err != nil {
|
|
t.Fatalf("Failed to pull image '%s': %s", imageName, err)
|
|
}
|
|
}
|
|
|
|
func removeImageForTest(ctx context.Context, s *terraform.State, imageName string) error {
|
|
client, err := testAccProvider.Meta().(*ProviderConfig).MakeClient(ctx, nil)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create Docker client: %w", err)
|
|
}
|
|
|
|
// for images with tag and digest like e.g.
|
|
// 'nginx:1.19.1@sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2'
|
|
// no image is found. This is why we strip the tag to remain with
|
|
// 'nginx@sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2'
|
|
if imageNameWithTagAndDigestRegexp.MatchString(imageName) {
|
|
tagStartIndex := strings.Index(imageName, ":")
|
|
digestStartIndex := strings.Index(imageName, "@")
|
|
imageName = imageName[:tagStartIndex] + imageName[digestStartIndex:]
|
|
}
|
|
|
|
filters := filters.NewArgs()
|
|
filters.Add("reference", imageName)
|
|
images, err := client.ImageList(ctx, image.ListOptions{
|
|
Filters: filters,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(images) == 0 {
|
|
return fmt.Errorf("did not find any image with name '%s' to delete", imageName)
|
|
}
|
|
|
|
for _, currentImage := range images {
|
|
_, err := client.ImageRemove(ctx, currentImage.ID, image.RemoveOptions{
|
|
Force: true,
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("failed to remove image with ID '%s'", currentImage.ID)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|