blob: d1ff805067e7c9c27b7f5131cd3612f5d75cc2c3 [file] [log] [blame]
package main
/*
FileStream example.
Run like this:
$ go run ./file_stream.go --logtostderr --project_id=skia-swarming-bots --task_name=filestream_example -o - --local
*/
import (
"context"
"flag"
"fmt"
"io"
"os"
"path/filepath"
"runtime"
"go.skia.org/infra/go/exec"
"go.skia.org/infra/go/sklog"
"go.skia.org/infra/go/util"
"go.skia.org/infra/task_driver/go/td"
)
var (
// Required flags for all TaskDrivers.
projectId = flag.String("project_id", "", "ID of the Google Cloud project.")
taskId = flag.String("task_id", "", "ID of this task.")
taskName = flag.String("task_name", "", "Name of the task.")
output = flag.String("o", "", "If provided, dump a JSON blob of step data to the given file. Prints to stdout if '-' is given.")
local = flag.Bool("local", false, "True if running locally (as opposed to in production)")
// Flags for this TaskDriver.
workdir = flag.String("workdir", os.TempDir(), "Working directory.")
)
func main() {
// Setup.
taskName := "FileStream Example"
ctx := td.StartRun(projectId, taskId, &taskName, output, local)
defer td.EndRun(ctx)
if err := example1(ctx); err != nil {
td.Fatal(ctx, err)
}
if err := example2(ctx); err != nil {
td.Fatal(ctx, err)
}
}
func example1(ctx context.Context) (rv error) {
ctx = td.StartStep(ctx, td.Props("example1"))
defer td.EndStep(ctx)
// This script writes logs to a file.
_, filename, _, ok := runtime.Caller(1)
if !ok {
return td.FailStep(ctx, fmt.Errorf("Failed to obtain path of current file."))
}
script := filepath.Join(filepath.Dir(filename), "write_logs.py")
fs, err := td.NewFileStream(ctx, "verbose", sklog.DEBUG)
if err != nil {
return td.FailStep(ctx, err)
}
defer util.Close(fs)
if _, err := exec.RunCwd(ctx, *workdir, "python", "-u", script, fs.FilePath()); err != nil {
return td.FailStep(ctx, err)
}
return nil
}
func example2(ctx context.Context) (rv error) {
ctx = td.StartStep(ctx, td.Props("example2"))
defer td.EndStep(ctx)
// File streams should also work when the file is copied over.
tmpFile := filepath.Join(*workdir, "tmpfile")
if err := util.WithWriteFile(tmpFile, func(w io.Writer) error {
if _, err := w.Write([]byte("Contents were copied (via os.Rename)")); err != nil {
return td.FailStep(ctx, err)
}
return nil
}); err != nil {
return td.FailStep(ctx, err)
}
fs, err := td.NewFileStream(ctx, "copied", sklog.DEBUG)
if err != nil {
return td.FailStep(ctx, err)
}
defer util.Close(fs)
if _, err := exec.RunCwd(ctx, *workdir, "cp", tmpFile, fs.FilePath()); err != nil {
return td.FailStep(ctx, err)
}
return nil
}