mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-10-03 01:01:06 +00:00
provider/google-cloud: Add maintenance window (#12042)
* provider/google-cloud: Add maintenance window Allows specification of the `maintenance_window` within the `settings` block. This controls when Google will restart a database in order to apply updates. It is also possible to select an `update_track` to relatively control updating between instances in the same project. * Adjustments as suggested in code review.
This commit is contained in:
parent
ecbbaaee89
commit
b1b6993d23
@ -153,6 +153,33 @@ func resourceSqlDatabaseInstance() *schema.Resource {
|
||||
},
|
||||
},
|
||||
},
|
||||
"maintenance_window": &schema.Schema{
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"day": &schema.Schema{
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
|
||||
return validateNumericRange(v, k, 1, 7)
|
||||
},
|
||||
},
|
||||
"hour": &schema.Schema{
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
|
||||
return validateNumericRange(v, k, 0, 23)
|
||||
},
|
||||
},
|
||||
"update_track": &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"pricing_plan": &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
@ -431,6 +458,25 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{})
|
||||
}
|
||||
}
|
||||
|
||||
if v, ok := _settings["maintenance_window"]; ok && len(v.([]interface{})) > 0 {
|
||||
settings.MaintenanceWindow = &sqladmin.MaintenanceWindow{}
|
||||
_maintenanceWindow := v.([]interface{})[0].(map[string]interface{})
|
||||
|
||||
if vp, okp := _maintenanceWindow["day"]; okp {
|
||||
settings.MaintenanceWindow.Day = int64(vp.(int))
|
||||
}
|
||||
|
||||
if vp, okp := _maintenanceWindow["hour"]; okp {
|
||||
settings.MaintenanceWindow.Hour = int64(vp.(int))
|
||||
}
|
||||
|
||||
if vp, ok := _maintenanceWindow["update_track"]; ok {
|
||||
if len(vp.(string)) > 0 {
|
||||
settings.MaintenanceWindow.UpdateTrack = vp.(string)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if v, ok := _settings["pricing_plan"]; ok {
|
||||
settings.PricingPlan = v.(string)
|
||||
}
|
||||
@ -745,6 +791,25 @@ func resourceSqlDatabaseInstanceRead(d *schema.ResourceData, meta interface{}) e
|
||||
}
|
||||
}
|
||||
|
||||
if v, ok := _settings["maintenance_window"]; ok && len(v.([]interface{})) > 0 &&
|
||||
settings.MaintenanceWindow != nil {
|
||||
_maintenanceWindow := v.([]interface{})[0].(map[string]interface{})
|
||||
|
||||
if vp, okp := _maintenanceWindow["day"]; okp && vp != nil {
|
||||
_maintenanceWindow["day"] = settings.MaintenanceWindow.Day
|
||||
}
|
||||
|
||||
if vp, okp := _maintenanceWindow["hour"]; okp && vp != nil {
|
||||
_maintenanceWindow["hour"] = settings.MaintenanceWindow.Hour
|
||||
}
|
||||
|
||||
if vp, ok := _maintenanceWindow["update_track"]; ok && vp != nil {
|
||||
if len(vp.(string)) > 0 {
|
||||
_maintenanceWindow["update_track"] = settings.MaintenanceWindow.UpdateTrack
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if v, ok := _settings["pricing_plan"]; ok && len(v.(string)) > 0 {
|
||||
_settings["pricing_plan"] = settings.PricingPlan
|
||||
}
|
||||
@ -1062,6 +1127,25 @@ func resourceSqlDatabaseInstanceUpdate(d *schema.ResourceData, meta interface{})
|
||||
}
|
||||
}
|
||||
|
||||
if v, ok := _settings["maintenance_window"]; ok && len(v.([]interface{})) > 0 {
|
||||
settings.MaintenanceWindow = &sqladmin.MaintenanceWindow{}
|
||||
_maintenanceWindow := v.([]interface{})[0].(map[string]interface{})
|
||||
|
||||
if vp, okp := _maintenanceWindow["day"]; okp {
|
||||
settings.MaintenanceWindow.Day = int64(vp.(int))
|
||||
}
|
||||
|
||||
if vp, okp := _maintenanceWindow["hour"]; okp {
|
||||
settings.MaintenanceWindow.Hour = int64(vp.(int))
|
||||
}
|
||||
|
||||
if vp, ok := _maintenanceWindow["update_track"]; ok {
|
||||
if len(vp.(string)) > 0 {
|
||||
settings.MaintenanceWindow.UpdateTrack = vp.(string)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if v, ok := _settings["pricing_plan"]; ok {
|
||||
settings.PricingPlan = v.(string)
|
||||
}
|
||||
@ -1109,3 +1193,12 @@ func resourceSqlDatabaseInstanceDelete(d *schema.ResourceData, meta interface{})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateNumericRange(v interface{}, k string, min int, max int) (ws []string, errors []error) {
|
||||
value := v.(int)
|
||||
if min > value || value > max {
|
||||
errors = append(errors, fmt.Errorf(
|
||||
"%q outside range %d-%d.", k, min, max))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -162,6 +162,29 @@ func TestAccGoogleSqlDatabaseInstance_diskspecs(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestAccGoogleSqlDatabaseInstance_maintenance(t *testing.T) {
|
||||
var instance sqladmin.DatabaseInstance
|
||||
masterID := acctest.RandInt()
|
||||
|
||||
resource.Test(t, resource.TestCase{
|
||||
PreCheck: func() { testAccPreCheck(t) },
|
||||
Providers: testAccProviders,
|
||||
CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy,
|
||||
Steps: []resource.TestStep{
|
||||
resource.TestStep{
|
||||
Config: fmt.Sprintf(
|
||||
testGoogleSqlDatabaseInstance_maintenance, masterID),
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
testAccCheckGoogleSqlDatabaseInstanceExists(
|
||||
"google_sql_database_instance.instance", &instance),
|
||||
testAccCheckGoogleSqlDatabaseInstanceEquals(
|
||||
"google_sql_database_instance.instance", &instance),
|
||||
),
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func TestAccGoogleSqlDatabaseInstance_settings_upgrade(t *testing.T) {
|
||||
var instance sqladmin.DatabaseInstance
|
||||
databaseID := acctest.RandInt()
|
||||
@ -359,6 +382,26 @@ func testAccCheckGoogleSqlDatabaseInstanceEquals(n string,
|
||||
}
|
||||
}
|
||||
|
||||
if instance.Settings.MaintenanceWindow != nil {
|
||||
server = strconv.FormatInt(instance.Settings.MaintenanceWindow.Day, 10)
|
||||
local = attributes["settings.0.maintenance_window.0.day"]
|
||||
if server != local && len(server) > 0 && len(local) > 0 {
|
||||
return fmt.Errorf("Error settings.maintenance_window.day mismatch, (%s, %s)", server, local)
|
||||
}
|
||||
|
||||
server = strconv.FormatInt(instance.Settings.MaintenanceWindow.Hour, 10)
|
||||
local = attributes["settings.0.maintenance_window.0.hour"]
|
||||
if server != local && len(server) > 0 && len(local) > 0 {
|
||||
return fmt.Errorf("Error settings.maintenance_window.hour mismatch, (%s, %s)", server, local)
|
||||
}
|
||||
|
||||
server = instance.Settings.MaintenanceWindow.UpdateTrack
|
||||
local = attributes["settings.0.maintenance_window.0.update_track"]
|
||||
if server != local && len(server) > 0 && len(local) > 0 {
|
||||
return fmt.Errorf("Error settings.maintenance_window.update_track mismatch, (%s, %s)", server, local)
|
||||
}
|
||||
}
|
||||
|
||||
server = instance.Settings.PricingPlan
|
||||
local = attributes["settings.0.pricing_plan"]
|
||||
if server != local && len(server) > 0 && len(local) > 0 {
|
||||
@ -639,6 +682,23 @@ resource "google_sql_database_instance" "instance" {
|
||||
}
|
||||
`
|
||||
|
||||
var testGoogleSqlDatabaseInstance_maintenance = `
|
||||
resource "google_sql_database_instance" "instance" {
|
||||
name = "tf-lw-%d"
|
||||
region = "us-central1"
|
||||
|
||||
settings {
|
||||
tier = "db-f1-micro"
|
||||
|
||||
maintenance_window {
|
||||
day = 7
|
||||
hour = 3
|
||||
update_track = "canary"
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
var testGoogleSqlDatabaseInstance_authNets_step1 = `
|
||||
resource "google_sql_database_instance" "instance" {
|
||||
name = "tf-lw-%d"
|
||||
|
Loading…
Reference in New Issue
Block a user