diff --git a/internal/provider/resource_tsuru_app.go b/internal/provider/resource_tsuru_app.go index 3603a9d..8c6b936 100644 --- a/internal/provider/resource_tsuru_app.go +++ b/internal/provider/resource_tsuru_app.go @@ -230,6 +230,10 @@ func resourceTsuruApplicationCreate(ctx context.Context, d *schema.ResourceData, if m, ok := d.GetOk("process"); ok { processes := processesFromResourceData(m) if processes != nil { + err := validateProcessesOrder(processes) + if err != nil { + return diag.FromErr(err) + } app.Processes = processes } } @@ -306,6 +310,10 @@ func resourceTsuruApplicationUpdate(ctx context.Context, d *schema.ResourceData, if newProcesses == nil { newProcesses = []tsuru_client.AppProcess{} } + err := validateProcessesOrder(newProcesses) + if err != nil { + return diag.FromErr(err) + } app.Processes = markRemovedProcessAsDefaultPlan(oldProcesses, newProcesses) } @@ -334,6 +342,15 @@ func resourceTsuruApplicationUpdate(ctx context.Context, d *schema.ResourceData, return resourceTsuruApplicationRead(ctx, d, meta) } +func validateProcessesOrder(processes []tsuru_client.AppProcess) error { + for i := 1; i < len(processes); i++ { + if processes[i-1].Name > processes[i].Name { + return errors.Errorf("please, sort app processes alphabetically") + } + } + return nil +} + func resourceTsuruApplicationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { provider := meta.(*tsuruProvider) name := d.Id() diff --git a/internal/provider/resource_tsuru_app_test.go b/internal/provider/resource_tsuru_app_test.go index bb54924..ac7a887 100644 --- a/internal/provider/resource_tsuru_app_test.go +++ b/internal/provider/resource_tsuru_app_test.go @@ -8,6 +8,7 @@ import ( "net/http" "net/http/httptest" "os" + "regexp" "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" @@ -261,6 +262,10 @@ func TestAccResourceTsuruApp(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "tags.0", "tagA"), ), }, + { + Config: testAccResourceTsuruApp_invalidProcessOrder(), + ExpectError: regexp.MustCompile("please, sort app processes alphabetically"), + }, }, }) } @@ -358,3 +363,43 @@ func testAccResourceTsuruApp_metadataAfterUpdate() string { } ` } + +func testAccResourceTsuruApp_invalidProcessOrder() string { + return ` + resource "tsuru_app" "app" { + name = "app01" + description = "my app description" + platform = "python" + plan = "c2m4" + team_owner = "my-team" + pool = "prod" + tags = ["tagA", "tagB"] + + process { + name = "worker" + + metadata { + labels = { + "workerlabel" = "value" + } + annotations = { + "workerannotation" = "nice" + } + } + } + + process { + name = "web" + plan = "c2m2" + metadata { + labels = { + "weblabel" = "value" + } + annotations = { + "webannotation" = "nice" + } + } + } + } + ` +}