From e12293463e40b431da94a600c7a6d0255c03a54d Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Mon, 22 Jul 2024 11:02:57 +0200 Subject: [PATCH] resolveRelativePaths can run with non-canonical model Signed-off-by: Nicolas De Loof --- loader/extends.go | 2 +- loader/extends_test.go | 17 +++++++++++++ loader/testdata/extends/interpolated.yaml | 5 ++++ paths/resolve.go | 30 ++++++++++++++--------- 4 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 loader/testdata/extends/interpolated.yaml diff --git a/loader/extends.go b/loader/extends.go index 21730f10..b2990453 100644 --- a/loader/extends.go +++ b/loader/extends.go @@ -190,7 +190,7 @@ func getExtendsBaseFromFile( ) } - // Attempt to make a canonical model so ResolveRelativePaths can operate on source:target short syntaxes + // Attempt to make a canonical model so ResolveRelativePaths can operate on source:target short syntax source, err = transform.Canonical(source, true) if err != nil { return nil, nil, err diff --git a/loader/extends_test.go b/loader/extends_test.go index 3990b3de..8f25f35d 100644 --- a/loader/extends_test.go +++ b/loader/extends_test.go @@ -484,3 +484,20 @@ services: assert.NilError(t, err) assert.Check(t, p.Services["test"].Command == nil) } + +func TestExtendsWithInterpolation(t *testing.T) { + yaml := ` +name: test-extends-with-interpolation +services: + test: + extends: { file: testdata/extends/interpolated.yaml, service: foo } +` + p, err := Load(types.ConfigDetails{ + ConfigFiles: []types.ConfigFile{{ + Content: []byte(yaml), + Filename: "-", + }}, + }) + assert.NilError(t, err) + assert.Check(t, p.Services["test"].Volumes[0].Source == "/dev/null") +} diff --git a/loader/testdata/extends/interpolated.yaml b/loader/testdata/extends/interpolated.yaml new file mode 100644 index 00000000..17d0ac5a --- /dev/null +++ b/loader/testdata/extends/interpolated.yaml @@ -0,0 +1,5 @@ +services: + foo: + image: bash + volumes: + - ${SOURCE:-/dev/null}:/tmp/foo:ro \ No newline at end of file diff --git a/paths/resolve.go b/paths/resolve.go index 3bb97f8c..303f39e2 100644 --- a/paths/resolve.go +++ b/paths/resolve.go @@ -116,24 +116,30 @@ func (r *relativePathsResolver) absPath(value any) (any, error) { } return v, nil } + return nil, fmt.Errorf("unexpected type %T", value) } func (r *relativePathsResolver) absVolumeMount(a any) (any, error) { - vol := a.(map[string]any) - if vol["type"] != types.VolumeTypeBind { + switch vol := a.(type) { + case map[string]any: + if vol["type"] != types.VolumeTypeBind { + return vol, nil + } + src, ok := vol["source"] + if !ok { + return nil, errors.New(`invalid mount config for type "bind": field Source must not be empty`) + } + abs, err := r.maybeUnixPath(src.(string)) + if err != nil { + return nil, err + } + vol["source"] = abs return vol, nil + default: + // not using canonical format, skip + return a, nil } - src, ok := vol["source"] - if !ok { - return nil, errors.New(`invalid mount config for type "bind": field Source must not be empty`) - } - abs, err := r.maybeUnixPath(src.(string)) - if err != nil { - return nil, err - } - vol["source"] = abs - return vol, nil } func (r *relativePathsResolver) volumeDriverOpts(a any) (any, error) {