diff --git a/CHANGELOG.md b/CHANGELOG.md index 05e0a2b7e..6954770f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ BACKWARDS INCOMPATIBILITIES: BUG FIXES: * core: Variables are validated to not contain interpolations. [GH-180] + * providers/heroku: If you delete the `config_vars` block, config vars + are properly nuked. PLUGIN CHANGES: diff --git a/builtin/providers/heroku/resource_heroku_app.go b/builtin/providers/heroku/resource_heroku_app.go index 9469854bf..10b73ef81 100644 --- a/builtin/providers/heroku/resource_heroku_app.go +++ b/builtin/providers/heroku/resource_heroku_app.go @@ -126,7 +126,7 @@ func resourceHerokuAppCreate(d *schema.ResourceData, meta interface{}) error { log.Printf("[INFO] App ID: %s", d.Id()) if v := d.Get("config_vars"); v != nil { - err = update_config_vars(d.Id(), v.([]interface{}), client) + err = update_config_vars(d.Id(), client, nil, v.([]interface{})) if err != nil { return err } @@ -175,16 +175,21 @@ func resourceHerokuAppUpdate(d *schema.ResourceData, meta interface{}) error { d.SetId(renamedApp.Name) } - // Get the config vars. If we have none, then set it to the empty - // list so that they're properly removed. - v := d.Get("config_vars") - if v == nil { - v = []interface{}{} - } + // If the config vars changed, then recalculate those + if d.HasChange("config_vars") { + o, n := d.GetChange("config_vars") + if o == nil { + o = []interface{}{} + } + if n == nil { + n = []interface{}{} + } - err := update_config_vars(d.Id(), v.([]interface{}), client) - if err != nil { - return err + err := update_config_vars( + d.Id(), client, o.([]interface{}), n.([]interface{})) + if err != nil { + return err + } } return resourceHerokuAppRead(d, meta) @@ -226,10 +231,19 @@ func retrieve_config_vars(id string, client *heroku.Client) (map[string]string, } // Updates the config vars for from an expanded configuration. -func update_config_vars(id string, vs []interface{}, client *heroku.Client) error { +func update_config_vars( + id string, + client *heroku.Client, + o []interface{}, + n []interface{}) error { vars := make(map[string]*string) - for _, v := range vs { + for _, v := range o { + for k, _ := range v.(map[string]interface{}) { + vars[k] = nil + } + } + for _, v := range n { for k, v := range v.(map[string]interface{}) { val := v.(string) vars[k] = &val