@@ -2,9 +2,6 @@ package budgets
2
2
3
3
import (
4
4
"fmt"
5
- "log"
6
- "strings"
7
-
8
5
"github.com/aws/aws-sdk-go/aws"
9
6
"github.com/aws/aws-sdk-go/aws/arn"
10
7
"github.com/aws/aws-sdk-go/service/budgets"
@@ -17,6 +14,8 @@ import (
17
14
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
18
15
"github.com/hashicorp/terraform-provider-aws/internal/verify"
19
16
"github.com/shopspring/decimal"
17
+ "log"
18
+ "strings"
20
19
)
21
20
22
21
func ResourceBudget () * schema.Resource {
@@ -143,12 +142,39 @@ func ResourceBudget() *schema.Resource {
143
142
},
144
143
"limit_amount" : {
145
144
Type : schema .TypeString ,
146
- Required : true ,
145
+ Optional : true ,
146
+ Computed : true ,
147
147
DiffSuppressFunc : suppressEquivalentBudgetLimitAmount ,
148
+ ConflictsWith : []string {"planned_limit" },
148
149
},
149
150
"limit_unit" : {
150
- Type : schema .TypeString ,
151
- Required : true ,
151
+ Type : schema .TypeString ,
152
+ Optional : true ,
153
+ Computed : true ,
154
+ ConflictsWith : []string {"planned_limit" },
155
+ },
156
+ "planned_limit" : {
157
+ Type : schema .TypeSet ,
158
+ Optional : true ,
159
+ Elem : & schema.Resource {
160
+ Schema : map [string ]* schema.Schema {
161
+ "start_time" : {
162
+ Type : schema .TypeString ,
163
+ Required : true ,
164
+ ValidateFunc : ValidTimePeriodTimestamp ,
165
+ },
166
+ "amount" : {
167
+ Type : schema .TypeString ,
168
+ Required : true ,
169
+ DiffSuppressFunc : suppressEquivalentBudgetLimitAmount ,
170
+ },
171
+ "unit" : {
172
+ Type : schema .TypeString ,
173
+ Required : true ,
174
+ },
175
+ },
176
+ },
177
+ ConflictsWith : []string {"limit_amount" , "limit_unit" },
152
178
},
153
179
"name" : {
154
180
Type : schema .TypeString ,
@@ -312,6 +338,7 @@ func resourceBudgetRead(d *schema.ResourceData, meta interface{}) error {
312
338
d .Set ("limit_unit" , budget .BudgetLimit .Unit )
313
339
}
314
340
341
+ d .Set ("planned_limit" , convertPlannedBudgetLimitsToSet (budget .PlannedBudgetLimits ))
315
342
d .Set ("name" , budget .BudgetName )
316
343
d .Set ("name_prefix" , create .NamePrefixFromName (aws .StringValue (budget .BudgetName )))
317
344
@@ -556,13 +583,58 @@ func convertCostFiltersToStringMap(costFilters map[string][]*string) map[string]
556
583
return convertedCostFilters
557
584
}
558
585
586
+ func convertPlannedBudgetLimitsToSet (plannedBudgetLimits map [string ]* budgets.Spend ) []interface {} {
587
+ if plannedBudgetLimits == nil {
588
+ return nil
589
+ }
590
+
591
+ convertedPlannedBudgetLimits := make ([]interface {}, len (plannedBudgetLimits ))
592
+ i := 0
593
+
594
+ for k , v := range plannedBudgetLimits {
595
+ if v == nil {
596
+ return nil
597
+ }
598
+
599
+ startTime , err := TimePeriodSecondsToString (k )
600
+ if err != nil {
601
+ return nil
602
+ }
603
+
604
+ convertedPlannedBudgetLimit := make (map [string ]string )
605
+ convertedPlannedBudgetLimit ["start_time" ] = startTime
606
+ convertedPlannedBudgetLimit ["amount" ] = * v .Amount
607
+ convertedPlannedBudgetLimit ["unit" ] = * v .Unit
608
+
609
+ convertedPlannedBudgetLimits [i ] = convertedPlannedBudgetLimit
610
+ i ++
611
+ }
612
+
613
+ return convertedPlannedBudgetLimits
614
+ }
615
+
559
616
func expandBudgetUnmarshal (d * schema.ResourceData ) (* budgets.Budget , error ) {
560
617
budgetName := d .Get ("name" ).(string )
561
618
budgetType := d .Get ("budget_type" ).(string )
562
- budgetLimitAmount := d .Get ("limit_amount" ).(string )
563
- budgetLimitUnit := d .Get ("limit_unit" ).(string )
564
619
budgetTimeUnit := d .Get ("time_unit" ).(string )
565
620
budgetCostFilters := make (map [string ][]* string )
621
+ var budgetLimit * budgets.Spend
622
+ var plannedBudgetLimits map [string ]* budgets.Spend
623
+
624
+ if plannedBudgetLimitsRaw , ok := d .GetOk ("planned_limit" ); ok {
625
+ plannedBudgetLimitsRaw := plannedBudgetLimitsRaw .(* schema.Set ).List ()
626
+
627
+ var err error
628
+ plannedBudgetLimits , err = expandPlannedBudgetLimitsUnmarshal (plannedBudgetLimitsRaw )
629
+ if err != nil {
630
+ return nil , err
631
+ }
632
+ } else {
633
+ budgetLimit = & budgets.Spend {
634
+ Amount : aws .String (d .Get ("limit_amount" ).(string )),
635
+ Unit : aws .String (d .Get ("limit_unit" ).(string )),
636
+ }
637
+ }
566
638
567
639
if costFilter , ok := d .GetOk ("cost_filter" ); ok {
568
640
for _ , v := range costFilter .(* schema.Set ).List () {
@@ -592,16 +664,14 @@ func expandBudgetUnmarshal(d *schema.ResourceData) (*budgets.Budget, error) {
592
664
}
593
665
594
666
budget := & budgets.Budget {
595
- BudgetName : aws .String (budgetName ),
596
- BudgetType : aws .String (budgetType ),
597
- BudgetLimit : & budgets.Spend {
598
- Amount : aws .String (budgetLimitAmount ),
599
- Unit : aws .String (budgetLimitUnit ),
600
- },
667
+ BudgetName : aws .String (budgetName ),
668
+ BudgetType : aws .String (budgetType ),
669
+ PlannedBudgetLimits : plannedBudgetLimits ,
601
670
TimePeriod : & budgets.TimePeriod {
602
671
End : budgetTimePeriodEnd ,
603
672
Start : budgetTimePeriodStart ,
604
673
},
674
+ BudgetLimit : budgetLimit ,
605
675
TimeUnit : aws .String (budgetTimeUnit ),
606
676
CostFilters : budgetCostFilters ,
607
677
}
@@ -657,6 +727,29 @@ func expandCostTypes(tfMap map[string]interface{}) *budgets.CostTypes {
657
727
return apiObject
658
728
}
659
729
730
+ func expandPlannedBudgetLimitsUnmarshal (plannedBudgetLimitsRaw []interface {}) (map [string ]* budgets.Spend , error ) {
731
+ plannedBudgetLimits := make (map [string ]* budgets.Spend , len (plannedBudgetLimitsRaw ))
732
+
733
+ for _ , plannedBudgetLimit := range plannedBudgetLimitsRaw {
734
+ plannedBudgetLimit := plannedBudgetLimit .(map [string ]interface {})
735
+
736
+ key , err := TimePeriodSecondsFromString (plannedBudgetLimit ["start_time" ].(string ))
737
+ if err != nil {
738
+ return nil , err
739
+ }
740
+
741
+ amount := plannedBudgetLimit ["amount" ].(string )
742
+ unit := plannedBudgetLimit ["unit" ].(string )
743
+
744
+ plannedBudgetLimits [key ] = & budgets.Spend {
745
+ Amount : aws .String (amount ),
746
+ Unit : aws .String (unit ),
747
+ }
748
+ }
749
+
750
+ return plannedBudgetLimits , nil
751
+ }
752
+
660
753
func expandBudgetNotificationsUnmarshal (notificationsRaw []interface {}) ([]* budgets.Notification , [][]* budgets.Subscriber ) {
661
754
662
755
notifications := make ([]* budgets.Notification , len (notificationsRaw ))
0 commit comments