blob: 8c56a077ed902303a39bae6b99724279cbb3adf5 [file] [log] [blame] [edit]
package isolate
import (
"context"
"encoding/json"
"os"
"path/filepath"
"go.skia.org/infra/go/exec"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/util"
)
// Upload the files specified by the given isolateFile to the isolate server.
// Returns the CAS digest.
func Upload(ctx context.Context, casInstance, baseDir, isolateFile string) (string, error) {
// Setup.
tmpDir, err := os.MkdirTemp("", "isolate")
if err != nil {
return "", skerr.Wrapf(err, "failed to create temporary dir")
}
defer util.RemoveAll(tmpDir)
// Isolate the tasks.
jsonOutput := filepath.Join(tmpDir, "isolated.json")
cmd := []string{
"isolate", "archive", "--verbose",
"--cas-instance", casInstance,
"--dump-json", jsonOutput,
"--isolate", isolateFile,
}
baseDirAbs, err := filepath.Abs(baseDir)
if err != nil {
return "", skerr.Wrap(err)
}
if _, err := exec.RunCwd(ctx, baseDirAbs, cmd...); err != nil {
return "", skerr.Wrap(err)
}
// Read the JSON output file and return the hash.
b, err := os.ReadFile(jsonOutput)
if err != nil {
return "", skerr.Wrap(err)
}
var hashes map[string]string
if err := json.Unmarshal(b, &hashes); err != nil {
return "", skerr.Wrap(err)
}
// We only provided one task, so there should only be one key in the map.
if len(hashes) != 1 {
return "", skerr.Fmt("Expected 1 hash but got %d; output: %s", len(hashes), string(b))
}
for _, hash := range hashes {
return hash, nil
}
return "", skerr.Fmt("Don't know how to read isolated output")
}