diff --git a/.changelog/10220.txt b/.changelog/10220.txt new file mode 100644 index 0000000000..030931ef30 --- /dev/null +++ b/.changelog/10220.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +cloudrunv2: added `template.volumes.nfs` field to `google_cloud_run_v2_job` resource (beta) +``` \ No newline at end of file diff --git a/google-beta/services/cloudrunv2/resource_cloud_run_v2_job.go b/google-beta/services/cloudrunv2/resource_cloud_run_v2_job.go index 13e6724be9..9f703485db 100644 --- a/google-beta/services/cloudrunv2/resource_cloud_run_v2_job.go +++ b/google-beta/services/cloudrunv2/resource_cloud_run_v2_job.go @@ -333,6 +333,31 @@ A duration in seconds with up to nine fractional digits, ending with 's'. Exampl }, }, }, + "nfs": { + Type: schema.TypeList, + Optional: true, + Description: `NFS share mounted as a volume. This feature requires the launch stage to be set to ALPHA or BETA.`, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "server": { + Type: schema.TypeString, + Required: true, + Description: `Hostname or IP address of the NFS server.`, + }, + "path": { + Type: schema.TypeString, + Optional: true, + Description: `Path that is exported by the NFS server.`, + }, + "read_only": { + Type: schema.TypeBool, + Optional: true, + Description: `If true, mount this volume as read-only in all mounts.`, + }, + }, + }, + }, "secret": { Type: schema.TypeList, Optional: true, @@ -1569,6 +1594,7 @@ func flattenCloudRunV2JobTemplateTemplateVolumes(v interface{}, d *schema.Resour "cloud_sql_instance": flattenCloudRunV2JobTemplateTemplateVolumesCloudSqlInstance(original["cloudSqlInstance"], d, config), "empty_dir": flattenCloudRunV2JobTemplateTemplateVolumesEmptyDir(original["emptyDir"], d, config), "gcs": flattenCloudRunV2JobTemplateTemplateVolumesGcs(original["gcs"], d, config), + "nfs": flattenCloudRunV2JobTemplateTemplateVolumesNfs(original["nfs"], d, config), }) } return transformed @@ -1723,6 +1749,35 @@ func flattenCloudRunV2JobTemplateTemplateVolumesGcsReadOnly(v interface{}, d *sc return v } +func flattenCloudRunV2JobTemplateTemplateVolumesNfs(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + if v == nil { + return nil + } + original := v.(map[string]interface{}) + if len(original) == 0 { + return nil + } + transformed := make(map[string]interface{}) + transformed["server"] = + flattenCloudRunV2JobTemplateTemplateVolumesNfsServer(original["server"], d, config) + transformed["path"] = + flattenCloudRunV2JobTemplateTemplateVolumesNfsPath(original["path"], d, config) + transformed["read_only"] = + flattenCloudRunV2JobTemplateTemplateVolumesNfsReadOnly(original["readOnly"], d, config) + return []interface{}{transformed} +} +func flattenCloudRunV2JobTemplateTemplateVolumesNfsServer(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + return v +} + +func flattenCloudRunV2JobTemplateTemplateVolumesNfsPath(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + return v +} + +func flattenCloudRunV2JobTemplateTemplateVolumesNfsReadOnly(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + return v +} + func flattenCloudRunV2JobTemplateTemplateTimeout(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } @@ -2545,6 +2600,13 @@ func expandCloudRunV2JobTemplateTemplateVolumes(v interface{}, d tpgresource.Ter transformed["gcs"] = transformedGcs } + transformedNfs, err := expandCloudRunV2JobTemplateTemplateVolumesNfs(original["nfs"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedNfs); val.IsValid() && !tpgresource.IsEmptyValue(val) { + transformed["nfs"] = transformedNfs + } + req = append(req, transformed) } return req, nil @@ -2734,6 +2796,51 @@ func expandCloudRunV2JobTemplateTemplateVolumesGcsReadOnly(v interface{}, d tpgr return v, nil } +func expandCloudRunV2JobTemplateTemplateVolumesNfs(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { + l := v.([]interface{}) + if len(l) == 0 || l[0] == nil { + return nil, nil + } + raw := l[0] + original := raw.(map[string]interface{}) + transformed := make(map[string]interface{}) + + transformedServer, err := expandCloudRunV2JobTemplateTemplateVolumesNfsServer(original["server"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedServer); val.IsValid() && !tpgresource.IsEmptyValue(val) { + transformed["server"] = transformedServer + } + + transformedPath, err := expandCloudRunV2JobTemplateTemplateVolumesNfsPath(original["path"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedPath); val.IsValid() && !tpgresource.IsEmptyValue(val) { + transformed["path"] = transformedPath + } + + transformedReadOnly, err := expandCloudRunV2JobTemplateTemplateVolumesNfsReadOnly(original["read_only"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedReadOnly); val.IsValid() && !tpgresource.IsEmptyValue(val) { + transformed["readOnly"] = transformedReadOnly + } + + return transformed, nil +} + +func expandCloudRunV2JobTemplateTemplateVolumesNfsServer(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { + return v, nil +} + +func expandCloudRunV2JobTemplateTemplateVolumesNfsPath(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { + return v, nil +} + +func expandCloudRunV2JobTemplateTemplateVolumesNfsReadOnly(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { + return v, nil +} + func expandCloudRunV2JobTemplateTemplateTimeout(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { return v, nil } diff --git a/google-beta/services/cloudrunv2/resource_cloud_run_v2_job_test.go b/google-beta/services/cloudrunv2/resource_cloud_run_v2_job_test.go index b9cf7a0f89..58a8261c7a 100644 --- a/google-beta/services/cloudrunv2/resource_cloud_run_v2_job_test.go +++ b/google-beta/services/cloudrunv2/resource_cloud_run_v2_job_test.go @@ -386,3 +386,67 @@ func testAccCloudRunV2Job_cloudrunv2JobWithGcsVolume(context map[string]interfac } `, context) } + +func TestAccCloudRunV2Job_cloudrunv2JobWithNfsUpdate(t *testing.T) { + t.Parallel() + + jobName := fmt.Sprintf("tf-test-cloudrun-service%s", acctest.RandString(t, 10)) + context := map[string]interface{}{ + "job_name": jobName, + } + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckCloudRunV2JobDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccCloudRunV2Job_cloudrunv2JobWithNoVolume(context), + }, + { + ResourceName: "google_cloud_run_v2_job.default", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"location", "launch_stage"}, + }, + { + Config: testAccCloudRunV2Job_cloudrunv2JobWithNfsVolume(context), + }, + { + ResourceName: "google_cloud_run_v2_job.default", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"location", "launch_stage"}, + }, + }, + }) +} + +func testAccCloudRunV2Job_cloudrunv2JobWithNfsVolume(context map[string]interface{}) string { + return acctest.Nprintf(` + resource "google_cloud_run_v2_job" "default" { + name = "%{job_name}" + location = "us-central1" + launch_stage = "BETA" + template { + template { + containers { + image = "us-docker.pkg.dev/cloudrun/container/job" + volume_mounts { + name = "nfs" + mount_path = "/mnt/nfs" + } + } + volumes { + name = "nfs" + nfs { + server = "10.0.10.10" + path = "/" + read_only = true + } + } + } + } + } +`, context) +} diff --git a/website/docs/r/cloud_run_v2_job.html.markdown b/website/docs/r/cloud_run_v2_job.html.markdown index 5e5ff42b77..2606624c9d 100644 --- a/website/docs/r/cloud_run_v2_job.html.markdown +++ b/website/docs/r/cloud_run_v2_job.html.markdown @@ -561,6 +561,11 @@ The following arguments are supported: Cloud Storage bucket mounted as a volume using GCSFuse. This feature requires the launch stage to be set to ALPHA or BETA. Structure is [documented below](#nested_gcs). +* `nfs` - + (Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)) + NFS share mounted as a volume. This feature requires the launch stage to be set to ALPHA or BETA. + Structure is [documented below](#nested_nfs). + The `secret` block supports: @@ -620,6 +625,20 @@ The following arguments are supported: (Optional) If true, mount this volume as read-only in all mounts. If false, mount this volume as read-write. +The `nfs` block supports: + +* `server` - + (Required) + Hostname or IP address of the NFS server. + +* `path` - + (Optional) + Path that is exported by the NFS server. + +* `read_only` - + (Optional) + If true, mount this volume as read-only in all mounts. + The `vpc_access` block supports: * `connector` -