package app import ( "strings" abraFormatter "coopcloud.tech/abra/cli/formatter" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/catalogue" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/upstream/stack" "github.com/docker/distribution/reference" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) // getImagePath returns the image name func getImagePath(image string) (string, error) { img, err := reference.ParseNormalizedNamed(image) if err != nil { return "", err } path := reference.Path(img) if strings.Contains(path, "library") { path = strings.Split(path, "/")[1] } logrus.Debugf("parsed '%s' from '%s'", path, image) return path, nil } var appVersionCommand = &cli.Command{ Name: "version", Aliases: []string{"v"}, Usage: "Show app versions", Description: ` This command shows all information about versioning related to a deployed app. This includes the individual image names, tags and digests. But also the Co-op Cloud recipe version. `, Action: func(c *cli.Context) error { app := internal.ValidateApp(c) stackName := app.StackName() cl, err := client.New(app.Server) if err != nil { logrus.Fatal(err) } logrus.Debugf("checking whether '%s' is already deployed", stackName) isDeployed, deployedVersion, err := stack.IsDeployed(c.Context, cl, stackName) if err != nil { logrus.Fatal(err) } if deployedVersion == "" { logrus.Fatalf("failed to determine version of deployed '%s'", app.Name) } if !isDeployed { logrus.Fatalf("'%s' is not deployed?", app.Name) } recipeMeta, err := catalogue.GetRecipeMeta(app.Type) if err != nil { logrus.Fatal(err) } versionsMeta := make(map[string]catalogue.ServiceMeta) for _, recipeVersion := range recipeMeta.Versions { if currentVersion, exists := recipeVersion[deployedVersion]; exists { versionsMeta = currentVersion } } if len(versionsMeta) == 0 { logrus.Fatalf("PANIC: could not retrieve deployed version ('%s') from recipe catalogue?", deployedVersion) } tableCol := []string{"name", "image", "version", "tag", "digest"} table := abraFormatter.CreateTable(tableCol) for serviceName, versionMeta := range versionsMeta { table.Append([]string{serviceName, versionMeta.Image, deployedVersion, versionMeta.Tag, versionMeta.Digest}) } table.Render() return nil }, BashComplete: autocomplete.AppNameComplete, }