2015-03-27 18:22:33 -04:00
|
|
|
package docker
|
|
|
|
|
|
|
|
|
|
import (
|
2018-07-03 11:30:53 -04:00
|
|
|
"context"
|
2016-03-23 00:56:51 -04:00
|
|
|
"fmt"
|
2017-11-21 04:14:07 -05:00
|
|
|
"os"
|
2016-01-14 04:12:05 -05:00
|
|
|
"regexp"
|
2015-07-03 05:58:05 -04:00
|
|
|
"testing"
|
2015-10-08 04:47:50 -04:00
|
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/helper/resource"
|
2016-03-23 00:56:51 -04:00
|
|
|
"github.com/hashicorp/terraform/terraform"
|
2015-03-27 18:22:33 -04:00
|
|
|
)
|
|
|
|
|
|
2016-03-06 10:22:11 -05:00
|
|
|
var contentDigestRegexp = regexp.MustCompile(`\A[A-Za-z0-9_\+\.-]+:[A-Fa-f0-9]+\z`)
|
|
|
|
|
|
2015-03-27 18:22:33 -04:00
|
|
|
func TestAccDockerImage_basic(t *testing.T) {
|
|
|
|
|
resource.Test(t, resource.TestCase{
|
2016-03-23 00:56:51 -04:00
|
|
|
PreCheck: func() { testAccPreCheck(t) },
|
|
|
|
|
Providers: testAccProviders,
|
|
|
|
|
CheckDestroy: testAccDockerImageDestroy,
|
2015-03-27 18:22:33 -04:00
|
|
|
Steps: []resource.TestStep{
|
|
|
|
|
resource.TestStep{
|
|
|
|
|
Config: testAccDockerImageConfig,
|
|
|
|
|
Check: resource.ComposeTestCheckFunc(
|
2016-03-06 10:22:11 -05:00
|
|
|
resource.TestMatchResourceAttr("docker_image.foo", "latest", contentDigestRegexp),
|
2015-03-27 18:22:33 -04:00
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-14 04:12:05 -05:00
|
|
|
func TestAccDockerImage_private(t *testing.T) {
|
2015-07-03 05:58:05 -04:00
|
|
|
resource.Test(t, resource.TestCase{
|
2016-03-23 00:56:51 -04:00
|
|
|
PreCheck: func() { testAccPreCheck(t) },
|
|
|
|
|
Providers: testAccProviders,
|
|
|
|
|
CheckDestroy: testAccDockerImageDestroy,
|
2015-07-03 05:58:05 -04:00
|
|
|
Steps: []resource.TestStep{
|
|
|
|
|
resource.TestStep{
|
|
|
|
|
Config: testAddDockerPrivateImageConfig,
|
|
|
|
|
Check: resource.ComposeTestCheckFunc(
|
2016-03-06 10:22:11 -05:00
|
|
|
resource.TestMatchResourceAttr("docker_image.foobar", "latest", contentDigestRegexp),
|
2015-07-03 05:58:05 -04:00
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-27 12:18:02 -04:00
|
|
|
func TestAccDockerImage_destroy(t *testing.T) {
|
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
|
|
|
PreCheck: func() { testAccPreCheck(t) },
|
|
|
|
|
Providers: testAccProviders,
|
|
|
|
|
CheckDestroy: func(s *terraform.State) error {
|
|
|
|
|
for _, rs := range s.RootModule().Resources {
|
|
|
|
|
if rs.Type != "docker_image" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-21 04:14:07 -05:00
|
|
|
client := testAccProvider.Meta().(*ProviderConfig).DockerClient
|
2018-07-03 11:30:53 -04:00
|
|
|
_, _, err := client.ImageInspectWithRaw(context.Background(), rs.Primary.Attributes["latest"])
|
2016-04-27 12:18:02 -04:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
},
|
|
|
|
|
Steps: []resource.TestStep{
|
|
|
|
|
resource.TestStep{
|
|
|
|
|
Config: testAccDockerImageKeepLocallyConfig,
|
|
|
|
|
Check: resource.ComposeTestCheckFunc(
|
|
|
|
|
resource.TestMatchResourceAttr("docker_image.foobarzoo", "latest", contentDigestRegexp),
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
2016-03-23 00:56:51 -04:00
|
|
|
|
2016-07-26 11:18:38 -04:00
|
|
|
func TestAccDockerImage_data(t *testing.T) {
|
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
|
|
|
PreCheck: func() { testAccPreCheck(t) },
|
|
|
|
|
Providers: testAccProviders,
|
|
|
|
|
PreventPostDestroyRefresh: true,
|
|
|
|
|
Steps: []resource.TestStep{
|
|
|
|
|
resource.TestStep{
|
|
|
|
|
Config: testAccDockerImageFromDataConfig,
|
|
|
|
|
Check: resource.ComposeTestCheckFunc(
|
|
|
|
|
resource.TestMatchResourceAttr("docker_image.foobarbaz", "latest", contentDigestRegexp),
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2017-01-03 11:10:39 -05:00
|
|
|
func TestAccDockerImage_data_pull_trigger(t *testing.T) {
|
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
|
|
|
PreCheck: func() { testAccPreCheck(t) },
|
|
|
|
|
Providers: testAccProviders,
|
|
|
|
|
PreventPostDestroyRefresh: true,
|
|
|
|
|
Steps: []resource.TestStep{
|
|
|
|
|
resource.TestStep{
|
|
|
|
|
Config: testAccDockerImageFromDataConfigWithPullTrigger,
|
|
|
|
|
Check: resource.ComposeTestCheckFunc(
|
|
|
|
|
resource.TestMatchResourceAttr("docker_image.foobarbazoo", "latest", contentDigestRegexp),
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-21 04:14:07 -05:00
|
|
|
func TestAccDockerImage_data_private(t *testing.T) {
|
|
|
|
|
registry := os.Getenv("DOCKER_REGISTRY_ADDRESS")
|
|
|
|
|
image := os.Getenv("DOCKER_PRIVATE_IMAGE")
|
|
|
|
|
|
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
|
|
|
PreCheck: func() { testAccPreCheck(t) },
|
|
|
|
|
Providers: testAccProviders,
|
|
|
|
|
PreventPostDestroyRefresh: true,
|
|
|
|
|
Steps: []resource.TestStep{
|
|
|
|
|
resource.TestStep{
|
|
|
|
|
Config: fmt.Sprintf(testAccDockerImageFromDataPrivateConfig, registry, image),
|
|
|
|
|
Check: resource.ComposeTestCheckFunc(
|
|
|
|
|
resource.TestMatchResourceAttr("docker_image.foo_private", "latest", contentDigestRegexp),
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-12 02:43:28 -04:00
|
|
|
func TestAccDockerImage_sha265(t *testing.T) {
|
|
|
|
|
resource.Test(t, resource.TestCase{
|
|
|
|
|
PreCheck: func() { testAccPreCheck(t) },
|
|
|
|
|
Providers: testAccProviders,
|
|
|
|
|
CheckDestroy: testAccDockerImageDestroy,
|
|
|
|
|
Steps: []resource.TestStep{
|
|
|
|
|
resource.TestStep{
|
|
|
|
|
Config: testAddDockerImageWithSHA256RepoDigest,
|
|
|
|
|
Check: resource.ComposeTestCheckFunc(
|
|
|
|
|
resource.TestMatchResourceAttr("docker_image.foobar", "latest", contentDigestRegexp),
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-27 12:18:02 -04:00
|
|
|
func testAccDockerImageDestroy(s *terraform.State) error {
|
2016-03-23 00:56:51 -04:00
|
|
|
for _, rs := range s.RootModule().Resources {
|
|
|
|
|
if rs.Type != "docker_image" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-21 04:14:07 -05:00
|
|
|
client := testAccProvider.Meta().(*ProviderConfig).DockerClient
|
2018-07-03 11:30:53 -04:00
|
|
|
_, _, err := client.ImageInspectWithRaw(context.Background(), rs.Primary.Attributes["latest"])
|
2016-03-23 00:56:51 -04:00
|
|
|
if err == nil {
|
|
|
|
|
return fmt.Errorf("Image still exists")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-27 18:22:33 -04:00
|
|
|
const testAccDockerImageConfig = `
|
|
|
|
|
resource "docker_image" "foo" {
|
2015-12-02 15:03:29 -05:00
|
|
|
name = "alpine:3.1"
|
2015-03-27 18:22:33 -04:00
|
|
|
}
|
|
|
|
|
`
|
2015-07-03 05:58:05 -04:00
|
|
|
|
|
|
|
|
const testAddDockerPrivateImageConfig = `
|
|
|
|
|
resource "docker_image" "foobar" {
|
|
|
|
|
name = "gcr.io:443/google_containers/pause:0.8.0"
|
|
|
|
|
}
|
|
|
|
|
`
|
2016-04-27 12:18:02 -04:00
|
|
|
|
|
|
|
|
const testAccDockerImageKeepLocallyConfig = `
|
|
|
|
|
resource "docker_image" "foobarzoo" {
|
|
|
|
|
name = "crux:3.1"
|
|
|
|
|
keep_locally = true
|
|
|
|
|
}
|
|
|
|
|
`
|
2016-07-26 11:18:38 -04:00
|
|
|
|
|
|
|
|
const testAccDockerImageFromDataConfig = `
|
|
|
|
|
data "docker_registry_image" "foobarbaz" {
|
|
|
|
|
name = "alpine:3.1"
|
|
|
|
|
}
|
|
|
|
|
resource "docker_image" "foobarbaz" {
|
|
|
|
|
name = "${data.docker_registry_image.foobarbaz.name}"
|
2017-01-03 11:10:39 -05:00
|
|
|
pull_triggers = ["${data.docker_registry_image.foobarbaz.sha256_digest}"]
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const testAccDockerImageFromDataConfigWithPullTrigger = `
|
|
|
|
|
data "docker_registry_image" "foobarbazoo" {
|
|
|
|
|
name = "alpine:3.1"
|
|
|
|
|
}
|
|
|
|
|
resource "docker_image" "foobarbazoo" {
|
|
|
|
|
name = "${data.docker_registry_image.foobarbazoo.name}"
|
|
|
|
|
pull_trigger = "${data.docker_registry_image.foobarbazoo.sha256_digest}"
|
2016-07-26 11:18:38 -04:00
|
|
|
}
|
|
|
|
|
`
|
2017-11-21 04:14:07 -05:00
|
|
|
|
|
|
|
|
const testAccDockerImageFromDataPrivateConfig = `
|
|
|
|
|
provider "docker" {
|
|
|
|
|
alias = "private"
|
|
|
|
|
registry_auth {
|
|
|
|
|
address = "%s"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
data "docker_registry_image" "foo_private" {
|
|
|
|
|
provider = "docker.private"
|
|
|
|
|
name = "%s"
|
|
|
|
|
}
|
|
|
|
|
resource "docker_image" "foo_private" {
|
|
|
|
|
provider = "docker.private"
|
|
|
|
|
name = "${data.docker_registry_image.foo_private.name}"
|
2018-02-09 14:11:30 -05:00
|
|
|
keep_locally = true
|
2017-11-21 04:14:07 -05:00
|
|
|
pull_triggers = ["${data.docker_registry_image.foo_private.sha256_digest}"]
|
|
|
|
|
}
|
|
|
|
|
`
|
2018-10-12 02:43:28 -04:00
|
|
|
|
|
|
|
|
const testAddDockerImageWithSHA256RepoDigest = `
|
|
|
|
|
resource "docker_image" "foobar" {
|
|
|
|
|
name = "stocard/gotthard@sha256:ed752380c07940c651b46c97ca2101034b3be112f4d86198900aa6141f37fe7b"
|
|
|
|
|
}
|
|
|
|
|
`
|