providers/heroku: refactor to handle vars
This commit is contained in:
parent
03d233aecc
commit
64f2630c7e
|
@ -8,9 +8,41 @@ import (
|
||||||
"github.com/hashicorp/terraform/flatmap"
|
"github.com/hashicorp/terraform/flatmap"
|
||||||
"github.com/hashicorp/terraform/helper/config"
|
"github.com/hashicorp/terraform/helper/config"
|
||||||
"github.com/hashicorp/terraform/helper/diff"
|
"github.com/hashicorp/terraform/helper/diff"
|
||||||
|
"github.com/hashicorp/terraform/helper/multierror"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// type application is used to store all the details of a heroku app
|
||||||
|
type application struct {
|
||||||
|
Id string // Id of the resource
|
||||||
|
|
||||||
|
App *heroku.App // The heroku application
|
||||||
|
Client *heroku.Client // Client to interact with the heroku API
|
||||||
|
Vars map[string]string // The vars on the application
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updates the application to have the latest from remote
|
||||||
|
func (a *application) Update() error {
|
||||||
|
var errs []error
|
||||||
|
var err error
|
||||||
|
|
||||||
|
a.App, err = a.Client.AppInfo(a.Id)
|
||||||
|
if err != nil {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
a.Vars, err = retrieve_config_vars(a.Id, a.Client)
|
||||||
|
if err != nil {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(errs) > 0 {
|
||||||
|
return &multierror.Error{Errors: errs}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func resource_heroku_app_create(
|
func resource_heroku_app_create(
|
||||||
s *terraform.ResourceState,
|
s *terraform.ResourceState,
|
||||||
d *terraform.ResourceDiff,
|
d *terraform.ResourceDiff,
|
||||||
|
@ -39,12 +71,12 @@ func resource_heroku_app_create(
|
||||||
|
|
||||||
log.Printf("[DEBUG] App create configuration: %#v", opts)
|
log.Printf("[DEBUG] App create configuration: %#v", opts)
|
||||||
|
|
||||||
app, err := client.AppCreate(&opts)
|
a, err := client.AppCreate(&opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
rs.ID = app.Name
|
rs.ID = a.Name
|
||||||
log.Printf("[INFO] App ID: %s", rs.ID)
|
log.Printf("[INFO] App ID: %s", rs.ID)
|
||||||
|
|
||||||
if attr, ok := rs.Attributes["config_vars.#"]; ok && attr == "1" {
|
if attr, ok := rs.Attributes["config_vars.#"]; ok && attr == "1" {
|
||||||
|
@ -57,7 +89,7 @@ func resource_heroku_app_create(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
app, err = resource_heroku_app_retrieve(rs.ID, client)
|
app, err := resource_heroku_app_retrieve(rs.ID, client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return rs, err
|
return rs, err
|
||||||
}
|
}
|
||||||
|
@ -136,26 +168,38 @@ func resource_heroku_app_diff(
|
||||||
|
|
||||||
func resource_heroku_app_update_state(
|
func resource_heroku_app_update_state(
|
||||||
s *terraform.ResourceState,
|
s *terraform.ResourceState,
|
||||||
app *heroku.App) (*terraform.ResourceState, error) {
|
app *application) (*terraform.ResourceState, error) {
|
||||||
|
|
||||||
s.Attributes["name"] = app.Name
|
s.Attributes["name"] = app.App.Name
|
||||||
s.Attributes["stack"] = app.Stack.Name
|
s.Attributes["stack"] = app.App.Stack.Name
|
||||||
s.Attributes["region"] = app.Region.Name
|
s.Attributes["region"] = app.App.Region.Name
|
||||||
s.Attributes["git_url"] = app.GitURL
|
s.Attributes["git_url"] = app.App.GitURL
|
||||||
s.Attributes["web_url"] = app.WebURL
|
s.Attributes["web_url"] = app.App.WebURL
|
||||||
s.Attributes["id"] = app.Id
|
s.Attributes["id"] = app.App.Id
|
||||||
|
|
||||||
|
toFlatten := make(map[string]interface{})
|
||||||
|
|
||||||
|
if len(app.Vars) > 0 {
|
||||||
|
toFlatten["config_vars"] = app.Vars
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range flatmap.Flatten(toFlatten) {
|
||||||
|
s.Attributes[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func resource_heroku_app_retrieve(id string, client *heroku.Client) (*heroku.App, error) {
|
func resource_heroku_app_retrieve(id string, client *heroku.Client) (*application, error) {
|
||||||
app, err := client.AppInfo(id)
|
app := application{Id: id, Client: client}
|
||||||
|
|
||||||
|
err := app.Update()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error retrieving app: %s", err)
|
return nil, fmt.Errorf("Error retrieving app: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return app, nil
|
return &app, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func resource_heroku_app_validation() *config.Validator {
|
func resource_heroku_app_validation() *config.Validator {
|
||||||
|
@ -170,6 +214,16 @@ func resource_heroku_app_validation() *config.Validator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func retrieve_config_vars(id string, client *heroku.Client) (map[string]string, error) {
|
||||||
|
vars, err := client.ConfigVarInfo(id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return vars, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Updates the config vars for from an expanded (prior to assertion)
|
// Updates the config vars for from an expanded (prior to assertion)
|
||||||
// []map[string]string config
|
// []map[string]string config
|
||||||
func update_config_vars(id string, vs []interface{}, client *heroku.Client) error {
|
func update_config_vars(id string, vs []interface{}, client *heroku.Client) error {
|
||||||
|
|
Loading…
Reference in New Issue