diff --git a/CHANGELOG.md b/CHANGELOG.md index aad50e4fd2..eb6fb32d3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,8 @@ BUG FIXES: * providers/heroku: Domains and drains are deleted before the app. * providers/heroku: Moved from the client library bgentry/heroku-go to cyberdelia/heroku-go [GH-239]. + * providers/heroku: Plans without a specific plan name for + heroku\_addon work. [GH-198] PLUGIN CHANGES: diff --git a/builtin/providers/heroku/resource_heroku_addon.go b/builtin/providers/heroku/resource_heroku_addon.go index 7a0544cb1c..79f776e7dc 100644 --- a/builtin/providers/heroku/resource_heroku_addon.go +++ b/builtin/providers/heroku/resource_heroku_addon.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "sync" + "strings" "github.com/cyberdelia/heroku-go/v3" "github.com/hashicorp/terraform/helper/schema" @@ -98,8 +99,21 @@ func resourceHerokuAddonRead(d *schema.ResourceData, meta interface{}) error { return err } + // Determine the plan. If we were configured without a specific plan, + // then just avoid the plan altogether (accepting anything that + // Heroku sends down). + plan := addon.Plan.Name + if v := d.Get("plan").(string); v != "" { + if idx := strings.IndexRune(v, ':'); idx == -1 { + idx = strings.IndexRune(plan, ':') + if idx > -1 { + plan = plan[:idx] + } + } + } + d.Set("name", addon.Name) - d.Set("plan", addon.Plan.Name) + d.Set("plan", plan) d.Set("provider_id", addon.ProviderID) d.Set("config_vars", []interface{}{addon.ConfigVars}) d.SetDependencies([]terraform.ResourceDependency{ diff --git a/builtin/providers/heroku/resource_heroku_addon_test.go b/builtin/providers/heroku/resource_heroku_addon_test.go index d0294cf1fa..77363d70b8 100644 --- a/builtin/providers/heroku/resource_heroku_addon_test.go +++ b/builtin/providers/heroku/resource_heroku_addon_test.go @@ -21,7 +21,7 @@ func TestAccHerokuAddon_Basic(t *testing.T) { Config: testAccCheckHerokuAddonConfig_basic, Check: resource.ComposeTestCheckFunc( testAccCheckHerokuAddonExists("heroku_addon.foobar", &addon), - testAccCheckHerokuAddonAttributes(&addon), + testAccCheckHerokuAddonAttributes(&addon, "deployhooks:http"), resource.TestCheckResourceAttr( "heroku_addon.foobar", "config.0.url", "http://google.com"), resource.TestCheckResourceAttr( @@ -34,6 +34,41 @@ func TestAccHerokuAddon_Basic(t *testing.T) { }) } +// GH-198 +func TestAccHerokuAddon_noPlan(t *testing.T) { + var addon heroku.Addon + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckHerokuAddonDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckHerokuAddonConfig_no_plan, + Check: resource.ComposeTestCheckFunc( + testAccCheckHerokuAddonExists("heroku_addon.foobar", &addon), + testAccCheckHerokuAddonAttributes(&addon, "memcachier:dev"), + resource.TestCheckResourceAttr( + "heroku_addon.foobar", "app", "terraform-test-app"), + resource.TestCheckResourceAttr( + "heroku_addon.foobar", "plan", "memcachier"), + ), + }, + resource.TestStep{ + Config: testAccCheckHerokuAddonConfig_no_plan, + Check: resource.ComposeTestCheckFunc( + testAccCheckHerokuAddonExists("heroku_addon.foobar", &addon), + testAccCheckHerokuAddonAttributes(&addon, "memcachier:dev"), + resource.TestCheckResourceAttr( + "heroku_addon.foobar", "app", "terraform-test-app"), + resource.TestCheckResourceAttr( + "heroku_addon.foobar", "plan", "memcachier"), + ), + }, + }, + }) +} + func testAccCheckHerokuAddonDestroy(s *terraform.State) error { client := testAccProvider.Meta().(*heroku.Service) @@ -52,11 +87,11 @@ func testAccCheckHerokuAddonDestroy(s *terraform.State) error { return nil } -func testAccCheckHerokuAddonAttributes(addon *heroku.Addon) resource.TestCheckFunc { +func testAccCheckHerokuAddonAttributes(addon *heroku.Addon, n string) resource.TestCheckFunc { return func(s *terraform.State) error { - if addon.Plan.Name != "deployhooks:http" { - return fmt.Errorf("Bad plan: %s", addon.Plan) + if addon.Plan.Name != n { + return fmt.Errorf("Bad plan: %s", addon.Plan.Name) } return nil @@ -106,3 +141,14 @@ resource "heroku_addon" "foobar" { url = "http://google.com" } }` + +const testAccCheckHerokuAddonConfig_no_plan = ` +resource "heroku_app" "foobar" { + name = "terraform-test-app" + region = "us" +} + +resource "heroku_addon" "foobar" { + app = "${heroku_app.foobar.name}" + plan = "memcachier" +}`