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

     1  package google
     2  
     3  /**
     4   * Note! You must run these tests once at a time. Google Cloud SQL does
     5   * not allow you to reuse a database for a short time after you reserved it,
     6   * and for this reason the tests will fail if the same config is used serveral
     7   * times in short succession.
     8   */
     9  
    10  import (
    11  	"fmt"
    12  	"strconv"
    13  	"testing"
    14  
    15  	"github.com/hashicorp/terraform/helper/resource"
    16  	"github.com/hashicorp/terraform/terraform"
    17  
    18  	"google.golang.org/api/sqladmin/v1beta4"
    19  )
    20  
    21  func TestAccGoogleSqlDatabaseInstance_basic(t *testing.T) {
    22  	var instance sqladmin.DatabaseInstance
    23  	databaseID := genRandInt()
    24  
    25  	resource.Test(t, resource.TestCase{
    26  		PreCheck:     func() { testAccPreCheck(t) },
    27  		Providers:    testAccProviders,
    28  		CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy,
    29  		Steps: []resource.TestStep{
    30  			resource.TestStep{
    31  				Config: fmt.Sprintf(
    32  					testGoogleSqlDatabaseInstance_basic, databaseID),
    33  				Check: resource.ComposeTestCheckFunc(
    34  					testAccCheckGoogleSqlDatabaseInstanceExists(
    35  						"google_sql_database_instance.instance", &instance),
    36  					testAccCheckGoogleSqlDatabaseInstanceEquals(
    37  						"google_sql_database_instance.instance", &instance),
    38  				),
    39  			},
    40  		},
    41  	})
    42  }
    43  
    44  func TestAccGoogleSqlDatabaseInstance_basic2(t *testing.T) {
    45  	var instance sqladmin.DatabaseInstance
    46  
    47  	resource.Test(t, resource.TestCase{
    48  		PreCheck:     func() { testAccPreCheck(t) },
    49  		Providers:    testAccProviders,
    50  		CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy,
    51  		Steps: []resource.TestStep{
    52  			resource.TestStep{
    53  				Config: testGoogleSqlDatabaseInstance_basic2,
    54  				Check: resource.ComposeTestCheckFunc(
    55  					testAccCheckGoogleSqlDatabaseInstanceExists(
    56  						"google_sql_database_instance.instance", &instance),
    57  					testAccCheckGoogleSqlDatabaseInstanceEquals(
    58  						"google_sql_database_instance.instance", &instance),
    59  				),
    60  			},
    61  		},
    62  	})
    63  }
    64  
    65  func TestAccGoogleSqlDatabaseInstance_settings_basic(t *testing.T) {
    66  	var instance sqladmin.DatabaseInstance
    67  	databaseID := genRandInt()
    68  
    69  	resource.Test(t, resource.TestCase{
    70  		PreCheck:     func() { testAccPreCheck(t) },
    71  		Providers:    testAccProviders,
    72  		CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy,
    73  		Steps: []resource.TestStep{
    74  			resource.TestStep{
    75  				Config: fmt.Sprintf(
    76  					testGoogleSqlDatabaseInstance_settings, databaseID),
    77  				Check: resource.ComposeTestCheckFunc(
    78  					testAccCheckGoogleSqlDatabaseInstanceExists(
    79  						"google_sql_database_instance.instance", &instance),
    80  					testAccCheckGoogleSqlDatabaseInstanceEquals(
    81  						"google_sql_database_instance.instance", &instance),
    82  				),
    83  			},
    84  		},
    85  	})
    86  }
    87  
    88  func TestAccGoogleSqlDatabaseInstance_settings_upgrade(t *testing.T) {
    89  	var instance sqladmin.DatabaseInstance
    90  	databaseID := genRandInt()
    91  
    92  	resource.Test(t, resource.TestCase{
    93  		PreCheck:     func() { testAccPreCheck(t) },
    94  		Providers:    testAccProviders,
    95  		CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy,
    96  		Steps: []resource.TestStep{
    97  			resource.TestStep{
    98  				Config: fmt.Sprintf(
    99  					testGoogleSqlDatabaseInstance_basic, databaseID),
   100  				Check: resource.ComposeTestCheckFunc(
   101  					testAccCheckGoogleSqlDatabaseInstanceExists(
   102  						"google_sql_database_instance.instance", &instance),
   103  					testAccCheckGoogleSqlDatabaseInstanceEquals(
   104  						"google_sql_database_instance.instance", &instance),
   105  				),
   106  			},
   107  			resource.TestStep{
   108  				Config: fmt.Sprintf(
   109  					testGoogleSqlDatabaseInstance_settings, databaseID),
   110  				Check: resource.ComposeTestCheckFunc(
   111  					testAccCheckGoogleSqlDatabaseInstanceExists(
   112  						"google_sql_database_instance.instance", &instance),
   113  					testAccCheckGoogleSqlDatabaseInstanceEquals(
   114  						"google_sql_database_instance.instance", &instance),
   115  				),
   116  			},
   117  		},
   118  	})
   119  }
   120  
   121  func TestAccGoogleSqlDatabaseInstance_settings_downgrade(t *testing.T) {
   122  	var instance sqladmin.DatabaseInstance
   123  	databaseID := genRandInt()
   124  
   125  	resource.Test(t, resource.TestCase{
   126  		PreCheck:     func() { testAccPreCheck(t) },
   127  		Providers:    testAccProviders,
   128  		CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy,
   129  		Steps: []resource.TestStep{
   130  			resource.TestStep{
   131  				Config: fmt.Sprintf(
   132  					testGoogleSqlDatabaseInstance_settings, databaseID),
   133  				Check: resource.ComposeTestCheckFunc(
   134  					testAccCheckGoogleSqlDatabaseInstanceExists(
   135  						"google_sql_database_instance.instance", &instance),
   136  					testAccCheckGoogleSqlDatabaseInstanceEquals(
   137  						"google_sql_database_instance.instance", &instance),
   138  				),
   139  			},
   140  			resource.TestStep{
   141  				Config: fmt.Sprintf(
   142  					testGoogleSqlDatabaseInstance_basic, databaseID),
   143  				Check: resource.ComposeTestCheckFunc(
   144  					testAccCheckGoogleSqlDatabaseInstanceExists(
   145  						"google_sql_database_instance.instance", &instance),
   146  					testAccCheckGoogleSqlDatabaseInstanceEquals(
   147  						"google_sql_database_instance.instance", &instance),
   148  				),
   149  			},
   150  		},
   151  	})
   152  }
   153  
   154  func testAccCheckGoogleSqlDatabaseInstanceEquals(n string,
   155  	instance *sqladmin.DatabaseInstance) resource.TestCheckFunc {
   156  	return func(s *terraform.State) error {
   157  		rs, ok := s.RootModule().Resources[n]
   158  		if !ok {
   159  			return fmt.Errorf("Not found: %s", n)
   160  		}
   161  		attributes := rs.Primary.Attributes
   162  
   163  		server := instance.Name
   164  		local := attributes["name"]
   165  		if server != local {
   166  			return fmt.Errorf("Error name mismatch, (%s, %s)", server, local)
   167  		}
   168  
   169  		server = instance.Settings.Tier
   170  		local = attributes["settings.0.tier"]
   171  		if server != local {
   172  			return fmt.Errorf("Error settings.tier mismatch, (%s, %s)", server, local)
   173  		}
   174  
   175  		server = instance.MasterInstanceName
   176  		local = attributes["master_instance_name"]
   177  		if server != local && len(server) > 0 && len(local) > 0 {
   178  			return fmt.Errorf("Error master_instance_name mismatch, (%s, %s)", server, local)
   179  		}
   180  
   181  		server = instance.Settings.ActivationPolicy
   182  		local = attributes["settings.0.activation_policy"]
   183  		if server != local && len(server) > 0 && len(local) > 0 {
   184  			return fmt.Errorf("Error settings.activation_policy mismatch, (%s, %s)", server, local)
   185  		}
   186  
   187  		if instance.Settings.BackupConfiguration != nil {
   188  			server = strconv.FormatBool(instance.Settings.BackupConfiguration.BinaryLogEnabled)
   189  			local = attributes["settings.0.backup_configuration.0.binary_log_enabled"]
   190  			if server != local && len(server) > 0 && len(local) > 0 {
   191  				return fmt.Errorf("Error settings.backup_configuration.binary_log_enabled mismatch, (%s, %s)", server, local)
   192  			}
   193  
   194  			server = strconv.FormatBool(instance.Settings.BackupConfiguration.Enabled)
   195  			local = attributes["settings.0.backup_configuration.0.enabled"]
   196  			if server != local && len(server) > 0 && len(local) > 0 {
   197  				return fmt.Errorf("Error settings.backup_configuration.enabled mismatch, (%s, %s)", server, local)
   198  			}
   199  
   200  			server = instance.Settings.BackupConfiguration.StartTime
   201  			local = attributes["settings.0.backup_configuration.0.start_time"]
   202  			if server != local && len(server) > 0 && len(local) > 0 {
   203  				return fmt.Errorf("Error settings.backup_configuration.start_time mismatch, (%s, %s)", server, local)
   204  			}
   205  		}
   206  
   207  		server = strconv.FormatBool(instance.Settings.CrashSafeReplicationEnabled)
   208  		local = attributes["settings.0.crash_safe_replication"]
   209  		if server != local && len(server) > 0 && len(local) > 0 {
   210  			return fmt.Errorf("Error settings.crash_safe_replication mismatch, (%s, %s)", server, local)
   211  		}
   212  
   213  		if instance.Settings.IpConfiguration != nil {
   214  			server = strconv.FormatBool(instance.Settings.IpConfiguration.Ipv4Enabled)
   215  			local = attributes["settings.0.ip_configuration.0.ipv4_enabled"]
   216  			if server != local && len(server) > 0 && len(local) > 0 {
   217  				return fmt.Errorf("Error settings.ip_configuration.ipv4_enabled mismatch, (%s, %s)", server, local)
   218  			}
   219  
   220  			server = strconv.FormatBool(instance.Settings.IpConfiguration.RequireSsl)
   221  			local = attributes["settings.0.ip_configuration.0.require_ssl"]
   222  			if server != local && len(server) > 0 && len(local) > 0 {
   223  				return fmt.Errorf("Error settings.ip_configuration.require_ssl mismatch, (%s, %s)", server, local)
   224  			}
   225  		}
   226  
   227  		if instance.Settings.LocationPreference != nil {
   228  			server = instance.Settings.LocationPreference.FollowGaeApplication
   229  			local = attributes["settings.0.location_preference.0.follow_gae_application"]
   230  			if server != local && len(server) > 0 && len(local) > 0 {
   231  				return fmt.Errorf("Error settings.location_preference.follow_gae_application mismatch, (%s, %s)", server, local)
   232  			}
   233  
   234  			server = instance.Settings.LocationPreference.Zone
   235  			local = attributes["settings.0.location_preference.0.zone"]
   236  			if server != local && len(server) > 0 && len(local) > 0 {
   237  				return fmt.Errorf("Error settings.location_preference.zone mismatch, (%s, %s)", server, local)
   238  			}
   239  		}
   240  
   241  		server = instance.Settings.PricingPlan
   242  		local = attributes["settings.0.pricing_plan"]
   243  		if server != local && len(server) > 0 && len(local) > 0 {
   244  			return fmt.Errorf("Error settings.pricing_plan mismatch, (%s, %s)", server, local)
   245  		}
   246  
   247  		if instance.ReplicaConfiguration != nil &&
   248  			instance.ReplicaConfiguration.MysqlReplicaConfiguration != nil {
   249  			server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.CaCertificate
   250  			local = attributes["replica_configuration.0.ca_certificate"]
   251  			if server != local && len(server) > 0 && len(local) > 0 {
   252  				return fmt.Errorf("Error replica_configuration.ca_certificate mismatch, (%s, %s)", server, local)
   253  			}
   254  
   255  			server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.ClientCertificate
   256  			local = attributes["replica_configuration.0.client_certificate"]
   257  			if server != local && len(server) > 0 && len(local) > 0 {
   258  				return fmt.Errorf("Error replica_configuration.client_certificate mismatch, (%s, %s)", server, local)
   259  			}
   260  
   261  			server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.ClientKey
   262  			local = attributes["replica_configuration.0.client_key"]
   263  			if server != local && len(server) > 0 && len(local) > 0 {
   264  				return fmt.Errorf("Error replica_configuration.client_key mismatch, (%s, %s)", server, local)
   265  			}
   266  
   267  			server = strconv.FormatInt(instance.ReplicaConfiguration.MysqlReplicaConfiguration.ConnectRetryInterval, 10)
   268  			local = attributes["replica_configuration.0.connect_retry_interval"]
   269  			if server != local && len(server) > 0 && len(local) > 0 {
   270  				return fmt.Errorf("Error replica_configuration.connect_retry_interval mismatch, (%s, %s)", server, local)
   271  			}
   272  
   273  			server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.DumpFilePath
   274  			local = attributes["replica_configuration.0.dump_file_path"]
   275  			if server != local && len(server) > 0 && len(local) > 0 {
   276  				return fmt.Errorf("Error replica_configuration.dump_file_path mismatch, (%s, %s)", server, local)
   277  			}
   278  
   279  			server = strconv.FormatInt(instance.ReplicaConfiguration.MysqlReplicaConfiguration.MasterHeartbeatPeriod, 10)
   280  			local = attributes["replica_configuration.0.master_heartbeat_period"]
   281  			if server != local && len(server) > 0 && len(local) > 0 {
   282  				return fmt.Errorf("Error replica_configuration.master_heartbeat_period mismatch, (%s, %s)", server, local)
   283  			}
   284  
   285  			server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.Password
   286  			local = attributes["replica_configuration.0.password"]
   287  			if server != local && len(server) > 0 && len(local) > 0 {
   288  				return fmt.Errorf("Error replica_configuration.password mismatch, (%s, %s)", server, local)
   289  			}
   290  
   291  			server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.SslCipher
   292  			local = attributes["replica_configuration.0.ssl_cipher"]
   293  			if server != local && len(server) > 0 && len(local) > 0 {
   294  				return fmt.Errorf("Error replica_configuration.ssl_cipher mismatch, (%s, %s)", server, local)
   295  			}
   296  
   297  			server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.Username
   298  			local = attributes["replica_configuration.0.username"]
   299  			if server != local && len(server) > 0 && len(local) > 0 {
   300  				return fmt.Errorf("Error replica_configuration.username mismatch, (%s, %s)", server, local)
   301  			}
   302  
   303  			server = strconv.FormatBool(instance.ReplicaConfiguration.MysqlReplicaConfiguration.VerifyServerCertificate)
   304  			local = attributes["replica_configuration.0.verify_server_certificate"]
   305  			if server != local && len(server) > 0 && len(local) > 0 {
   306  				return fmt.Errorf("Error replica_configuration.verify_server_certificate mismatch, (%s, %s)", server, local)
   307  			}
   308  		}
   309  
   310  		return nil
   311  	}
   312  }
   313  
   314  func testAccCheckGoogleSqlDatabaseInstanceExists(n string,
   315  	instance *sqladmin.DatabaseInstance) resource.TestCheckFunc {
   316  	return func(s *terraform.State) error {
   317  		config := testAccProvider.Meta().(*Config)
   318  		rs, ok := s.RootModule().Resources[n]
   319  		if !ok {
   320  			return fmt.Errorf("Not found: %s", n)
   321  		}
   322  
   323  		found, err := config.clientSqlAdmin.Instances.Get(config.Project,
   324  			rs.Primary.Attributes["name"]).Do()
   325  
   326  		*instance = *found
   327  
   328  		if err != nil {
   329  			return fmt.Errorf("Not found: %s", n)
   330  		}
   331  
   332  		return nil
   333  	}
   334  }
   335  
   336  func testAccGoogleSqlDatabaseInstanceDestroy(s *terraform.State) error {
   337  	for _, rs := range s.RootModule().Resources {
   338  		config := testAccProvider.Meta().(*Config)
   339  		if rs.Type != "google_sql_database_instance" {
   340  			continue
   341  		}
   342  
   343  		_, err := config.clientSqlAdmin.Instances.Get(config.Project,
   344  			rs.Primary.Attributes["name"]).Do()
   345  		if err == nil {
   346  			return fmt.Errorf("Database Instance still exists")
   347  		}
   348  	}
   349  
   350  	return nil
   351  }
   352  
   353  var testGoogleSqlDatabaseInstance_basic = `
   354  resource "google_sql_database_instance" "instance" {
   355  	name = "tf-lw-%d"
   356  	region = "us-central"
   357  	settings {
   358  		tier = "D0"
   359  		crash_safe_replication = false
   360  	}
   361  }
   362  `
   363  
   364  var testGoogleSqlDatabaseInstance_basic2 = `
   365  resource "google_sql_database_instance" "instance" {
   366  	region = "us-central"
   367  	settings {
   368  		tier = "D0"
   369  		crash_safe_replication = false
   370  	}
   371  }
   372  `
   373  
   374  var testGoogleSqlDatabaseInstance_settings = `
   375  resource "google_sql_database_instance" "instance" {
   376  	name = "tf-lw-%d"
   377  	region = "us-central"
   378  	settings {
   379  		tier = "D0"
   380  		crash_safe_replication = false
   381  		replication_type = "ASYNCHRONOUS"
   382  		location_preference {
   383  			zone = "us-central1-f"
   384  		}
   385  
   386  		ip_configuration {
   387  			ipv4_enabled = "true"
   388  			authorized_networks {
   389  				value = "108.12.12.12"
   390  				name = "misc"
   391  				expiration_time = "2017-11-15T16:19:00.094Z"
   392  			}
   393  		}
   394  
   395  		backup_configuration {
   396  			enabled = "true"
   397  			start_time = "19:19"
   398  		}
   399  
   400  		activation_policy = "ON_DEMAND"
   401  	}
   402  }
   403  `
   404  
   405  // Note - this test is not feasible to run unless we generate
   406  // backups first.
   407  var testGoogleSqlDatabaseInstance_replica = `
   408  resource "google_sql_database_instance" "instance_master" {
   409  	name = "tf-lw-%d"
   410  	database_version = "MYSQL_5_6"
   411  	region = "us-east1"
   412  
   413  	settings {
   414  		tier = "D0"
   415  		crash_safe_replication = true
   416  
   417  		backup_configuration {
   418  			enabled = true
   419  			start_time = "00:00"
   420  			binary_log_enabled = true
   421  		}
   422  	}
   423  }
   424  
   425  resource "google_sql_database_instance" "instance" {
   426  	name = "tf-lw-%d"
   427  	database_version = "MYSQL_5_6"
   428  	region = "us-central"
   429  
   430  	settings {
   431  		tier = "D0"
   432  	}
   433  
   434  	master_instance_name = "${google_sql_database_instance.instance_master.name}"
   435  
   436  	replica_configuration {
   437  		ca_certificate = "${file("~/tmp/fake.pem")}"
   438  		client_certificate = "${file("~/tmp/fake.pem")}"
   439  		client_key = "${file("~/tmp/fake.pem")}"
   440  		connect_retry_interval = 100
   441  		master_heartbeat_period = 10000
   442  		password = "password"
   443  		username = "username"
   444  		ssl_cipher = "ALL"
   445  		verify_server_certificate = false
   446  	}
   447  }
   448  `