From ebdceac770a5cb64512351baaf19099d8ed3bb31 Mon Sep 17 00:00:00 2001 From: Dainis Tillers Date: Tue, 2 Sep 2014 16:49:16 +0300 Subject: [PATCH 1/3] Require project id as otherwise it will fail with cryptic error --- builtin/providers/google/provider_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/builtin/providers/google/provider_test.go b/builtin/providers/google/provider_test.go index 9139f5fcec..976b657a6e 100644 --- a/builtin/providers/google/provider_test.go +++ b/builtin/providers/google/provider_test.go @@ -36,4 +36,8 @@ func testAccPreCheck(t *testing.T) { if v := os.Getenv("GOOGLE_CLIENT_FILE"); v == "" { t.Fatal("GOOGLE_CLIENT_FILE must be set for acceptance tests") } + + if v := os.Getenv("GOOGLE_PROJECT"); v == "" { + t.Fatal("GOOGLE_PROJECT must be set for acceptance tests") + } } From 47ee01b7cea0725555844595128cf3c2847d2a58 Mon Sep 17 00:00:00 2001 From: Dainis Tillers Date: Tue, 2 Sep 2014 16:52:21 +0300 Subject: [PATCH 2/3] Fixed - allow to attach already existing disks --- .../google/resource_compute_instance.go | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/builtin/providers/google/resource_compute_instance.go b/builtin/providers/google/resource_compute_instance.go index 5a2d6aa180..8766bca726 100644 --- a/builtin/providers/google/resource_compute_instance.go +++ b/builtin/providers/google/resource_compute_instance.go @@ -151,12 +151,19 @@ func resourceComputeInstanceCreate(d *schema.ResourceData, meta interface{}) err for i := 0; i < disksCount; i++ { prefix := fmt.Sprintf("disk.%d", i) - var sourceLink string + // var sourceLink string + + // Build the disk + var disk compute.AttachedDisk + disk.Type = "PERSISTENT" + disk.Mode = "READ_WRITE" + disk.Boot = i == 0 + disk.AutoDelete = true // Load up the disk for this disk if specified if v, ok := d.GetOk(prefix + ".disk"); ok { diskName := v.(string) - disk, err := config.clientCompute.Disks.Get( + diskData, err := config.clientCompute.Disks.Get( config.Project, zone.Name, diskName).Do() if err != nil { return fmt.Errorf( @@ -164,7 +171,7 @@ func resourceComputeInstanceCreate(d *schema.ResourceData, meta interface{}) err diskName, err) } - sourceLink = disk.SelfLink + disk.Source = diskData.SelfLink } // Load up the image for this disk if specified @@ -177,17 +184,9 @@ func resourceComputeInstanceCreate(d *schema.ResourceData, meta interface{}) err imageName, err) } - sourceLink = image.SelfLink - } - - // Build the disk - var disk compute.AttachedDisk - disk.Type = "PERSISTENT" - disk.Mode = "READ_WRITE" - disk.Boot = i == 0 - disk.AutoDelete = true - disk.InitializeParams = &compute.AttachedDiskInitializeParams{ - SourceImage: sourceLink, + disk.InitializeParams = &compute.AttachedDiskInitializeParams{ + SourceImage: image.SelfLink, + } } disks = append(disks, &disk) From 0ba21945032dbcc28631f4731a9588aaa9a3d85b Mon Sep 17 00:00:00 2001 From: Dainis Tillers Date: Tue, 2 Sep 2014 16:52:49 +0300 Subject: [PATCH 3/3] Added - flag to set whether disk needs to be delete or not when instance terminates --- .../google/resource_compute_instance.go | 8 +++ .../google/resource_compute_instance_test.go | 64 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/builtin/providers/google/resource_compute_instance.go b/builtin/providers/google/resource_compute_instance.go index 8766bca726..7e332dc5a6 100644 --- a/builtin/providers/google/resource_compute_instance.go +++ b/builtin/providers/google/resource_compute_instance.go @@ -60,6 +60,10 @@ func resourceComputeInstance() *schema.Resource { Type: schema.TypeString, Optional: true, }, + "auto_delete": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + }, }, }, }, @@ -160,6 +164,10 @@ func resourceComputeInstanceCreate(d *schema.ResourceData, meta interface{}) err disk.Boot = i == 0 disk.AutoDelete = true + if v, ok := d.GetOk(prefix + ".auto_delete"); ok { + disk.AutoDelete = v.(bool) + } + // Load up the disk for this disk if specified if v, ok := d.GetOk(prefix + ".disk"); ok { diskName := v.(string) diff --git a/builtin/providers/google/resource_compute_instance_test.go b/builtin/providers/google/resource_compute_instance_test.go index 24a752148d..5538da8ea6 100644 --- a/builtin/providers/google/resource_compute_instance_test.go +++ b/builtin/providers/google/resource_compute_instance_test.go @@ -3,6 +3,7 @@ package google import ( "fmt" "testing" + "strings" "code.google.com/p/google-api-go-client/compute/v1" "github.com/hashicorp/terraform/helper/resource" @@ -24,6 +25,7 @@ func TestAccComputeInstance_basic(t *testing.T) { "google_compute_instance.foobar", &instance), testAccCheckComputeInstanceTag(&instance, "foo"), testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"), + testAccCheckComputeInstanceDisk(&instance, "terraform-test", true, true), ), }, }, @@ -50,6 +52,28 @@ func TestAccComputeInstance_IP(t *testing.T) { }) } +//!NB requires that disk with name terraform-test-disk is present in gce, +//if created as dependency then it tries to remove it while it is still attached +//to instance and that fails with an error +func TestAccComputeInstance_disks(t *testing.T) { + var instance compute.Instance + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckComputeInstanceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccComputeInstance_disks, + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeInstanceDisk(&instance, "terraform-test", true, true), + testAccCheckComputeInstanceDisk(&instance, "terraform-test-disk", false, false), + ), + }, + }, + }) +} + func TestAccComputeInstance_update(t *testing.T) { var instance compute.Instance @@ -164,6 +188,22 @@ func testAccCheckComputeInstanceNetwork(instance *compute.Instance) resource.Tes } } +func testAccCheckComputeInstanceDisk(instance *compute.Instance, source string, delete bool, boot bool) resource.TestCheckFunc { + return func(s *terraform.State) error { + if instance.Disks == nil { + return fmt.Errorf("no disks") + } + + for _, disk := range instance.Disks { + if strings.LastIndex(disk.Source, "/"+source) == (len(disk.Source) - len(source) - 1) && disk.AutoDelete == delete && disk.Boot == boot{ + return nil + } + } + + return fmt.Errorf("Disk not found: %s", source) + } +} + func testAccCheckComputeInstanceTag(instance *compute.Instance, n string) resource.TestCheckFunc { return func(s *terraform.State) error { if instance.Tags == nil { @@ -244,3 +284,27 @@ resource "google_compute_instance" "foobar" { foo = "bar" } }` + +const testAccComputeInstance_disks = ` +resource "google_compute_instance" "foobar" { + name = "terraform-test" + machine_type = "n1-standard-1" + zone = "us-central1-a" + + disk { + image = "debian-7-wheezy-v20140814" + } + + disk { + disk = "terraform-test-disk" + auto_delete = false + } + + network { + source = "default" + } + + metadata { + foo = "bar" + } +}`