diff --git a/loader/merge.go b/loader/merge.go index 78af4cfe..bac9dd70 100644 --- a/loader/merge.go +++ b/loader/merge.go @@ -147,12 +147,21 @@ func toServicePortConfigsMap(s interface{}) (map[interface{}]interface{}, error) return nil, errors.Errorf("not a servicePortConfig slice: %v", s) } m := map[interface{}]interface{}{} + type port struct { + target uint32 + published uint32 + ip string + protocol string + } + for _, p := range ports { - k := p.Published - if k == 0 { - k = p.Target + mergeKey := port{ + target: p.Target, + published: p.Published, + ip: p.HostIP, + protocol: p.Protocol, } - m[k] = p + m[mergeKey] = p } return m, nil } diff --git a/loader/merge_test.go b/loader/merge_test.go index 7bc01776..035eeba9 100644 --- a/loader/merge_test.go +++ b/loader/merge_test.go @@ -286,24 +286,30 @@ func TestLoadMultipleServicePorts(t *testing.T) { }, }, { - name: "override_same_published", + name: "override_distinct_protocols", portBase: map[string]interface{}{ "ports": []interface{}{ - "8080:80", + "8080:80/tcp", }, }, portOverride: map[string]interface{}{ "ports": []interface{}{ - "8080:81", + "8080:80/udp", }, }, expected: []types.ServicePortConfig{ { Mode: "ingress", Published: 8080, - Target: 81, + Target: 80, Protocol: "tcp", }, + { + Mode: "ingress", + Published: 8080, + Target: 80, + Protocol: "udp", + }, }, }, { @@ -947,6 +953,12 @@ func TestLoadMultipleConfigs(t *testing.T) { }, }, Ports: []types.ServicePortConfig{ + { + Mode: "ingress", + Target: 80, + Published: 8080, + Protocol: "tcp", + }, { Target: 81, Published: 8080,