Skip to content

Commit 745efb1

Browse files
authored
feat: Validate app processes are alphabetically sorted (#64)
* feat: add validation to ensure app processes are alphabetically sorted * test: add validation for alphabetically sorted app processes * fix: restore app.Processes assignment after validation * refactor: rename isProcessListSorted to validateProcessesOrder for clarity
1 parent 8691283 commit 745efb1

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

internal/provider/resource_tsuru_app.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,10 @@ func resourceTsuruApplicationCreate(ctx context.Context, d *schema.ResourceData,
230230
if m, ok := d.GetOk("process"); ok {
231231
processes := processesFromResourceData(m)
232232
if processes != nil {
233+
err := validateProcessesOrder(processes)
234+
if err != nil {
235+
return diag.FromErr(err)
236+
}
233237
app.Processes = processes
234238
}
235239
}
@@ -306,6 +310,10 @@ func resourceTsuruApplicationUpdate(ctx context.Context, d *schema.ResourceData,
306310
if newProcesses == nil {
307311
newProcesses = []tsuru_client.AppProcess{}
308312
}
313+
err := validateProcessesOrder(newProcesses)
314+
if err != nil {
315+
return diag.FromErr(err)
316+
}
309317

310318
app.Processes = markRemovedProcessAsDefaultPlan(oldProcesses, newProcesses)
311319
}
@@ -334,6 +342,15 @@ func resourceTsuruApplicationUpdate(ctx context.Context, d *schema.ResourceData,
334342
return resourceTsuruApplicationRead(ctx, d, meta)
335343
}
336344

345+
func validateProcessesOrder(processes []tsuru_client.AppProcess) error {
346+
for i := 1; i < len(processes); i++ {
347+
if processes[i-1].Name > processes[i].Name {
348+
return errors.Errorf("please, sort app processes alphabetically")
349+
}
350+
}
351+
return nil
352+
}
353+
337354
func resourceTsuruApplicationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
338355
provider := meta.(*tsuruProvider)
339356
name := d.Id()

internal/provider/resource_tsuru_app_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"net/http/httptest"
1010
"os"
11+
"regexp"
1112
"testing"
1213

1314
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -261,6 +262,10 @@ func TestAccResourceTsuruApp(t *testing.T) {
261262
resource.TestCheckResourceAttr(resourceName, "tags.0", "tagA"),
262263
),
263264
},
265+
{
266+
Config: testAccResourceTsuruApp_invalidProcessOrder(),
267+
ExpectError: regexp.MustCompile("please, sort app processes alphabetically"),
268+
},
264269
},
265270
})
266271
}
@@ -358,3 +363,43 @@ func testAccResourceTsuruApp_metadataAfterUpdate() string {
358363
}
359364
`
360365
}
366+
367+
func testAccResourceTsuruApp_invalidProcessOrder() string {
368+
return `
369+
resource "tsuru_app" "app" {
370+
name = "app01"
371+
description = "my app description"
372+
platform = "python"
373+
plan = "c2m4"
374+
team_owner = "my-team"
375+
pool = "prod"
376+
tags = ["tagA", "tagB"]
377+
378+
process {
379+
name = "worker"
380+
381+
metadata {
382+
labels = {
383+
"workerlabel" = "value"
384+
}
385+
annotations = {
386+
"workerannotation" = "nice"
387+
}
388+
}
389+
}
390+
391+
process {
392+
name = "web"
393+
plan = "c2m2"
394+
metadata {
395+
labels = {
396+
"weblabel" = "value"
397+
}
398+
annotations = {
399+
"webannotation" = "nice"
400+
}
401+
}
402+
}
403+
}
404+
`
405+
}

0 commit comments

Comments
 (0)