Add support for using GCP Image Family names. (#8083)
This commit is contained in:
parent
cb1787c2f7
commit
84162586b0
|
@ -6,8 +6,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// If the given name is a URL, return it.
|
// If the given name is a URL, return it.
|
||||||
// If it is of the form project/name, use that URL.
|
// If it is of the form project/name, search the specified project first, then
|
||||||
// If it is of the form name then look in the configured project and then hosted image projects.
|
// search image families in the specified project.
|
||||||
|
// If it is of the form name then look in the configured project, then hosted
|
||||||
|
// image projects, and lastly at image families in hosted image projects.
|
||||||
func resolveImage(c *Config, name string) (string, error) {
|
func resolveImage(c *Config, name string) (string, error) {
|
||||||
|
|
||||||
if strings.HasPrefix(name, "https://www.googleapis.com/compute/v1/") {
|
if strings.HasPrefix(name, "https://www.googleapis.com/compute/v1/") {
|
||||||
|
@ -28,8 +30,8 @@ func resolveImage(c *Config, name string) (string, error) {
|
||||||
// If we match a lookup for an alternate project, then try that next.
|
// If we match a lookup for an alternate project, then try that next.
|
||||||
// If not, we return the original error.
|
// If not, we return the original error.
|
||||||
|
|
||||||
// If the image name contains the left hand side, we use the project from the right hand
|
// If the image name contains the left hand side, we use the project from
|
||||||
// side.
|
// the right hand side.
|
||||||
imageMap := map[string]string{
|
imageMap := map[string]string{
|
||||||
"centos": "centos-cloud",
|
"centos": "centos-cloud",
|
||||||
"coreos": "coreos-cloud",
|
"coreos": "coreos-cloud",
|
||||||
|
@ -57,13 +59,28 @@ func resolveImage(c *Config, name string) (string, error) {
|
||||||
return image.SelfLink, nil
|
return image.SelfLink, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If it doesn't exist, try to see if it works as an image family:
|
||||||
|
image, err = c.clientCompute.Images.GetFromFamily(project, name).Do()
|
||||||
|
if err == nil {
|
||||||
|
return image.SelfLink, nil
|
||||||
|
}
|
||||||
|
|
||||||
return "", err
|
return "", err
|
||||||
|
|
||||||
} else if len(splitName) == 2 {
|
} else if len(splitName) == 2 {
|
||||||
|
|
||||||
|
// Check if image exists in the specified project:
|
||||||
image, err := c.clientCompute.Images.Get(splitName[0], splitName[1]).Do()
|
image, err := c.clientCompute.Images.Get(splitName[0], splitName[1]).Do()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return image.SelfLink, nil
|
return image.SelfLink, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If it doesn't, check if it exists as an image family:
|
||||||
|
image, err = c.clientCompute.Images.GetFromFamily(splitName[0], splitName[1]).Do()
|
||||||
|
if err == nil {
|
||||||
|
return image.SelfLink, nil
|
||||||
|
}
|
||||||
|
|
||||||
return "", err
|
return "", err
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -104,6 +104,52 @@ func TestAccComputeInstance_basic3(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAccComputeInstance_basic4(t *testing.T) {
|
||||||
|
var instance compute.Instance
|
||||||
|
var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
|
||||||
|
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckComputeInstanceDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccComputeInstance_basic4(instanceName),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckComputeInstanceExists(
|
||||||
|
"google_compute_instance.foobar", &instance),
|
||||||
|
testAccCheckComputeInstanceTag(&instance, "foo"),
|
||||||
|
testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
|
||||||
|
testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAccComputeInstance_basic5(t *testing.T) {
|
||||||
|
var instance compute.Instance
|
||||||
|
var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
|
||||||
|
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckComputeInstanceDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccComputeInstance_basic5(instanceName),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckComputeInstanceExists(
|
||||||
|
"google_compute_instance.foobar", &instance),
|
||||||
|
testAccCheckComputeInstanceTag(&instance, "foo"),
|
||||||
|
testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
|
||||||
|
testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestAccComputeInstance_IP(t *testing.T) {
|
func TestAccComputeInstance_IP(t *testing.T) {
|
||||||
var instance compute.Instance
|
var instance compute.Instance
|
||||||
var ipName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
|
var ipName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
|
||||||
|
@ -665,6 +711,29 @@ func testAccComputeInstance_basic(instance string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func testAccComputeInstance_basic2(instance string) string {
|
func testAccComputeInstance_basic2(instance string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "google_compute_instance" "foobar" {
|
||||||
|
name = "%s"
|
||||||
|
machine_type = "n1-standard-1"
|
||||||
|
zone = "us-central1-a"
|
||||||
|
can_ip_forward = false
|
||||||
|
tags = ["foo", "bar"]
|
||||||
|
|
||||||
|
disk {
|
||||||
|
image = "debian-8"
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
network = "default"
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata {
|
||||||
|
foo = "bar"
|
||||||
|
}
|
||||||
|
}`, instance)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccComputeInstance_basic3(instance string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
resource "google_compute_instance" "foobar" {
|
resource "google_compute_instance" "foobar" {
|
||||||
name = "%s"
|
name = "%s"
|
||||||
|
@ -688,7 +757,31 @@ func testAccComputeInstance_basic2(instance string) string {
|
||||||
}`, instance)
|
}`, instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testAccComputeInstance_basic3(instance string) string {
|
func testAccComputeInstance_basic4(instance string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "google_compute_instance" "foobar" {
|
||||||
|
name = "%s"
|
||||||
|
machine_type = "n1-standard-1"
|
||||||
|
zone = "us-central1-a"
|
||||||
|
can_ip_forward = false
|
||||||
|
tags = ["foo", "bar"]
|
||||||
|
|
||||||
|
disk {
|
||||||
|
image = "debian-cloud/debian-8"
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
network = "default"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
metadata {
|
||||||
|
foo = "bar"
|
||||||
|
}
|
||||||
|
}`, instance)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccComputeInstance_basic5(instance string) string {
|
||||||
return fmt.Sprintf(`
|
return fmt.Sprintf(`
|
||||||
resource "google_compute_instance" "foobar" {
|
resource "google_compute_instance" "foobar" {
|
||||||
name = "%s"
|
name = "%s"
|
||||||
|
|
|
@ -112,8 +112,9 @@ the type is "local-ssd", in which case scratch must be true).
|
||||||
`google_compute_disk`) to attach.
|
`google_compute_disk`) to attach.
|
||||||
|
|
||||||
* `image` - The image from which to initialize this
|
* `image` - The image from which to initialize this
|
||||||
disk. Either the full URL, a contraction of the form "project/name", or
|
disk. Either the full URL, a contraction of the form "project/name", an
|
||||||
just a name (in which case the current project is used).
|
[image family](https://cloud.google.com/compute/docs/images#image_families),
|
||||||
|
or just a name (in which case the current project is used).
|
||||||
|
|
||||||
* `auto_delete` - (Optional) Whether or not the disk should be auto-deleted.
|
* `auto_delete` - (Optional) Whether or not the disk should be auto-deleted.
|
||||||
This defaults to true. Leave true for local SSDs.
|
This defaults to true. Leave true for local SSDs.
|
||||||
|
@ -195,4 +196,3 @@ exported:
|
||||||
* `network_interface.0.address` - The internal ip address of the instance, either manually or dynamically assigned.
|
* `network_interface.0.address` - The internal ip address of the instance, either manually or dynamically assigned.
|
||||||
|
|
||||||
* `network_interface.0.access_config.0.assigned_nat_ip` - If the instance has an access config, either the given external ip (in the `nat_ip` field) or the ephemeral (generated) ip (if you didn't provide one).
|
* `network_interface.0.access_config.0.assigned_nat_ip` - If the instance has an access config, either the given external ip (in the `nat_ip` field) or the ephemeral (generated) ip (if you didn't provide one).
|
||||||
|
|
||||||
|
|
|
@ -169,7 +169,7 @@ The `disk` block supports:
|
||||||
to the name of the instance.
|
to the name of the instance.
|
||||||
|
|
||||||
* `source_image` - (Required if source not set) The name of the image to base
|
* `source_image` - (Required if source not set) The name of the image to base
|
||||||
this disk off of.
|
this disk off of. Accepts same arguments as a [google_compute_instance image](https://www.terraform.io/docs/providers/google/r/compute_instance.html#image).
|
||||||
|
|
||||||
* `interface` - (Optional) Specifies the disk interface to use for attaching
|
* `interface` - (Optional) Specifies the disk interface to use for attaching
|
||||||
this disk.
|
this disk.
|
||||||
|
|
Loading…
Reference in New Issue