package app import ( "errors" "fmt" "strings" abraFormatter "coopcloud.tech/abra/cli/formatter" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/client/stack" "coopcloud.tech/abra/config" "github.com/docker/distribution/reference" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) // parseVersionLabel parses a $VERSION-$DIGEST service label func parseVersionLabel(label string) (string, string) { // versions may look like v4.2-abcd or v4.2-alpine-abcd idx := strings.LastIndex(label, "-") return label[:idx], label[idx+1:] } var appVersionCommand = &cli.Command{ Name: "version", Usage: "show version of all services in app", Action: func(c *cli.Context) error { appName := c.Args().First() if appName == "" { internal.ShowSubcommandHelpAndError(c, errors.New("no app name provided")) } appFiles, err := config.LoadAppFiles("") if err != nil { logrus.Fatal(err) } appEnv, err := config.GetApp(appFiles, appName) if err != nil { logrus.Fatal(err) } app := appFiles[appName] compose, err := config.GetAppComposeFiles(appEnv.Type) if err != nil { logrus.Fatal(err) } tableCol := []string{"Name", "Image", "Version", "Digest"} table := abraFormatter.CreateTable(tableCol) for _, service := range compose.Services { label := fmt.Sprintf("coop-cloud.%s.%s.version", appEnv.StackName(), service.Name) status := stack.GetDeployedServicesByLabel(app.Server, label) for _, serviceStatus := range status.Services { version, digest := parseVersionLabel(serviceStatus.Spec.Labels[label]) img, err := reference.ParseNormalizedNamed(service.Image) if err != nil { logrus.Fatal(err) } image := reference.Path(img) if strings.Contains(image, "library") { image = strings.Split(image, "/")[1] } serviceName := fmt.Sprintf("%s_%s", appEnv.StackName(), service.Name) table.Append([]string{serviceName, image, version, digest}) } } table.Render() return nil }, }