Skip to content

Commit 78d0044

Browse files
committed
aws_quicksight_data_set: Add support for configuring refresh properties
Closes hashicorp#30744
1 parent 84312cc commit 78d0044

File tree

4 files changed

+395
-2
lines changed

4 files changed

+395
-2
lines changed

.changelog/30744.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
aws_quicksight_data_set: Add support for configuring refresh properties
3+
```

internal/service/quicksight/data_set.go

+247-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/aws/aws-sdk-go/service/quicksight"
1212
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
1313
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
1415
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1516
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1617
"github.com/hashicorp/terraform-provider-aws/internal/conns"
@@ -299,10 +300,68 @@ func ResourceDataSet() *schema.Resource {
299300
},
300301
},
301302
},
303+
"refresh_properties": {
304+
Type: schema.TypeList,
305+
Optional: true,
306+
MaxItems: 1,
307+
Elem: &schema.Resource{
308+
Schema: map[string]*schema.Schema{
309+
"refresh_configuration": {
310+
Type: schema.TypeList,
311+
Required: true,
312+
MaxItems: 1,
313+
Elem: &schema.Resource{
314+
Schema: map[string]*schema.Schema{
315+
"incremental_refresh": {
316+
Type: schema.TypeList,
317+
Required: true,
318+
MaxItems: 1,
319+
Elem: &schema.Resource{
320+
Schema: map[string]*schema.Schema{
321+
"lookback_window": {
322+
Type: schema.TypeList,
323+
Required: true,
324+
MaxItems: 1,
325+
Elem: &schema.Resource{
326+
Schema: map[string]*schema.Schema{
327+
"column_name": {
328+
Type: schema.TypeString,
329+
Required: true,
330+
},
331+
"size": {
332+
Type: schema.TypeInt,
333+
Required: true,
334+
},
335+
"size_unit": {
336+
Type: schema.TypeString,
337+
Required: true,
338+
ValidateFunc: validation.StringInSlice(quicksight.LookbackWindowSizeUnit_Values(), false),
339+
},
340+
},
341+
},
342+
},
343+
},
344+
},
345+
},
346+
},
347+
},
348+
},
349+
},
350+
},
351+
},
302352
names.AttrTags: tftags.TagsSchema(),
303353
names.AttrTagsAll: tftags.TagsSchemaComputed(),
304354
},
305-
CustomizeDiff: verify.SetTagsDiff,
355+
CustomizeDiff: customdiff.All(
356+
func(_ context.Context, diff *schema.ResourceDiff, _ interface{}) error {
357+
mode := diff.Get("import_mode").(string)
358+
if v, ok := diff.Get("refresh_properties").([]interface{}); ok && v != nil && len(v) > 0 && mode == "DIRECT_QUERY" {
359+
return fmt.Errorf("refresh_properties cannot be set when import_mode is 'DIRECT_QUERY'")
360+
}
361+
return nil
362+
},
363+
verify.SetTagsDiff,
364+
),
306365
}
307366
}
308367

@@ -829,6 +888,19 @@ func resourceDataSetCreate(ctx context.Context, d *schema.ResourceData, meta int
829888
return diag.Errorf("error creating QuickSight Data Set: %s", err)
830889
}
831890

891+
if v, ok := d.GetOk("refresh_properties"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil {
892+
input := &quicksight.PutDataSetRefreshPropertiesInput{
893+
AwsAccountId: aws.String(awsAccountId),
894+
DataSetId: aws.String(dataSetID),
895+
DataSetRefreshProperties: expandDataSetRefreshProperties(v.([]interface{})),
896+
}
897+
898+
_, err := conn.PutDataSetRefreshPropertiesWithContext(ctx, input)
899+
if err != nil {
900+
return diag.Errorf("error putting QuickSight Data Set Refresh Properties: %s", err)
901+
}
902+
}
903+
832904
return resourceDataSetRead(ctx, d, meta)
833905
}
834906

@@ -917,13 +989,29 @@ func resourceDataSetRead(ctx context.Context, d *schema.ResourceData, meta inter
917989
if err := d.Set("permissions", flattenPermissions(permsResp.Permissions)); err != nil {
918990
return diag.Errorf("error setting permissions: %s", err)
919991
}
992+
993+
propsResp, err := conn.DescribeDataSetRefreshPropertiesWithContext(ctx, &quicksight.DescribeDataSetRefreshPropertiesInput{
994+
AwsAccountId: aws.String(awsAccountId),
995+
DataSetId: aws.String(dataSetId),
996+
})
997+
998+
if err != nil && !tfawserr.ErrCodeEquals(err, quicksight.ErrCodeResourceNotFoundException) {
999+
return diag.Errorf("error describing refresh properties (%s): %s", d.Id(), err)
1000+
}
1001+
1002+
if err == nil {
1003+
if err := d.Set("refresh_properties", flattenRefreshProperties(propsResp.DataSetRefreshProperties)); err != nil {
1004+
return diag.Errorf("error setting refresh properties: %s", err)
1005+
}
1006+
}
1007+
9201008
return nil
9211009
}
9221010

9231011
func resourceDataSetUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
9241012
conn := meta.(*conns.AWSClient).QuickSightConn()
9251013

926-
if d.HasChangesExcept("permissions", "tags", "tags_all") {
1014+
if d.HasChangesExcept("permissions", "tags", "tags_all", "refresh_properties") {
9271015
awsAccountId, dataSetId, err := ParseDataSetID(d.Id())
9281016
if err != nil {
9291017
return diag.FromErr(err)
@@ -989,6 +1077,35 @@ func resourceDataSetUpdate(ctx context.Context, d *schema.ResourceData, meta int
9891077
}
9901078
}
9911079

1080+
if d.HasChange("refresh_properties") {
1081+
awsAccountId, dataSetId, err := ParseDataSetID(d.Id())
1082+
if err != nil {
1083+
return diag.FromErr(err)
1084+
}
1085+
1086+
oldraw, newraw := d.GetChange("refresh_properties")
1087+
old := oldraw.([]interface{})
1088+
new := newraw.([]interface{})
1089+
if len(old) == 1 && len(new) == 0 {
1090+
_, err := conn.DeleteDataSetRefreshPropertiesWithContext(ctx, &quicksight.DeleteDataSetRefreshPropertiesInput{
1091+
AwsAccountId: aws.String(awsAccountId),
1092+
DataSetId: aws.String(dataSetId),
1093+
})
1094+
if err != nil {
1095+
return diag.Errorf("error deleting QuickSight Data Set Refresh Properties (%s): %s", d.Id(), err)
1096+
}
1097+
} else {
1098+
_, err = conn.PutDataSetRefreshPropertiesWithContext(ctx, &quicksight.PutDataSetRefreshPropertiesInput{
1099+
AwsAccountId: aws.String(awsAccountId),
1100+
DataSetId: aws.String(dataSetId),
1101+
DataSetRefreshProperties: expandDataSetRefreshProperties(d.Get("refresh_properties").([]interface{})),
1102+
})
1103+
if err != nil {
1104+
return diag.Errorf("error updating QuickSight Data Set Refresh Properties (%s): %s", d.Id(), err)
1105+
}
1106+
}
1107+
}
1108+
9921109
return resourceDataSetRead(ctx, d, meta)
9931110
}
9941111

@@ -1740,6 +1857,76 @@ func expandDataSetRowLevelPermissionTagConfigurations(tfList []interface{}) *qui
17401857
return rowLevelPermissionTagConfiguration
17411858
}
17421859

1860+
func expandDataSetRefreshProperties(tfList []interface{}) *quicksight.DataSetRefreshProperties {
1861+
if len(tfList) == 0 || tfList[0] == nil {
1862+
return nil
1863+
}
1864+
1865+
tfMap, ok := tfList[0].(map[string]interface{})
1866+
if !ok {
1867+
return nil
1868+
}
1869+
props := &quicksight.DataSetRefreshProperties{}
1870+
if v, ok := tfMap["refresh_configuration"].([]interface{}); ok {
1871+
props.RefreshConfiguration = expandDataSetRefreshConfiguration(v)
1872+
}
1873+
return props
1874+
}
1875+
1876+
func expandDataSetRefreshConfiguration(tfList []interface{}) *quicksight.RefreshConfiguration {
1877+
if len(tfList) == 0 || tfList[0] == nil {
1878+
return nil
1879+
}
1880+
1881+
tfMap, ok := tfList[0].(map[string]interface{})
1882+
if !ok {
1883+
return nil
1884+
}
1885+
config := &quicksight.RefreshConfiguration{}
1886+
if v, ok := tfMap["incremental_refresh"].([]interface{}); ok {
1887+
config.IncrementalRefresh = expandIncrementalRefresh(v)
1888+
}
1889+
return config
1890+
}
1891+
1892+
func expandIncrementalRefresh(tfList []interface{}) *quicksight.IncrementalRefresh {
1893+
if len(tfList) == 0 || tfList[0] == nil {
1894+
return nil
1895+
}
1896+
1897+
tfMap, ok := tfList[0].(map[string]interface{})
1898+
if !ok {
1899+
return nil
1900+
}
1901+
refresh := &quicksight.IncrementalRefresh{}
1902+
if v, ok := tfMap["lookback_window"].([]interface{}); ok {
1903+
refresh.LookbackWindow = expandLookbackWindow(v)
1904+
}
1905+
return refresh
1906+
}
1907+
1908+
func expandLookbackWindow(tfList []interface{}) *quicksight.LookbackWindow {
1909+
if len(tfList) == 0 || tfList[0] == nil {
1910+
return nil
1911+
}
1912+
1913+
tfMap, ok := tfList[0].(map[string]interface{})
1914+
if !ok {
1915+
return nil
1916+
}
1917+
window := &quicksight.LookbackWindow{}
1918+
if v, ok := tfMap["column_name"].(string); ok {
1919+
window.ColumnName = aws.String(v)
1920+
}
1921+
if v, ok := tfMap["size"].(int); ok {
1922+
window.Size = aws.Int64(int64(v))
1923+
}
1924+
if v, ok := tfMap["size_unit"].(string); ok {
1925+
window.SizeUnit = aws.String(v)
1926+
}
1927+
return window
1928+
}
1929+
17431930
func expandDataSetTagRules(tfList []interface{}) []*quicksight.RowLevelPermissionTagRule {
17441931
if len(tfList) == 0 {
17451932
return nil
@@ -2423,6 +2610,64 @@ func flattenRowLevelPermissionTagConfiguration(apiObject *quicksight.RowLevelPer
24232610
return []interface{}{tfMap}
24242611
}
24252612

2613+
func flattenRefreshProperties(apiObject *quicksight.DataSetRefreshProperties) interface{} {
2614+
if apiObject == nil {
2615+
return nil
2616+
}
2617+
2618+
tfMap := map[string]interface{}{}
2619+
if apiObject.RefreshConfiguration != nil {
2620+
tfMap["refresh_configuration"] = flattenRefreshConfiguration(apiObject.RefreshConfiguration)
2621+
}
2622+
2623+
return []interface{}{tfMap}
2624+
}
2625+
2626+
func flattenRefreshConfiguration(apiObject *quicksight.RefreshConfiguration) interface{} {
2627+
if apiObject == nil {
2628+
return nil
2629+
}
2630+
2631+
tfMap := map[string]interface{}{}
2632+
if apiObject.IncrementalRefresh != nil {
2633+
tfMap["incremental_refresh"] = flattenIncrementalRefresh(apiObject.IncrementalRefresh)
2634+
}
2635+
2636+
return []interface{}{tfMap}
2637+
}
2638+
2639+
func flattenIncrementalRefresh(apiObject *quicksight.IncrementalRefresh) interface{} {
2640+
if apiObject == nil {
2641+
return nil
2642+
}
2643+
2644+
tfMap := map[string]interface{}{}
2645+
if apiObject.LookbackWindow != nil {
2646+
tfMap["lookback_window"] = flattenLookbackWindow(apiObject.LookbackWindow)
2647+
}
2648+
2649+
return []interface{}{tfMap}
2650+
}
2651+
2652+
func flattenLookbackWindow(apiObject *quicksight.LookbackWindow) interface{} {
2653+
if apiObject == nil {
2654+
return nil
2655+
}
2656+
2657+
tfMap := map[string]interface{}{}
2658+
if apiObject.ColumnName != nil {
2659+
tfMap["column_name"] = aws.StringValue(apiObject.ColumnName)
2660+
}
2661+
if apiObject.Size != nil {
2662+
tfMap["size"] = aws.Int64Value(apiObject.Size)
2663+
}
2664+
if apiObject.SizeUnit != nil {
2665+
tfMap["size_unit"] = aws.StringValue(apiObject.SizeUnit)
2666+
}
2667+
2668+
return []interface{}{tfMap}
2669+
}
2670+
24262671
func flattenTagRules(apiObject []*quicksight.RowLevelPermissionTagRule) []interface{} {
24272672
if len(apiObject) == 0 {
24282673
return nil

0 commit comments

Comments
 (0)