Skip to content

Commit 88ee1a6

Browse files
authored
Merge pull request #895 from vdemeester/simplify-yaml-marshal
Simplify the marshaling of compose types.Config
2 parents 939938b + cf86a4d commit 88ee1a6

File tree

11 files changed

+60
-70
lines changed

11 files changed

+60
-70
lines changed

cli/command/stack/kubernetes/deploy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ func RunDeploy(dockerCli *KubeCli, opts options.Deploy) error {
2222
}
2323

2424
// Parse the compose file
25-
cfg, version, err := loader.LoadComposefile(dockerCli, opts)
25+
cfg, err := loader.LoadComposefile(dockerCli, opts)
2626
if err != nil {
2727
return err
2828
}
29-
stack, err := LoadStack(opts.Namespace, version, *cfg)
29+
stack, err := LoadStack(opts.Namespace, *cfg)
3030
if err != nil {
3131
return err
3232
}

cli/command/stack/kubernetes/loader.go

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,9 @@ import (
77
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
88
)
99

10-
type versionedConfig struct {
11-
composetypes.Config
12-
version string
13-
}
14-
15-
func (c versionedConfig) MarshalYAML() (interface{}, error) {
16-
services := map[string]composetypes.ServiceConfig{}
17-
for _, service := range c.Services {
18-
services[service.Name] = service
19-
}
20-
return map[string]interface{}{
21-
"services": services,
22-
"networks": c.Networks,
23-
"volumes": c.Volumes,
24-
"secrets": c.Secrets,
25-
"configs": c.Configs,
26-
"version": c.version,
27-
}, nil
28-
}
29-
3010
// LoadStack loads a stack from a Compose config, with a given name.
31-
func LoadStack(name, version string, cfg composetypes.Config) (*apiv1beta1.Stack, error) {
32-
res, err := yaml.Marshal(versionedConfig{
33-
version: version,
34-
Config: cfg,
35-
})
11+
func LoadStack(name string, cfg composetypes.Config) (*apiv1beta1.Stack, error) {
12+
res, err := yaml.Marshal(cfg)
3613
if err != nil {
3714
return nil, err
3815
}

cli/command/stack/kubernetes/loader_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import (
1010
)
1111

1212
func TestLoadStack(t *testing.T) {
13-
s, err := LoadStack("foo", "3.1", composetypes.Config{
13+
s, err := LoadStack("foo", composetypes.Config{
14+
Version: "3.1",
1415
Filename: "banana",
1516
Services: []composetypes.ServiceConfig{
1617
{
@@ -29,16 +30,16 @@ func TestLoadStack(t *testing.T) {
2930
Name: "foo",
3031
},
3132
Spec: apiv1beta1.StackSpec{
32-
ComposeFile: string(`configs: {}
33-
networks: {}
34-
secrets: {}
33+
ComposeFile: string(`version: "3.1"
3534
services:
3635
bar:
3736
image: bar
3837
foo:
3938
image: foo
40-
version: "3.1"
39+
networks: {}
4140
volumes: {}
41+
secrets: {}
42+
configs: {}
4243
`),
4344
},
4445
}, s)

cli/command/stack/loader/loader.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,21 @@ import (
1818
)
1919

2020
// LoadComposefile parse the composefile specified in the cli and returns its Config and version.
21-
func LoadComposefile(dockerCli command.Cli, opts options.Deploy) (*composetypes.Config, string, error) {
21+
func LoadComposefile(dockerCli command.Cli, opts options.Deploy) (*composetypes.Config, error) {
2222
configDetails, err := getConfigDetails(opts.Composefiles, dockerCli.In())
2323
if err != nil {
24-
return nil, "", err
24+
return nil, err
2525
}
2626

2727
dicts := getDictsFrom(configDetails.ConfigFiles)
2828
config, err := loader.Load(configDetails)
2929
if err != nil {
3030
if fpe, ok := err.(*loader.ForbiddenPropertiesError); ok {
31-
return nil, "", errors.Errorf("Compose file contains unsupported options:\n\n%s\n",
31+
return nil, errors.Errorf("Compose file contains unsupported options:\n\n%s\n",
3232
propertyWarnings(fpe.Properties))
3333
}
3434

35-
return nil, "", err
35+
return nil, err
3636
}
3737

3838
unsupportedProperties := loader.GetUnsupportedProperties(dicts...)
@@ -46,7 +46,7 @@ func LoadComposefile(dockerCli command.Cli, opts options.Deploy) (*composetypes.
4646
fmt.Fprintf(dockerCli.Err(), "Ignoring deprecated options:\n\n%s\n\n",
4747
propertyWarnings(deprecatedProperties))
4848
}
49-
return config, configDetails.Version, nil
49+
return config, nil
5050
}
5151

5252
func getDictsFrom(configFiles []composetypes.ConfigFile) []map[string]interface{} {

cli/command/stack/swarm/deploy_composefile.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
)
1919

2020
func deployCompose(ctx context.Context, dockerCli command.Cli, opts options.Deploy) error {
21-
config, _, err := loader.LoadComposefile(dockerCli, opts)
21+
config, err := loader.LoadComposefile(dockerCli, opts)
2222
if err != nil {
2323
return err
2424
}

cli/compose/loader/full-struct_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
func fullExampleConfig(workingDir, homeDir string) *types.Config {
1010
return &types.Config{
11+
Version: "3.6",
1112
Services: services(workingDir, homeDir),
1213
Networks: networks(),
1314
Volumes: volumes(),

cli/compose/loader/loader.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ func validateForbidden(configDict map[string]interface{}) error {
9898

9999
func loadSections(config map[string]interface{}, configDetails types.ConfigDetails) (*types.Config, error) {
100100
var err error
101-
cfg := types.Config{}
101+
cfg := types.Config{
102+
Version: schema.Version(config),
103+
}
102104

103105
var loaders = []struct {
104106
key string

cli/compose/loader/loader_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ func strPtr(val string) *string {
119119
}
120120

121121
var sampleConfig = types.Config{
122+
Version: "3.0",
122123
Services: []types.ServiceConfig{
123124
{
124125
Name: "foo",
@@ -174,6 +175,7 @@ func TestParseYAML(t *testing.T) {
174175
func TestLoad(t *testing.T) {
175176
actual, err := Load(buildConfigDetails(sampleDict, nil))
176177
require.NoError(t, err)
178+
assert.Equal(t, sampleConfig.Version, actual.Version)
177179
assert.Equal(t, serviceSort(sampleConfig.Services), serviceSort(actual.Services))
178180
assert.Equal(t, sampleConfig.Networks, actual.Networks)
179181
assert.Equal(t, sampleConfig.Volumes, actual.Volumes)
@@ -573,6 +575,7 @@ networks:
573575
require.NoError(t, err)
574576
expected := &types.Config{
575577
Filename: "filename.yml",
578+
Version: "3.4",
576579
Services: []types.ServiceConfig{
577580
{
578581
Name: "web",

cli/compose/loader/merge_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ func TestLoadLogging(t *testing.T) {
207207
require.NoError(t, err)
208208
require.Equal(t, &types.Config{
209209
Filename: "base.yml",
210+
Version: "3.4",
210211
Services: []types.ServiceConfig{
211212
{
212213
Name: "foo",
@@ -325,6 +326,7 @@ func TestLoadMultipleServicePorts(t *testing.T) {
325326
require.NoError(t, err)
326327
require.Equal(t, &types.Config{
327328
Filename: "base.yml",
329+
Version: "3.4",
328330
Services: []types.ServiceConfig{
329331
{
330332
Name: "foo",
@@ -450,6 +452,7 @@ func TestLoadMultipleSecretsConfig(t *testing.T) {
450452
require.NoError(t, err)
451453
require.Equal(t, &types.Config{
452454
Filename: "base.yml",
455+
Version: "3.4",
453456
Services: []types.ServiceConfig{
454457
{
455458
Name: "foo",
@@ -575,6 +578,7 @@ func TestLoadMultipleConfigobjsConfig(t *testing.T) {
575578
require.NoError(t, err)
576579
require.Equal(t, &types.Config{
577580
Filename: "base.yml",
581+
Version: "3.4",
578582
Services: []types.ServiceConfig{
579583
{
580584
Name: "foo",
@@ -690,6 +694,7 @@ func TestLoadMultipleUlimits(t *testing.T) {
690694
require.NoError(t, err)
691695
require.Equal(t, &types.Config{
692696
Filename: "base.yml",
697+
Version: "3.4",
693698
Services: []types.ServiceConfig{
694699
{
695700
Name: "foo",
@@ -808,6 +813,7 @@ func TestLoadMultipleNetworks(t *testing.T) {
808813
require.NoError(t, err)
809814
require.Equal(t, &types.Config{
810815
Filename: "base.yml",
816+
Version: "3.4",
811817
Services: []types.ServiceConfig{
812818
{
813819
Name: "foo",
@@ -895,6 +901,7 @@ func TestLoadMultipleConfigs(t *testing.T) {
895901
require.NoError(t, err)
896902
require.Equal(t, &types.Config{
897903
Filename: "base.yml",
904+
Version: "3.4",
898905
Services: []types.ServiceConfig{
899906
{
900907
Name: "bar",

cli/compose/loader/types_test.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,7 @@ import (
99

1010
func TestMarshallConfig(t *testing.T) {
1111
cfg := fullExampleConfig("/foo", "/bar")
12-
expected := `configs: {}
13-
networks:
14-
external-network:
15-
name: external-network
16-
external: true
17-
other-external-network:
18-
name: my-cool-network
19-
external: true
20-
other-network:
21-
driver: overlay
22-
driver_opts:
23-
baz: "1"
24-
foo: bar
25-
ipam:
26-
driver: overlay
27-
config:
28-
- subnet: 172.16.238.0/24
29-
- subnet: 2001:3984:3989::/64
30-
some-network: {}
31-
secrets: {}
12+
expected := `version: "3.6"
3213
services:
3314
foo:
3415
build:
@@ -292,6 +273,24 @@ services:
292273
tmpfs:
293274
size: 10000
294275
working_dir: /code
276+
networks:
277+
external-network:
278+
name: external-network
279+
external: true
280+
other-external-network:
281+
name: my-cool-network
282+
external: true
283+
other-network:
284+
driver: overlay
285+
driver_opts:
286+
baz: "1"
287+
foo: bar
288+
ipam:
289+
driver: overlay
290+
config:
291+
- subnet: 172.16.238.0/24
292+
- subnet: 2001:3984:3989::/64
293+
some-network: {}
295294
volumes:
296295
another-volume:
297296
name: user_specified_name
@@ -314,6 +313,8 @@ volumes:
314313
baz: "1"
315314
foo: bar
316315
some-volume: {}
316+
secrets: {}
317+
configs: {}
317318
`
318319

319320
actual, err := yaml.Marshal(cfg)

0 commit comments

Comments
 (0)