Add support for using GCP Image Family names. (#8083)

This commit is contained in:
Christoph Blecker 2016-08-15 14:29:58 -07:00 committed by Paul Stack
parent cb1787c2f7
commit 84162586b0
4 changed files with 120 additions and 10 deletions

View File

@ -6,8 +6,10 @@ import (
)
// 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 name then look in the configured project and then hosted image projects.
// If it is of the form project/name, search the specified project first, then
// 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) {
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 not, we return the original error.
// If the image name contains the left hand side, we use the project from the right hand
// side.
// If the image name contains the left hand side, we use the project from
// the right hand side.
imageMap := map[string]string{
"centos": "centos-cloud",
"coreos": "coreos-cloud",
@ -57,13 +59,28 @@ func resolveImage(c *Config, name string) (string, error) {
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
} else if len(splitName) == 2 {
// Check if image exists in the specified project:
image, err := c.clientCompute.Images.Get(splitName[0], splitName[1]).Do()
if err == 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
} else {

View File

@ -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) {
var instance compute.Instance
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 {
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(`
resource "google_compute_instance" "foobar" {
name = "%s"
@ -688,7 +757,31 @@ func testAccComputeInstance_basic2(instance string) string {
}`, 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(`
resource "google_compute_instance" "foobar" {
name = "%s"

View File

@ -112,8 +112,9 @@ the type is "local-ssd", in which case scratch must be true).
`google_compute_disk`) to attach.
* `image` - The image from which to initialize this
disk. Either the full URL, a contraction of the form "project/name", or
just a name (in which case the current project is used).
disk. Either the full URL, a contraction of the form "project/name", an
[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.
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.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).

View File

@ -83,7 +83,7 @@ resource "google_compute_instance_template" "instance_template" {
network_interface {
...
}
lifecycle {
create_before_destroy = true
}
@ -169,7 +169,7 @@ The `disk` block supports:
to the name of the instance.
* `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
this disk.