diff --git a/aws/resource_aws_budgets_budget.go b/aws/resource_aws_budgets_budget.go index 1f65e6d4678b..7979bae02c19 100644 --- a/aws/resource_aws_budgets_budget.go +++ b/aws/resource_aws_budgets_budget.go @@ -7,6 +7,7 @@ import ( "time" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/arn" "github.com/aws/aws-sdk-go/service/budgets" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -16,6 +17,10 @@ import ( func resourceAwsBudgetsBudget() *schema.Resource { return &schema.Resource{ Schema: map[string]*schema.Schema{ + "arn": { + Type: schema.TypeString, + Computed: true, + }, "account_id": { Type: schema.TypeString, Computed: true, @@ -37,8 +42,9 @@ func resourceAwsBudgetsBudget() *schema.Resource { ForceNew: true, }, "budget_type": { - Type: schema.TypeString, - Required: true, + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringInSlice(budgets.BudgetType_Values(), false), }, "limit_amount": { Type: schema.TypeString, @@ -123,8 +129,9 @@ func resourceAwsBudgetsBudget() *schema.Resource { Default: "2087-06-15_00:00", }, "time_unit": { - Type: schema.TypeString, - Required: true, + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringInSlice(budgets.TimeUnit_Values(), false), }, "cost_filters": { Type: schema.TypeMap, @@ -138,33 +145,23 @@ func resourceAwsBudgetsBudget() *schema.Resource { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "comparison_operator": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validation.StringInSlice([]string{ - budgets.ComparisonOperatorEqualTo, - budgets.ComparisonOperatorGreaterThan, - budgets.ComparisonOperatorLessThan, - }, false), + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringInSlice(budgets.ComparisonOperator_Values(), false), }, "threshold": { Type: schema.TypeFloat, Required: true, }, "threshold_type": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validation.StringInSlice([]string{ - budgets.ThresholdTypeAbsoluteValue, - budgets.ThresholdTypePercentage, - }, false), + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringInSlice(budgets.ThresholdType_Values(), false), }, "notification_type": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validation.StringInSlice([]string{ - budgets.NotificationTypeActual, - budgets.NotificationTypeForecasted, - }, false), + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringInSlice(budgets.NotificationType_Values(), false), }, "subscriber_email_addresses": { Type: schema.TypeSet, @@ -174,7 +171,10 @@ func resourceAwsBudgetsBudget() *schema.Resource { "subscriber_sns_topic_arns": { Type: schema.TypeSet, Optional: true, - Elem: &schema.Schema{Type: schema.TypeString}, + Elem: &schema.Schema{ + Type: schema.TypeString, + ValidateFunc: validateArn, + }, }, }, }, @@ -222,7 +222,7 @@ func resourceAwsBudgetsBudgetCreate(d *schema.ResourceData, meta interface{}) er return fmt.Errorf("create budget failed: %v", err) } - d.SetId(fmt.Sprintf("%s:%s", accountID, *budget.BudgetName)) + d.SetId(fmt.Sprintf("%s:%s", accountID, aws.StringValue(budget.BudgetName))) notificationsRaw := d.Get("notification").(*schema.Set).List() notifications, subscribers := expandBudgetNotificationsUnmarshal(notificationsRaw) @@ -350,6 +350,14 @@ func resourceAwsBudgetsBudgetRead(d *schema.ResourceData, meta interface{}) erro d.Set("time_unit", budget.TimeUnit) + arn := arn.ARN{ + Partition: meta.(*AWSClient).partition, + Service: "budgetservice", + AccountID: meta.(*AWSClient).accountid, + Resource: fmt.Sprintf("budget/%s", aws.StringValue(budget.BudgetName)), + } + d.Set("arn", arn.String()) + return resourceAwsBudgetsBudgetNotificationRead(d, meta) } @@ -402,9 +410,9 @@ func resourceAwsBudgetsBudgetNotificationRead(d *schema.ResourceData, meta inter emailSubscribers := make([]interface{}, 0) for _, subscriberOutput := range subscribersOutput.Subscribers { - if *subscriberOutput.SubscriptionType == budgets.SubscriptionTypeSns { + if aws.StringValue(subscriberOutput.SubscriptionType) == budgets.SubscriptionTypeSns { snsSubscribers = append(snsSubscribers, *subscriberOutput.Address) - } else if *subscriberOutput.SubscriptionType == budgets.SubscriptionTypeEmail { + } else if aws.StringValue(subscriberOutput.SubscriptionType) == budgets.SubscriptionTypeEmail { emailSubscribers = append(emailSubscribers, *subscriberOutput.Address) } } diff --git a/aws/resource_aws_budgets_budget_test.go b/aws/resource_aws_budgets_budget_test.go index 80e0a13f41be..af1346c17b3a 100644 --- a/aws/resource_aws_budgets_budget_test.go +++ b/aws/resource_aws_budgets_budget_test.go @@ -78,10 +78,11 @@ func testSweepBudgetsBudgets(region string) error { func TestAccAWSBudgetsBudget_basic(t *testing.T) { costFilterKey := "AZ" - name := fmt.Sprintf("test-budget-%d", acctest.RandInt()) - configBasicDefaults := testAccAWSBudgetsBudgetConfigDefaults(name) + rName := acctest.RandomWithPrefix("tf-acc-test") + configBasicDefaults := testAccAWSBudgetsBudgetConfigDefaults(rName) accountID := "012345678910" - configBasicUpdate := testAccAWSBudgetsBudgetConfigUpdate(name) + configBasicUpdate := testAccAWSBudgetsBudgetConfigUpdate(rName) + resourceName := "aws_budgets_budget.test" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSBudgets(t) }, @@ -91,14 +92,15 @@ func TestAccAWSBudgetsBudget_basic(t *testing.T) { { Config: testAccAWSBudgetsBudgetConfig_BasicDefaults(configBasicDefaults, costFilterKey), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), - resource.TestMatchResourceAttr("aws_budgets_budget.foo", "name", regexp.MustCompile(*configBasicDefaults.BudgetName)), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "budget_type", *configBasicDefaults.BudgetType), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "limit_amount", *configBasicDefaults.BudgetLimit.Amount), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "limit_unit", *configBasicDefaults.BudgetLimit.Unit), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_period_start", configBasicDefaults.TimePeriod.Start.Format("2006-01-02_15:04")), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_period_end", configBasicDefaults.TimePeriod.End.Format("2006-01-02_15:04")), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_unit", *configBasicDefaults.TimeUnit), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), + testAccCheckResourceAttrGlobalARN(resourceName, "arn", "budgetservice", fmt.Sprintf(`budget/%s`, rName)), + resource.TestMatchResourceAttr(resourceName, "name", regexp.MustCompile(*configBasicDefaults.BudgetName)), + resource.TestCheckResourceAttr(resourceName, "budget_type", *configBasicDefaults.BudgetType), + resource.TestCheckResourceAttr(resourceName, "limit_amount", *configBasicDefaults.BudgetLimit.Amount), + resource.TestCheckResourceAttr(resourceName, "limit_unit", *configBasicDefaults.BudgetLimit.Unit), + resource.TestCheckResourceAttr(resourceName, "time_period_start", configBasicDefaults.TimePeriod.Start.Format("2006-01-02_15:04")), + resource.TestCheckResourceAttr(resourceName, "time_period_end", configBasicDefaults.TimePeriod.End.Format("2006-01-02_15:04")), + resource.TestCheckResourceAttr(resourceName, "time_unit", *configBasicDefaults.TimeUnit), ), }, { @@ -109,18 +111,18 @@ func TestAccAWSBudgetsBudget_basic(t *testing.T) { { Config: testAccAWSBudgetsBudgetConfig_Basic(configBasicUpdate, costFilterKey), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicUpdate), - resource.TestMatchResourceAttr("aws_budgets_budget.foo", "name", regexp.MustCompile(*configBasicUpdate.BudgetName)), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "budget_type", *configBasicUpdate.BudgetType), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "limit_amount", *configBasicUpdate.BudgetLimit.Amount), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "limit_unit", *configBasicUpdate.BudgetLimit.Unit), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_period_start", configBasicUpdate.TimePeriod.Start.Format("2006-01-02_15:04")), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_period_end", configBasicUpdate.TimePeriod.End.Format("2006-01-02_15:04")), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_unit", *configBasicUpdate.TimeUnit), + testAccAWSBudgetsBudgetExists(resourceName, configBasicUpdate), + resource.TestMatchResourceAttr(resourceName, "name", regexp.MustCompile(*configBasicUpdate.BudgetName)), + resource.TestCheckResourceAttr(resourceName, "budget_type", *configBasicUpdate.BudgetType), + resource.TestCheckResourceAttr(resourceName, "limit_amount", *configBasicUpdate.BudgetLimit.Amount), + resource.TestCheckResourceAttr(resourceName, "limit_unit", *configBasicUpdate.BudgetLimit.Unit), + resource.TestCheckResourceAttr(resourceName, "time_period_start", configBasicUpdate.TimePeriod.Start.Format("2006-01-02_15:04")), + resource.TestCheckResourceAttr(resourceName, "time_period_end", configBasicUpdate.TimePeriod.End.Format("2006-01-02_15:04")), + resource.TestCheckResourceAttr(resourceName, "time_unit", *configBasicUpdate.TimeUnit), ), }, { - ResourceName: "aws_budgets_budget.foo", + ResourceName: resourceName, ImportState: true, ImportStateVerify: true, ImportStateVerifyIgnore: []string{"name_prefix"}, @@ -131,9 +133,10 @@ func TestAccAWSBudgetsBudget_basic(t *testing.T) { func TestAccAWSBudgetsBudget_prefix(t *testing.T) { costFilterKey := "AZ" - name := "test-budget-" - configBasicDefaults := testAccAWSBudgetsBudgetConfigDefaults(name) - configBasicUpdate := testAccAWSBudgetsBudgetConfigUpdate(name) + rName := acctest.RandomWithPrefix("tf-acc-test") + configBasicDefaults := testAccAWSBudgetsBudgetConfigDefaults(rName) + configBasicUpdate := testAccAWSBudgetsBudgetConfigUpdate(rName) + resourceName := "aws_budgets_budget.test" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSBudgets(t) }, @@ -143,33 +146,33 @@ func TestAccAWSBudgetsBudget_prefix(t *testing.T) { { Config: testAccAWSBudgetsBudgetConfig_PrefixDefaults(configBasicDefaults, costFilterKey), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), - resource.TestMatchResourceAttr("aws_budgets_budget.foo", "name_prefix", regexp.MustCompile(*configBasicDefaults.BudgetName)), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "budget_type", *configBasicDefaults.BudgetType), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "limit_amount", *configBasicDefaults.BudgetLimit.Amount), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "limit_unit", *configBasicDefaults.BudgetLimit.Unit), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_period_start", configBasicDefaults.TimePeriod.Start.Format("2006-01-02_15:04")), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_period_end", configBasicDefaults.TimePeriod.End.Format("2006-01-02_15:04")), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_unit", *configBasicDefaults.TimeUnit), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), + resource.TestMatchResourceAttr(resourceName, "name_prefix", regexp.MustCompile(*configBasicDefaults.BudgetName)), + resource.TestCheckResourceAttr(resourceName, "budget_type", *configBasicDefaults.BudgetType), + resource.TestCheckResourceAttr(resourceName, "limit_amount", *configBasicDefaults.BudgetLimit.Amount), + resource.TestCheckResourceAttr(resourceName, "limit_unit", *configBasicDefaults.BudgetLimit.Unit), + resource.TestCheckResourceAttr(resourceName, "time_period_start", configBasicDefaults.TimePeriod.Start.Format("2006-01-02_15:04")), + resource.TestCheckResourceAttr(resourceName, "time_period_end", configBasicDefaults.TimePeriod.End.Format("2006-01-02_15:04")), + resource.TestCheckResourceAttr(resourceName, "time_unit", *configBasicDefaults.TimeUnit), ), }, { Config: testAccAWSBudgetsBudgetConfig_Prefix(configBasicUpdate, costFilterKey), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicUpdate), - resource.TestMatchResourceAttr("aws_budgets_budget.foo", "name_prefix", regexp.MustCompile(*configBasicUpdate.BudgetName)), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "budget_type", *configBasicUpdate.BudgetType), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "limit_amount", *configBasicUpdate.BudgetLimit.Amount), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "limit_unit", *configBasicUpdate.BudgetLimit.Unit), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_period_start", configBasicUpdate.TimePeriod.Start.Format("2006-01-02_15:04")), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_period_end", configBasicUpdate.TimePeriod.End.Format("2006-01-02_15:04")), - resource.TestCheckResourceAttr("aws_budgets_budget.foo", "time_unit", *configBasicUpdate.TimeUnit), + testAccAWSBudgetsBudgetExists(resourceName, configBasicUpdate), + resource.TestMatchResourceAttr(resourceName, "name_prefix", regexp.MustCompile(*configBasicUpdate.BudgetName)), + resource.TestCheckResourceAttr(resourceName, "budget_type", *configBasicUpdate.BudgetType), + resource.TestCheckResourceAttr(resourceName, "limit_amount", *configBasicUpdate.BudgetLimit.Amount), + resource.TestCheckResourceAttr(resourceName, "limit_unit", *configBasicUpdate.BudgetLimit.Unit), + resource.TestCheckResourceAttr(resourceName, "time_period_start", configBasicUpdate.TimePeriod.Start.Format("2006-01-02_15:04")), + resource.TestCheckResourceAttr(resourceName, "time_period_end", configBasicUpdate.TimePeriod.End.Format("2006-01-02_15:04")), + resource.TestCheckResourceAttr(resourceName, "time_unit", *configBasicUpdate.TimeUnit), ), }, { - ResourceName: "aws_budgets_budget.foo", + ResourceName: resourceName, ImportState: true, ImportStateVerify: true, ImportStateVerifyIgnore: []string{"name_prefix"}, @@ -179,9 +182,10 @@ func TestAccAWSBudgetsBudget_prefix(t *testing.T) { } func TestAccAWSBudgetsBudget_notification(t *testing.T) { - name := fmt.Sprintf("test-budget-%d", acctest.RandInt()) - configBasicDefaults := testAccAWSBudgetsBudgetConfigDefaults(name) + rName := acctest.RandomWithPrefix("tf-acc-test") + configBasicDefaults := testAccAWSBudgetsBudgetConfigDefaults(rName) configBasicDefaults.CostFilters = map[string][]*string{} + resourceName := "aws_budgets_budget.test" notificationConfigDefaults := []budgets.Notification{testAccAWSBudgetsBudgetNotificationConfigDefaults()} notificationConfigUpdated := []budgets.Notification{testAccAWSBudgetsBudgetNotificationConfigUpdate()} @@ -191,7 +195,7 @@ func TestAccAWSBudgetsBudget_notification(t *testing.T) { } noEmails := []string{} - oneEmail := []string{"foo@example.com"} + oneEmail := []string{"test@example.com"} oneOtherEmail := []string{"bar@example.com"} twoEmails := []string{"bar@example.com", "baz@example.com"} noTopics := []string{} @@ -207,42 +211,42 @@ func TestAccAWSBudgetsBudget_notification(t *testing.T) { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, notificationConfigDefaults, noEmails, noTopics), ExpectError: regexp.MustCompile(`Notification must have at least one subscriber`), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, // Basic Notification with only email { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, notificationConfigDefaults, oneEmail, noTopics), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, // Change only subscriber to a different e-mail { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, notificationConfigDefaults, oneOtherEmail, noTopics), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, // Add a second e-mail and a topic { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, notificationConfigDefaults, twoEmails, oneTopic), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, // Delete both E-Mails { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, notificationConfigDefaults, noEmails, oneTopic), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, // Swap one Topic fo one E-Mail { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, notificationConfigDefaults, oneEmail, noTopics), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, // Can't update without at least one subscriber @@ -250,7 +254,7 @@ func TestAccAWSBudgetsBudget_notification(t *testing.T) { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, notificationConfigDefaults, noEmails, noTopics), ExpectError: regexp.MustCompile(`Notification must have at least one subscriber`), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, // Update all non-subscription parameters @@ -258,7 +262,7 @@ func TestAccAWSBudgetsBudget_notification(t *testing.T) { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, notificationConfigUpdated, noEmails, noTopics), ExpectError: regexp.MustCompile(`Notification must have at least one subscriber`), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, // Add a second subscription @@ -266,13 +270,36 @@ func TestAccAWSBudgetsBudget_notification(t *testing.T) { Config: testAccAWSBudgetsBudgetConfigWithNotification_Basic(configBasicDefaults, twoNotificationConfigs, noEmails, noTopics), ExpectError: regexp.MustCompile(`Notification must have at least one subscriber`), Check: resource.ComposeTestCheckFunc( - testAccAWSBudgetsBudgetExists("aws_budgets_budget.foo", configBasicDefaults), + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), ), }, }, }) } +func TestAccAWSBudgetsBudget_disappears(t *testing.T) { + costFilterKey := "AZ" + rName := acctest.RandomWithPrefix("tf-acc-test") + configBasicDefaults := testAccAWSBudgetsBudgetConfigDefaults(rName) + resourceName := "aws_budgets_budget.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSBudgets(t) }, + Providers: testAccProviders, + CheckDestroy: testAccAWSBudgetsBudgetDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSBudgetsBudgetConfig_BasicDefaults(configBasicDefaults, costFilterKey), + Check: resource.ComposeTestCheckFunc( + testAccAWSBudgetsBudgetExists(resourceName, configBasicDefaults), + testAccCheckResourceDisappears(testAccProvider, resourceAwsBudgetsBudget(), resourceName), + ), + ExpectNonEmptyPlan: true, + }, + }, + }) +} + func testAccAWSBudgetsBudgetExists(resourceName string, config budgets.Budget) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[resourceName] @@ -299,8 +326,9 @@ func testAccAWSBudgetsBudgetExists(resourceName string, config budgets.Budget) r return fmt.Errorf("No budget returned %v in %v", b.Budget, b) } - if *b.Budget.BudgetLimit.Amount != *config.BudgetLimit.Amount { - return fmt.Errorf("budget limit incorrectly set %v != %v", *config.BudgetLimit.Amount, *b.Budget.BudgetLimit.Amount) + if aws.StringValue(b.Budget.BudgetLimit.Amount) != aws.StringValue(config.BudgetLimit.Amount) { + return fmt.Errorf("budget limit incorrectly set %v != %v", aws.StringValue(config.BudgetLimit.Amount), + aws.StringValue(b.Budget.BudgetLimit.Amount)) } if err := testAccAWSBudgetsBudgetCheckCostTypes(config, *b.Budget.CostTypes); err != nil { @@ -506,7 +534,7 @@ func testAccAWSBudgetsBudgetConfig_WithAccountID(budgetConfig budgets.Budget, ac costFilterValue := *budgetConfig.CostFilters[costFilterKey][0] return fmt.Sprintf(` -resource "aws_budgets_budget" "foo" { +resource "aws_budgets_budget" "test" { account_id = "%s" name_prefix = "%s" budget_type = "%s" @@ -527,7 +555,7 @@ func testAccAWSBudgetsBudgetConfig_PrefixDefaults(budgetConfig budgets.Budget, c costFilterValue := *budgetConfig.CostFilters[costFilterKey][0] return fmt.Sprintf(` -resource "aws_budgets_budget" "foo" { +resource "aws_budgets_budget" "test" { name_prefix = "%s" budget_type = "%s" limit_amount = "%s" @@ -548,7 +576,7 @@ func testAccAWSBudgetsBudgetConfig_Prefix(budgetConfig budgets.Budget, costFilte costFilterValue := *budgetConfig.CostFilters[costFilterKey][0] return fmt.Sprintf(` -resource "aws_budgets_budget" "foo" { +resource "aws_budgets_budget" "test" { name_prefix = "%s" budget_type = "%s" limit_amount = "%s" @@ -575,7 +603,7 @@ func testAccAWSBudgetsBudgetConfig_BasicDefaults(budgetConfig budgets.Budget, co costFilterValue := *budgetConfig.CostFilters[costFilterKey][0] return fmt.Sprintf(` -resource "aws_budgets_budget" "foo" { +resource "aws_budgets_budget" "test" { name = "%s" budget_type = "%s" limit_amount = "%s" @@ -596,7 +624,7 @@ func testAccAWSBudgetsBudgetConfig_Basic(budgetConfig budgets.Budget, costFilter costFilterValue := *budgetConfig.CostFilters[costFilterKey][0] return fmt.Sprintf(` -resource "aws_budgets_budget" "foo" { +resource "aws_budgets_budget" "test" { name = "%s" budget_type = "%s" limit_amount = "%s" @@ -633,7 +661,7 @@ resource "aws_sns_topic" "budget_notifications" { name_prefix = "user-updates-topic" } -resource "aws_budgets_budget" "foo" { +resource "aws_budgets_budget" "test" { name = "%s" budget_type = "%s" limit_amount = "%s" diff --git a/website/docs/r/budgets_budget.html.markdown b/website/docs/r/budgets_budget.html.markdown index 75ffbcb0f0d0..ecead1ce7096 100644 --- a/website/docs/r/budgets_budget.html.markdown +++ b/website/docs/r/budgets_budget.html.markdown @@ -123,22 +123,24 @@ The following arguments are supported: * `name` - (Optional) The name of a budget. Unique within accounts. * `name_prefix` - (Optional) The prefix of the name of a budget. Unique within accounts. * `budget_type` - (Required) Whether this budget tracks monetary cost or usage. -* `cost_filters` - (Optional) Map of [CostFilters](#CostFilters) key/value pairs to apply to the budget. -* `cost_types` - (Optional) Object containing [CostTypes](#CostTypes) The types of cost included in a budget, such as tax and subscriptions.. +* `cost_filters` - (Optional) Map of [Cost Filters](#Cost-Filters) key/value pairs to apply to the budget. +* `cost_types` - (Optional) Object containing [Cost Types](#Cost-Types) The types of cost included in a budget, such as tax and subscriptions.. * `limit_amount` - (Required) The amount of cost or usage being measured for a budget. * `limit_unit` - (Required) The unit of measurement used for the budget forecast, actual spend, or budget threshold, such as dollars or GB. See [Spend](http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/data-type-spend.html) documentation. * `time_period_end` - (Optional) The end of the time period covered by the budget. There are no restrictions on the end date. Format: `2017-01-01_12:00`. * `time_period_start` - (Required) The start of the time period covered by the budget. The start date must come before the end date. Format: `2017-01-01_12:00`. -* `time_unit` - (Required) The length of time until a budget resets the actual and forecasted spend. Valid values: `MONTHLY`, `QUARTERLY`, `ANNUALLY`. -* `notification` - (Optional) Object containing [Budget Notifications](#BudgetNotification). Can be used multiple times to define more than one budget notification +* `time_unit` - (Required) The length of time until a budget resets the actual and forecasted spend. Valid values: `MONTHLY`, `QUARTERLY`, `ANNUALLY`, and `DAILY`. +* `notification` - (Optional) Object containing [Budget Notifications](#Budget-Notification). Can be used multiple times to define more than one budget notification ## Attributes Reference In addition to all arguments above, the following attributes are exported: * `id` - id of resource. +* `arn` - The ARN of the budget. -### CostTypes + +### Cost Types Valid keys for `cost_types` parameter. @@ -156,7 +158,7 @@ Valid keys for `cost_types` parameter. Refer to [AWS CostTypes documentation](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_budgets_CostTypes.html) for further detail. -### CostFilters +### Cost Filters Valid keys for `cost_filters` parameter vary depending on the `budget_type` value. @@ -177,7 +179,7 @@ Valid keys for `cost_filters` parameter vary depending on the `budget_type` valu Refer to [AWS CostFilter documentation](http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/data-type-filter.html) for further detail. -### BudgetNotification +### Budget Notification Valid keys for `notification` parameter.