Skip to content

Commit b3df08c

Browse files
Move filestore enterprise features out of beta and add support for cu… (#5875) (#11493)
Signed-off-by: Modular Magician <[email protected]>
1 parent 024d427 commit b3df08c

File tree

4 files changed

+354
-7
lines changed

4 files changed

+354
-7
lines changed

.changelog/5875.txt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
```release-note:enhancement
2+
filestore: promoted enterprise features to GA
3+
filestore: added `kms_key_name` field to `google_filestore_instance` resource to support CMEK
4+
```

google/resource_filestore_instance.go

+252-3
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,56 @@ for the standard tier, or 2560 GiB for the premium tier.`,
7373
ForceNew: true,
7474
Description: `The name of the fileshare (16 characters or less)`,
7575
},
76+
"nfs_export_options": {
77+
Type: schema.TypeList,
78+
Optional: true,
79+
Description: `Nfs Export Options. There is a limit of 10 export options per file share.`,
80+
MaxItems: 10,
81+
Elem: &schema.Resource{
82+
Schema: map[string]*schema.Schema{
83+
"access_mode": {
84+
Type: schema.TypeString,
85+
Optional: true,
86+
ValidateFunc: validateEnum([]string{"READ_ONLY", "READ_WRITE", ""}),
87+
Description: `Either READ_ONLY, for allowing only read requests on the exported directory,
88+
or READ_WRITE, for allowing both read and write requests. The default is READ_WRITE. Default value: "READ_WRITE" Possible values: ["READ_ONLY", "READ_WRITE"]`,
89+
Default: "READ_WRITE",
90+
},
91+
"anon_gid": {
92+
Type: schema.TypeInt,
93+
Optional: true,
94+
Description: `An integer representing the anonymous group id with a default value of 65534.
95+
Anon_gid may only be set with squashMode of ROOT_SQUASH. An error will be returned
96+
if this field is specified for other squashMode settings.`,
97+
},
98+
"anon_uid": {
99+
Type: schema.TypeInt,
100+
Optional: true,
101+
Description: `An integer representing the anonymous user id with a default value of 65534.
102+
Anon_uid may only be set with squashMode of ROOT_SQUASH. An error will be returned
103+
if this field is specified for other squashMode settings.`,
104+
},
105+
"ip_ranges": {
106+
Type: schema.TypeList,
107+
Optional: true,
108+
Description: `List of either IPv4 addresses, or ranges in CIDR notation which may mount the file share.
109+
Overlapping IP ranges are not allowed, both within and across NfsExportOptions. An error will be returned.
110+
The limit is 64 IP ranges/addresses for each FileShareConfig among all NfsExportOptions.`,
111+
Elem: &schema.Schema{
112+
Type: schema.TypeString,
113+
},
114+
},
115+
"squash_mode": {
116+
Type: schema.TypeString,
117+
Optional: true,
118+
ValidateFunc: validateEnum([]string{"NO_ROOT_SQUASH", "ROOT_SQUASH", ""}),
119+
Description: `Either NO_ROOT_SQUASH, for allowing root access on the exported directory, or ROOT_SQUASH,
120+
for not allowing root access. The default is NO_ROOT_SQUASH. Default value: "NO_ROOT_SQUASH" Possible values: ["NO_ROOT_SQUASH", "ROOT_SQUASH"]`,
121+
Default: "NO_ROOT_SQUASH",
122+
},
123+
},
124+
},
125+
},
76126
},
77127
},
78128
},
@@ -108,6 +158,16 @@ IP addresses assigned. Possible values: ["ADDRESS_MODE_UNSPECIFIED", "MODE_IPV4"
108158
Description: `The name of the GCE VPC network to which the
109159
instance is connected.`,
110160
},
161+
"connect_mode": {
162+
Type: schema.TypeString,
163+
Optional: true,
164+
ForceNew: true,
165+
ValidateFunc: validateEnum([]string{"DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS", ""}),
166+
Description: `The network connect mode of the Filestore instance.
167+
If not provided, the connect mode defaults to
168+
DIRECT_PEERING. Default value: "DIRECT_PEERING" Possible values: ["DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS"]`,
169+
Default: "DIRECT_PEERING",
170+
},
111171
"reserved_ip_range": {
112172
Type: schema.TypeString,
113173
Computed: true,
@@ -132,13 +192,19 @@ addresses reserved for this instance.`,
132192
Required: true,
133193
ForceNew: true,
134194
Description: `The service tier of the instance.
135-
Possible values include: STANDARD, PREMIUM, BASIC_HDD, BASIC_SSD, HIGH_SCALE_SSD and ENTERPRISE (beta only)`,
195+
Possible values include: STANDARD, PREMIUM, BASIC_HDD, BASIC_SSD, HIGH_SCALE_SSD and ENTERPRISE`,
136196
},
137197
"description": {
138198
Type: schema.TypeString,
139199
Optional: true,
140200
Description: `A description of the instance.`,
141201
},
202+
"kms_key_name": {
203+
Type: schema.TypeString,
204+
Optional: true,
205+
ForceNew: true,
206+
Description: `KMS key name used for data encryption.`,
207+
},
142208
"labels": {
143209
Type: schema.TypeMap,
144210
Optional: true,
@@ -222,6 +288,12 @@ func resourceFilestoreInstanceCreate(d *schema.ResourceData, meta interface{}) e
222288
} else if v, ok := d.GetOkExists("networks"); !isEmptyValue(reflect.ValueOf(networksProp)) && (ok || !reflect.DeepEqual(v, networksProp)) {
223289
obj["networks"] = networksProp
224290
}
291+
kmsKeyNameProp, err := expandFilestoreInstanceKmsKeyName(d.Get("kms_key_name"), d, config)
292+
if err != nil {
293+
return err
294+
} else if v, ok := d.GetOkExists("kms_key_name"); !isEmptyValue(reflect.ValueOf(kmsKeyNameProp)) && (ok || !reflect.DeepEqual(v, kmsKeyNameProp)) {
295+
obj["kmsKeyName"] = kmsKeyNameProp
296+
}
225297

226298
lockName, err := replaceVars(d, config, "filestore/{{project}}")
227299
if err != nil {
@@ -357,6 +429,9 @@ func resourceFilestoreInstanceRead(d *schema.ResourceData, meta interface{}) err
357429
if err := d.Set("etag", flattenFilestoreInstanceEtag(res["etag"], d, config)); err != nil {
358430
return fmt.Errorf("Error reading Instance: %s", err)
359431
}
432+
if err := d.Set("kms_key_name", flattenFilestoreInstanceKmsKeyName(res["kmsKeyName"], d, config)); err != nil {
433+
return fmt.Errorf("Error reading Instance: %s", err)
434+
}
360435

361436
return nil
362437
}
@@ -554,8 +629,9 @@ func flattenFilestoreInstanceFileShares(v interface{}, d *schema.ResourceData, c
554629
continue
555630
}
556631
transformed = append(transformed, map[string]interface{}{
557-
"name": flattenFilestoreInstanceFileSharesName(original["name"], d, config),
558-
"capacity_gb": flattenFilestoreInstanceFileSharesCapacityGb(original["capacityGb"], d, config),
632+
"name": flattenFilestoreInstanceFileSharesName(original["name"], d, config),
633+
"capacity_gb": flattenFilestoreInstanceFileSharesCapacityGb(original["capacityGb"], d, config),
634+
"nfs_export_options": flattenFilestoreInstanceFileSharesNfsExportOptions(original["nfsExportOptions"], d, config),
559635
})
560636
}
561637
return transformed
@@ -581,6 +657,74 @@ func flattenFilestoreInstanceFileSharesCapacityGb(v interface{}, d *schema.Resou
581657
return v // let terraform core handle it otherwise
582658
}
583659

660+
func flattenFilestoreInstanceFileSharesNfsExportOptions(v interface{}, d *schema.ResourceData, config *Config) interface{} {
661+
if v == nil {
662+
return v
663+
}
664+
l := v.([]interface{})
665+
transformed := make([]interface{}, 0, len(l))
666+
for _, raw := range l {
667+
original := raw.(map[string]interface{})
668+
if len(original) < 1 {
669+
// Do not include empty json objects coming back from the api
670+
continue
671+
}
672+
transformed = append(transformed, map[string]interface{}{
673+
"ip_ranges": flattenFilestoreInstanceFileSharesNfsExportOptionsIpRanges(original["ipRanges"], d, config),
674+
"access_mode": flattenFilestoreInstanceFileSharesNfsExportOptionsAccessMode(original["accessMode"], d, config),
675+
"squash_mode": flattenFilestoreInstanceFileSharesNfsExportOptionsSquashMode(original["squashMode"], d, config),
676+
"anon_uid": flattenFilestoreInstanceFileSharesNfsExportOptionsAnonUid(original["anonUid"], d, config),
677+
"anon_gid": flattenFilestoreInstanceFileSharesNfsExportOptionsAnonGid(original["anonGid"], d, config),
678+
})
679+
}
680+
return transformed
681+
}
682+
func flattenFilestoreInstanceFileSharesNfsExportOptionsIpRanges(v interface{}, d *schema.ResourceData, config *Config) interface{} {
683+
return v
684+
}
685+
686+
func flattenFilestoreInstanceFileSharesNfsExportOptionsAccessMode(v interface{}, d *schema.ResourceData, config *Config) interface{} {
687+
return v
688+
}
689+
690+
func flattenFilestoreInstanceFileSharesNfsExportOptionsSquashMode(v interface{}, d *schema.ResourceData, config *Config) interface{} {
691+
return v
692+
}
693+
694+
func flattenFilestoreInstanceFileSharesNfsExportOptionsAnonUid(v interface{}, d *schema.ResourceData, config *Config) interface{} {
695+
// Handles the string fixed64 format
696+
if strVal, ok := v.(string); ok {
697+
if intVal, err := stringToFixed64(strVal); err == nil {
698+
return intVal
699+
}
700+
}
701+
702+
// number values are represented as float64
703+
if floatVal, ok := v.(float64); ok {
704+
intVal := int(floatVal)
705+
return intVal
706+
}
707+
708+
return v // let terraform core handle it otherwise
709+
}
710+
711+
func flattenFilestoreInstanceFileSharesNfsExportOptionsAnonGid(v interface{}, d *schema.ResourceData, config *Config) interface{} {
712+
// Handles the string fixed64 format
713+
if strVal, ok := v.(string); ok {
714+
if intVal, err := stringToFixed64(strVal); err == nil {
715+
return intVal
716+
}
717+
}
718+
719+
// number values are represented as float64
720+
if floatVal, ok := v.(float64); ok {
721+
intVal := int(floatVal)
722+
return intVal
723+
}
724+
725+
return v // let terraform core handle it otherwise
726+
}
727+
584728
func flattenFilestoreInstanceNetworks(v interface{}, d *schema.ResourceData, config *Config) interface{} {
585729
if v == nil {
586730
return v
@@ -598,6 +742,7 @@ func flattenFilestoreInstanceNetworks(v interface{}, d *schema.ResourceData, con
598742
"modes": flattenFilestoreInstanceNetworksModes(original["modes"], d, config),
599743
"reserved_ip_range": flattenFilestoreInstanceNetworksReservedIpRange(original["reservedIpRange"], d, config),
600744
"ip_addresses": flattenFilestoreInstanceNetworksIpAddresses(original["ipAddresses"], d, config),
745+
"connect_mode": flattenFilestoreInstanceNetworksConnectMode(original["connectMode"], d, config),
601746
})
602747
}
603748
return transformed
@@ -618,10 +763,22 @@ func flattenFilestoreInstanceNetworksIpAddresses(v interface{}, d *schema.Resour
618763
return v
619764
}
620765

766+
func flattenFilestoreInstanceNetworksConnectMode(v interface{}, d *schema.ResourceData, config *Config) interface{} {
767+
if v == nil || isEmptyValue(reflect.ValueOf(v)) {
768+
return "DIRECT_PEERING"
769+
}
770+
771+
return v
772+
}
773+
621774
func flattenFilestoreInstanceEtag(v interface{}, d *schema.ResourceData, config *Config) interface{} {
622775
return v
623776
}
624777

778+
func flattenFilestoreInstanceKmsKeyName(v interface{}, d *schema.ResourceData, config *Config) interface{} {
779+
return v
780+
}
781+
625782
func expandFilestoreInstanceDescription(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
626783
return v, nil
627784
}
@@ -665,6 +822,13 @@ func expandFilestoreInstanceFileShares(v interface{}, d TerraformResourceData, c
665822
transformed["capacityGb"] = transformedCapacityGb
666823
}
667824

825+
transformedNfsExportOptions, err := expandFilestoreInstanceFileSharesNfsExportOptions(original["nfs_export_options"], d, config)
826+
if err != nil {
827+
return nil, err
828+
} else if val := reflect.ValueOf(transformedNfsExportOptions); val.IsValid() && !isEmptyValue(val) {
829+
transformed["nfsExportOptions"] = transformedNfsExportOptions
830+
}
831+
668832
req = append(req, transformed)
669833
}
670834
return req, nil
@@ -678,6 +842,76 @@ func expandFilestoreInstanceFileSharesCapacityGb(v interface{}, d TerraformResou
678842
return v, nil
679843
}
680844

845+
func expandFilestoreInstanceFileSharesNfsExportOptions(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
846+
l := v.([]interface{})
847+
req := make([]interface{}, 0, len(l))
848+
for _, raw := range l {
849+
if raw == nil {
850+
continue
851+
}
852+
original := raw.(map[string]interface{})
853+
transformed := make(map[string]interface{})
854+
855+
transformedIpRanges, err := expandFilestoreInstanceFileSharesNfsExportOptionsIpRanges(original["ip_ranges"], d, config)
856+
if err != nil {
857+
return nil, err
858+
} else if val := reflect.ValueOf(transformedIpRanges); val.IsValid() && !isEmptyValue(val) {
859+
transformed["ipRanges"] = transformedIpRanges
860+
}
861+
862+
transformedAccessMode, err := expandFilestoreInstanceFileSharesNfsExportOptionsAccessMode(original["access_mode"], d, config)
863+
if err != nil {
864+
return nil, err
865+
} else if val := reflect.ValueOf(transformedAccessMode); val.IsValid() && !isEmptyValue(val) {
866+
transformed["accessMode"] = transformedAccessMode
867+
}
868+
869+
transformedSquashMode, err := expandFilestoreInstanceFileSharesNfsExportOptionsSquashMode(original["squash_mode"], d, config)
870+
if err != nil {
871+
return nil, err
872+
} else if val := reflect.ValueOf(transformedSquashMode); val.IsValid() && !isEmptyValue(val) {
873+
transformed["squashMode"] = transformedSquashMode
874+
}
875+
876+
transformedAnonUid, err := expandFilestoreInstanceFileSharesNfsExportOptionsAnonUid(original["anon_uid"], d, config)
877+
if err != nil {
878+
return nil, err
879+
} else if val := reflect.ValueOf(transformedAnonUid); val.IsValid() && !isEmptyValue(val) {
880+
transformed["anonUid"] = transformedAnonUid
881+
}
882+
883+
transformedAnonGid, err := expandFilestoreInstanceFileSharesNfsExportOptionsAnonGid(original["anon_gid"], d, config)
884+
if err != nil {
885+
return nil, err
886+
} else if val := reflect.ValueOf(transformedAnonGid); val.IsValid() && !isEmptyValue(val) {
887+
transformed["anonGid"] = transformedAnonGid
888+
}
889+
890+
req = append(req, transformed)
891+
}
892+
return req, nil
893+
}
894+
895+
func expandFilestoreInstanceFileSharesNfsExportOptionsIpRanges(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
896+
return v, nil
897+
}
898+
899+
func expandFilestoreInstanceFileSharesNfsExportOptionsAccessMode(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
900+
return v, nil
901+
}
902+
903+
func expandFilestoreInstanceFileSharesNfsExportOptionsSquashMode(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
904+
return v, nil
905+
}
906+
907+
func expandFilestoreInstanceFileSharesNfsExportOptionsAnonUid(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
908+
return v, nil
909+
}
910+
911+
func expandFilestoreInstanceFileSharesNfsExportOptionsAnonGid(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
912+
return v, nil
913+
}
914+
681915
func expandFilestoreInstanceNetworks(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
682916
l := v.([]interface{})
683917
req := make([]interface{}, 0, len(l))
@@ -716,6 +950,13 @@ func expandFilestoreInstanceNetworks(v interface{}, d TerraformResourceData, con
716950
transformed["ipAddresses"] = transformedIpAddresses
717951
}
718952

953+
transformedConnectMode, err := expandFilestoreInstanceNetworksConnectMode(original["connect_mode"], d, config)
954+
if err != nil {
955+
return nil, err
956+
} else if val := reflect.ValueOf(transformedConnectMode); val.IsValid() && !isEmptyValue(val) {
957+
transformed["connectMode"] = transformedConnectMode
958+
}
959+
719960
req = append(req, transformed)
720961
}
721962
return req, nil
@@ -737,6 +978,14 @@ func expandFilestoreInstanceNetworksIpAddresses(v interface{}, d TerraformResour
737978
return v, nil
738979
}
739980

981+
func expandFilestoreInstanceNetworksConnectMode(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
982+
return v, nil
983+
}
984+
985+
func expandFilestoreInstanceKmsKeyName(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
986+
return v, nil
987+
}
988+
740989
func resourceFilestoreInstanceResourceV0() *schema.Resource {
741990
return &schema.Resource{
742991
Schema: map[string]*schema.Schema{

0 commit comments

Comments
 (0)