Skip to content

Commit f2d0c39

Browse files
added qos support (#14929) (#10615)
[upstream:214ebd8df12aa3040fac3d200cf2310dfce9252a] Signed-off-by: Modular Magician <magic-modules@google.com>
1 parent ea07b81 commit f2d0c39

File tree

8 files changed

+203
-0
lines changed

8 files changed

+203
-0
lines changed

.changelog/14929.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:enhancement
2+
netapp: added `qosType` and `availableThroughputMibps` fields to `netapp_storage_pool` resource
3+
```
4+
5+
```release-note:enhancement
6+
netapp: added `throughputMibps` field to `netapp_volume` resource
7+
```

google-beta/services/netapp/resource_netapp_storage_pool.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,13 @@ Please refer to the field 'effective_labels' for all of the labels present on th
147147
ForceNew: true,
148148
Description: `When enabled, the volumes uses Active Directory as LDAP name service for UID/GID lookups. Required to enable extended group support for NFSv3,
149149
using security identifiers for NFSv4.1 or principal names for kerberized NFSv4.1.`,
150+
},
151+
"qos_type": {
152+
Type: schema.TypeString,
153+
Optional: true,
154+
ValidateFunc: verify.ValidateEnum([]string{"QOS_TYPE_UNSPECIFIED", "AUTO", "MANUAL", ""}),
155+
Description: `QoS (Quality of Service) type of the storage pool.
156+
Possible values are: AUTO, MANUAL. Possible values: ["QOS_TYPE_UNSPECIFIED", "AUTO", "MANUAL"]`,
150157
},
151158
"replica_zone": {
152159
Type: schema.TypeString,
@@ -161,6 +168,7 @@ using security identifiers for NFSv4.1 or principal names for kerberized NFSv4.1
161168
},
162169
"total_throughput_mibps": {
163170
Type: schema.TypeString,
171+
Computed: true,
164172
Optional: true,
165173
Description: `Optional. Custom Performance Total Throughput of the pool (in MiB/s).`,
166174
},
@@ -172,6 +180,11 @@ using security identifiers for NFSv4.1 or principal names for kerberized NFSv4.1
172180
[zone switch](https://cloud.google.com/netapp/volumes/docs/configure-and-use/storage-pools/edit-or-delete-storage-pool#switch_active_and_replica_zones).
173181
If you want to create a zonal Flex pool, specify a zone name for 'location' and omit 'zone'.`,
174182
},
183+
"available_throughput_mibps": {
184+
Type: schema.TypeFloat,
185+
Computed: true,
186+
Description: `Available throughput of the storage pool (in MiB/s).`,
187+
},
175188
"effective_labels": {
176189
Type: schema.TypeMap,
177190
Computed: true,
@@ -309,6 +322,12 @@ func resourceNetappStoragePoolCreate(d *schema.ResourceData, meta interface{}) e
309322
} else if v, ok := d.GetOkExists("enable_hot_tier_auto_resize"); ok || !reflect.DeepEqual(v, enableHotTierAutoResizeProp) {
310323
obj["enableHotTierAutoResize"] = enableHotTierAutoResizeProp
311324
}
325+
qosTypeProp, err := expandNetappStoragePoolQosType(d.Get("qos_type"), d, config)
326+
if err != nil {
327+
return err
328+
} else if v, ok := d.GetOkExists("qos_type"); !tpgresource.IsEmptyValue(reflect.ValueOf(qosTypeProp)) && (ok || !reflect.DeepEqual(v, qosTypeProp)) {
329+
obj["qosType"] = qosTypeProp
330+
}
312331
effectiveLabelsProp, err := expandNetappStoragePoolEffectiveLabels(d.Get("effective_labels"), d, config)
313332
if err != nil {
314333
return err
@@ -468,6 +487,12 @@ func resourceNetappStoragePoolRead(d *schema.ResourceData, meta interface{}) err
468487
if err := d.Set("hot_tier_size_gib", flattenNetappStoragePoolHotTierSizeGib(res["hotTierSizeGib"], d, config)); err != nil {
469488
return fmt.Errorf("Error reading StoragePool: %s", err)
470489
}
490+
if err := d.Set("qos_type", flattenNetappStoragePoolQosType(res["qosType"], d, config)); err != nil {
491+
return fmt.Errorf("Error reading StoragePool: %s", err)
492+
}
493+
if err := d.Set("available_throughput_mibps", flattenNetappStoragePoolAvailableThroughputMibps(res["availableThroughputMibps"], d, config)); err != nil {
494+
return fmt.Errorf("Error reading StoragePool: %s", err)
495+
}
471496
if err := d.Set("terraform_labels", flattenNetappStoragePoolTerraformLabels(res["labels"], d, config)); err != nil {
472497
return fmt.Errorf("Error reading StoragePool: %s", err)
473498
}
@@ -554,6 +579,12 @@ func resourceNetappStoragePoolUpdate(d *schema.ResourceData, meta interface{}) e
554579
} else if v, ok := d.GetOkExists("enable_hot_tier_auto_resize"); ok || !reflect.DeepEqual(v, enableHotTierAutoResizeProp) {
555580
obj["enableHotTierAutoResize"] = enableHotTierAutoResizeProp
556581
}
582+
qosTypeProp, err := expandNetappStoragePoolQosType(d.Get("qos_type"), d, config)
583+
if err != nil {
584+
return err
585+
} else if v, ok := d.GetOkExists("qos_type"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, qosTypeProp)) {
586+
obj["qosType"] = qosTypeProp
587+
}
557588
effectiveLabelsProp, err := expandNetappStoragePoolEffectiveLabels(d.Get("effective_labels"), d, config)
558589
if err != nil {
559590
return err
@@ -610,6 +641,10 @@ func resourceNetappStoragePoolUpdate(d *schema.ResourceData, meta interface{}) e
610641
updateMask = append(updateMask, "enableHotTierAutoResize")
611642
}
612643

