Skip to content

Commit

Permalink
Only ignore parsing errors when used with no-interpolate
Browse files Browse the repository at this point in the history
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
  • Loading branch information
ndeloof committed Apr 5, 2024
1 parent 27a3a6a commit facef9f
Show file tree
Hide file tree
Showing 21 changed files with 142 additions and 44 deletions.
2 changes: 1 addition & 1 deletion loader/loader.go
Expand Up @@ -463,7 +463,7 @@ func loadYamlModel(ctx context.Context, config types.ConfigDetails, opts *Option
}
}

dict, err = transform.Canonical(dict)
dict, err = transform.Canonical(dict, opts.SkipInterpolation)
if err != nil {
return nil, err
}
Expand Down
6 changes: 3 additions & 3 deletions transform/build.go
Expand Up @@ -22,10 +22,10 @@ import (
"github.com/compose-spec/compose-go/v2/tree"
)

func transformBuild(data any, p tree.Path) (any, error) {
func transformBuild(data any, p tree.Path, ignoreParseError bool) (any, error) {
switch v := data.(type) {
case map[string]any:
return transformMapping(v, p)
return transformMapping(v, p, ignoreParseError)
case string:
return map[string]any{
"context": v,
Expand All @@ -35,7 +35,7 @@ func transformBuild(data any, p tree.Path) (any, error) {
}
}

func defaultBuildContext(data any, _ tree.Path) (any, error) {
func defaultBuildContext(data any, _ tree.Path, _ bool) (any, error) {
switch v := data.(type) {
case map[string]any:
if _, ok := v["context"]; !ok {
Expand Down
2 changes: 1 addition & 1 deletion transform/build_test.go
Expand Up @@ -49,7 +49,7 @@ func Test_transformBuild(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := transformBuild(tt.yaml, tree.NewPath("services.foo.build"))
got, err := transformBuild(tt.yaml, tree.NewPath("services.foo.build"), false)
assert.NilError(t, err)
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("transformBuild() got = %v, want %v", got, tt.want)
Expand Down
22 changes: 11 additions & 11 deletions transform/canonical.go
Expand Up @@ -20,7 +20,7 @@ import (
"github.com/compose-spec/compose-go/v2/tree"
)

type transformFunc func(data any, p tree.Path) (any, error)
type transformFunc func(data any, p tree.Path, ignoreParseError bool) (any, error)

var transformers = map[tree.Path]transformFunc{}

Expand Down Expand Up @@ -48,18 +48,18 @@ func init() {
}

// Canonical transforms a compose model into canonical syntax
func Canonical(yaml map[string]any) (map[string]any, error) {
canonical, err := transform(yaml, tree.NewPath())
func Canonical(yaml map[string]any, ignoreParseError bool) (map[string]any, error) {
canonical, err := transform(yaml, tree.NewPath(), ignoreParseError)
if err != nil {
return nil, err
}
return canonical.(map[string]any), nil
}

func transform(data any, p tree.Path) (any, error) {
func transform(data any, p tree.Path, ignoreParseError bool) (any, error) {
for pattern, transformer := range transformers {
if p.Matches(pattern) {
t, err := transformer(data, p)
t, err := transformer(data, p, ignoreParseError)
if err != nil {
return nil, err
}
Expand All @@ -68,13 +68,13 @@ func transform(data any, p tree.Path) (any, error) {
}
switch v := data.(type) {
case map[string]any:
a, err := transformMapping(v, p)
a, err := transformMapping(v, p, ignoreParseError)
if err != nil {
return a, err
}
return v, nil
case []any:
a, err := transformSequence(v, p)
a, err := transformSequence(v, p, ignoreParseError)
if err != nil {
return a, err
}
Expand All @@ -84,9 +84,9 @@ func transform(data any, p tree.Path) (any, error) {
}
}

func transformSequence(v []any, p tree.Path) ([]any, error) {
func transformSequence(v []any, p tree.Path, ignoreParseError bool) ([]any, error) {
for i, e := range v {
t, err := transform(e, p.Next("[]"))
t, err := transform(e, p.Next("[]"), ignoreParseError)
if err != nil {
return nil, err
}
Expand All @@ -95,9 +95,9 @@ func transformSequence(v []any, p tree.Path) ([]any, error) {
return v, nil
}

func transformMapping(v map[string]any, p tree.Path) (map[string]any, error) {
func transformMapping(v map[string]any, p tree.Path, ignoreParseError bool) (map[string]any, error) {
for k, e := range v {
t, err := transform(e, p.Next(k))
t, err := transform(e, p.Next(k), ignoreParseError)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion transform/defaults.go
Expand Up @@ -39,7 +39,7 @@ func SetDefaultValues(yaml map[string]any) (map[string]any, error) {
func setDefaults(data any, p tree.Path) (any, error) {
for pattern, transformer := range defaultValues {
if p.Matches(pattern) {
t, err := transformer(data, p)
t, err := transformer(data, p, false)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion transform/dependson.go
Expand Up @@ -22,7 +22,7 @@ import (
"github.com/compose-spec/compose-go/v2/tree"
)

func transformDependsOn(data any, p tree.Path) (any, error) {
func transformDependsOn(data any, p tree.Path, _ bool) (any, error) {
switch v := data.(type) {
case map[string]any:
for i, e := range v {
Expand Down
2 changes: 1 addition & 1 deletion transform/envfile.go
Expand Up @@ -22,7 +22,7 @@ import (
"github.com/compose-spec/compose-go/v2/tree"
)

func transformEnvFile(data any, p tree.Path) (any, error) {
func transformEnvFile(data any, p tree.Path, _ bool) (any, error) {
switch v := data.(type) {
case string:
return []any{
Expand Down
6 changes: 3 additions & 3 deletions transform/envfile_test.go
Expand Up @@ -25,7 +25,7 @@ import (
)

func TestSingle(t *testing.T) {
env, err := transformEnvFile(".env", tree.NewPath("service.test.env_file"))
env, err := transformEnvFile(".env", tree.NewPath("service.test.env_file"), false)
assert.NilError(t, err)
assert.DeepEqual(t, env, []any{
map[string]any{
Expand All @@ -42,7 +42,7 @@ func TestSequence(t *testing.T) {
- other.env
`), &in)
assert.NilError(t, err)
env, err := transformEnvFile(in, tree.NewPath("service.test.env_file"))
env, err := transformEnvFile(in, tree.NewPath("service.test.env_file"), false)
assert.NilError(t, err)
assert.DeepEqual(t, env, []any{
map[string]any{
Expand All @@ -64,7 +64,7 @@ func TestOptional(t *testing.T) {
required: false
`), &in)
assert.NilError(t, err)
env, err := transformEnvFile(in, tree.NewPath("service.test.env_file"))
env, err := transformEnvFile(in, tree.NewPath("service.test.env_file"), false)
assert.NilError(t, err)
assert.DeepEqual(t, env, []any{
map[string]any{
Expand Down
4 changes: 2 additions & 2 deletions transform/extends.go
Expand Up @@ -22,10 +22,10 @@ import (
"github.com/compose-spec/compose-go/v2/tree"
)

func transformExtends(data any, p tree.Path) (any, error) {
func transformExtends(data any, p tree.Path, ignoreParseError bool) (any, error) {
switch v := data.(type) {
case map[string]any:
return transformMapping(v, p)
return transformMapping(v, p, ignoreParseError)
case string:
return map[string]any{
"service": v,
Expand Down
4 changes: 2 additions & 2 deletions transform/external.go
Expand Up @@ -23,11 +23,11 @@ import (
"github.com/sirupsen/logrus"
)

func transformMaybeExternal(data any, p tree.Path) (any, error) {
func transformMaybeExternal(data any, p tree.Path, ignoreParseError bool) (any, error) {
if data == nil {
return nil, nil
}
resource, err := transformMapping(data.(map[string]any), p)
resource, err := transformMapping(data.(map[string]any), p, ignoreParseError)
if err != nil {
return nil, err
}
Expand Down
10 changes: 5 additions & 5 deletions transform/external_test.go
Expand Up @@ -26,7 +26,7 @@ import (
func TestNotExternal(t *testing.T) {
ssh, err := transformMaybeExternal(map[string]any{
"driver": "foo",
}, tree.NewPath("resources.test"))
}, tree.NewPath("resources.test"), false)
assert.NilError(t, err)
assert.DeepEqual(t, ssh, map[string]any{
"driver": "foo",
Expand All @@ -37,7 +37,7 @@ func TestExternalNamed(t *testing.T) {
ssh, err := transformMaybeExternal(map[string]any{
"external": true,
"name": "foo",
}, tree.NewPath("resources.test"))
}, tree.NewPath("resources.test"), false)
assert.NilError(t, err)
assert.DeepEqual(t, ssh, map[string]any{
"external": true,
Expand All @@ -48,7 +48,7 @@ func TestExternalNamed(t *testing.T) {
func TestExternalUnnamed(t *testing.T) {
ssh, err := transformMaybeExternal(map[string]any{
"external": true,
}, tree.NewPath("resources.test"))
}, tree.NewPath("resources.test"), false)
assert.NilError(t, err)
assert.DeepEqual(t, ssh, map[string]any{
"external": true,
Expand All @@ -60,7 +60,7 @@ func TestExternalLegacy(t *testing.T) {
"external": map[string]any{
"name": "foo",
},
}, tree.NewPath("resources.test"))
}, tree.NewPath("resources.test"), false)
assert.NilError(t, err)
assert.DeepEqual(t, ssh, map[string]any{
"external": true,
Expand All @@ -74,7 +74,7 @@ func TestExternalLegacyNamed(t *testing.T) {
"name": "foo",
},
"name": "foo",
}, tree.NewPath("resources.test"))
}, tree.NewPath("resources.test"), false)
assert.NilError(t, err)
assert.DeepEqual(t, ssh, map[string]any{
"external": true,
Expand Down
2 changes: 1 addition & 1 deletion transform/include.go
Expand Up @@ -22,7 +22,7 @@ import (
"github.com/compose-spec/compose-go/v2/tree"
)

func transformInclude(data any, p tree.Path) (any, error) {
func transformInclude(data any, p tree.Path, _ bool) (any, error) {
switch v := data.(type) {
case map[string]any:
return v, nil
Expand Down
5 changes: 4 additions & 1 deletion transform/mapping.go
Expand Up @@ -23,7 +23,7 @@ import (
"github.com/compose-spec/compose-go/v2/tree"
)

func transformKeyValue(data any, p tree.Path) (any, error) {
func transformKeyValue(data any, p tree.Path, ignoreParseError bool) (any, error) {
switch v := data.(type) {
case map[string]any:
return v, nil
Expand All @@ -32,6 +32,9 @@ func transformKeyValue(data any, p tree.Path) (any, error) {
for _, e := range v {
before, after, found := strings.Cut(e.(string), "=")
if !found {
if ignoreParseError {
return data, nil
}
return nil, fmt.Errorf("%s: invalid value %s, expected key=value", p, e)
}
mapping[before] = after
Expand Down
7 changes: 5 additions & 2 deletions transform/ports.go
Expand Up @@ -24,7 +24,7 @@ import (
"github.com/mitchellh/mapstructure"
)

func transformPorts(data any, p tree.Path) (any, error) {
func transformPorts(data any, p tree.Path, ignoreParseError bool) (any, error) {
switch entries := data.(type) {
case []any:
// We process the list instead of individual items here.
Expand All @@ -48,7 +48,10 @@ func transformPorts(data any, p tree.Path) (any, error) {
case string:
parsed, err := types.ParsePortConfig(value)
if err != nil {
return data, nil
if ignoreParseError {
return data, nil
}
return nil, err
}
if err != nil {
return nil, err
Expand Down
89 changes: 89 additions & 0 deletions transform/ports_test.go
@@ -0,0 +1,89 @@
/*
Copyright 2020 The Compose Specification Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package transform

import (
"reflect"
"testing"

"github.com/compose-spec/compose-go/v2/tree"
"gotest.tools/v3/assert"
)

func Test_transformPorts(t *testing.T) {
tests := []struct {
name string
yaml any
ignoreParseError bool
want any
wantErr string
}{
{
name: "[]string",
yaml: []any{
"127.0.0.1:8080:80",
"127.0.0.1:8081:81",
},
want: []any{
map[string]any{
"host_ip": "127.0.0.1",
"mode": "ingress",
"protocol": "tcp",
"published": "8080",
"target": uint32(80),
},
map[string]any{
"host_ip": "127.0.0.1",
"mode": "ingress",
"protocol": "tcp",
"published": "8081",
"target": uint32(81),
},
},
},
{
name: "invalid IP",
yaml: []any{
"127.0.1:8080:80",
},
wantErr: "Invalid ip address: 127.0.1",
},
{
name: "ignore invalid IP",
yaml: []any{
"${HOST_IP}:${HOST_PORT}:80",
},
ignoreParseError: true,
want: []any{
"${HOST_IP}:${HOST_PORT}:80",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := transformPorts(tt.yaml, tree.NewPath("services.foo.ports"), tt.ignoreParseError)
if tt.wantErr != "" {
assert.Error(t, err, tt.wantErr)
return
}
assert.NilError(t, err)
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("transformPorts() got = %v, want %v", got, tt.want)
}
})
}
}
4 changes: 2 additions & 2 deletions transform/secrets.go
Expand Up @@ -22,7 +22,7 @@ import (
"github.com/compose-spec/compose-go/v2/tree"
)

func transformFileMount(data any, p tree.Path) (any, error) {
func transformFileMount(data any, p tree.Path, _ bool) (any, error) {
switch v := data.(type) {
case map[string]any:
return data, nil
Expand All @@ -35,7 +35,7 @@ func transformFileMount(data any, p tree.Path) (any, error) {
}
}

func defaultSecretMount(data any, p tree.Path) (any, error) {
func defaultSecretMount(data any, p tree.Path, _ bool) (any, error) {
switch v := data.(type) {
case map[string]any:
source := v["source"]
Expand Down

0 comments on commit facef9f

Please sign in to comment.