@@ -11,6 +11,7 @@ import (
11
11
"github.com/aws/aws-sdk-go/service/quicksight"
12
12
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
13
13
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
14
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
14
15
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
15
16
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
16
17
"github.com/hashicorp/terraform-provider-aws/internal/conns"
@@ -299,10 +300,68 @@ func ResourceDataSet() *schema.Resource {
299
300
},
300
301
},
301
302
},
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
+ },
302
352
names .AttrTags : tftags .TagsSchema (),
303
353
names .AttrTagsAll : tftags .TagsSchemaComputed (),
304
354
},
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
+ ),
306
365
}
307
366
}
308
367
@@ -829,6 +888,19 @@ func resourceDataSetCreate(ctx context.Context, d *schema.ResourceData, meta int
829
888
return diag .Errorf ("error creating QuickSight Data Set: %s" , err )
830
889
}
831
890
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
+
832
904
return resourceDataSetRead (ctx , d , meta )
833
905
}
834
906
@@ -917,13 +989,29 @@ func resourceDataSetRead(ctx context.Context, d *schema.ResourceData, meta inter
917
989
if err := d .Set ("permissions" , flattenPermissions (permsResp .Permissions )); err != nil {
918
990
return diag .Errorf ("error setting permissions: %s" , err )
919
991
}
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
+
920
1008
return nil
921
1009
}
922
1010
923
1011
func resourceDataSetUpdate (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
924
1012
conn := meta .(* conns.AWSClient ).QuickSightConn ()
925
1013
926
- if d .HasChangesExcept ("permissions" , "tags" , "tags_all" ) {
1014
+ if d .HasChangesExcept ("permissions" , "tags" , "tags_all" , "refresh_properties" ) {
927
1015
awsAccountId , dataSetId , err := ParseDataSetID (d .Id ())
928
1016
if err != nil {
929
1017
return diag .FromErr (err )
@@ -989,6 +1077,35 @@ func resourceDataSetUpdate(ctx context.Context, d *schema.ResourceData, meta int
989
1077
}
990
1078
}
991
1079
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
+
992
1109
return resourceDataSetRead (ctx , d , meta )
993
1110
}
994
1111
@@ -1740,6 +1857,76 @@ func expandDataSetRowLevelPermissionTagConfigurations(tfList []interface{}) *qui
1740
1857
return rowLevelPermissionTagConfiguration
1741
1858
}
1742
1859
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
+
1743
1930
func expandDataSetTagRules (tfList []interface {}) []* quicksight.RowLevelPermissionTagRule {
1744
1931
if len (tfList ) == 0 {
1745
1932
return nil
@@ -2423,6 +2610,64 @@ func flattenRowLevelPermissionTagConfiguration(apiObject *quicksight.RowLevelPer
2423
2610
return []interface {}{tfMap }
2424
2611
}
2425
2612
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
+
2426
2671
func flattenTagRules (apiObject []* quicksight.RowLevelPermissionTagRule ) []interface {} {
2427
2672
if len (apiObject ) == 0 {
2428
2673
return nil
0 commit comments