github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/builtin/providers/google/resource_compute_disk_test.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strconv"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/terraform/helper/acctest"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  	"google.golang.org/api/compute/v1"
    13  )
    14  
    15  func TestAccComputeDisk_basic(t *testing.T) {
    16  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    17  	var disk compute.Disk
    18  
    19  	resource.Test(t, resource.TestCase{
    20  		PreCheck:     func() { testAccPreCheck(t) },
    21  		Providers:    testAccProviders,
    22  		CheckDestroy: testAccCheckComputeDiskDestroy,
    23  		Steps: []resource.TestStep{
    24  			resource.TestStep{
    25  				Config: testAccComputeDisk_basic(diskName),
    26  				Check: resource.ComposeTestCheckFunc(
    27  					testAccCheckComputeDiskExists(
    28  						"google_compute_disk.foobar", &disk),
    29  				),
    30  			},
    31  		},
    32  	})
    33  }
    34  
    35  func TestAccComputeDisk_fromSnapshotURI(t *testing.T) {
    36  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    37  	firstDiskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    38  	snapshotName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    39  	var xpn_host = os.Getenv("GOOGLE_XPN_HOST_PROJECT")
    40  
    41  	var disk compute.Disk
    42  
    43  	resource.Test(t, resource.TestCase{
    44  		PreCheck:     func() { testAccPreCheck(t) },
    45  		Providers:    testAccProviders,
    46  		CheckDestroy: testAccCheckComputeDiskDestroy,
    47  		Steps: []resource.TestStep{
    48  			resource.TestStep{
    49  				Config: testAccComputeDisk_fromSnapshotURI(firstDiskName, snapshotName, diskName, xpn_host),
    50  				Check: resource.ComposeTestCheckFunc(
    51  					testAccCheckComputeDiskExists(
    52  						"google_compute_disk.seconddisk", &disk),
    53  				),
    54  			},
    55  		},
    56  	})
    57  }
    58  
    59  func TestAccComputeDisk_encryption(t *testing.T) {
    60  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    61  	var disk compute.Disk
    62  
    63  	resource.Test(t, resource.TestCase{
    64  		PreCheck:     func() { testAccPreCheck(t) },
    65  		Providers:    testAccProviders,
    66  		CheckDestroy: testAccCheckComputeDiskDestroy,
    67  		Steps: []resource.TestStep{
    68  			resource.TestStep{
    69  				Config: testAccComputeDisk_encryption(diskName),
    70  				Check: resource.ComposeTestCheckFunc(
    71  					testAccCheckComputeDiskExists(
    72  						"google_compute_disk.foobar", &disk),
    73  					testAccCheckEncryptionKey(
    74  						"google_compute_disk.foobar", &disk),
    75  				),
    76  			},
    77  		},
    78  	})
    79  }
    80  
    81  func TestAccComputeDisk_deleteDetach(t *testing.T) {
    82  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    83  	instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    84  	var disk compute.Disk
    85  
    86  	resource.Test(t, resource.TestCase{
    87  		PreCheck:     func() { testAccPreCheck(t) },
    88  		Providers:    testAccProviders,
    89  		CheckDestroy: testAccCheckComputeDiskDestroy,
    90  		Steps: []resource.TestStep{
    91  			resource.TestStep{
    92  				Config: testAccComputeDisk_deleteDetach(instanceName, diskName),
    93  				Check: resource.ComposeTestCheckFunc(
    94  					testAccCheckComputeDiskExists(
    95  						"google_compute_disk.foo", &disk),
    96  				),
    97  			},
    98  			// this needs to be a second step so we refresh and see the instance
    99  			// listed as attached to the disk; the instance is created after the
   100  			// disk. and the disk's properties aren't refreshed unless there's
   101  			// another step
   102  			resource.TestStep{
   103  				Config: testAccComputeDisk_deleteDetach(instanceName, diskName),
   104  				Check: resource.ComposeTestCheckFunc(
   105  					testAccCheckComputeDiskExists(
   106  						"google_compute_disk.foo", &disk),
   107  					testAccCheckComputeDiskInstances(
   108  						"google_compute_disk.foo", &disk),
   109  				),
   110  			},
   111  		},
   112  	})
   113  }
   114  
   115  func testAccCheckComputeDiskDestroy(s *terraform.State) error {
   116  	config := testAccProvider.Meta().(*Config)
   117  
   118  	for _, rs := range s.RootModule().Resources {
   119  		if rs.Type != "google_compute_disk" {
   120  			continue
   121  		}
   122  
   123  		_, err := config.clientCompute.Disks.Get(
   124  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   125  		if err == nil {
   126  			return fmt.Errorf("Disk still exists")
   127  		}
   128  	}
   129  
   130  	return nil
   131  }
   132  
   133  func testAccCheckComputeDiskExists(n string, disk *compute.Disk) resource.TestCheckFunc {
   134  	return func(s *terraform.State) error {
   135  		rs, ok := s.RootModule().Resources[n]
   136  		if !ok {
   137  			return fmt.Errorf("Not found: %s", n)
   138  		}
   139  
   140  		if rs.Primary.ID == "" {
   141  			return fmt.Errorf("No ID is set")
   142  		}
   143  
   144  		config := testAccProvider.Meta().(*Config)
   145  
   146  		found, err := config.clientCompute.Disks.Get(
   147  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   148  		if err != nil {
   149  			return err
   150  		}
   151  
   152  		if found.Name != rs.Primary.ID {
   153  			return fmt.Errorf("Disk not found")
   154  		}
   155  
   156  		*disk = *found
   157  
   158  		return nil
   159  	}
   160  }
   161  
   162  func testAccCheckEncryptionKey(n string, disk *compute.Disk) resource.TestCheckFunc {
   163  	return func(s *terraform.State) error {
   164  		rs, ok := s.RootModule().Resources[n]
   165  		if !ok {
   166  			return fmt.Errorf("Not found: %s", n)
   167  		}
   168  
   169  		attr := rs.Primary.Attributes["disk_encryption_key_sha256"]
   170  		if disk.DiskEncryptionKey == nil && attr != "" {
   171  			return fmt.Errorf("Disk %s has mismatched encryption key.\nTF State: %+v\nGCP State: <empty>", n, attr)
   172  		}
   173  
   174  		if attr != disk.DiskEncryptionKey.Sha256 {
   175  			return fmt.Errorf("Disk %s has mismatched encryption key.\nTF State: %+v.\nGCP State: %+v",
   176  				n, attr, disk.DiskEncryptionKey.Sha256)
   177  		}
   178  		return nil
   179  	}
   180  }
   181  
   182  func testAccCheckComputeDiskInstances(n string, disk *compute.Disk) resource.TestCheckFunc {
   183  	return func(s *terraform.State) error {
   184  		rs, ok := s.RootModule().Resources[n]
   185  		if !ok {
   186  			return fmt.Errorf("Not found: %s", n)
   187  		}
   188  
   189  		attr := rs.Primary.Attributes["users.#"]
   190  		if strconv.Itoa(len(disk.Users)) != attr {
   191  			return fmt.Errorf("Disk %s has mismatched users.\nTF State: %+v\nGCP State: %+v", n, rs.Primary.Attributes["users"], disk.Users)
   192  		}
   193  
   194  		for pos, user := range disk.Users {
   195  			if rs.Primary.Attributes["users."+strconv.Itoa(pos)] != user {
   196  				return fmt.Errorf("Disk %s has mismatched users.\nTF State: %+v.\nGCP State: %+v",
   197  					n, rs.Primary.Attributes["users"], disk.Users)
   198  			}
   199  		}
   200  		return nil
   201  	}
   202  }
   203  
   204  func testAccComputeDisk_basic(diskName string) string {
   205  	return fmt.Sprintf(`
   206  resource "google_compute_disk" "foobar" {
   207  	name = "%s"
   208  	image = "debian-8-jessie-v20160803"
   209  	size = 50
   210  	type = "pd-ssd"
   211  	zone = "us-central1-a"
   212  }`, diskName)
   213  }
   214  
   215  func testAccComputeDisk_fromSnapshotURI(firstDiskName, snapshotName, diskName, xpn_host string) string {
   216  	return fmt.Sprintf(`
   217  		resource "google_compute_disk" "foobar" {
   218  			name = "%s"
   219  			image = "debian-8-jessie-v20160803"
   220  			size = 50
   221  			type = "pd-ssd"
   222  			zone = "us-central1-a"
   223  			project = "%s"
   224  		}
   225  
   226  resource "google_compute_snapshot" "snapdisk" {
   227    name = "%s"
   228    source_disk = "${google_compute_disk.foobar.name}"
   229    zone = "us-central1-a"
   230  	project = "%s"
   231  }
   232  resource "google_compute_disk" "seconddisk" {
   233  	name = "%s"
   234  	snapshot = "${google_compute_snapshot.snapdisk.self_link}"
   235  	type = "pd-ssd"
   236  	zone = "us-central1-a"
   237  }`, firstDiskName, xpn_host, snapshotName, xpn_host, diskName)
   238  }
   239  
   240  func testAccComputeDisk_encryption(diskName string) string {
   241  	return fmt.Sprintf(`
   242  resource "google_compute_disk" "foobar" {
   243  	name = "%s"
   244  	image = "debian-8-jessie-v20160803"
   245  	size = 50
   246  	type = "pd-ssd"
   247  	zone = "us-central1-a"
   248  	disk_encryption_key_raw = "SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0="
   249  }`, diskName)
   250  }
   251  
   252  func testAccComputeDisk_deleteDetach(instanceName, diskName string) string {
   253  	return fmt.Sprintf(`
   254  resource "google_compute_disk" "foo" {
   255  	name = "%s"
   256  	image = "debian-8"
   257  	size = 50
   258  	type = "pd-ssd"
   259  	zone = "us-central1-a"
   260  }
   261  
   262  resource "google_compute_instance" "bar" {
   263  	name = "%s"
   264  	machine_type = "n1-standard-1"
   265  	zone = "us-central1-a"
   266  
   267  	disk {
   268  		image = "debian-8"
   269  	}
   270  
   271  	disk {
   272  		disk = "${google_compute_disk.foo.name}"
   273  		auto_delete = false
   274  	}
   275  
   276  	network_interface {
   277  		network = "default"
   278  	}
   279  }`, diskName, instanceName)
   280  }