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