644+
if d.HasChange("qos_type") {
645+
updateMask = append(updateMask, "qosType")
646+
}
647+
613648
if d.HasChange("effective_labels") {
614649
updateMask = append(updateMask, "labels")
615650
}
@@ -893,6 +928,14 @@ func flattenNetappStoragePoolHotTierSizeGib(v interface{}, d *schema.ResourceDat
893928
return v
894929
}
895930

931+
func flattenNetappStoragePoolQosType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
932+
return v
933+
}
934+
935+
func flattenNetappStoragePoolAvailableThroughputMibps(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
936+
return v
937+
}
938+
896939
func flattenNetappStoragePoolTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
897940
if v == nil {
898941
return v
@@ -972,6 +1015,10 @@ func expandNetappStoragePoolEnableHotTierAutoResize(v interface{}, d tpgresource
9721015
return v, nil
9731016
}
9741017

1018+
func expandNetappStoragePoolQosType(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1019+
return v, nil
1020+
}
1021+
9751022
func expandNetappStoragePoolEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
9761023
if v == nil {
9771024
return map[string]string{}, nil

google-beta/services/netapp/resource_netapp_storage_pool_generated_meta.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ api_resource_type_kind: 'StoragePool'
77
fields:
88
- field: 'active_directory'
99
- field: 'allow_auto_tiering'
10+
- field: 'available_throughput_mibps'
1011
- field: 'capacity_gib'
1112
- field: 'custom_performance_enabled'
1213
- field: 'description'
@@ -23,6 +24,7 @@ fields:
2324
- field: 'name'
2425
provider_only: true
2526
- field: 'network'
27+
- field: 'qos_type'
2628
- field: 'replica_zone'
2729
- field: 'service_level'
2830
- field: 'terraform_labels'

google-beta/services/netapp/resource_netapp_volume.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,12 @@ To disable automatic snapshot creation you have to remove the whole snapshot_pol
480480
},
481481
},
482482
},
483+
"throughput_mibps": {
484+
Type: schema.TypeFloat,
485+
Computed: true,
486+
Optional: true,
487+
Description: `Optional. Custom Performance Total Throughput of the pool (in MiB/s).`,
488+
},
483489
"tiering_policy": {
484490
Type: schema.TypeList,
485491
Optional: true,
@@ -778,6 +784,12 @@ func resourceNetappVolumeCreate(d *schema.ResourceData, meta interface{}) error
778784
} else if v, ok := d.GetOkExists("hybrid_replication_parameters"); !tpgresource.IsEmptyValue(reflect.ValueOf(hybridReplicationParametersProp)) && (ok || !reflect.DeepEqual(v, hybridReplicationParametersProp)) {
779785
obj["hybridReplicationParameters"] = hybridReplicationParametersProp
780786
}
787+
throughputMibpsProp, err := expandNetappVolumeThroughputMibps(d.Get("throughput_mibps"), d, config)
788+
if err != nil {
789+
return err
790+
} else if v, ok := d.GetOkExists("throughput_mibps"); !tpgresource.IsEmptyValue(reflect.ValueOf(throughputMibpsProp)) && (ok || !reflect.DeepEqual(v, throughputMibpsProp)) {
791+
obj["throughputMibps"] = throughputMibpsProp
792+
}
781793
effectiveLabelsProp, err := expandNetappVolumeEffectiveLabels(d.Get("effective_labels"), d, config)
782794
if err != nil {
783795
return err
@@ -994,6 +1006,9 @@ func resourceNetappVolumeRead(d *schema.ResourceData, meta interface{}) error {
9941006
if err := d.Set("hybrid_replication_parameters", flattenNetappVolumeHybridReplicationParameters(res["hybridReplicationParameters"], d, config)); err != nil {
9951007
return fmt.Errorf("Error reading Volume: %s", err)
9961008
}
1009+
if err := d.Set("throughput_mibps", flattenNetappVolumeThroughputMibps(res["throughputMibps"], d, config)); err != nil {
1010+
return fmt.Errorf("Error reading Volume: %s", err)
1011+
}
9971012
if err := d.Set("terraform_labels", flattenNetappVolumeTerraformLabels(res["labels"], d, config)); err != nil {
9981013
return fmt.Errorf("Error reading Volume: %s", err)
9991014
}
@@ -1098,6 +1113,12 @@ func resourceNetappVolumeUpdate(d *schema.ResourceData, meta interface{}) error
10981113
} else if v, ok := d.GetOkExists("hybrid_replication_parameters"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, hybridReplicationParametersProp)) {
10991114
obj["hybridReplicationParameters"] = hybridReplicationParametersProp
11001115
}
1116+
throughputMibpsProp, err := expandNetappVolumeThroughputMibps(d.Get("throughput_mibps"), d, config)
1117+
if err != nil {
1118+
return err
1119+
} else if v, ok := d.GetOkExists("throughput_mibps"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, throughputMibpsProp)) {
1120+
obj["throughputMibps"] = throughputMibpsProp
1121+
}
11011122
effectiveLabelsProp, err := expandNetappVolumeEffectiveLabels(d.Get("effective_labels"), d, config)
11021123
if err != nil {
11031124
return err
@@ -1170,6 +1191,10 @@ func resourceNetappVolumeUpdate(d *schema.ResourceData, meta interface{}) error
11701191
updateMask = append(updateMask, "hybridReplicationParameters")
11711192
}
11721193

