diff --git a/cli/app/version.go b/cli/app/version.go index a5f42021..d0ac862c 100644 --- a/cli/app/version.go +++ b/cli/app/version.go @@ -14,6 +14,19 @@ import ( "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(image, "library") { + image = strings.Split(image, "/")[1] + } + return path, nil +} + // parseVersionLabel parses a $STACK_NAME_$SERVICE_NAME service label func parseServiceName(label string) string { idx := strings.LastIndex(label, "_") @@ -63,22 +76,33 @@ var appVersionCommand = &cli.Command{ tableCol := []string{"Name", "Image", "Version", "Digest"} table := abraFormatter.CreateTable(tableCol) + statuses := make(map[string]stack.StackStatus) for range compose.Services { status := <-ch - for _, service := range status.Services { - serviceName := parseServiceName(service.Spec.Name) - label := fmt.Sprintf("coop-cloud.%s.%s.version", appEnv.StackName(), serviceName) - version, digest := parseVersionLabel(service.Spec.Labels[label]) - img, err := reference.ParseNormalizedNamed(service.Spec.Labels["com.docker.stack.image"]) + if len(status.Services) > 0 { + serviceName := parseServiceName(status.Services[0].Spec.Name) + statuses[serviceName] = status + } + } + + for _, service := range compose.Services { + if status, ok := statuses[service.Name]; ok { + statusService := status.Services[0] + label := fmt.Sprintf("coop-cloud.%s.%s.version", appEnv.StackName(), service.Name) + version, digest := parseVersionLabel(statusService.Spec.Labels[label]) + image, err := getImagePath(statusService.Spec.Labels["com.docker.stack.image"]) if err != nil { logrus.Fatal(err) } - image := reference.Path(img) - if strings.Contains(image, "library") { - image = strings.Split(image, "/")[1] - } - table.Append([]string{serviceName, image, version, digest}) + table.Append([]string{service.Name, image, version, digest}) + continue } + + image, err := getImagePath(service.Image) + if err != nil { + logrus.Fatal(err) + } + table.Append([]string{service.Name, image, "?", "?"}) } table.Render() diff --git a/config/app.go b/config/app.go index 8646e84e..e628eb19 100644 --- a/config/app.go +++ b/config/app.go @@ -209,9 +209,7 @@ func GetAppStatuses(appFiles AppFiles) (map[string]string, error) { servers := appFiles.GetServers() ch := make(chan stack.StackStatus, len(servers)) for _, server := range servers { - go func(s string) { - ch <- stack.GetAllDeployedServices(s) - }(server) + go func(s string) { ch <- stack.GetAllDeployedServices(s) }(server) } statuses := map[string]string{}