From 380c15f5f44ff9a52de81d171bacd8a76b521494 Mon Sep 17 00:00:00 2001 From: Joel Longtine Date: Tue, 14 Dec 2021 16:32:31 -0700 Subject: [PATCH 1/7] engine.#WriteFile Signed-off-by: Joel Longtine --- plan/task/writefile.go | 90 +++++++++++++++++++ stdlib/europa/dagger/engine/fs.cue | 10 +++ tests/cue.mod/module.cue | 1 + tests/cue.mod/pkg/.gitignore | 3 + tests/tasks.bats | 11 +++ tests/tasks/write_file/cue.mod/module.cue | 1 + tests/tasks/write_file/cue.mod/pkg/.gitignore | 3 + tests/tasks/write_file/write_file.cue | 26 ++++++ .../write_file_failure_diff_contents.cue | 26 ++++++ 9 files changed, 171 insertions(+) create mode 100644 plan/task/writefile.go create mode 100644 tests/cue.mod/module.cue create mode 100644 tests/cue.mod/pkg/.gitignore create mode 100644 tests/tasks/write_file/cue.mod/module.cue create mode 100644 tests/tasks/write_file/cue.mod/pkg/.gitignore create mode 100644 tests/tasks/write_file/write_file.cue create mode 100644 tests/tasks/write_file/write_file_failure_diff_contents.cue diff --git a/plan/task/writefile.go b/plan/task/writefile.go new file mode 100644 index 00000000..611abb68 --- /dev/null +++ b/plan/task/writefile.go @@ -0,0 +1,90 @@ +package task + +import ( + "context" + "fmt" + "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("WriteFile", func() Task { return &writeFileTask{} }) +} + +type writeFileTask struct { +} + +func (t *writeFileTask) Run(ctx context.Context, pctx *plancontext.Context, s solver.Solver, v *compiler.Value) (*compiler.Value, error) { + var contents []byte + var err error + + path, err := v.Lookup("path").String() + if err != nil { + return nil, err + } + + switch kind := v.Lookup("contents").Kind(); kind { + // TODO: support bytes? + // case cue.BytesKind: + // contents, err = v.Lookup("contents").Bytes() + case cue.StringKind: + var str string + str, err = v.Lookup("contents").String() + if err == nil { + contents = []byte(str) + } + case cue.BottomKind: + err = fmt.Errorf("%s: WriteFile contents is not set", path) + default: + err = fmt.Errorf("%s: unhandled data type in WriteFile: %s", path, kind) + } + + if err != nil { + return nil, err + } + + mode, err := v.Lookup("mode").Int64() + + // err = fmt.Errorf("%s: unhandled data type in WriteFile: %w", path, err) + if err != nil { + return nil, err + } + + input, err := pctx.FS.FromValue(v.Lookup("input")) + + if err != nil { + return nil, err + } + + inputState, err := input.Result().ToState() + + if err != nil { + return nil, err + } + + outputState := inputState.File( + llb.Mkfile(path, fs.FileMode(mode), contents), + withCustomName(v, "WriteFile %s", path), + ) + + result, err := s.Solve(ctx, outputState, pctx.Platform.Get()) + + if err != nil { + return nil, err + } + + fs := pctx.FS.New(result) + + output := compiler.NewValue() + + if err := output.FillPath(cue.ParsePath("output"), fs.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 7632d6be..bb8f1209 100644 --- a/stdlib/europa/dagger/engine/fs.cue +++ b/stdlib/europa/dagger/engine/fs.cue @@ -8,3 +8,13 @@ package engine contents: string output: #FS } + +#WriteFile: { + _type: "WriteFile" + + input: #FS + path: string + contents: string + mode: int + output: #FS +} diff --git a/tests/cue.mod/module.cue b/tests/cue.mod/module.cue new file mode 100644 index 00000000..f8af9cef --- /dev/null +++ b/tests/cue.mod/module.cue @@ -0,0 +1 @@ +module: "" diff --git a/tests/cue.mod/pkg/.gitignore b/tests/cue.mod/pkg/.gitignore new file mode 100644 index 00000000..2d4dc1ae --- /dev/null +++ b/tests/cue.mod/pkg/.gitignore @@ -0,0 +1,3 @@ +# generated by dagger +alpha.dagger.io +dagger.lock diff --git a/tests/tasks.bats b/tests/tasks.bats index 8036dffd..fe2c25fb 100644 --- a/tests/tasks.bats +++ b/tests/tasks.bats @@ -12,4 +12,15 @@ setup() { @test "task: #ReadFile" { cd "$TESTDIR"/tasks/readfile dagger --europa up +} + +@test "task: #WriteFile" { + cd "$TESTDIR" + dagger --europa up ./tasks/write_file/write_file.cue +} + +@test "task: #WriteFile failure: different contents" { + cd "$TESTDIR" + run dagger --europa up ./tasks/write_file/write_file_failure_diff_contents.cue + assert_failure } \ No newline at end of file diff --git a/tests/tasks/write_file/cue.mod/module.cue b/tests/tasks/write_file/cue.mod/module.cue new file mode 100644 index 00000000..f8af9cef --- /dev/null +++ b/tests/tasks/write_file/cue.mod/module.cue @@ -0,0 +1 @@ +module: "" diff --git a/tests/tasks/write_file/cue.mod/pkg/.gitignore b/tests/tasks/write_file/cue.mod/pkg/.gitignore new file mode 100644 index 00000000..2d4dc1ae --- /dev/null +++ b/tests/tasks/write_file/cue.mod/pkg/.gitignore @@ -0,0 +1,3 @@ +# generated by dagger +alpha.dagger.io +dagger.lock diff --git a/tests/tasks/write_file/write_file.cue b/tests/tasks/write_file/write_file.cue new file mode 100644 index 00000000..2935c14a --- /dev/null +++ b/tests/tasks/write_file/write_file.cue @@ -0,0 +1,26 @@ +package main + +import ( + "alpha.dagger.io/dagger/engine" +) + +engine.#Plan & { + actions: { + pull: engine.#Pull & { + source: "alpine:3.15.0@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3" + } + write: engine.#WriteFile & { + input: pull.output + path: "/testing" + contents: "1,2,3" + mode: 700 + } + readfile: engine.#ReadFile & { + input: write.output + path: "/testing" + } & { + // assert result + contents: "1,2,3" + } + } +} diff --git a/tests/tasks/write_file/write_file_failure_diff_contents.cue b/tests/tasks/write_file/write_file_failure_diff_contents.cue new file mode 100644 index 00000000..fde16a5a --- /dev/null +++ b/tests/tasks/write_file/write_file_failure_diff_contents.cue @@ -0,0 +1,26 @@ +package main + +import ( + "alpha.dagger.io/dagger/engine" +) + +engine.#Plan & { + actions: { + pull: engine.#Pull & { + source: "alpine:3.15.0@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3" + } + write: engine.#WriteFile & { + input: pull.output + path: "/testing" + contents: "1,2,3,4" + mode: 700 + } + readfile: engine.#ReadFile & { + input: write.output + path: "/testing" + } & { + // assert result + contents: "1,2,3" + } + } +} From f47dd3e877d50ef2fa6c5e37a3d8150775e3f415 Mon Sep 17 00:00:00 2001 From: Joel Longtine Date: Wed, 15 Dec 2021 09:50:08 -0700 Subject: [PATCH 2/7] Add docs Signed-off-by: Joel Longtine --- docs/reference/europa/dagger/engine/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/reference/europa/dagger/engine/README.md b/docs/reference/europa/dagger/engine/README.md index f2ecc560..d3965862 100644 --- a/docs/reference/europa/dagger/engine/README.md +++ b/docs/reference/europa/dagger/engine/README.md @@ -99,3 +99,13 @@ _No input._ ### engine.#Service Outputs _No output._ + +## engine.#WriteFile + +### engine.#WriteFile Inputs + +_No input._ + +### engine.#WriteFile Outputs + +_No output._ From 94f59a76cfe8c3d90a102c7fad5baebe063b43ae Mon Sep 17 00:00:00 2001 From: Joel Longtine Date: Wed, 15 Dec 2021 10:00:04 -0700 Subject: [PATCH 3/7] alpha.dagger.io/dagger/engine -> alpha.dagger.io/europa/dagger/engine Signed-off-by: Joel Longtine --- tests/tasks/write_file/write_file.cue | 2 +- tests/tasks/write_file/write_file_failure_diff_contents.cue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/tasks/write_file/write_file.cue b/tests/tasks/write_file/write_file.cue index 2935c14a..4f84b9b9 100644 --- a/tests/tasks/write_file/write_file.cue +++ b/tests/tasks/write_file/write_file.cue @@ -1,7 +1,7 @@ package main import ( - "alpha.dagger.io/dagger/engine" + "alpha.dagger.io/europa/dagger/engine" ) engine.#Plan & { diff --git a/tests/tasks/write_file/write_file_failure_diff_contents.cue b/tests/tasks/write_file/write_file_failure_diff_contents.cue index fde16a5a..3e4fb3c8 100644 --- a/tests/tasks/write_file/write_file_failure_diff_contents.cue +++ b/tests/tasks/write_file/write_file_failure_diff_contents.cue @@ -1,7 +1,7 @@ package main import ( - "alpha.dagger.io/dagger/engine" + "alpha.dagger.io/europa/dagger/engine" ) engine.#Plan & { From be3628d93c24d4192282185b289d98fcb64ff6b1 Mon Sep 17 00:00:00 2001 From: Joel Longtine Date: Wed, 15 Dec 2021 10:00:18 -0700 Subject: [PATCH 4/7] Remove `tests/cue.mod` Signed-off-by: Joel Longtine --- tests/cue.mod/module.cue | 1 - tests/cue.mod/pkg/.gitignore | 3 --- 2 files changed, 4 deletions(-) delete mode 100644 tests/cue.mod/module.cue delete mode 100644 tests/cue.mod/pkg/.gitignore diff --git a/tests/cue.mod/module.cue b/tests/cue.mod/module.cue deleted file mode 100644 index f8af9cef..00000000 --- a/tests/cue.mod/module.cue +++ /dev/null @@ -1 +0,0 @@ -module: "" diff --git a/tests/cue.mod/pkg/.gitignore b/tests/cue.mod/pkg/.gitignore deleted file mode 100644 index 2d4dc1ae..00000000 --- a/tests/cue.mod/pkg/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# generated by dagger -alpha.dagger.io -dagger.lock From 45de510ce0a50fc532bb78be9f9ba11465bc14c6 Mon Sep 17 00:00:00 2001 From: Joel Longtine Date: Wed, 15 Dec 2021 10:04:25 -0700 Subject: [PATCH 5/7] Clean up old code Signed-off-by: Joel Longtine --- plan/task/writefile.go | 1 - 1 file changed, 1 deletion(-) diff --git a/plan/task/writefile.go b/plan/task/writefile.go index 611abb68..f92fb8b2 100644 --- a/plan/task/writefile.go +++ b/plan/task/writefile.go @@ -50,7 +50,6 @@ func (t *writeFileTask) Run(ctx context.Context, pctx *plancontext.Context, s so mode, err := v.Lookup("mode").Int64() - // err = fmt.Errorf("%s: unhandled data type in WriteFile: %w", path, err) if err != nil { return nil, err } From 9f9168ab6083d846f902a4770ed7e57d161b411b Mon Sep 17 00:00:00 2001 From: Joel Longtine Date: Wed, 15 Dec 2021 10:36:15 -0700 Subject: [PATCH 6/7] Clean up test code Signed-off-by: Joel Longtine --- tests/tasks.bats | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/tasks.bats b/tests/tasks.bats index fe2c25fb..e58cba54 100644 --- a/tests/tasks.bats +++ b/tests/tasks.bats @@ -15,12 +15,12 @@ setup() { } @test "task: #WriteFile" { - cd "$TESTDIR" - dagger --europa up ./tasks/write_file/write_file.cue + cd "$TESTDIR"/tasks/write_file + dagger --europa up ./write_file.cue } @test "task: #WriteFile failure: different contents" { - cd "$TESTDIR" - run dagger --europa up ./tasks/write_file/write_file_failure_diff_contents.cue + cd "$TESTDIR"/tasks/write_file + run dagger --europa up ./write_file_failure_diff_contents.cue assert_failure } \ No newline at end of file From d7621e24ec0b2c3d5766366f642265324982b92f Mon Sep 17 00:00:00 2001 From: Joel Longtine Date: Wed, 15 Dec 2021 13:09:20 -0700 Subject: [PATCH 7/7] Change test names Signed-off-by: Joel Longtine --- tests/tasks.bats | 8 ++++---- tests/tasks/{write_file => writefile}/cue.mod/module.cue | 0 .../{write_file => writefile}/cue.mod/pkg/.gitignore | 0 .../write_file.cue => writefile/writefile.cue} | 0 .../writefile_failure_diff_contents.cue} | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename tests/tasks/{write_file => writefile}/cue.mod/module.cue (100%) rename tests/tasks/{write_file => writefile}/cue.mod/pkg/.gitignore (100%) rename tests/tasks/{write_file/write_file.cue => writefile/writefile.cue} (100%) rename tests/tasks/{write_file/write_file_failure_diff_contents.cue => writefile/writefile_failure_diff_contents.cue} (100%) diff --git a/tests/tasks.bats b/tests/tasks.bats index e58cba54..5c111b2e 100644 --- a/tests/tasks.bats +++ b/tests/tasks.bats @@ -15,12 +15,12 @@ setup() { } @test "task: #WriteFile" { - cd "$TESTDIR"/tasks/write_file - dagger --europa up ./write_file.cue + cd "$TESTDIR"/tasks/writefile + dagger --europa up ./writefile.cue } @test "task: #WriteFile failure: different contents" { - cd "$TESTDIR"/tasks/write_file - run dagger --europa up ./write_file_failure_diff_contents.cue + cd "$TESTDIR"/tasks/writefile + run dagger --europa up ./writefile_failure_diff_contents.cue assert_failure } \ No newline at end of file diff --git a/tests/tasks/write_file/cue.mod/module.cue b/tests/tasks/writefile/cue.mod/module.cue similarity index 100% rename from tests/tasks/write_file/cue.mod/module.cue rename to tests/tasks/writefile/cue.mod/module.cue diff --git a/tests/tasks/write_file/cue.mod/pkg/.gitignore b/tests/tasks/writefile/cue.mod/pkg/.gitignore similarity index 100% rename from tests/tasks/write_file/cue.mod/pkg/.gitignore rename to tests/tasks/writefile/cue.mod/pkg/.gitignore diff --git a/tests/tasks/write_file/write_file.cue b/tests/tasks/writefile/writefile.cue similarity index 100% rename from tests/tasks/write_file/write_file.cue rename to tests/tasks/writefile/writefile.cue diff --git a/tests/tasks/write_file/write_file_failure_diff_contents.cue b/tests/tasks/writefile/writefile_failure_diff_contents.cue similarity index 100% rename from tests/tasks/write_file/write_file_failure_diff_contents.cue rename to tests/tasks/writefile/writefile_failure_diff_contents.cue