github.com/erriapo/terraform@v0.6.12-0.20160203182612-0340ea72354f/builtin/providers/google/resource_compute_instance_template_test.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/terraform/helper/acctest"
     8  	"github.com/hashicorp/terraform/helper/resource"
     9  	"github.com/hashicorp/terraform/terraform"
    10  	"google.golang.org/api/compute/v1"
    11  )
    12  
    13  func TestAccComputeInstanceTemplate_basic(t *testing.T) {
    14  	var instanceTemplate compute.InstanceTemplate
    15  
    16  	resource.Test(t, resource.TestCase{
    17  		PreCheck:     func() { testAccPreCheck(t) },
    18  		Providers:    testAccProviders,
    19  		CheckDestroy: testAccCheckComputeInstanceTemplateDestroy,
    20  		Steps: []resource.TestStep{
    21  			resource.TestStep{
    22  				Config: testAccComputeInstanceTemplate_basic,
    23  				Check: resource.ComposeTestCheckFunc(
    24  					testAccCheckComputeInstanceTemplateExists(
    25  						"google_compute_instance_template.foobar", &instanceTemplate),
    26  					testAccCheckComputeInstanceTemplateTag(&instanceTemplate, "foo"),
    27  					testAccCheckComputeInstanceTemplateMetadata(&instanceTemplate, "foo", "bar"),
    28  					testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140814", true, true),
    29  				),
    30  			},
    31  		},
    32  	})
    33  }
    34  
    35  func TestAccComputeInstanceTemplate_IP(t *testing.T) {
    36  	var instanceTemplate compute.InstanceTemplate
    37  
    38  	resource.Test(t, resource.TestCase{
    39  		PreCheck:     func() { testAccPreCheck(t) },
    40  		Providers:    testAccProviders,
    41  		CheckDestroy: testAccCheckComputeInstanceTemplateDestroy,
    42  		Steps: []resource.TestStep{
    43  			resource.TestStep{
    44  				Config: testAccComputeInstanceTemplate_ip,
    45  				Check: resource.ComposeTestCheckFunc(
    46  					testAccCheckComputeInstanceTemplateExists(
    47  						"google_compute_instance_template.foobar", &instanceTemplate),
    48  					testAccCheckComputeInstanceTemplateNetwork(&instanceTemplate),
    49  				),
    50  			},
    51  		},
    52  	})
    53  }
    54  
    55  func TestAccComputeInstanceTemplate_disks(t *testing.T) {
    56  	var instanceTemplate compute.InstanceTemplate
    57  
    58  	resource.Test(t, resource.TestCase{
    59  		PreCheck:     func() { testAccPreCheck(t) },
    60  		Providers:    testAccProviders,
    61  		CheckDestroy: testAccCheckComputeInstanceTemplateDestroy,
    62  		Steps: []resource.TestStep{
    63  			resource.TestStep{
    64  				Config: testAccComputeInstanceTemplate_disks,
    65  				Check: resource.ComposeTestCheckFunc(
    66  					testAccCheckComputeInstanceTemplateExists(
    67  						"google_compute_instance_template.foobar", &instanceTemplate),
    68  					testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140814", true, true),
    69  					testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "terraform-test-foobar", false, false),
    70  				),
    71  			},
    72  		},
    73  	})
    74  }
    75  
    76  func testAccCheckComputeInstanceTemplateDestroy(s *terraform.State) error {
    77  	config := testAccProvider.Meta().(*Config)
    78  
    79  	for _, rs := range s.RootModule().Resources {
    80  		if rs.Type != "google_compute_instance_template" {
    81  			continue
    82  		}
    83  
    84  		_, err := config.clientCompute.InstanceTemplates.Get(
    85  			config.Project, rs.Primary.ID).Do()
    86  		if err == nil {
    87  			return fmt.Errorf("Instance template still exists")
    88  		}
    89  	}
    90  
    91  	return nil
    92  }
    93  
    94  func testAccCheckComputeInstanceTemplateExists(n string, instanceTemplate *compute.InstanceTemplate) resource.TestCheckFunc {
    95  	return func(s *terraform.State) error {
    96  		rs, ok := s.RootModule().Resources[n]
    97  		if !ok {
    98  			return fmt.Errorf("Not found: %s", n)
    99  		}
   100  
   101  		if rs.Primary.ID == "" {
   102  			return fmt.Errorf("No ID is set")
   103  		}
   104  
   105  		config := testAccProvider.Meta().(*Config)
   106  
   107  		found, err := config.clientCompute.InstanceTemplates.Get(
   108  			config.Project, rs.Primary.ID).Do()
   109  		if err != nil {
   110  			return err
   111  		}
   112  
   113  		if found.Name != rs.Primary.ID {
   114  			return fmt.Errorf("Instance template not found")
   115  		}
   116  
   117  		*instanceTemplate = *found
   118  
   119  		return nil
   120  	}
   121  }
   122  
   123  func testAccCheckComputeInstanceTemplateMetadata(
   124  	instanceTemplate *compute.InstanceTemplate,
   125  	k string, v string) resource.TestCheckFunc {
   126  	return func(s *terraform.State) error {
   127  		if instanceTemplate.Properties.Metadata == nil {
   128  			return fmt.Errorf("no metadata")
   129  		}
   130  
   131  		for _, item := range instanceTemplate.Properties.Metadata.Items {
   132  			if k != item.Key {
   133  				continue
   134  			}
   135  
   136  			if item.Value != nil && v == *item.Value {
   137  				return nil
   138  			}
   139  
   140  			return fmt.Errorf("bad value for %s: %s", k, *item.Value)
   141  		}
   142  
   143  		return fmt.Errorf("metadata not found: %s", k)
   144  	}
   145  }
   146  
   147  func testAccCheckComputeInstanceTemplateNetwork(instanceTemplate *compute.InstanceTemplate) resource.TestCheckFunc {
   148  	return func(s *terraform.State) error {
   149  		for _, i := range instanceTemplate.Properties.NetworkInterfaces {
   150  			for _, c := range i.AccessConfigs {
   151  				if c.NatIP == "" {
   152  					return fmt.Errorf("no NAT IP")
   153  				}
   154  			}
   155  		}
   156  
   157  		return nil
   158  	}
   159  }
   160  
   161  func testAccCheckComputeInstanceTemplateDisk(instanceTemplate *compute.InstanceTemplate, source string, delete bool, boot bool) resource.TestCheckFunc {
   162  	return func(s *terraform.State) error {
   163  		if instanceTemplate.Properties.Disks == nil {
   164  			return fmt.Errorf("no disks")
   165  		}
   166  
   167  		for _, disk := range instanceTemplate.Properties.Disks {
   168  			if disk.InitializeParams == nil {
   169  				// Check disk source
   170  				if disk.Source == source {
   171  					if disk.AutoDelete == delete && disk.Boot == boot {
   172  						return nil
   173  					}
   174  				}
   175  			} else {
   176  				// Check source image
   177  				if disk.InitializeParams.SourceImage == source {
   178  					if disk.AutoDelete == delete && disk.Boot == boot {
   179  						return nil
   180  					}
   181  				}
   182  			}
   183  		}
   184  
   185  		return fmt.Errorf("Disk not found: %s", source)
   186  	}
   187  }
   188  
   189  func testAccCheckComputeInstanceTemplateTag(instanceTemplate *compute.InstanceTemplate, n string) resource.TestCheckFunc {
   190  	return func(s *terraform.State) error {
   191  		if instanceTemplate.Properties.Tags == nil {
   192  			return fmt.Errorf("no tags")
   193  		}
   194  
   195  		for _, k := range instanceTemplate.Properties.Tags.Items {
   196  			if k == n {
   197  				return nil
   198  			}
   199  		}
   200  
   201  		return fmt.Errorf("tag not found: %s", n)
   202  	}
   203  }
   204  
   205  var testAccComputeInstanceTemplate_basic = fmt.Sprintf(`
   206  resource "google_compute_instance_template" "foobar" {
   207  	name = "instancet-test-%s"
   208  	machine_type = "n1-standard-1"
   209  	can_ip_forward = false
   210  	tags = ["foo", "bar"]
   211  
   212  	disk {
   213  		source_image = "debian-7-wheezy-v20140814"
   214  		auto_delete = true
   215  		boot = true
   216  	}
   217  
   218  	network_interface {
   219  		network = "default"
   220  	}
   221  
   222  	scheduling {
   223  		preemptible = false
   224  		automatic_restart = true
   225  	}
   226  
   227  	metadata {
   228  		foo = "bar"
   229  	}
   230  
   231  	service_account {
   232  		scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   233  	}
   234  }`, acctest.RandString(10))
   235  
   236  var testAccComputeInstanceTemplate_ip = fmt.Sprintf(`
   237  resource "google_compute_address" "foo" {
   238  	name = "instancet-test-%s"
   239  }
   240  
   241  resource "google_compute_instance_template" "foobar" {
   242  	name = "instancet-test-%s"
   243  	machine_type = "n1-standard-1"
   244  	tags = ["foo", "bar"]
   245  
   246  	disk {
   247  		source_image = "debian-7-wheezy-v20140814"
   248  	}
   249  
   250  	network_interface {
   251  		network = "default"
   252  		access_config {
   253  			nat_ip = "${google_compute_address.foo.address}"
   254  		}
   255  	}
   256  
   257  	metadata {
   258  		foo = "bar"
   259  	}
   260  }`, acctest.RandString(10), acctest.RandString(10))
   261  
   262  var testAccComputeInstanceTemplate_disks = fmt.Sprintf(`
   263  resource "google_compute_disk" "foobar" {
   264  	name = "instancet-test-%s"
   265  	image = "debian-7-wheezy-v20140814"
   266  	size = 10
   267  	type = "pd-ssd"
   268  	zone = "us-central1-a"
   269  }
   270  
   271  resource "google_compute_instance_template" "foobar" {
   272  	name = "instancet-test-%s"
   273  	machine_type = "n1-standard-1"
   274  
   275  	disk {
   276  		source_image = "debian-7-wheezy-v20140814"
   277  		auto_delete = true
   278  		disk_size_gb = 100
   279  		boot = true
   280  	}
   281  
   282  	disk {
   283  		source = "terraform-test-foobar"
   284  		auto_delete = false
   285  		boot = false
   286  	}
   287  
   288  	network_interface {
   289  		network = "default"
   290  	}
   291  
   292  	metadata {
   293  		foo = "bar"
   294  	}
   295  }`, acctest.RandString(10), acctest.RandString(10))