package recipe import ( "fmt" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/client/stack" "coopcloud.tech/abra/pkg/config" "github.com/docker/distribution/reference" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) var recipeSyncCommand = &cli.Command{ Name: "sync", Usage: "Generate new recipe labels", Aliases: []string{"s"}, Description: ` This command will generate labels for each service which correspond to the following format: coop-cloud.${STACK_NAME}.${SERVICE_NAME}.version=${IMAGE_TAG}-${IMAGE_DIGEST} The configuration will be updated on the local file system. These labels are consumed by abra in other command invocations and used to determine the versioning metadata of up-and-running containers are. `, ArgsUsage: "", Action: func(c *cli.Context) error { recipe := internal.ValidateRecipeArg(c) appFiles, err := config.LoadAppFiles("") if err != nil { logrus.Fatal(err) } appEnv, err := config.GetApp(appFiles, recipe) if err != nil { logrus.Fatal(err) } compose, err := config.GetAppComposeConfig(recipe, stack.Deploy{}, appEnv.Env) if err != nil { logrus.Fatal(err) } hasAppService := false for _, service := range compose.Services { if service.Name == "app" { hasAppService = true } } if !hasAppService { logrus.Fatal(fmt.Sprintf("No 'app' service defined in '%s', cannot proceed", recipe)) } for _, service := range compose.Services { img, _ := reference.ParseNormalizedNamed(service.Image) if err != nil { logrus.Fatal(err) } digest, err := client.GetTagDigest(img) if err != nil { logrus.Fatal(err) } tag := img.(reference.NamedTagged).Tag() label := fmt.Sprintf("coop-cloud.${STACK_NAME}.%s.version=%s-%s", service.Name, tag, digest) if err := config.UpdateAppComposeLabel(recipe, service.Name, label, appEnv.Env); err != nil { logrus.Fatal(err) } } return nil }, }