From 5d05df6e5c7f8fa0c78a9e2a9d02c262d3756495 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Fri, 29 Dec 2023 11:45:45 +0100 Subject: [PATCH] update compose-go to version using immutable Project functions Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> --- cmd/compose/compose.go | 6 +++--- cmd/compose/compose_test.go | 2 +- cmd/compose/config.go | 5 +++-- cmd/compose/pull.go | 11 ++++++----- cmd/compose/pullOptions_test.go | 2 +- cmd/compose/push.go | 2 +- cmd/compose/restart.go | 2 +- cmd/compose/run.go | 17 +++++++++-------- cmd/compose/scale.go | 2 +- cmd/compose/up.go | 17 +++++++++-------- go.mod | 4 +++- go.sum | 8 ++++++-- pkg/compose/build.go | 7 +++---- pkg/compose/compose.go | 5 +++-- pkg/compose/publish.go | 7 +++++-- pkg/compose/restart.go | 4 ++-- pkg/compose/watch.go | 3 ++- 17 files changed, 59 insertions(+), 45 deletions(-) diff --git a/cmd/compose/compose.go b/cmd/compose/compose.go index cddcd3a4c..6a53ea0c8 100644 --- a/cmd/compose/compose.go +++ b/cmd/compose/compose.go @@ -226,7 +226,7 @@ func (o *ProjectOptions) ToProject(dockerCli command.Cli, services []string, po return nil, errors.New("project name can't be empty. Use `--project-name` to set a valid name") } - err = project.EnableServices(services...) + project, err = project.WithServicesEnabled(services...) if err != nil { return nil, err } @@ -246,9 +246,9 @@ func (o *ProjectOptions) ToProject(dockerCli command.Cli, services []string, po project.Services[name] = s } - project.WithoutUnnecessaryResources() + project = project.WithoutUnnecessaryResources() - err = project.ForServices(services) + project, err = project.WithSelectedServices(services) return project, err } diff --git a/cmd/compose/compose_test.go b/cmd/compose/compose_test.go index b61e6215f..708929ff8 100644 --- a/cmd/compose/compose_test.go +++ b/cmd/compose/compose_test.go @@ -44,7 +44,7 @@ func TestFilterServices(t *testing.T) { }, }, } - err := p.ForServices([]string{"bar"}) + p, err := p.WithSelectedServices([]string{"bar"}) assert.NilError(t, err) assert.Equal(t, len(p.Services), 2) diff --git a/cmd/compose/config.go b/cmd/compose/config.go index 2128c6cea..cf26832cf 100644 --- a/cmd/compose/config.go +++ b/cmd/compose/config.go @@ -159,10 +159,11 @@ func runServices(ctx context.Context, dockerCli command.Cli, opts configOptions) if err != nil { return err } - return project.WithServices(project.ServiceNames(), func(s types.ServiceConfig) error { - fmt.Fprintln(dockerCli.Out(), s.Name) + err = project.ForEachService(project.ServiceNames(), func(serviceName string, _ *types.ServiceConfig) error { + fmt.Fprintln(dockerCli.Out(), serviceName) return nil }) + return err } func runVolumes(ctx context.Context, dockerCli command.Cli, opts configOptions) error { diff --git a/cmd/compose/pull.go b/cmd/compose/pull.go index 657f5bbba..d6ce561be 100644 --- a/cmd/compose/pull.go +++ b/cmd/compose/pull.go @@ -72,11 +72,12 @@ func pullCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service) return cmd } -func (opts pullOptions) apply(project *types.Project, services []string) error { +func (opts pullOptions) apply(project *types.Project, services []string) (*types.Project, error) { if !opts.includeDeps { - err := project.ForServices(services, types.IgnoreDependencies) + var err error + project, err = project.WithSelectedServices(services, types.IgnoreDependencies) if err != nil { - return err + return nil, err } } @@ -89,7 +90,7 @@ func (opts pullOptions) apply(project *types.Project, services []string) error { project.Services[i] = service } } - return nil + return project, nil } func runPull(ctx context.Context, dockerCli command.Cli, backend api.Service, opts pullOptions, services []string) error { @@ -98,7 +99,7 @@ func runPull(ctx context.Context, dockerCli command.Cli, backend api.Service, op return err } - err = opts.apply(project, services) + project, err = opts.apply(project, services) if err != nil { return err } diff --git a/cmd/compose/pullOptions_test.go b/cmd/compose/pullOptions_test.go index 153a050ec..05dd868ed 100644 --- a/cmd/compose/pullOptions_test.go +++ b/cmd/compose/pullOptions_test.go @@ -46,7 +46,7 @@ func TestApplyPullOptions(t *testing.T) { }, }, } - err := pullOptions{ + project, err := pullOptions{ policy: types.PullPolicyMissing, }.apply(project, nil) assert.NilError(t, err) diff --git a/cmd/compose/push.go b/cmd/compose/push.go index ddb5904c6..ccc0e5991 100644 --- a/cmd/compose/push.go +++ b/cmd/compose/push.go @@ -60,7 +60,7 @@ func runPush(ctx context.Context, dockerCli command.Cli, backend api.Service, op } if !opts.IncludeDeps { - err := project.ForServices(services, types.IgnoreDependencies) + project, err = project.WithSelectedServices(services, types.IgnoreDependencies) if err != nil { return err } diff --git a/cmd/compose/restart.go b/cmd/compose/restart.go index 7dad375bc..9fe65f461 100644 --- a/cmd/compose/restart.go +++ b/cmd/compose/restart.go @@ -62,7 +62,7 @@ func runRestart(ctx context.Context, dockerCli command.Cli, backend api.Service, } if project != nil && len(services) > 0 { - err := project.EnableServices(services...) + project, err = project.WithServicesEnabled(services...) if err != nil { return err } diff --git a/cmd/compose/run.go b/cmd/compose/run.go index de996778f..c2649d5f1 100644 --- a/cmd/compose/run.go +++ b/cmd/compose/run.go @@ -66,17 +66,18 @@ type runOptions struct { quietPull bool } -func (options runOptions) apply(project *types.Project) error { +func (options runOptions) apply(project *types.Project) (*types.Project, error) { if options.noDeps { - err := project.ForServices([]string{options.Service}, types.IgnoreDependencies) + var err error + project, err = project.WithSelectedServices([]string{options.Service}, types.IgnoreDependencies) if err != nil { - return err + return nil, err } } target, err := project.GetService(options.Service) if err != nil { - return err + return nil, err } target.Tty = !options.noTty @@ -91,7 +92,7 @@ func (options runOptions) apply(project *types.Project) error { for _, p := range options.publish { config, err := types.ParsePortConfig(p) if err != nil { - return err + return nil, err } target.Ports = append(target.Ports, config...) } @@ -100,7 +101,7 @@ func (options runOptions) apply(project *types.Project) error { for _, v := range options.volumes { volume, err := format.ParseVolume(v) if err != nil { - return err + return nil, err } target.Volumes = append(target.Volumes, volume) } @@ -111,7 +112,7 @@ func (options runOptions) apply(project *types.Project) error { break } } - return nil + return project, nil } func runCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service) *cobra.Command { @@ -210,7 +211,7 @@ func normalizeRunFlags(f *pflag.FlagSet, name string) pflag.NormalizedName { } func runRun(ctx context.Context, backend api.Service, project *types.Project, options runOptions, createOpts createOptions, buildOpts buildOptions, dockerCli command.Cli) error { - err := options.apply(project) + project, err := options.apply(project) if err != nil { return err } diff --git a/cmd/compose/scale.go b/cmd/compose/scale.go index 78b23ae6f..2ab435127 100644 --- a/cmd/compose/scale.go +++ b/cmd/compose/scale.go @@ -67,7 +67,7 @@ func runScale(ctx context.Context, dockerCli command.Cli, backend api.Service, o } if opts.noDeps { - if err := project.ForServices(services, types.IgnoreDependencies); err != nil { + if project, err = project.WithSelectedServices(services, types.IgnoreDependencies); err != nil { return err } } diff --git a/cmd/compose/up.go b/cmd/compose/up.go index f68c79403..c4919ca80 100644 --- a/cmd/compose/up.go +++ b/cmd/compose/up.go @@ -56,22 +56,23 @@ type upOptions struct { waitTimeout int } -func (opts upOptions) apply(project *types.Project, services []string) error { +func (opts upOptions) apply(project *types.Project, services []string) (*types.Project, error) { if opts.noDeps { - err := project.ForServices(services, types.IgnoreDependencies) + var err error + project, err = project.WithSelectedServices(services, types.IgnoreDependencies) if err != nil { - return err + return nil, err } } if opts.exitCodeFrom != "" { _, err := project.GetService(opts.exitCodeFrom) if err != nil { - return err + return nil, err } } - return nil + return project, nil } func upCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service) *cobra.Command { @@ -171,7 +172,7 @@ func runUp( return err } - err = upOptions.apply(project, services) + project, err = upOptions.apply(project, services) if err != nil { return err } @@ -229,9 +230,9 @@ func runUp( if upOptions.attachDependencies { dependencyOpt = types.IncludeDependencies } - if err := project.WithServices(services, func(s types.ServiceConfig) error { + if err := project.ForEachService(services, func(serviceName string, s *types.ServiceConfig) error { if s.Attach == nil || *s.Attach { - attachSet.Add(s.Name) + attachSet.Add(serviceName) } return nil }, dependencyOpt); err != nil { diff --git a/go.mod b/go.mod index 37297cf61..6e7693677 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/AlecAivazis/survey/v2 v2.3.7 github.com/Microsoft/go-winio v0.6.1 github.com/buger/goterm v1.0.4 - github.com/compose-spec/compose-go/v2 v2.0.0-beta.2 + github.com/compose-spec/compose-go/v2 v2.0.0-beta.3 github.com/containerd/console v1.0.3 github.com/containerd/containerd v1.7.11 github.com/davecgh/go-spew v1.1.1 @@ -114,6 +114,8 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/miekg/pkcs11 v1.1.1 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect github.com/moby/sys/mountinfo v0.6.2 // indirect diff --git a/go.sum b/go.sum index 33c36f076..8d4124928 100644 --- a/go.sum +++ b/go.sum @@ -86,8 +86,8 @@ github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+g github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/compose-spec/compose-go/v2 v2.0.0-beta.2 h1:UrKM2RA9qel+EGsHvdK/0y6XA047iDuK75dJYHWXZnc= -github.com/compose-spec/compose-go/v2 v2.0.0-beta.2/go.mod h1:PWCgeD8cxiI/DmdpBM407CuLDrZ2W4xuS6/Z9jAi0YQ= +github.com/compose-spec/compose-go/v2 v2.0.0-beta.3 h1:9MsMdwLaHE0uplnF2baXtM3yExD8Yaw3HUGlwm8Z+fQ= +github.com/compose-spec/compose-go/v2 v2.0.0-beta.3/go.mod h1:IVsvFyGVhw4FASzUtlWNVaAOhYmakXAFY9IlZ7LAuD8= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= @@ -327,9 +327,13 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991 h1:r80LLQ91uOLxU1ElAvrB1o8oBsph51lPzVnr7t2b200= github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991/go.mod h1:6MddWPSL5jxy+W8eMMHWDOfZzzRRKWXPZqajw72YHBc= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= diff --git a/pkg/compose/build.go b/pkg/compose/build.go index 67f58d621..b4ce4c80a 100644 --- a/pkg/compose/build.go +++ b/pkg/compose/build.go @@ -84,17 +84,16 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti if options.Deps { policy = types.IncludeDependencies } - err = project.WithServices(options.Services, func(service types.ServiceConfig) error { + err = project.ForEachService(options.Services, func(serviceName string, service *types.ServiceConfig) error { if service.Build == nil { return nil } - image := api.GetImageNameOrDefault(service, project.Name) + image := api.GetImageNameOrDefault(*service, project.Name) _, localImagePresent := localImages[image] if localImagePresent && service.PullPolicy != types.PullPolicyBuild { return nil } - name := service.Name - serviceToBeBuild[name] = serviceToBuild{name: name, service: service} + serviceToBeBuild[serviceName] = serviceToBuild{name: serviceName, service: *service} return nil }, policy) if err != nil || len(serviceToBeBuild) == 0 { diff --git a/pkg/compose/compose.go b/pkg/compose/compose.go index 18dc65a1c..9230e8091 100644 --- a/pkg/compose/compose.go +++ b/pkg/compose/compose.go @@ -148,7 +148,8 @@ func getContainerNameWithoutProject(c moby.Container) string { func (s *composeService) Config(ctx context.Context, project *types.Project, options api.ConfigOptions) ([]byte, error) { if options.ResolveImageDigests { - err := project.ResolveImages(func(named reference.Named) (digest.Digest, error) { + var err error + project, err = project.WithImagesResolved(func(named reference.Named) (digest.Digest, error) { auth, err := encodedAuth(named, s.configFile()) if err != nil { return "", err @@ -233,7 +234,7 @@ SERVICES: } return project, fmt.Errorf("no such service: %q: %w", qs, api.ErrNotFound) } - err := project.ForServices(services) + project, err := project.WithSelectedServices(services) if err != nil { return project, err } diff --git a/pkg/compose/publish.go b/pkg/compose/publish.go index 1608ff42a..406da5ec2 100644 --- a/pkg/compose/publish.go +++ b/pkg/compose/publish.go @@ -107,8 +107,11 @@ func (s *composeService) publish(ctx context.Context, project *types.Project, re } func (s *composeService) generateImageDigestsOverride(ctx context.Context, project *types.Project) ([]byte, error) { - project.ApplyProfiles([]string{"*"}) - err := project.ResolveImages(func(named reference.Named) (digest.Digest, error) { + project, err := project.WithProfiles([]string{"*"}) + if err != nil { + return nil, err + } + project, err = project.WithImagesResolved(func(named reference.Named) (digest.Digest, error) { auth, err := encodedAuth(named, s.configFile()) if err != nil { return "", err diff --git a/pkg/compose/restart.go b/pkg/compose/restart.go index 0a93813ed..e0ab730b4 100644 --- a/pkg/compose/restart.go +++ b/pkg/compose/restart.go @@ -49,7 +49,7 @@ func (s *composeService) restart(ctx context.Context, projectName string, option } if options.NoDeps { - err := project.ForServices(options.Services, types.IgnoreDependencies) + project, err = project.WithSelectedServices(options.Services, types.IgnoreDependencies) if err != nil { return err } @@ -66,7 +66,7 @@ func (s *composeService) restart(ctx context.Context, projectName string, option } if len(options.Services) != 0 { - err = project.ForServices(options.Services, types.IncludeDependents) + project, err = project.WithSelectedServices(options.Services, types.IncludeDependents) if err != nil { return err } diff --git a/pkg/compose/watch.go b/pkg/compose/watch.go index 436b6c5f0..3673c4355 100644 --- a/pkg/compose/watch.go +++ b/pkg/compose/watch.go @@ -64,7 +64,8 @@ func (s *composeService) getSyncImplementation(project *types.Project) sync.Sync } func (s *composeService) Watch(ctx context.Context, project *types.Project, services []string, options api.WatchOptions) error { //nolint: gocyclo - if err := project.ForServices(services); err != nil { + var err error + if project, err = project.WithSelectedServices(services); err != nil { return err } syncer := s.getSyncImplementation(project)