Skip to content

Commit 18d12cf

Browse files
authored
Merge pull request #410 from ndeloof/reset_service_map
2 parents 3e67049 + 0061519 commit 18d12cf

File tree

2 files changed

+34
-19
lines changed

2 files changed

+34
-19
lines changed

loader/merge_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,13 @@ services:
13771377
read_only: true
13781378
environment:
13791379
FOO: BAR
1380+
ports:
1381+
- "8080:80"
1382+
bar:
1383+
image: test
1384+
ports:
1385+
- "8443:443"
1386+
13801387
`
13811388
override := `
13821389
services:
@@ -1386,6 +1393,7 @@ services:
13861393
read_only: !reset false
13871394
environment:
13881395
FOO: !reset
1396+
ports: !reset []
13891397
`
13901398
configDetails := types.ConfigDetails{
13911399
Environment: map[string]string{},
@@ -1401,9 +1409,18 @@ services:
14011409
WorkingDir: "",
14021410
Services: []types.ServiceConfig{
14031411
{
1412+
Name: "bar",
1413+
Image: "test",
1414+
Environment: types.MappingWithEquals{},
1415+
Ports: []types.ServicePortConfig{{Mode: "ingress", Target: 443, Published: "8443", Protocol: "tcp"}},
1416+
Scale: 1,
1417+
},
1418+
{
1419+
Build: nil,
14041420
Name: "foo",
14051421
Image: "foo",
14061422
Environment: types.MappingWithEquals{},
1423+
Ports: nil,
14071424
ReadOnly: false,
14081425
Scale: 1,
14091426
},

loader/null.go

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ func (p *ResetProcessor) resolveReset(node *yaml.Node, path tree.Path) (*yaml.No
5050
case yaml.SequenceNode:
5151
var err error
5252
for idx, v := range node.Content {
53-
node.Content[idx], err = p.resolveReset(v, path.Next(strconv.Itoa(idx)))
53+
next := path.Next(strconv.Itoa(idx))
54+
node.Content[idx], err = p.resolveReset(v, next)
5455
if err != nil {
5556
return nil, err
5657
}
@@ -74,20 +75,6 @@ func (p *ResetProcessor) resolveReset(node *yaml.Node, path tree.Path) (*yaml.No
7475

7576
// Apply finds the go attributes matching recorded paths and reset them to zero value
7677
func (p *ResetProcessor) Apply(target *types.Config) error {
77-
for i, path := range p.paths {
78-
parts := path.Parts()
79-
// services is a mapping in yaml but a slice in types.Config, so need to translate the paths
80-
if len(parts) > 1 && parts[0] == "services" {
81-
name := parts[1]
82-
for idx, service := range target.Services {
83-
if service.Name == name {
84-
parts[1] = fmt.Sprintf("[%d]", idx)
85-
p.paths[i] = tree.NewPath(parts...)
86-
break
87-
}
88-
}
89-
}
90-
}
9178
return p.applyNullOverrides(reflect.ValueOf(target), tree.NewPath())
9279
}
9380

@@ -98,8 +85,19 @@ func (p *ResetProcessor) applyNullOverrides(val reflect.Value, path tree.Path) e
9885
return nil
9986
}
10087
typ := val.Type()
101-
switch typ.Kind() {
102-
case reflect.Map:
88+
switch {
89+
case path == "services":
90+
// Project.Services is a slice in compose-go, but a mapping in yaml
91+
for i := 0; i < val.Len(); i++ {
92+
service := val.Index(i)
93+
name := service.FieldByName("Name")
94+
next := path.Next(name.String())
95+
err := p.applyNullOverrides(service, next)
96+
if err != nil {
97+
return err
98+
}
99+
}
100+
case typ.Kind() == reflect.Map:
103101
iter := val.MapRange()
104102
KEYS:
105103
for iter.Next() {
@@ -113,7 +111,7 @@ func (p *ResetProcessor) applyNullOverrides(val reflect.Value, path tree.Path) e
113111
}
114112
return p.applyNullOverrides(iter.Value(), next)
115113
}
116-
case reflect.Slice:
114+
case typ.Kind() == reflect.Slice:
117115
ITER:
118116
for i := 0; i < val.Len(); i++ {
119117
next := path.Next(fmt.Sprintf("[%d]", i))
@@ -127,7 +125,7 @@ func (p *ResetProcessor) applyNullOverrides(val reflect.Value, path tree.Path) e
127125
return p.applyNullOverrides(val.Index(i), next)
128126
}
129127

130-
case reflect.Struct:
128+
case typ.Kind() == reflect.Struct:
131129
FIELDS:
132130
for i := 0; i < typ.NumField(); i++ {
133131
field := typ.Field(i)

0 commit comments

Comments
 (0)