Skip to content

Commit a696986

Browse files
committed
use compose-go to load and parse compose files
Signed-off-by: Guillaume Lours <[email protected]>
1 parent 34797d1 commit a696986

File tree

179 files changed

+26018
-7857
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

179 files changed

+26018
-7857
lines changed

cli/command/stack/config.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ package stack
33
import (
44
"fmt"
55

6+
specLoader "github.com/compose-spec/compose-go/v2/loader"
7+
compose "github.com/compose-spec/compose-go/v2/types"
68
"github.com/docker/cli/cli"
79
"github.com/docker/cli/cli/command"
810
"github.com/docker/cli/cli/command/completion"
911
"github.com/docker/cli/cli/command/stack/loader"
1012
"github.com/docker/cli/cli/command/stack/options"
1113
composeLoader "github.com/docker/cli/cli/compose/loader"
12-
composetypes "github.com/docker/cli/cli/compose/types"
1314
"github.com/spf13/cobra"
1415
yaml "gopkg.in/yaml.v2"
1516
)
@@ -45,8 +46,8 @@ func newConfigCommand(dockerCli command.Cli) *cobra.Command {
4546
}
4647

4748
// outputConfig returns the merged and interpolated config file
48-
func outputConfig(configFiles composetypes.ConfigDetails, skipInterpolation bool) (string, error) {
49-
optsFunc := func(opts *composeLoader.Options) {
49+
func outputConfig(configFiles compose.ConfigDetails, skipInterpolation bool) (string, error) {
50+
optsFunc := func(opts *specLoader.Options) {
5051
opts.SkipInterpolation = skipInterpolation
5152
}
5253
config, err := composeLoader.Load(configFiles, optsFunc)

cli/command/stack/config_test.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import (
44
"io"
55
"testing"
66

7-
"github.com/docker/cli/cli/compose/loader"
8-
composetypes "github.com/docker/cli/cli/compose/types"
7+
composetypes "github.com/compose-spec/compose-go/v2/types"
8+
99
"github.com/docker/cli/internal/test"
1010
"gotest.tools/v3/assert"
1111
)
@@ -29,6 +29,7 @@ func TestConfigMergeInterpolation(t *testing.T) {
2929
name: "With Interpolation",
3030
skipInterpolation: false,
3131
fileOne: `version: "3.7"
32+
name: interpolation
3233
services:
3334
foo:
3435
image: busybox:latest
@@ -40,19 +41,25 @@ services:
4041
image: busybox:${VERSION}
4142
command: cat file2.txt
4243
`,
43-
expected: `version: "3.7"
44+
expected: `name: interpolation
4445
services:
4546
foo:
4647
command:
4748
- cat
4849
- file2.txt
4950
image: busybox:1.0
51+
networks:
52+
default: null
53+
networks:
54+
default:
55+
name: interpolation_default
5056
`,
5157
},
5258
{
5359
name: "Without Interpolation",
5460
skipInterpolation: true,
5561
fileOne: `version: "3.7"
62+
name: without-interpolation
5663
services:
5764
foo:
5865
image: busybox:latest
@@ -64,28 +71,28 @@ services:
6471
image: busybox:${VERSION}
6572
command: cat file2.txt
6673
`,
67-
expected: `version: "3.7"
74+
expected: `name: without-interpolation
6875
services:
6976
foo:
7077
command:
7178
- cat
7279
- file2.txt
7380
image: busybox:${VERSION}
81+
networks:
82+
default: null
83+
networks:
84+
default:
85+
name: without-interpolation_default
7486
`,
7587
},
7688
}
7789

7890
for _, tc := range tests {
7991
t.Run(tc.name, func(t *testing.T) {
80-
firstConfigData, err := loader.ParseYAML([]byte(tc.fileOne))
81-
assert.Check(t, err)
82-
secondConfigData, err := loader.ParseYAML([]byte(tc.fileTwo))
83-
assert.Check(t, err)
84-
8592
actual, err := outputConfig(composetypes.ConfigDetails{
8693
ConfigFiles: []composetypes.ConfigFile{
87-
{Config: firstConfigData, Filename: "firstConfig"},
88-
{Config: secondConfigData, Filename: "secondConfig"},
94+
{Content: []byte(tc.fileOne), Filename: "firstConfig"},
95+
{Content: []byte(tc.fileTwo), Filename: "secondConfig"},
8996
},
9097
Environment: map[string]string{
9198
"VERSION": "1.0",

cli/command/stack/deploy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ func newDeployCommand(dockerCli command.Cli) *cobra.Command {
2222
if err := validateStackName(opts.Namespace); err != nil {
2323
return err
2424
}
25-
config, err := loader.LoadComposefile(dockerCli, opts)
25+
project, err := loader.LoadComposefile(dockerCli, opts)
2626
if err != nil {
2727
return err
2828
}
29-
return swarm.RunDeploy(cmd.Context(), dockerCli, opts, config)
29+
return swarm.RunDeploy(cmd.Context(), dockerCli, opts, project)
3030
},
3131
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
3232
return completeNames(dockerCli)(cmd, args, toComplete)

cli/command/stack/loader/loader.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,26 @@ import (
1212
"sort"
1313
"strings"
1414

15+
specloader "github.com/compose-spec/compose-go/v2/loader"
16+
composetypes "github.com/compose-spec/compose-go/v2/types"
1517
"github.com/docker/cli/cli/command"
1618
"github.com/docker/cli/cli/command/stack/options"
1719
"github.com/docker/cli/cli/compose/loader"
1820
"github.com/docker/cli/cli/compose/schema"
19-
composetypes "github.com/docker/cli/cli/compose/types"
2021
"github.com/pkg/errors"
2122
)
2223

2324
// LoadComposefile parse the composefile specified in the cli and returns its Config and version.
24-
func LoadComposefile(dockerCli command.Cli, opts options.Deploy) (*composetypes.Config, error) {
25+
func LoadComposefile(dockerCli command.Cli, opts options.Deploy) (*composetypes.Project, error) {
2526
configDetails, err := GetConfigDetails(opts.Composefiles, dockerCli.In())
2627
if err != nil {
2728
return nil, err
2829
}
2930

30-
dicts := getDictsFrom(configDetails.ConfigFiles)
31-
config, err := loader.Load(configDetails)
31+
projectNameFunc := func(o *specloader.Options) {
32+
o.SetProjectName(opts.Namespace, true)
33+
}
34+
project, err := loader.Load(configDetails, projectNameFunc)
3235
if err != nil {
3336
if fpe, ok := err.(*loader.ForbiddenPropertiesError); ok {
3437
// this error is intentionally formatted multi-line
@@ -38,28 +41,18 @@ func LoadComposefile(dockerCli command.Cli, opts options.Deploy) (*composetypes.
3841
return nil, err
3942
}
4043

41-
unsupportedProperties := loader.GetUnsupportedProperties(dicts...)
44+
unsupportedProperties := loader.GetUnsupportedProperties(project.Services)
4245
if len(unsupportedProperties) > 0 {
4346
fmt.Fprintf(dockerCli.Err(), "Ignoring unsupported options: %s\n\n",
4447
strings.Join(unsupportedProperties, ", "))
4548
}
4649

47-
deprecatedProperties := loader.GetDeprecatedProperties(dicts...)
50+
deprecatedProperties := loader.GetDeprecatedProperties(project.Services)
4851
if len(deprecatedProperties) > 0 {
4952
fmt.Fprintf(dockerCli.Err(), "Ignoring deprecated options:\n\n%s\n\n",
5053
propertyWarnings(deprecatedProperties))
5154
}
52-
return config, nil
53-
}
54-
55-
func getDictsFrom(configFiles []composetypes.ConfigFile) []map[string]any {
56-
dicts := []map[string]any{}
57-
58-
for _, configFile := range configFiles {
59-
dicts = append(dicts, configFile.Config)
60-
}
61-
62-
return dicts
55+
return project, nil
6356
}
6457

6558
func propertyWarnings(properties map[string]string) string {
@@ -157,7 +150,7 @@ func loadConfigFile(filename string, stdin io.Reader) (*composetypes.ConfigFile,
157150
return nil, err
158151
}
159152

160-
config, err := loader.ParseYAML(bytes)
153+
config, err := specloader.ParseYAML(bytes)
161154
if err != nil {
162155
return nil, err
163156
}

cli/command/stack/swarm/deploy.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import (
44
"context"
55
"fmt"
66

7+
composetypes "github.com/compose-spec/compose-go/v2/types"
78
"github.com/docker/cli/cli/command"
89
"github.com/docker/cli/cli/command/stack/options"
910
"github.com/docker/cli/cli/compose/convert"
10-
composetypes "github.com/docker/cli/cli/compose/types"
1111
"github.com/docker/docker/api/types/swarm"
1212
"github.com/docker/docker/api/types/versions"
1313
"github.com/pkg/errors"
@@ -22,7 +22,7 @@ const (
2222
)
2323

2424
// RunDeploy is the swarm implementation of docker stack deploy
25-
func RunDeploy(ctx context.Context, dockerCli command.Cli, opts options.Deploy, cfg *composetypes.Config) error {
25+
func RunDeploy(ctx context.Context, dockerCli command.Cli, opts options.Deploy, project *composetypes.Project) error {
2626
if err := validateResolveImageFlag(&opts); err != nil {
2727
return err
2828
}
@@ -32,7 +32,7 @@ func RunDeploy(ctx context.Context, dockerCli command.Cli, opts options.Deploy,
3232
opts.ResolveImage = ResolveImageNever
3333
}
3434

35-
return deployCompose(ctx, dockerCli, opts, cfg)
35+
return deployCompose(ctx, dockerCli, opts, project)
3636
}
3737

3838
// validateResolveImageFlag validates the opts.resolveImage command line option

cli/command/stack/swarm/deploy_composefile.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import (
44
"context"
55
"fmt"
66

7+
composetypes "github.com/compose-spec/compose-go/v2/types"
78
"github.com/docker/cli/cli/command"
89
"github.com/docker/cli/cli/command/stack/options"
910
"github.com/docker/cli/cli/compose/convert"
10-
composetypes "github.com/docker/cli/cli/compose/types"
1111
"github.com/docker/docker/api/types"
1212
"github.com/docker/docker/api/types/container"
1313
"github.com/docker/docker/api/types/swarm"
@@ -16,7 +16,7 @@ import (
1616
"github.com/pkg/errors"
1717
)
1818

19-
func deployCompose(ctx context.Context, dockerCli command.Cli, opts options.Deploy, config *composetypes.Config) error {
19+
func deployCompose(ctx context.Context, dockerCli command.Cli, opts options.Deploy, project *composetypes.Project) error {
2020
if err := checkDaemonIsSwarmManager(ctx, dockerCli); err != nil {
2121
return err
2222
}
@@ -25,45 +25,45 @@ func deployCompose(ctx context.Context, dockerCli command.Cli, opts options.Depl
2525

2626
if opts.Prune {
2727
services := map[string]struct{}{}
28-
for _, service := range config.Services {
28+
for _, service := range project.Services {
2929
services[service.Name] = struct{}{}
3030
}
3131
pruneServices(ctx, dockerCli, namespace, services)
3232
}
3333

34-
serviceNetworks := getServicesDeclaredNetworks(config.Services)
35-
networks, externalNetworks := convert.Networks(namespace, config.Networks, serviceNetworks)
34+
serviceNetworks := getServicesDeclaredNetworks(project.Services)
35+
networks, externalNetworks := convert.Networks(namespace, project.Networks, serviceNetworks)
3636
if err := validateExternalNetworks(ctx, dockerCli.Client(), externalNetworks); err != nil {
3737
return err
3838
}
3939
if err := createNetworks(ctx, dockerCli, namespace, networks); err != nil {
4040
return err
4141
}
4242

43-
secrets, err := convert.Secrets(namespace, config.Secrets)
43+
secrets, err := convert.Secrets(namespace, project.Secrets)
4444
if err != nil {
4545
return err
4646
}
4747
if err := createSecrets(ctx, dockerCli, secrets); err != nil {
4848
return err
4949
}
5050

51-
configs, err := convert.Configs(namespace, config.Configs)
51+
configs, err := convert.Configs(namespace, project.Configs)
5252
if err != nil {
5353
return err
5454
}
5555
if err := createConfigs(ctx, dockerCli, configs); err != nil {
5656
return err
5757
}
5858

59-
services, err := convert.Services(ctx, namespace, config, dockerCli.Client())
59+
services, err := convert.Services(ctx, namespace, project, dockerCli.Client())
6060
if err != nil {
6161
return err
6262
}
6363
return deployServices(ctx, dockerCli, services, namespace, opts.SendRegistryAuth, opts.ResolveImage)
6464
}
6565

66-
func getServicesDeclaredNetworks(serviceConfigs []composetypes.ServiceConfig) map[string]struct{} {
66+
func getServicesDeclaredNetworks(serviceConfigs composetypes.Services) map[string]struct{} {
6767
serviceNetworks := map[string]struct{}{}
6868
for _, serviceConfig := range serviceConfigs {
6969
if len(serviceConfig.Networks) == 0 {

cli/compose/convert/compose.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"os"
55
"strings"
66

7-
composetypes "github.com/docker/cli/cli/compose/types"
7+
composetypes "github.com/compose-spec/compose-go/v2/types"
88
"github.com/docker/docker/api/types"
99
networktypes "github.com/docker/docker/api/types/network"
1010
"github.com/docker/docker/api/types/swarm"
@@ -52,7 +52,7 @@ func AddStackLabel(namespace Namespace, labels map[string]string) map[string]str
5252
type networkMap map[string]composetypes.NetworkConfig
5353

5454
// Networks from the compose-file type to the engine API type
55-
func Networks(namespace Namespace, networks networkMap, servicesNetworks map[string]struct{}) (map[string]types.NetworkCreate, []string) {
55+
func Networks(namespace Namespace, networks composetypes.Networks, servicesNetworks map[string]struct{}) (map[string]types.NetworkCreate, []string) {
5656
if networks == nil {
5757
networks = make(map[string]composetypes.NetworkConfig)
5858
}
@@ -61,7 +61,7 @@ func Networks(namespace Namespace, networks networkMap, servicesNetworks map[str
6161
result := make(map[string]types.NetworkCreate)
6262
for internalName := range servicesNetworks {
6363
network := networks[internalName]
64-
if network.External.External {
64+
if network.External {
6565
externalNetworks = append(externalNetworks, network.Name)
6666
continue
6767
}
@@ -102,7 +102,7 @@ func Networks(namespace Namespace, networks networkMap, servicesNetworks map[str
102102
func Secrets(namespace Namespace, secrets map[string]composetypes.SecretConfig) ([]swarm.SecretSpec, error) {
103103
result := []swarm.SecretSpec{}
104104
for name, secret := range secrets {
105-
if secret.External.External {
105+
if secret.External {
106106
continue
107107
}
108108

@@ -137,7 +137,7 @@ func Secrets(namespace Namespace, secrets map[string]composetypes.SecretConfig)
137137
func Configs(namespace Namespace, configs map[string]composetypes.ConfigObjConfig) ([]swarm.ConfigSpec, error) {
138138
result := []swarm.ConfigSpec{}
139139
for name, config := range configs {
140-
if config.External.External {
140+
if config.External {
141141
continue
142142
}
143143

cli/compose/convert/compose_test.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package convert
33
import (
44
"testing"
55

6-
composetypes "github.com/docker/cli/cli/compose/types"
6+
composetypes "github.com/compose-spec/compose-go/v2/types"
77
"github.com/docker/docker/api/types"
88
"github.com/docker/docker/api/types/network"
99
"gotest.tools/v3/assert"
@@ -37,7 +37,7 @@ func TestNetworks(t *testing.T) {
3737
"attachablenet": {},
3838
"named": {},
3939
}
40-
source := networkMap{
40+
source := composetypes.Networks{
4141
"normal": composetypes.NetworkConfig{
4242
Driver: "overlay",
4343
DriverOpts: map[string]string{
@@ -56,7 +56,7 @@ func TestNetworks(t *testing.T) {
5656
},
5757
},
5858
"outside": composetypes.NetworkConfig{
59-
External: composetypes.External{External: true},
59+
External: true,
6060
Name: "special",
6161
},
6262
"attachablenet": composetypes.NetworkConfig{
@@ -121,9 +121,7 @@ func TestSecrets(t *testing.T) {
121121
Labels: map[string]string{"monster": "mash"},
122122
},
123123
"ext": {
124-
External: composetypes.External{
125-
External: true,
126-
},
124+
External: true,
127125
},
128126
}
129127

@@ -152,9 +150,7 @@ func TestConfigs(t *testing.T) {
152150
Labels: map[string]string{"monster": "mash"},
153151
},
154152
"ext": {
155-
External: composetypes.External{
156-
External: true,
157-
},
153+
External: true,
158154
},
159155
}
160156

0 commit comments

Comments
 (0)