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` -