From 95a815dedadf40f4068568cda1f7deb6f0b4734c Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Fri, 10 Oct 2014 11:54:33 -0500 Subject: [PATCH 1/4] Starting point for adding Organization app support for Heroku Provider --- .../providers/heroku/resource_heroku_app.go | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/builtin/providers/heroku/resource_heroku_app.go b/builtin/providers/heroku/resource_heroku_app.go index 275bcaeec..05cae572f 100644 --- a/builtin/providers/heroku/resource_heroku_app.go +++ b/builtin/providers/heroku/resource_heroku_app.go @@ -42,7 +42,7 @@ func (a *application) Update() error { func resourceHerokuApp() *schema.Resource { return &schema.Resource{ - Create: resourceHerokuAppCreate, + Create: switchHerokuAppCreate, Read: resourceHerokuAppRead, Update: resourceHerokuAppUpdate, Delete: resourceHerokuAppDelete, @@ -93,10 +93,24 @@ func resourceHerokuApp() *schema.Resource { Type: schema.TypeString, Computed: true, }, + + "organization": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + }, }, } } +func switchHerokuAppCreate(d *schema.ResourceData, meta interface{}) error { + isOrg := d.Get("organization") + if len(isOrg.(string)) != 0 { + return resourceHerokuOrgAppCreate(d, meta) + } else { + return resourceHerokuAppCreate(d, meta) + } +} + func resourceHerokuAppCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*heroku.Service) @@ -138,6 +152,50 @@ func resourceHerokuAppCreate(d *schema.ResourceData, meta interface{}) error { return resourceHerokuAppRead(d, meta) } +func resourceHerokuOrgAppCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*heroku.Service) + // Build up our creation options + opts := heroku.OrganizationAppCreateOpts{} + if v := d.Get("organization"); v != nil { + vs := v.(string) + log.Printf("[DEBUG] App name: %s", vs) + opts.Organization = &vs + } + if v := d.Get("name"); v != nil { + vs := v.(string) + log.Printf("[DEBUG] App name: %s", vs) + opts.Name = &vs + } + if v := d.Get("region"); v != nil { + vs := v.(string) + log.Printf("[DEBUG] App region: %s", vs) + opts.Region = &vs + } + if v := d.Get("stack"); v != nil { + vs := v.(string) + log.Printf("[DEBUG] App stack: %s", vs) + opts.Stack = &vs + } + + log.Printf("[DEBUG] Creating Heroku app...") + a, err := client.OrganizationAppCreate(opts) + if err != nil { + return err + } + + d.SetId(a.Name) + log.Printf("[INFO] App ID: %s", d.Id()) + + if v := d.Get("config_vars"); v != nil { + err = update_config_vars(d.Id(), client, nil, v.([]interface{})) + if err != nil { + return err + } + } + + return resourceHerokuAppRead(d, meta) +} + func resourceHerokuAppRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*heroku.Service) app, err := resource_heroku_app_retrieve(d.Id(), client) From 5fe2593c16d06f94d27880296df81b006b3899c8 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Sun, 12 Oct 2014 11:49:57 -0500 Subject: [PATCH 2/4] Add to Organization schema ref. Also gofmt the file --- .../providers/heroku/resource_heroku_app.go | 97 ++++++++++--------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/builtin/providers/heroku/resource_heroku_app.go b/builtin/providers/heroku/resource_heroku_app.go index 05cae572f..fd59bd7d1 100644 --- a/builtin/providers/heroku/resource_heroku_app.go +++ b/builtin/providers/heroku/resource_heroku_app.go @@ -42,7 +42,7 @@ func (a *application) Update() error { func resourceHerokuApp() *schema.Resource { return &schema.Resource{ - Create: switchHerokuAppCreate, + Create: switchHerokuAppCreate, Read: resourceHerokuAppRead, Update: resourceHerokuAppUpdate, Delete: resourceHerokuAppDelete, @@ -94,21 +94,22 @@ func resourceHerokuApp() *schema.Resource { Computed: true, }, - "organization": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - }, + "organization": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + ForceNew: true, + }, }, } } func switchHerokuAppCreate(d *schema.ResourceData, meta interface{}) error { - isOrg := d.Get("organization") - if len(isOrg.(string)) != 0 { - return resourceHerokuOrgAppCreate(d, meta) - } else { - return resourceHerokuAppCreate(d, meta) - } + isOrg := d.Get("organization") + if len(isOrg.(string)) != 0 { + return resourceHerokuOrgAppCreate(d, meta) + } else { + return resourceHerokuAppCreate(d, meta) + } } func resourceHerokuAppCreate(d *schema.ResourceData, meta interface{}) error { @@ -153,47 +154,47 @@ func resourceHerokuAppCreate(d *schema.ResourceData, meta interface{}) error { } func resourceHerokuOrgAppCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*heroku.Service) - // Build up our creation options - opts := heroku.OrganizationAppCreateOpts{} - if v := d.Get("organization"); v != nil { - vs := v.(string) - log.Printf("[DEBUG] App name: %s", vs) - opts.Organization = &vs - } - if v := d.Get("name"); v != nil { - vs := v.(string) - log.Printf("[DEBUG] App name: %s", vs) - opts.Name = &vs - } - if v := d.Get("region"); v != nil { - vs := v.(string) - log.Printf("[DEBUG] App region: %s", vs) - opts.Region = &vs - } - if v := d.Get("stack"); v != nil { - vs := v.(string) - log.Printf("[DEBUG] App stack: %s", vs) - opts.Stack = &vs - } + client := meta.(*heroku.Service) + // Build up our creation options + opts := heroku.OrganizationAppCreateOpts{} + if v := d.Get("organization"); v != nil { + vs := v.(string) + log.Printf("[DEBUG] App name: %s", vs) + opts.Organization = &vs + } + if v := d.Get("name"); v != nil { + vs := v.(string) + log.Printf("[DEBUG] App name: %s", vs) + opts.Name = &vs + } + if v := d.Get("region"); v != nil { + vs := v.(string) + log.Printf("[DEBUG] App region: %s", vs) + opts.Region = &vs + } + if v := d.Get("stack"); v != nil { + vs := v.(string) + log.Printf("[DEBUG] App stack: %s", vs) + opts.Stack = &vs + } - log.Printf("[DEBUG] Creating Heroku app...") - a, err := client.OrganizationAppCreate(opts) - if err != nil { - return err - } + log.Printf("[DEBUG] Creating Heroku app...") + a, err := client.OrganizationAppCreate(opts) + if err != nil { + return err + } - d.SetId(a.Name) - log.Printf("[INFO] App ID: %s", d.Id()) + d.SetId(a.Name) + log.Printf("[INFO] App ID: %s", d.Id()) - if v := d.Get("config_vars"); v != nil { - err = update_config_vars(d.Id(), client, nil, v.([]interface{})) - if err != nil { - return err - } - } + if v := d.Get("config_vars"); v != nil { + err = update_config_vars(d.Id(), client, nil, v.([]interface{})) + if err != nil { + return err + } + } - return resourceHerokuAppRead(d, meta) + return resourceHerokuAppRead(d, meta) } func resourceHerokuAppRead(d *schema.ResourceData, meta interface{}) error { From 8ab3ebbfb2c6e1aea18a4de5f1d5fe0dbd6c1f62 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Sun, 12 Oct 2014 11:58:18 -0500 Subject: [PATCH 3/4] clean up the conditional check for Heroku organization --- builtin/providers/heroku/resource_heroku_app.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/builtin/providers/heroku/resource_heroku_app.go b/builtin/providers/heroku/resource_heroku_app.go index fd59bd7d1..368adad5a 100644 --- a/builtin/providers/heroku/resource_heroku_app.go +++ b/builtin/providers/heroku/resource_heroku_app.go @@ -104,8 +104,7 @@ func resourceHerokuApp() *schema.Resource { } func switchHerokuAppCreate(d *schema.ResourceData, meta interface{}) error { - isOrg := d.Get("organization") - if len(isOrg.(string)) != 0 { + if _, ok := d.GetOk("organization"); ok { return resourceHerokuOrgAppCreate(d, meta) } else { return resourceHerokuAppCreate(d, meta) From 764b0259dd5c85856e3c64c3c82968a903fc2ec0 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Sun, 12 Oct 2014 12:21:32 -0500 Subject: [PATCH 4/4] Document the organization name field --- builtin/providers/heroku/resource_heroku_app.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/builtin/providers/heroku/resource_heroku_app.go b/builtin/providers/heroku/resource_heroku_app.go index 368adad5a..3fe5a3ea4 100644 --- a/builtin/providers/heroku/resource_heroku_app.go +++ b/builtin/providers/heroku/resource_heroku_app.go @@ -95,9 +95,10 @@ func resourceHerokuApp() *schema.Resource { }, "organization": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - ForceNew: true, + Type: schema.TypeString, + Description: "Name of Organization to create application in. Leave blank for personal apps.", + Optional: true, + ForceNew: true, }, }, }