diff --git a/.changelog/15416.txt b/.changelog/15416.txt
new file mode 100644
index 0000000000..525ea1bf65
--- /dev/null
+++ b/.changelog/15416.txt
@@ -0,0 +1,3 @@
+```release-note:enhancement
+netapp: added `cache_parameters` field to `google_netapp_volume` resource
+```
\ No newline at end of file
diff --git a/google-beta/services/netapp/resource_netapp_volume.go b/google-beta/services/netapp/resource_netapp_volume.go
index 0224e0ccd6..491f724378 100644
--- a/google-beta/services/netapp/resource_netapp_volume.go
+++ b/google-beta/services/netapp/resource_netapp_volume.go
@@ -199,6 +199,85 @@ the parent Volume's 'capacity_gib'.`,
},
},
},
+ "cache_parameters": {
+ Type: schema.TypeList,
+ Optional: true,
+ Description: `Cache parameters for the volume.`,
+ MaxItems: 1,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "cache_config": {
+ Type: schema.TypeList,
+ Optional: true,
+ Description: `Optional. Configuration of the cache volume.`,
+ MaxItems: 1,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "cifs_change_notify_enabled": {
+ Type: schema.TypeBool,
+ Optional: true,
+ Description: `Optional. Flag indicating whether a CIFS change notification is enabled for the FlexCache volume.`,
+ },
+ },
+ },
+ },
+ "enable_global_file_lock": {
+ Type: schema.TypeBool,
+ Optional: true,
+ Description: `Optional. Field indicating whether cache volume as global file lock enabled.`,
+ },
+ "peer_cluster_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: `Required. Name of the origin volume's ONTAP cluster.`,
+ },
+ "peer_ip_addresses": {
+ Type: schema.TypeList,
+ Optional: true,
+ Description: `Required. List of IC LIF addresses of the origin volume's ONTAP cluster.`,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ },
+ "peer_svm_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: `Required. Name of the origin volume's SVM.`,
+ },
+ "peer_volume_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: `Required. Name of the origin volume for the cache volume.`,
+ },
+ "peering_command_expiry_time": {
+ Type: schema.TypeString,
+ Computed: true,
+ Optional: true,
+ Description: `Optional. Expiration time for the peering command to be executed on user's ONTAP. A timestamp in RFC3339 UTC "Zulu" format. Examples: "2023-06-22T09:13:01.617Z".`,
+ },
+ "cache_state": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: `State of the cache volume indicating the peering status.`,
+ },
+ "command": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: `Copy-paste-able commands to be used on user's ONTAP to accept peering requests.`,
+ },
+ "passphrase": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: `Temporary passphrase generated to accept cluster peering command.`,
+ },
+ "state_details": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: `Detailed description of the current cache state.`,
+ },
+ },
+ },
+ },
"description": {
Type: schema.TypeString,
Optional: true,
@@ -913,6 +992,12 @@ func resourceNetappVolumeCreate(d *schema.ResourceData, meta interface{}) error
} else if v, ok := d.GetOkExists("throughput_mibps"); !tpgresource.IsEmptyValue(reflect.ValueOf(throughputMibpsProp)) && (ok || !reflect.DeepEqual(v, throughputMibpsProp)) {
obj["throughputMibps"] = throughputMibpsProp
}
+ cacheParametersProp, err := expandNetappVolumeCacheParameters(d.Get("cache_parameters"), d, config)
+ if err != nil {
+ return err
+ } else if v, ok := d.GetOkExists("cache_parameters"); !tpgresource.IsEmptyValue(reflect.ValueOf(cacheParametersProp)) && (ok || !reflect.DeepEqual(v, cacheParametersProp)) {
+ obj["cacheParameters"] = cacheParametersProp
+ }
blockDevicesProp, err := expandNetappVolumeBlockDevices(d.Get("block_devices"), d, config)
if err != nil {
return err
@@ -1141,6 +1226,9 @@ func resourceNetappVolumeRead(d *schema.ResourceData, meta interface{}) error {
if err := d.Set("hot_tier_size_used_gib", flattenNetappVolumeHotTierSizeUsedGib(res["hotTierSizeUsedGib"], d, config)); err != nil {
return fmt.Errorf("Error reading Volume: %s", err)
}
+ if err := d.Set("cache_parameters", flattenNetappVolumeCacheParameters(res["cacheParameters"], d, config)); err != nil {
+ return fmt.Errorf("Error reading Volume: %s", err)
+ }
if err := d.Set("block_devices", flattenNetappVolumeBlockDevices(res["blockDevices"], d, config)); err != nil {
return fmt.Errorf("Error reading Volume: %s", err)
}
@@ -1254,6 +1342,12 @@ func resourceNetappVolumeUpdate(d *schema.ResourceData, meta interface{}) error
} else if v, ok := d.GetOkExists("throughput_mibps"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, throughputMibpsProp)) {
obj["throughputMibps"] = throughputMibpsProp
}
+ cacheParametersProp, err := expandNetappVolumeCacheParameters(d.Get("cache_parameters"), d, config)
+ if err != nil {
+ return err
+ } else if v, ok := d.GetOkExists("cache_parameters"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, cacheParametersProp)) {
+ obj["cacheParameters"] = cacheParametersProp
+ }
blockDevicesProp, err := expandNetappVolumeBlockDevices(d.Get("block_devices"), d, config)
if err != nil {
return err
@@ -1336,6 +1430,10 @@ func resourceNetappVolumeUpdate(d *schema.ResourceData, meta interface{}) error
updateMask = append(updateMask, "throughputMibps")
}
+ if d.HasChange("cache_parameters") {
+ updateMask = append(updateMask, "cacheParameters")
+ }
+
if d.HasChange("block_devices") {
updateMask = append(updateMask, "blockDevices")
}
@@ -2239,6 +2337,96 @@ func flattenNetappVolumeHotTierSizeUsedGib(v interface{}, d *schema.ResourceData
return v
}
+func flattenNetappVolumeCacheParameters(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["peer_volume_name"] =
+ flattenNetappVolumeCacheParametersPeerVolumeName(original["peerVolumeName"], d, config)
+ transformed["peer_cluster_name"] =
+ flattenNetappVolumeCacheParametersPeerClusterName(original["peerClusterName"], d, config)
+ transformed["peer_svm_name"] =
+ flattenNetappVolumeCacheParametersPeerSvmName(original["peerSvmName"], d, config)
+ transformed["peer_ip_addresses"] =
+ flattenNetappVolumeCacheParametersPeerIpAddresses(original["peerIpAddresses"], d, config)
+ transformed["enable_global_file_lock"] =
+ flattenNetappVolumeCacheParametersEnableGlobalFileLock(original["enableGlobalFileLock"], d, config)
+ transformed["peering_command_expiry_time"] =
+ flattenNetappVolumeCacheParametersPeeringCommandExpiryTime(original["peeringCommandExpiryTime"], d, config)
+ transformed["cache_state"] =
+ flattenNetappVolumeCacheParametersCacheState(original["cacheState"], d, config)
+ transformed["command"] =
+ flattenNetappVolumeCacheParametersCommand(original["command"], d, config)
+ transformed["passphrase"] =
+ flattenNetappVolumeCacheParametersPassphrase(original["passphrase"], d, config)
+ transformed["state_details"] =
+ flattenNetappVolumeCacheParametersStateDetails(original["stateDetails"], d, config)
+ transformed["cache_config"] =
+ flattenNetappVolumeCacheParametersCacheConfig(original["cacheConfig"], d, config)
+ return []interface{}{transformed}
+}
+func flattenNetappVolumeCacheParametersPeerVolumeName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersPeerClusterName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersPeerSvmName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersPeerIpAddresses(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersEnableGlobalFileLock(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersPeeringCommandExpiryTime(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersCacheState(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersCommand(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersPassphrase(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersStateDetails(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
+func flattenNetappVolumeCacheParametersCacheConfig(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["cifs_change_notify_enabled"] =
+ flattenNetappVolumeCacheParametersCacheConfigCifsChangeNotifyEnabled(original["cifsChangeNotifyEnabled"], d, config)
+ return []interface{}{transformed}
+}
+func flattenNetappVolumeCacheParametersCacheConfigCifsChangeNotifyEnabled(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
+ return v
+}
+
func flattenNetappVolumeBlockDevices(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return v
@@ -3085,6 +3273,164 @@ func expandNetappVolumeThroughputMibps(v interface{}, d tpgresource.TerraformRes
return v, nil
}
+func expandNetappVolumeCacheParameters(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ if v == nil {
+ return nil, nil
+ }
+ 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{})
+
+ transformedPeerVolumeName, err := expandNetappVolumeCacheParametersPeerVolumeName(original["peer_volume_name"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedPeerVolumeName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["peerVolumeName"] = transformedPeerVolumeName
+ }
+
+ transformedPeerClusterName, err := expandNetappVolumeCacheParametersPeerClusterName(original["peer_cluster_name"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedPeerClusterName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["peerClusterName"] = transformedPeerClusterName
+ }
+
+ transformedPeerSvmName, err := expandNetappVolumeCacheParametersPeerSvmName(original["peer_svm_name"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedPeerSvmName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["peerSvmName"] = transformedPeerSvmName
+ }
+
+ transformedPeerIpAddresses, err := expandNetappVolumeCacheParametersPeerIpAddresses(original["peer_ip_addresses"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedPeerIpAddresses); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["peerIpAddresses"] = transformedPeerIpAddresses
+ }
+
+ transformedEnableGlobalFileLock, err := expandNetappVolumeCacheParametersEnableGlobalFileLock(original["enable_global_file_lock"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedEnableGlobalFileLock); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["enableGlobalFileLock"] = transformedEnableGlobalFileLock
+ }
+
+ transformedPeeringCommandExpiryTime, err := expandNetappVolumeCacheParametersPeeringCommandExpiryTime(original["peering_command_expiry_time"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedPeeringCommandExpiryTime); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["peeringCommandExpiryTime"] = transformedPeeringCommandExpiryTime
+ }
+
+ transformedCacheState, err := expandNetappVolumeCacheParametersCacheState(original["cache_state"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedCacheState); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["cacheState"] = transformedCacheState
+ }
+
+ transformedCommand, err := expandNetappVolumeCacheParametersCommand(original["command"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedCommand); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["command"] = transformedCommand
+ }
+
+ transformedPassphrase, err := expandNetappVolumeCacheParametersPassphrase(original["passphrase"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedPassphrase); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["passphrase"] = transformedPassphrase
+ }
+
+ transformedStateDetails, err := expandNetappVolumeCacheParametersStateDetails(original["state_details"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedStateDetails); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["stateDetails"] = transformedStateDetails
+ }
+
+ transformedCacheConfig, err := expandNetappVolumeCacheParametersCacheConfig(original["cache_config"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedCacheConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["cacheConfig"] = transformedCacheConfig
+ }
+
+ return transformed, nil
+}
+
+func expandNetappVolumeCacheParametersPeerVolumeName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersPeerClusterName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersPeerSvmName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersPeerIpAddresses(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersEnableGlobalFileLock(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersPeeringCommandExpiryTime(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersCacheState(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersCommand(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersPassphrase(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersStateDetails(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
+func expandNetappVolumeCacheParametersCacheConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ if v == nil {
+ return nil, nil
+ }
+ 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{})
+
+ transformedCifsChangeNotifyEnabled, err := expandNetappVolumeCacheParametersCacheConfigCifsChangeNotifyEnabled(original["cifs_change_notify_enabled"], d, config)
+ if err != nil {
+ return nil, err
+ } else if val := reflect.ValueOf(transformedCifsChangeNotifyEnabled); val.IsValid() && !tpgresource.IsEmptyValue(val) {
+ transformed["cifsChangeNotifyEnabled"] = transformedCifsChangeNotifyEnabled
+ }
+
+ return transformed, nil
+}
+
+func expandNetappVolumeCacheParametersCacheConfigCifsChangeNotifyEnabled(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
+ return v, nil
+}
+
func expandNetappVolumeBlockDevices(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
if v == nil {
return nil, nil
diff --git a/google-beta/services/netapp/resource_netapp_volume_generated_meta.yaml b/google-beta/services/netapp/resource_netapp_volume_generated_meta.yaml
index 662c3a5df6..ed39c5c19d 100644
--- a/google-beta/services/netapp/resource_netapp_volume_generated_meta.yaml
+++ b/google-beta/services/netapp/resource_netapp_volume_generated_meta.yaml
@@ -14,6 +14,17 @@ fields:
- api_field: 'blockDevices.name'
- api_field: 'blockDevices.osType'
- api_field: 'blockDevices.sizeGib'
+ - api_field: 'cacheParameters.cacheConfig.cifsChangeNotifyEnabled'
+ - api_field: 'cacheParameters.cacheState'
+ - api_field: 'cacheParameters.command'
+ - api_field: 'cacheParameters.enableGlobalFileLock'
+ - api_field: 'cacheParameters.passphrase'
+ - api_field: 'cacheParameters.peerClusterName'
+ - api_field: 'cacheParameters.peerIpAddresses'
+ - api_field: 'cacheParameters.peerSvmName'
+ - api_field: 'cacheParameters.peerVolumeName'
+ - api_field: 'cacheParameters.peeringCommandExpiryTime'
+ - api_field: 'cacheParameters.stateDetails'
- api_field: 'capacityGib'
- api_field: 'coldTierSizeGib'
- api_field: 'createTime'
diff --git a/website/docs/r/netapp_volume.html.markdown b/website/docs/r/netapp_volume.html.markdown
index 994fa9d197..9f48767579 100644
--- a/website/docs/r/netapp_volume.html.markdown
+++ b/website/docs/r/netapp_volume.html.markdown
@@ -181,6 +181,11 @@ The following arguments are supported:
(Optional)
Optional. Custom Performance Total Throughput of the pool (in MiB/s).
+* `cache_parameters` -
+ (Optional)
+ Cache parameters for the volume.
+ Structure is [documented below](#nested_cache_parameters).
+
* `block_devices` -
(Optional)
Block device represents the device(s) which are stored in the block volume.
@@ -445,6 +450,60 @@ Possible values: DEFAULT, FORCE.
(Optional)
Optional. Constituent volume count for large volume.
+The `cache_parameters` block supports:
+
+* `peer_volume_name` -
+ (Optional)
+ Required. Name of the origin volume for the cache volume.
+
+* `peer_cluster_name` -
+ (Optional)
+ Required. Name of the origin volume's ONTAP cluster.
+
+* `peer_svm_name` -
+ (Optional)
+ Required. Name of the origin volume's SVM.
+
+* `peer_ip_addresses` -
+ (Optional)
+ Required. List of IC LIF addresses of the origin volume's ONTAP cluster.
+
+* `enable_global_file_lock` -
+ (Optional)
+ Optional. Field indicating whether cache volume as global file lock enabled.
+
+* `peering_command_expiry_time` -
+ (Optional)
+ Optional. Expiration time for the peering command to be executed on user's ONTAP. A timestamp in RFC3339 UTC "Zulu" format. Examples: "2023-06-22T09:13:01.617Z".
+
+* `cache_state` -
+ (Output)
+ State of the cache volume indicating the peering status.
+
+* `command` -
+ (Output)
+ Copy-paste-able commands to be used on user's ONTAP to accept peering requests.
+
+* `passphrase` -
+ (Output)
+ Temporary passphrase generated to accept cluster peering command.
+
+* `state_details` -
+ (Output)
+ Detailed description of the current cache state.
+
+* `cache_config` -
+ (Optional)
+ Optional. Configuration of the cache volume.
+ Structure is [documented below](#nested_cache_parameters_cache_config).
+
+
+The `cache_config` block supports:
+
+* `cifs_change_notify_enabled` -
+ (Optional)
+ Optional. Flag indicating whether a CIFS change notification is enabled for the FlexCache volume.
+
The `block_devices` block supports:
* `name` -