From 15fa9b0aac43aa24c235ad8389edce032ea093b8 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Fri, 17 Dec 2021 20:23:05 +0100 Subject: [PATCH 1/4] Add #Mkdir to engine fs definition Signed-off-by: Vasek - Tom C --- stdlib/europa/dagger/engine/fs.cue | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/stdlib/europa/dagger/engine/fs.cue b/stdlib/europa/dagger/engine/fs.cue index c564fe95..97bc24d2 100644 --- a/stdlib/europa/dagger/engine/fs.cue +++ b/stdlib/europa/dagger/engine/fs.cue @@ -1,6 +1,23 @@ package engine // Read a file from a filesystem tree +#Mkdir: { + $dagger: task: _name: "Mkdir" + + input: #FS + + // Path of the directory + path: string + + // Permission to set + mode: *0o755 | int + + // Create parents' directory if they do not exist + parents: *true | false + + output: #FS +} + #ReadFile: { $dagger: task: _name: "ReadFile" From 09c427f1cfdba14c7020253703283541eb4ee52d Mon Sep 17 00:00:00 2001 From: Vasek - Tom C Date: Fri, 17 Dec 2021 20:25:20 +0100 Subject: [PATCH 2/4] Add mkdir task Signed-off-by: Vasek - Tom C --- plan/task/mkdir.go | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 plan/task/mkdir.go diff --git a/plan/task/mkdir.go b/plan/task/mkdir.go new file mode 100644 index 00000000..8a03d70c --- /dev/null +++ b/plan/task/mkdir.go @@ -0,0 +1,81 @@ +package task + +import ( + "context" + "io/fs" + + "cuelang.org/go/cue" + "github.com/moby/buildkit/client/llb" + "go.dagger.io/dagger/compiler" + "go.dagger.io/dagger/plancontext" + "go.dagger.io/dagger/solver" +) + +func init() { + Register("Mkdir", func() Task { return &mkdirTask{} }) +} + +type mkdirTask struct { +} + +func (t *mkdirTask) Run(ctx context.Context, pctx *plancontext.Context, s solver.Solver, v *compiler.Value) (*compiler.Value, error) { + path, err := v.Lookup("path").String() + if err != nil { + return nil, err + } + + // Mode (int) + mode, err := v.Lookup("mode").Int64() + if err != nil { + return nil, err + } + + // Retrieve options + mkdirOpts := []llb.MkdirOption{} + var opts struct { + Parents bool + } + + if err := v.Decode(&opts); err != nil { + return nil, err + } + + if opts.Parents { + mkdirOpts = append(mkdirOpts, llb.WithParents(true)) + } + + // Retrieve input Filesystem + input, err := pctx.FS.FromValue(v.Lookup("input")) + if err != nil { + return nil, err + } + + // Retrieve input llb state + inputState, err := input.Result().ToState() + if err != nil { + return nil, err + } + + // Add Mkdir operation on input llb state + outputState := inputState.File( + llb.Mkdir(path, fs.FileMode(mode), mkdirOpts...), + withCustomName(v, "Mkdir %s", path), + ) + + // Compute state + result, err := s.Solve(ctx, outputState, pctx.Platform.Get()) + if err != nil { + return nil, err + } + + // Retrieve result result filesystem + outputFs := pctx.FS.New(result) + + // Init output + output := compiler.NewValue() + + if err := output.FillPath(cue.ParsePath("output"), outputFs.MarshalCUE()); err != nil { + return nil, err + } + return output, nil +} From d2580f4a73d0a1ba37dbe3e9bd134c30329d24b4 Mon Sep 17 00:00:00 2001 From: Vasek - Tom C Date: Fri, 17 Dec 2021 20:29:15 +0100 Subject: [PATCH 3/4] Add mkdir task tests Signed-off-by: Vasek - Tom C --- tests/tasks.bats | 19 ++++++++++- tests/tasks/mkdir/cue.mod/module.cue | 1 + tests/tasks/mkdir/cue.mod/pkg/.gitignore | 3 ++ tests/tasks/mkdir/mkdir.cue | 33 ++++++++++++++++++ .../mkdir/mkdir_failure_disable_parents.cue | 34 +++++++++++++++++++ tests/tasks/mkdir/mkdir_parents.cue | 33 ++++++++++++++++++ 6 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 tests/tasks/mkdir/cue.mod/module.cue create mode 100644 tests/tasks/mkdir/cue.mod/pkg/.gitignore create mode 100644 tests/tasks/mkdir/mkdir.cue create mode 100644 tests/tasks/mkdir/mkdir_failure_disable_parents.cue create mode 100644 tests/tasks/mkdir/mkdir_parents.cue diff --git a/tests/tasks.bats b/tests/tasks.bats index 93f74820..a0d6fc8f 100644 --- a/tests/tasks.bats +++ b/tests/tasks.bats @@ -51,7 +51,24 @@ setup() { cd "$TESTDIR"/tasks/copy "$DAGGER" --europa up ./copy_exec.cue "$DAGGER" --europa up ./copy_file.cue - + run "$DAGGER" --europa up ./copy_exec_invalid.cue assert_failure } + + +@test "task: #Mkdir" { + cd "$TESTDIR"/tasks/mkdir + "$DAGGER" --europa up ./mkdir.cue +} + +@test "task: #Mkdir: create parents" { + cd "$TESTDIR"/tasks/mkdir + "$DAGGER" --europa up ./mkdir_parents.cue +} + +@test "task: #Mkdir failure: disable parents creation" { + cd "$TESTDIR"/tasks/mkdir + run "$DAGGER" --europa up ./mkdir_failure_disable_parents.cue + assert_failure +} \ No newline at end of file diff --git a/tests/tasks/mkdir/cue.mod/module.cue b/tests/tasks/mkdir/cue.mod/module.cue new file mode 100644 index 00000000..f8af9cef --- /dev/null +++ b/tests/tasks/mkdir/cue.mod/module.cue @@ -0,0 +1 @@ +module: "" diff --git a/tests/tasks/mkdir/cue.mod/pkg/.gitignore b/tests/tasks/mkdir/cue.mod/pkg/.gitignore new file mode 100644 index 00000000..2d4dc1ae --- /dev/null +++ b/tests/tasks/mkdir/cue.mod/pkg/.gitignore @@ -0,0 +1,3 @@ +# generated by dagger +alpha.dagger.io +dagger.lock diff --git a/tests/tasks/mkdir/mkdir.cue b/tests/tasks/mkdir/mkdir.cue new file mode 100644 index 00000000..886ec29b --- /dev/null +++ b/tests/tasks/mkdir/mkdir.cue @@ -0,0 +1,33 @@ +package main + +import ( + "alpha.dagger.io/europa/dagger/engine" +) + +engine.#Plan & { + actions: { + image: engine.#Pull & { + source: "alpine:3.15.0@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3" + } + + mkdir: engine.#Mkdir & { + input: image.output + path: "/test" + } + + writeChecker: engine.#WriteFile & { + input: mkdir.output + path: "/test/foo" + contents: "bar" + mode: 700 + } + + readChecker: engine.#ReadFile & { + input: writeChecker.output + path: "/test/foo" + } & { + // assert result + contents: "bar" + } + } +} \ No newline at end of file diff --git a/tests/tasks/mkdir/mkdir_failure_disable_parents.cue b/tests/tasks/mkdir/mkdir_failure_disable_parents.cue new file mode 100644 index 00000000..9cf76775 --- /dev/null +++ b/tests/tasks/mkdir/mkdir_failure_disable_parents.cue @@ -0,0 +1,34 @@ +package main + +import ( + "alpha.dagger.io/europa/dagger/engine" +) + +engine.#Plan & { + actions: { + image: engine.#Pull & { + source: "alpine:3.15.0@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3" + } + + mkdir: engine.#Mkdir & { + input: image.output + path: "/test/baz" + parents: false + } + + writeChecker: engine.#WriteFile & { + input: mkdir.output + path: "/test/baz/foo" + contents: "bar" + mode: 700 + } + + readChecker: engine.#ReadFile & { + input: writeChecker.output + path: "/test/baz/foo" + } & { + // assert result + contents: "bar" + } + } +} \ No newline at end of file diff --git a/tests/tasks/mkdir/mkdir_parents.cue b/tests/tasks/mkdir/mkdir_parents.cue new file mode 100644 index 00000000..163608ae --- /dev/null +++ b/tests/tasks/mkdir/mkdir_parents.cue @@ -0,0 +1,33 @@ +package main + +import ( + "alpha.dagger.io/europa/dagger/engine" +) + +engine.#Plan & { + actions: { + image: engine.#Pull & { + source: "alpine:3.15.0@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3" + } + + mkdir: engine.#Mkdir & { + input: image.output + path: "/test/baz" + } + + writeChecker: engine.#WriteFile & { + input: mkdir.output + path: "/test/baz/foo" + contents: "bar" + mode: 700 + } + + readChecker: engine.#ReadFile & { + input: writeChecker.output + path: "/test/baz/foo" + } & { + // assert result + contents: "bar" + } + } +} \ No newline at end of file From e11cb1b6fd6c536e41ae3eeb2d9264811ecfb98a Mon Sep 17 00:00:00 2001 From: Vasek - Tom C Date: Fri, 17 Dec 2021 22:17:06 +0100 Subject: [PATCH 4/4] Add mkdir docs Signed-off-by: Vasek - Tom C --- docs/reference/europa/dagger/engine.md | 4 +-- docs/reference/europa/dagger/engine/README.md | 12 ++++++++ .../europa/dagger/engine/spec/engine.md | 2 +- plan/task/mkdir.go | 4 +-- stdlib/europa/dagger/engine/fs.cue | 28 +++++-------------- tests/tasks.bats | 7 ++--- tests/tasks/mkdir/mkdir.cue | 6 ++-- .../mkdir/mkdir_failure_disable_parents.cue | 8 +++--- tests/tasks/mkdir/mkdir_parents.cue | 6 ++-- 9 files changed, 36 insertions(+), 41 deletions(-) diff --git a/docs/reference/europa/dagger/engine.md b/docs/reference/europa/dagger/engine.md index 0db8b5c5..05f964ea 100644 --- a/docs/reference/europa/dagger/engine.md +++ b/docs/reference/europa/dagger/engine.md @@ -152,7 +152,7 @@ _No output._ ## engine.#Mkdir -Create a directory +Create one or multiple directory in a container ### engine.#Mkdir Inputs @@ -212,8 +212,6 @@ _No output._ ## engine.#ReadFile -Read a file from a filesystem tree - ### engine.#ReadFile Inputs _No input._ diff --git a/docs/reference/europa/dagger/engine/README.md b/docs/reference/europa/dagger/engine/README.md index 4e75f679..ca890581 100644 --- a/docs/reference/europa/dagger/engine/README.md +++ b/docs/reference/europa/dagger/engine/README.md @@ -56,6 +56,18 @@ _No input._ _No output._ +## engine.#Mkdir + +Create one or multiple directory in a container + +### engine.#Mkdir Inputs + +_No input._ + +### engine.#Mkdir Outputs + +_No output._ + ## engine.#Mount A transient filesystem mount. diff --git a/docs/reference/europa/dagger/engine/spec/engine.md b/docs/reference/europa/dagger/engine/spec/engine.md index df6f2351..2073079f 100644 --- a/docs/reference/europa/dagger/engine/spec/engine.md +++ b/docs/reference/europa/dagger/engine/spec/engine.md @@ -150,7 +150,7 @@ _No output._ ## engine.#Mkdir -Create a directory +Create one or multiple directory in a container Create a directory ### engine.#Mkdir Inputs diff --git a/plan/task/mkdir.go b/plan/task/mkdir.go index 8a03d70c..cf6999bb 100644 --- a/plan/task/mkdir.go +++ b/plan/task/mkdir.go @@ -69,12 +69,12 @@ func (t *mkdirTask) Run(ctx context.Context, pctx *plancontext.Context, s solver } // Retrieve result result filesystem - outputFs := pctx.FS.New(result) + outputFS := pctx.FS.New(result) // Init output output := compiler.NewValue() - if err := output.FillPath(cue.ParsePath("output"), outputFs.MarshalCUE()); err != nil { + if err := output.FillPath(cue.ParsePath("output"), outputFS.MarshalCUE()); err != nil { return nil, err } return output, nil diff --git a/stdlib/europa/dagger/engine/fs.cue b/stdlib/europa/dagger/engine/fs.cue index 97bc24d2..215d4cbe 100644 --- a/stdlib/europa/dagger/engine/fs.cue +++ b/stdlib/europa/dagger/engine/fs.cue @@ -1,20 +1,23 @@ package engine -// Read a file from a filesystem tree +// Create one or multiple directory in a container #Mkdir: { $dagger: task: _name: "Mkdir" + // Container filesystem input: #FS - // Path of the directory + // Path of the directory to create + // It can be nested (e.g : "/foo" or "/foo/bar") path: string - // Permission to set + // Permissions to set mode: *0o755 | int - // Create parents' directory if they do not exist + // If set, it creates parents' directory if they do not exist parents: *true | false + // Modified filesystem output: #FS } @@ -57,23 +60,6 @@ package engine output: #FS } -// Create a directory -#Mkdir: { - @dagger(notimplemented) - $dagger: task: _name: "Mkdir" - - input: #FS - - // Path of the directory - path: string - // FIXME: permissions? - mode: int - // Create parent directories as needed? - parents: *true | false - - output: #FS -} - // Copy files from one FS tree to another #Copy: { $dagger: task: _name: "Copy" diff --git a/tests/tasks.bats b/tests/tasks.bats index a0d6fc8f..ae1eef5a 100644 --- a/tests/tasks.bats +++ b/tests/tasks.bats @@ -58,16 +58,15 @@ setup() { @test "task: #Mkdir" { + # Make directory cd "$TESTDIR"/tasks/mkdir "$DAGGER" --europa up ./mkdir.cue -} -@test "task: #Mkdir: create parents" { + # Create parents cd "$TESTDIR"/tasks/mkdir "$DAGGER" --europa up ./mkdir_parents.cue -} -@test "task: #Mkdir failure: disable parents creation" { + # Disable parents creation cd "$TESTDIR"/tasks/mkdir run "$DAGGER" --europa up ./mkdir_failure_disable_parents.cue assert_failure diff --git a/tests/tasks/mkdir/mkdir.cue b/tests/tasks/mkdir/mkdir.cue index 886ec29b..5305bab8 100644 --- a/tests/tasks/mkdir/mkdir.cue +++ b/tests/tasks/mkdir/mkdir.cue @@ -12,7 +12,7 @@ engine.#Plan & { mkdir: engine.#Mkdir & { input: image.output - path: "/test" + path: "/test" } writeChecker: engine.#WriteFile & { @@ -24,10 +24,10 @@ engine.#Plan & { readChecker: engine.#ReadFile & { input: writeChecker.output - path: "/test/foo" + path: "/test/foo" } & { // assert result contents: "bar" } } -} \ No newline at end of file +} diff --git a/tests/tasks/mkdir/mkdir_failure_disable_parents.cue b/tests/tasks/mkdir/mkdir_failure_disable_parents.cue index 9cf76775..8888400d 100644 --- a/tests/tasks/mkdir/mkdir_failure_disable_parents.cue +++ b/tests/tasks/mkdir/mkdir_failure_disable_parents.cue @@ -11,8 +11,8 @@ engine.#Plan & { } mkdir: engine.#Mkdir & { - input: image.output - path: "/test/baz" + input: image.output + path: "/test/baz" parents: false } @@ -25,10 +25,10 @@ engine.#Plan & { readChecker: engine.#ReadFile & { input: writeChecker.output - path: "/test/baz/foo" + path: "/test/baz/foo" } & { // assert result contents: "bar" } } -} \ No newline at end of file +} diff --git a/tests/tasks/mkdir/mkdir_parents.cue b/tests/tasks/mkdir/mkdir_parents.cue index 163608ae..7d642382 100644 --- a/tests/tasks/mkdir/mkdir_parents.cue +++ b/tests/tasks/mkdir/mkdir_parents.cue @@ -12,7 +12,7 @@ engine.#Plan & { mkdir: engine.#Mkdir & { input: image.output - path: "/test/baz" + path: "/test/baz" } writeChecker: engine.#WriteFile & { @@ -24,10 +24,10 @@ engine.#Plan & { readChecker: engine.#ReadFile & { input: writeChecker.output - path: "/test/baz/foo" + path: "/test/baz/foo" } & { // assert result contents: "bar" } } -} \ No newline at end of file +}