package recipe import ( "fmt" "sort" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/formatter" recipePkg "coopcloud.tech/abra/pkg/recipe" "github.com/olekukonko/tablewriter" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) func sortServiceByName(versions [][]string) func(i, j int) bool { return func(i, j int) bool { // NOTE(d1): corresponds to the `tableCol` definition below if versions[i][1] == "app" { return true } return versions[i][1] < versions[j][1] } } var recipeVersionCommand = cli.Command{ Name: "versions", Aliases: []string{"v"}, Usage: "List recipe versions", ArgsUsage: "", Description: "Versions are read from the recipe catalogue.", Flags: []cli.Flag{ internal.DebugFlag, internal.OfflineFlag, internal.NoInputFlag, internal.MachineReadableFlag, }, Before: internal.SubCommandBefore, BashComplete: autocomplete.RecipeNameComplete, Action: func(c *cli.Context) error { recipe := internal.ValidateRecipe(c) catl, err := recipePkg.ReadRecipeCatalogue(internal.Offline) if err != nil { logrus.Fatal(err) } recipeMeta, ok := catl[recipe.Name] if !ok { logrus.Fatalf("%s is not published on the catalogue?", recipe.Name) } if len(recipeMeta.Versions) == 0 { logrus.Fatalf("%s has no catalogue published versions?", recipe.Name) } for i := len(recipeMeta.Versions) - 1; i >= 0; i-- { tableCols := []string{"version", "service", "image", "tag"} table := formatter.CreateTable(tableCols) for version, meta := range recipeMeta.Versions[i] { var versions [][]string for service, serviceMeta := range meta { versions = append(versions, []string{version, service, serviceMeta.Image, serviceMeta.Tag}) } sort.Slice(versions, sortServiceByName(versions)) for _, version := range versions { table.Append(version) } if internal.MachineReadable { table.JSONRender() } else { table.SetAutoMergeCellsByColumnIndex([]int{0}) table.SetAlignment(tablewriter.ALIGN_LEFT) table.Render() fmt.Println() } } } return nil }, }