1194+
if d.HasChange("throughput_mibps") {
1195+
updateMask = append(updateMask, "throughputMibps")
1196+
}
1197+
11731198
if d.HasChange("effective_labels") {
11741199
updateMask = append(updateMask, "labels")
11751200
}
@@ -1970,6 +1995,10 @@ func flattenNetappVolumeHybridReplicationParametersLabels(v interface{}, d *sche
19701995
return v
19711996
}
19721997

1998+
func flattenNetappVolumeThroughputMibps(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1999+
return v
2000+
}
2001+
19732002
func flattenNetappVolumeTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
19742003
if v == nil {
19752004
return v
@@ -2669,6 +2698,10 @@ func expandNetappVolumeHybridReplicationParametersLabels(v interface{}, d tpgres
26692698
return m, nil
26702699
}
26712700

2701+
func expandNetappVolumeThroughputMibps(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2702+
return v, nil
2703+
}
2704+
26722705
func expandNetappVolumeEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
26732706
if v == nil {
26742707
return map[string]string{}, nil

google-beta/services/netapp/resource_netapp_volume_generated_meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ fields:
8383
- field: 'storage_pool'
8484
- field: 'terraform_labels'
8585
provider_only: true
86+
- field: 'throughput_mibps'
8687
- field: 'tiering_policy.cooling_threshold_days'
8788
- field: 'tiering_policy.hot_tier_bypass_mode_enabled'
8889
- field: 'tiering_policy.tier_action'

google-beta/services/netapp/resource_netapp_volume_test.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,3 +885,103 @@ data "google_compute_network" "default" {
885885
}
886886
`, context)
887887
}
888+
889+
func TestAccNetappStoragePool_ManualQos(t *testing.T) {
890+
context := map[string]interface{}{
891+
"network_name": acctest.BootstrapSharedServiceNetworkingConnection(t, "gcnv-network-config-3", acctest.ServiceNetworkWithParentService("netapp.servicenetworking.goog")),
892+
"random_suffix": acctest.RandString(t, 10),
893+
}
894+
895+
acctest.VcrTest(t, resource.TestCase{
896+
PreCheck: func() { acctest.AccTestPreCheck(t) },
897+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
898+
CheckDestroy: testAccCheckNetappVolumeDestroyProducer(t),
899+
ExternalProviders: map[string]resource.ExternalProvider{
900+
"time": {},
901+
},
902+
Steps: []resource.TestStep{
903+
{
904+
Config: testAccNetappVolume_ManualQosAuto(context),
905+
},
906+
{
907+
ResourceName: "google_netapp_volume.test_volume",
908+
ImportState: true,
909+
ImportStateVerify: true,
910+
ImportStateVerifyIgnore: []string{"restore_parameters", "location", "name", "deletion_policy", "labels", "terraform_labels"},
911+
},
912+
{
913+
Config: testAccNetappVolume_ManualQosManual(context),
914+
},
915+
{
916+
ResourceName: "google_netapp_volume.test_volume",
917+
ImportState: true,
918+
ImportStateVerify: true,
919+
ImportStateVerifyIgnore: []string{"restore_parameters", "location", "name", "deletion_policy", "labels", "terraform_labels"},
920+
},
921+
},
922+
})
923+
}
924+
925+
func testAccNetappVolume_ManualQosAuto(context map[string]interface{}) string {
926+
return acctest.Nprintf(`
927+
resource "google_netapp_storage_pool" "test_pool" {
928+
name = "tf-test-pool%{random_suffix}"
929+
location = "us-east4"
930+
service_level = "EXTREME"
931+
capacity_gib = "2048"
932+
network = data.google_compute_network.default.id
933+
qos_type = "AUTO"
934+
}
935+
936+
resource "time_sleep" "wait_3_minutes" {
937+
depends_on = [google_netapp_storage_pool.test_pool]
938+
create_duration = "3m"
939+
}
940+
941+
resource "google_netapp_volume" "test_volume" {
942+
location = "us-east4"
943+
name = "tf-test-test-volume%{random_suffix}"
944+
capacity_gib = "100"
945+
share_name = "tf-test-test-volume%{random_suffix}"
946+
storage_pool = google_netapp_storage_pool.test_pool.name
947+
protocols = ["NFSV3"]
948+
}
949+
950+
data "google_compute_network" "default" {
951+
name = "%{network_name}"
952+
}
953+
`, context)
954+
}
955+
956+
func testAccNetappVolume_ManualQosManual(context map[string]interface{}) string {
957+
return acctest.Nprintf(`
958+
resource "google_netapp_storage_pool" "test_pool" {
959+
name = "tf-test-pool%{random_suffix}"
960+
location = "us-east4"
961+
service_level = "EXTREME"
962+
capacity_gib = "2048"
963+
network = data.google_compute_network.default.id
964+
qos_type = "MANUAL"
965+
}
966+
967+
resource "time_sleep" "wait_3_minutes" {
968+
depends_on = [google_netapp_storage_pool.test_pool]
969+
create_duration = "3m"
970+
}
971+
972+
resource "google_netapp_volume" "test_volume" {
973+
location = "us-east4"
974+
name = "tf-test-test-volume%{random_suffix}"
975+
capacity_gib = "100"
976+
description = "This is a test description for manual qos volume"
977+
share_name = "tf-test-test-volume%{random_suffix}"
978+
storage_pool = google_netapp_storage_pool.test_pool.name
979+
protocols = ["NFSV3"]
980+
throughput_mibps = 12.5
981+
}
982+
983+
data "google_compute_network" "default" {
984+
name = "%{network_name}"
985+
}
986+
`, context)
987+
}

website/docs/r/netapp_storage_pool.html.markdown

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,12 @@ The following arguments are supported:
191191
Flag indicating that the hot-tier threshold will be auto-increased by 10% of the hot-tier when it hits 100%. Default is true.
192192
The increment will kick in only if the new size after increment is still less than or equal to storage pool size.
193193

194+
* `qos_type` -
195+
(Optional)
196+
QoS (Quality of Service) type of the storage pool.
197+
Possible values are: AUTO, MANUAL.
198+
Possible values are: `QOS_TYPE_UNSPECIFIED`, `AUTO`, `MANUAL`.
199+
194200
* `project` - (Optional) The ID of the project in which the resource belongs.
195201
If it is not provided, the provider project is used.
196202

@@ -211,6 +217,9 @@ In addition to the arguments listed above, the following computed attributes are
211217
* `encryption_type` -
212218
Reports if volumes in the pool are encrypted using a Google-managed encryption key or CMEK.
213219

220+
* `available_throughput_mibps` -
221+
Available throughput of the storage pool (in MiB/s).
222+
214223
* `terraform_labels` -
215224
The combination of labels configured directly on the resource
216225
and default labels configured on the provider.

website/docs/r/netapp_volume.html.markdown

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ The following arguments are supported:
177177
The Hybrid Replication parameters for the volume.
178178
Structure is [documented below](#nested_hybrid_replication_parameters).
179179

180+
* `throughput_mibps` -
181+
(Optional)
182+
Optional. Custom Performance Total Throughput of the pool (in MiB/s).
183+
180184
* `project` - (Optional) The ID of the project in which the resource belongs.
181185
If it is not provided, the provider project is used.
182186

0 commit comments

Comments
 (0)