Skip to content

Commit 836777f

Browse files
metastore - add support for scheduled backups (#10213) (#7140)
* add support for dataproc metastore scheduled backups * CR comments * CR comments * CR comments * CR comments * CR comments * Update mmv1/third_party/terraform/services/dataprocmetastore/resource_dataproc_metastore_service_test.go.erb * Update mmv1/third_party/terraform/services/dataprocmetastore/resource_dataproc_metastore_service_test.go.erb * CR comments --------- [upstream:6f7d670e0f2e9da1ab3e562611c2a3ed25284ab3] Signed-off-by: Modular Magician <[email protected]>
1 parent 4c98bad commit 836777f

5 files changed

+334
-0
lines changed

.changelog/10213.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
metastore: added `scheduled_backup` field to `google_dataproc_metastore_service` resource
3+
```

google-beta/services/dataprocmetastore/resource_dataproc_metastore_service.go

+142
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,38 @@ There must be at least one IP address available in the subnet's primary range. T
338338
},
339339
},
340340
},
341+
"scheduled_backup": {
342+
Type: schema.TypeList,
343+
Optional: true,
344+
Description: `The configuration of scheduled backup for the metastore service.`,
345+
MaxItems: 1,
346+
Elem: &schema.Resource{
347+
Schema: map[string]*schema.Schema{
348+
"backup_location": {
349+
Type: schema.TypeString,
350+
Required: true,
351+
Description: `A Cloud Storage URI of a folder, in the format gs://<bucket_name>/<path_inside_bucket>. A sub-folder <backup_folder> containing backup files will be stored below it.`,
352+
},
353+
"cron_schedule": {
354+
Type: schema.TypeString,
355+
Optional: true,
356+
Description: `The scheduled interval in Cron format, see https://en.wikipedia.org/wiki/Cron The default is empty: scheduled backup is not enabled. Must be specified to enable scheduled backups.`,
357+
},
358+
"enabled": {
359+
Type: schema.TypeBool,
360+
Computed: true,
361+
Optional: true,
362+
Description: `Defines whether the scheduled backup is enabled. The default value is false.`,
363+
},
364+
"time_zone": {
365+
Type: schema.TypeString,
366+
Computed: true,
367+
Optional: true,
368+
Description: `Specifies the time zone to be used when interpreting cronSchedule. Must be a time zone name from the time zone database (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones), e.g. America/Los_Angeles or Africa/Abidjan. If left unspecified, the default is UTC.`,
369+
},
370+
},
371+
},
372+
},
341373
"telemetry_config": {
342374
Type: schema.TypeList,
343375
Computed: true,
@@ -450,6 +482,12 @@ func resourceDataprocMetastoreServiceCreate(d *schema.ResourceData, meta interfa
450482
} else if v, ok := d.GetOkExists("scaling_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(scalingConfigProp)) && (ok || !reflect.DeepEqual(v, scalingConfigProp)) {
451483
obj["scalingConfig"] = scalingConfigProp
452484
}
485+
scheduledBackupProp, err := expandDataprocMetastoreServiceScheduledBackup(d.Get("scheduled_backup"), d, config)
486+
if err != nil {
487+
return err
488+
} else if v, ok := d.GetOkExists("scheduled_backup"); !tpgresource.IsEmptyValue(reflect.ValueOf(scheduledBackupProp)) && (ok || !reflect.DeepEqual(v, scheduledBackupProp)) {
489+
obj["scheduledBackup"] = scheduledBackupProp
490+
}
453491
maintenanceWindowProp, err := expandDataprocMetastoreServiceMaintenanceWindow(d.Get("maintenance_window"), d, config)
454492
if err != nil {
455493
return err
@@ -629,6 +667,9 @@ func resourceDataprocMetastoreServiceRead(d *schema.ResourceData, meta interface
629667
if err := d.Set("scaling_config", flattenDataprocMetastoreServiceScalingConfig(res["scalingConfig"], d, config)); err != nil {
630668
return fmt.Errorf("Error reading Service: %s", err)
631669
}
670+
if err := d.Set("scheduled_backup", flattenDataprocMetastoreServiceScheduledBackup(res["scheduledBackup"], d, config)); err != nil {
671+
return fmt.Errorf("Error reading Service: %s", err)
672+
}
632673
if err := d.Set("maintenance_window", flattenDataprocMetastoreServiceMaintenanceWindow(res["maintenanceWindow"], d, config)); err != nil {
633674
return fmt.Errorf("Error reading Service: %s", err)
634675
}
@@ -700,6 +741,12 @@ func resourceDataprocMetastoreServiceUpdate(d *schema.ResourceData, meta interfa
700741
} else if v, ok := d.GetOkExists("scaling_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, scalingConfigProp)) {
701742
obj["scalingConfig"] = scalingConfigProp
702743
}
744+
scheduledBackupProp, err := expandDataprocMetastoreServiceScheduledBackup(d.Get("scheduled_backup"), d, config)
745+
if err != nil {
746+
return err
747+
} else if v, ok := d.GetOkExists("scheduled_backup"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, scheduledBackupProp)) {
748+
obj["scheduledBackup"] = scheduledBackupProp
749+
}
703750
maintenanceWindowProp, err := expandDataprocMetastoreServiceMaintenanceWindow(d.Get("maintenance_window"), d, config)
704751
if err != nil {
705752
return err
@@ -757,6 +804,10 @@ func resourceDataprocMetastoreServiceUpdate(d *schema.ResourceData, meta interfa
757804
updateMask = append(updateMask, "scalingConfig")
758805
}
759806

807+
if d.HasChange("scheduled_backup") {
808+
updateMask = append(updateMask, "scheduledBackup")
809+
}
810+
760811
if d.HasChange("maintenance_window") {
761812
updateMask = append(updateMask, "maintenanceWindow")
762813
}
@@ -978,6 +1029,41 @@ func flattenDataprocMetastoreServiceScalingConfigScalingFactor(v interface{}, d
9781029
return v
9791030
}
9801031

1032+
func flattenDataprocMetastoreServiceScheduledBackup(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1033+
if v == nil {
1034+
return nil
1035+
}
1036+
original := v.(map[string]interface{})
1037+
if len(original) == 0 {
1038+
return nil
1039+
}
1040+
transformed := make(map[string]interface{})
1041+
transformed["enabled"] =
1042+
flattenDataprocMetastoreServiceScheduledBackupEnabled(original["enabled"], d, config)
1043+
transformed["cron_schedule"] =
1044+
flattenDataprocMetastoreServiceScheduledBackupCronSchedule(original["cronSchedule"], d, config)
1045+
transformed["time_zone"] =
1046+
flattenDataprocMetastoreServiceScheduledBackupTimeZone(original["timeZone"], d, config)
1047+
transformed["backup_location"] =
1048+
flattenDataprocMetastoreServiceScheduledBackupBackupLocation(original["backupLocation"], d, config)
1049+
return []interface{}{transformed}
1050+
}
1051+
func flattenDataprocMetastoreServiceScheduledBackupEnabled(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1052+
return v
1053+
}
1054+
1055+
func flattenDataprocMetastoreServiceScheduledBackupCronSchedule(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1056+
return v
1057+
}
1058+
1059+
func flattenDataprocMetastoreServiceScheduledBackupTimeZone(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1060+
return v
1061+
}
1062+
1063+
func flattenDataprocMetastoreServiceScheduledBackupBackupLocation(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1064+
return v
1065+
}
1066+
9811067
func flattenDataprocMetastoreServiceMaintenanceWindow(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
9821068
if v == nil {
9831069
return nil
@@ -1300,6 +1386,62 @@ func expandDataprocMetastoreServiceScalingConfigScalingFactor(v interface{}, d t
13001386
return v, nil
13011387
}
13021388

1389+
func expandDataprocMetastoreServiceScheduledBackup(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1390+
l := v.([]interface{})
1391+
if len(l) == 0 || l[0] == nil {
1392+
return nil, nil
1393+
}
1394+
raw := l[0]
1395+
original := raw.(map[string]interface{})
1396+
transformed := make(map[string]interface{})
1397+
1398+
transformedEnabled, err := expandDataprocMetastoreServiceScheduledBackupEnabled(original["enabled"], d, config)
1399+
if err != nil {
1400+
return nil, err
1401+
} else if val := reflect.ValueOf(transformedEnabled); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1402+
transformed["enabled"] = transformedEnabled
1403+
}
1404+
1405+
transformedCronSchedule, err := expandDataprocMetastoreServiceScheduledBackupCronSchedule(original["cron_schedule"], d, config)
1406+
if err != nil {
1407+
return nil, err
1408+
} else if val := reflect.ValueOf(transformedCronSchedule); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1409+
transformed["cronSchedule"] = transformedCronSchedule
1410+
}
1411+
1412+
transformedTimeZone, err := expandDataprocMetastoreServiceScheduledBackupTimeZone(original["time_zone"], d, config)
1413+
if err != nil {
1414+
return nil, err
1415+
} else if val := reflect.ValueOf(transformedTimeZone); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1416+
transformed["timeZone"] = transformedTimeZone
1417+
}
1418+
1419+
transformedBackupLocation, err := expandDataprocMetastoreServiceScheduledBackupBackupLocation(original["backup_location"], d, config)
1420+
if err != nil {
1421+
return nil, err
1422+
} else if val := reflect.ValueOf(transformedBackupLocation); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1423+
transformed["backupLocation"] = transformedBackupLocation
1424+
}
1425+
1426+
return transformed, nil
1427+
}
1428+
1429+
func expandDataprocMetastoreServiceScheduledBackupEnabled(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1430+
return v, nil
1431+
}
1432+
1433+
func expandDataprocMetastoreServiceScheduledBackupCronSchedule(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1434+
return v, nil
1435+
}
1436+
1437+
func expandDataprocMetastoreServiceScheduledBackupTimeZone(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1438+
return v, nil
1439+
}
1440+
1441+
func expandDataprocMetastoreServiceScheduledBackupBackupLocation(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1442+
return v, nil
1443+
}
1444+
13031445
func expandDataprocMetastoreServiceMaintenanceWindow(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
13041446
l := v.([]interface{})
13051447
if len(l) == 0 || l[0] == nil {

google-beta/services/dataprocmetastore/resource_dataproc_metastore_service_generated_test.go

+61
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,67 @@ resource "google_dataproc_metastore_service" "dpms2_scaling_factor_lt1" {
428428
`, context)
429429
}
430430

431+
func TestAccDataprocMetastoreService_dataprocMetastoreServiceScheduledBackupExample(t *testing.T) {
432+
t.Parallel()
433+
434+
context := map[string]interface{}{
435+
"random_suffix": acctest.RandString(t, 10),
436+
}
437+
438+
acctest.VcrTest(t, resource.TestCase{
439+
PreCheck: func() { acctest.AccTestPreCheck(t) },
440+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
441+
CheckDestroy: testAccCheckDataprocMetastoreServiceDestroyProducer(t),
442+
Steps: []resource.TestStep{
443+
{
444+
Config: testAccDataprocMetastoreService_dataprocMetastoreServiceScheduledBackupExample(context),
445+
},
446+
{
447+
ResourceName: "google_dataproc_metastore_service.backup",
448+
ImportState: true,
449+
ImportStateVerify: true,
450+
ImportStateVerifyIgnore: []string{"service_id", "location", "labels", "terraform_labels"},
451+
},
452+
},
453+
})
454+
}
455+
456+
func testAccDataprocMetastoreService_dataprocMetastoreServiceScheduledBackupExample(context map[string]interface{}) string {
457+
return acctest.Nprintf(`
458+
resource "google_dataproc_metastore_service" "backup" {
459+
service_id = "backup%{random_suffix}"
460+
location = "us-central1"
461+
port = 9080
462+
tier = "DEVELOPER"
463+
464+
maintenance_window {
465+
hour_of_day = 2
466+
day_of_week = "SUNDAY"
467+
}
468+
469+
hive_metastore_config {
470+
version = "2.3.6"
471+
}
472+
473+
scheduled_backup {
474+
enabled = true
475+
cron_schedule = "0 0 * * *"
476+
time_zone = "UTC"
477+
backup_location = "gs://${google_storage_bucket.bucket.name}"
478+
}
479+
480+
labels = {
481+
env = "test"
482+
}
483+
}
484+
485+
resource "google_storage_bucket" "bucket" {
486+
name = "backup%{random_suffix}"
487+
location = "us-central1"
488+
}
489+
`, context)
490+
}
491+
431492
func testAccCheckDataprocMetastoreServiceDestroyProducer(t *testing.T) func(s *terraform.State) error {
432493
return func(s *terraform.State) error {
433494
for name, rs := range s.RootModule().Resources {

google-beta/services/dataprocmetastore/resource_dataproc_metastore_service_test.go

+64
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,34 @@ resource "google_dataproc_metastore_service" "my_metastore" {
5454
`, name, tier)
5555
}
5656

57+
func TestAccDataprocMetastoreService_dataprocMetastoreServiceScheduledBackupExampleUpdate(t *testing.T) {
58+
t.Parallel()
59+
60+
context := map[string]interface{}{
61+
"random_suffix": acctest.RandString(t, 10),
62+
}
63+
64+
acctest.VcrTest(t, resource.TestCase{
65+
PreCheck: func() { acctest.AccTestPreCheck(t) },
66+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
67+
CheckDestroy: testAccCheckDataprocMetastoreServiceDestroyProducer(t),
68+
Steps: []resource.TestStep{
69+
{
70+
Config: testAccDataprocMetastoreService_dataprocMetastoreServiceScheduledBackupExample(context),
71+
},
72+
{
73+
ResourceName: "google_dataproc_metastore_service.backup",
74+
ImportState: true,
75+
ImportStateVerify: true,
76+
ImportStateVerifyIgnore: []string{"service_id", "location", "labels", "terraform_labels"},
77+
},
78+
{
79+
Config: testAccDataprocMetastoreService_dataprocMetastoreServiceScheduledBackupExampleUpdate(context),
80+
},
81+
},
82+
})
83+
}
84+
5785
func TestAccDataprocMetastoreService_PrivateServiceConnect(t *testing.T) {
5886
t.Skip("Skipping due to https://github.com/hashicorp/terraform-provider-google/issues/13710")
5987
t.Parallel()
@@ -105,3 +133,39 @@ resource "google_dataproc_metastore_service" "default" {
105133
}
106134
`, context)
107135
}
136+
137+
func testAccDataprocMetastoreService_dataprocMetastoreServiceScheduledBackupExampleUpdate(context map[string]interface{}) string {
138+
return acctest.Nprintf(`
139+
resource "google_dataproc_metastore_service" "backup" {
140+
service_id = "tf-test-backup%{random_suffix}"
141+
location = "us-central1"
142+
port = 9080
143+
tier = "DEVELOPER"
144+
145+
maintenance_window {
146+
hour_of_day = 2
147+
day_of_week = "SUNDAY"
148+
}
149+
150+
hive_metastore_config {
151+
version = "2.3.6"
152+
}
153+
154+
scheduled_backup {
155+
enabled = true
156+
cron_schedule = "0 0 * * 0"
157+
time_zone = "America/Los_Angeles"
158+
backup_location = "gs://${google_storage_bucket.bucket.name}"
159+
}
160+
161+
labels = {
162+
env = "test"
163+
}
164+
}
165+
166+
resource "google_storage_bucket" "bucket" {
167+
name = "tf-test-backup%{random_suffix}"
168+
location = "us-central1"
169+
}
170+
`, context)
171+
}

0 commit comments

Comments
 (0)