github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/google/resource_compute_project_metadata_test.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/hashicorp/terraform/helper/acctest"
     9  	"github.com/hashicorp/terraform/helper/resource"
    10  	"github.com/hashicorp/terraform/terraform"
    11  	"google.golang.org/api/compute/v1"
    12  )
    13  
    14  // Add two key value pairs
    15  func TestAccComputeProjectMetadata_basic(t *testing.T) {
    16  	skipIfEnvNotSet(t,
    17  		[]string{
    18  			"GOOGLE_ORG",
    19  			"GOOGLE_BILLING_ACCOUNT",
    20  		}...,
    21  	)
    22  
    23  	billingId := os.Getenv("GOOGLE_BILLING_ACCOUNT")
    24  	var project compute.Project
    25  	projectID := "terrafom-test-" + acctest.RandString(10)
    26  
    27  	resource.Test(t, resource.TestCase{
    28  		PreCheck:     func() { testAccPreCheck(t) },
    29  		Providers:    testAccProviders,
    30  		CheckDestroy: testAccCheckComputeProjectMetadataDestroy,
    31  		Steps: []resource.TestStep{
    32  			resource.TestStep{
    33  				Config: testAccComputeProject_basic0_metadata(projectID, pname, org, billingId),
    34  				Check: resource.ComposeTestCheckFunc(
    35  					testAccCheckComputeProjectExists(
    36  						"google_compute_project_metadata.fizzbuzz", projectID, &project),
    37  					testAccCheckComputeProjectMetadataContains(projectID, "banana", "orange"),
    38  					testAccCheckComputeProjectMetadataContains(projectID, "sofa", "darwinism"),
    39  					testAccCheckComputeProjectMetadataSize(projectID, 2),
    40  				),
    41  			},
    42  		},
    43  	})
    44  }
    45  
    46  // Add three key value pairs, then replace one and modify a second
    47  func TestAccComputeProjectMetadata_modify_1(t *testing.T) {
    48  	skipIfEnvNotSet(t,
    49  		[]string{
    50  			"GOOGLE_ORG",
    51  			"GOOGLE_BILLING_ACCOUNT",
    52  		}...,
    53  	)
    54  
    55  	billingId := os.Getenv("GOOGLE_BILLING_ACCOUNT")
    56  	var project compute.Project
    57  	projectID := "terrafom-test-" + acctest.RandString(10)
    58  
    59  	resource.Test(t, resource.TestCase{
    60  		PreCheck:     func() { testAccPreCheck(t) },
    61  		Providers:    testAccProviders,
    62  		CheckDestroy: testAccCheckComputeProjectMetadataDestroy,
    63  		Steps: []resource.TestStep{
    64  			resource.TestStep{
    65  				Config: testAccComputeProject_modify0_metadata(projectID, pname, org, billingId),
    66  				Check: resource.ComposeTestCheckFunc(
    67  					testAccCheckComputeProjectExists(
    68  						"google_compute_project_metadata.fizzbuzz", projectID, &project),
    69  					testAccCheckComputeProjectMetadataContains(projectID, "paper", "pen"),
    70  					testAccCheckComputeProjectMetadataContains(projectID, "genghis_khan", "french bread"),
    71  					testAccCheckComputeProjectMetadataContains(projectID, "happy", "smiling"),
    72  					testAccCheckComputeProjectMetadataSize(projectID, 3),
    73  				),
    74  			},
    75  
    76  			resource.TestStep{
    77  				Config: testAccComputeProject_modify1_metadata(projectID, pname, org, billingId),
    78  				Check: resource.ComposeTestCheckFunc(
    79  					testAccCheckComputeProjectExists(
    80  						"google_compute_project_metadata.fizzbuzz", projectID, &project),
    81  					testAccCheckComputeProjectMetadataContains(projectID, "paper", "pen"),
    82  					testAccCheckComputeProjectMetadataContains(projectID, "paris", "french bread"),
    83  					testAccCheckComputeProjectMetadataContains(projectID, "happy", "laughing"),
    84  					testAccCheckComputeProjectMetadataSize(projectID, 3),
    85  				),
    86  			},
    87  		},
    88  	})
    89  }
    90  
    91  // Add two key value pairs, and replace both
    92  func TestAccComputeProjectMetadata_modify_2(t *testing.T) {
    93  	skipIfEnvNotSet(t,
    94  		[]string{
    95  			"GOOGLE_ORG",
    96  			"GOOGLE_BILLING_ACCOUNT",
    97  		}...,
    98  	)
    99  
   100  	billingId := os.Getenv("GOOGLE_BILLING_ACCOUNT")
   101  	var project compute.Project
   102  	projectID := "terraform-test-" + acctest.RandString(10)
   103  
   104  	resource.Test(t, resource.TestCase{
   105  		PreCheck:     func() { testAccPreCheck(t) },
   106  		Providers:    testAccProviders,
   107  		CheckDestroy: testAccCheckComputeProjectMetadataDestroy,
   108  		Steps: []resource.TestStep{
   109  			resource.TestStep{
   110  				Config: testAccComputeProject_basic0_metadata(projectID, pname, org, billingId),
   111  				Check: resource.ComposeTestCheckFunc(
   112  					testAccCheckComputeProjectExists(
   113  						"google_compute_project_metadata.fizzbuzz", projectID, &project),
   114  					testAccCheckComputeProjectMetadataContains(projectID, "banana", "orange"),
   115  					testAccCheckComputeProjectMetadataContains(projectID, "sofa", "darwinism"),
   116  					testAccCheckComputeProjectMetadataSize(projectID, 2),
   117  				),
   118  			},
   119  
   120  			resource.TestStep{
   121  				Config: testAccComputeProject_basic1_metadata(projectID, pname, org, billingId),
   122  				Check: resource.ComposeTestCheckFunc(
   123  					testAccCheckComputeProjectExists(
   124  						"google_compute_project_metadata.fizzbuzz", projectID, &project),
   125  					testAccCheckComputeProjectMetadataContains(projectID, "kiwi", "papaya"),
   126  					testAccCheckComputeProjectMetadataContains(projectID, "finches", "darwinism"),
   127  					testAccCheckComputeProjectMetadataSize(projectID, 2),
   128  				),
   129  			},
   130  		},
   131  	})
   132  }
   133  
   134  func testAccCheckComputeProjectMetadataDestroy(s *terraform.State) error {
   135  	config := testAccProvider.Meta().(*Config)
   136  
   137  	for _, rs := range s.RootModule().Resources {
   138  		if rs.Type != "google_compute_project_metadata" {
   139  			continue
   140  		}
   141  
   142  		project, err := config.clientCompute.Projects.Get(rs.Primary.ID).Do()
   143  		if err == nil && len(project.CommonInstanceMetadata.Items) > 0 {
   144  			return fmt.Errorf("Error, metadata items still exist in %s", rs.Primary.ID)
   145  		}
   146  	}
   147  
   148  	return nil
   149  }
   150  
   151  func testAccCheckComputeProjectExists(n, projectID string, project *compute.Project) resource.TestCheckFunc {
   152  	return func(s *terraform.State) error {
   153  		rs, ok := s.RootModule().Resources[n]
   154  		if !ok {
   155  			return fmt.Errorf("Not found: %s", n)
   156  		}
   157  
   158  		if rs.Primary.ID == "" {
   159  			return fmt.Errorf("No ID is set")
   160  		}
   161  
   162  		config := testAccProvider.Meta().(*Config)
   163  
   164  		found, err := config.clientCompute.Projects.Get(projectID).Do()
   165  		if err != nil {
   166  			return err
   167  		}
   168  
   169  		if "common_metadata" != rs.Primary.ID {
   170  			return fmt.Errorf("Common metadata not found, found %s", rs.Primary.ID)
   171  		}
   172  
   173  		*project = *found
   174  
   175  		return nil
   176  	}
   177  }
   178  
   179  func testAccCheckComputeProjectMetadataContains(projectID, key, value string) resource.TestCheckFunc {
   180  	return func(s *terraform.State) error {
   181  		config := testAccProvider.Meta().(*Config)
   182  		project, err := config.clientCompute.Projects.Get(projectID).Do()
   183  		if err != nil {
   184  			return fmt.Errorf("Error, failed to load project service for %s: %s", config.Project, err)
   185  		}
   186  
   187  		for _, kv := range project.CommonInstanceMetadata.Items {
   188  			if kv.Key == key {
   189  				if kv.Value != nil && *kv.Value == value {
   190  					return nil
   191  				} else {
   192  					return fmt.Errorf("Error, key value mismatch, wanted (%s, %s), got (%s, %s)",
   193  						key, value, kv.Key, *kv.Value)
   194  				}
   195  			}
   196  		}
   197  
   198  		return fmt.Errorf("Error, key %s not present in %s", key, project.SelfLink)
   199  	}
   200  }
   201  
   202  func testAccCheckComputeProjectMetadataSize(projectID string, size int) resource.TestCheckFunc {
   203  	return func(s *terraform.State) error {
   204  		config := testAccProvider.Meta().(*Config)
   205  		project, err := config.clientCompute.Projects.Get(projectID).Do()
   206  		if err != nil {
   207  			return fmt.Errorf("Error, failed to load project service for %s: %s", config.Project, err)
   208  		}
   209  
   210  		if size > len(project.CommonInstanceMetadata.Items) {
   211  			return fmt.Errorf("Error, expected at least %d metadata items, got %d", size,
   212  				len(project.CommonInstanceMetadata.Items))
   213  		}
   214  
   215  		return nil
   216  	}
   217  }
   218  
   219  func testAccComputeProject_basic0_metadata(projectID, name, org, billing string) string {
   220  	return fmt.Sprintf(`
   221  resource "google_project" "project" {
   222    project_id = "%s"
   223    name = "%s"
   224    org_id = "%s"
   225    billing_account = "%s"
   226  }
   227  
   228  resource "google_project_services" "services" {
   229    project = "${google_project.project.project_id}"
   230    services = ["compute-component.googleapis.com"]
   231  }
   232  
   233  resource "google_compute_project_metadata" "fizzbuzz" {
   234    project = "${google_project.project.project_id}"
   235    metadata {
   236      banana = "orange"
   237      sofa = "darwinism"
   238    }
   239    depends_on = ["google_project_services.services"]
   240  }`, projectID, name, org, billing)
   241  }
   242  
   243  func testAccComputeProject_basic1_metadata(projectID, name, org, billing string) string {
   244  	return fmt.Sprintf(`
   245  resource "google_project" "project" {
   246    project_id = "%s"
   247    name = "%s"
   248    org_id = "%s"
   249    billing_account = "%s"
   250  }
   251  
   252  resource "google_project_services" "services" {
   253    project = "${google_project.project.project_id}"
   254    services = ["compute-component.googleapis.com"]
   255  }
   256  
   257  resource "google_compute_project_metadata" "fizzbuzz" {
   258    project = "${google_project.project.project_id}"
   259    metadata {
   260      kiwi = "papaya"
   261      finches = "darwinism"
   262    }
   263    depends_on = ["google_project_services.services"]
   264  }`, projectID, name, org, billing)
   265  }
   266  
   267  func testAccComputeProject_modify0_metadata(projectID, name, org, billing string) string {
   268  	return fmt.Sprintf(`
   269  resource "google_project" "project" {
   270    project_id = "%s"
   271    name = "%s"
   272    org_id = "%s"
   273    billing_account = "%s"
   274  }
   275  
   276  resource "google_project_services" "services" {
   277    project = "${google_project.project.project_id}"
   278    services = ["compute-component.googleapis.com"]
   279  }
   280  
   281  resource "google_compute_project_metadata" "fizzbuzz" {
   282    project = "${google_project.project.project_id}"
   283    metadata {
   284      paper = "pen"
   285      genghis_khan = "french bread"
   286      happy = "smiling"
   287    }
   288    depends_on = ["google_project_services.services"]
   289  }`, projectID, name, org, billing)
   290  }
   291  
   292  func testAccComputeProject_modify1_metadata(projectID, name, org, billing string) string {
   293  	return fmt.Sprintf(`
   294  resource "google_project" "project" {
   295    project_id = "%s"
   296    name = "%s"
   297    org_id = "%s"
   298    billing_account = "%s"
   299  }
   300  
   301  resource "google_project_services" "services" {
   302    project = "${google_project.project.project_id}"
   303    services = ["compute-component.googleapis.com"]
   304  }
   305  
   306  resource "google_compute_project_metadata" "fizzbuzz" {
   307    project = "${google_project.project.project_id}"
   308    metadata {
   309      paper = "pen"
   310      paris = "french bread"
   311      happy = "laughing"
   312    }
   313    depends_on = ["google_project_services.services"]
   314  }`, projectID, name, org, billing)
   315  }