europa: up: support --output

Support `dagger up --output <file.json>` or `-` for stdout. This will
write the computed layer.

Can be used for tests, e.g.

```
run dagger up --output -
assert_output --partial foobar
```

Fixes #1220

Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
Andrea Luzzardi 2021-12-21 15:17:51 +01:00
parent 074dfcbdf2
commit 4feb2c7048
2 changed files with 20 additions and 5 deletions

View File

@ -3,6 +3,7 @@ package cmd
import ( import (
"context" "context"
"errors" "errors"
"fmt"
"os" "os"
"cuelang.org/go/cue" "cuelang.org/go/cue"
@ -121,10 +122,23 @@ func europaUp(ctx context.Context, cl *client.Client, args ...string) error {
} }
return cl.Do(ctx, p.Context(), func(ctx context.Context, s solver.Solver) error { return cl.Do(ctx, p.Context(), func(ctx context.Context, s solver.Solver) error {
if err := p.Up(ctx, s); err != nil { computed, err := p.Up(ctx, s)
if err != nil {
return err return err
} }
if output := viper.GetString("output"); output != "" {
data := computed.JSON().PrettyString()
if output == "-" {
fmt.Println(data)
return nil
}
err := os.WriteFile(output, []byte(data), 0600)
if err != nil {
lg.Fatal().Err(err).Str("path", output).Msg("failed to write output")
}
}
return nil return nil
}) })
} }
@ -179,6 +193,7 @@ func checkInputs(ctx context.Context, env *environment.Environment) error {
func init() { func init() {
upCmd.Flags().BoolP("force", "f", false, "Force up, disable inputs check") upCmd.Flags().BoolP("force", "f", false, "Force up, disable inputs check")
upCmd.Flags().String("output", "", "Write computed output. Prints on stdout if set to-")
if err := viper.BindPFlags(upCmd.Flags()); err != nil { if err := viper.BindPFlags(upCmd.Flags()); err != nil {
panic(err) panic(err)

View File

@ -86,7 +86,7 @@ func (p *Plan) registerLocalDirs() error {
} }
// Up executes the plan // Up executes the plan
func (p *Plan) Up(ctx context.Context, s solver.Solver) error { func (p *Plan) Up(ctx context.Context, s solver.Solver) (*compiler.Value, error) {
ctx, span := otel.Tracer("dagger").Start(ctx, "plan.Up") ctx, span := otel.Tracer("dagger").Start(ctx, "plan.Up")
defer span.End() defer span.End()
@ -98,7 +98,7 @@ func (p *Plan) Up(ctx context.Context, s solver.Solver) error {
newRunner(p.context, s, computed), newRunner(p.context, s, computed),
) )
if err := flow.Run(ctx); err != nil { if err := flow.Run(ctx); err != nil {
return err return nil, err
} }
if src, err := computed.Source(); err == nil { if src, err := computed.Source(); err == nil {
@ -109,9 +109,9 @@ func (p *Plan) Up(ctx context.Context, s solver.Solver) error {
// Check explicitly if the context is canceled. // Check explicitly if the context is canceled.
select { select {
case <-ctx.Done(): case <-ctx.Done():
return ctx.Err() return nil, ctx.Err()
default: default:
return nil return computed, nil
} }
} }