Skip to main content

Exec Library

Introduction​

A builder for executing commands.

Sources​

https://github.com/milaboratory/platforma/tree/main/sdk/workflow-tengo/src/exec

API​

Import​

exec := import("@platforma-sdk/workflow-tengo:exec")

builder​

Creates a new builder for constructing and executing commands.

Example​

mixcrSw := assets.importSoftware("@platforma-open/milaboratories.software-mixcr:main")
mixcrForBackCmd := exec.builder().
software(mixcrSw).
secret("MI_LICENSE", "MI_LICENSE").
printErrStreamToStdout().
arg("presetSpecificationsForBack").
addFile("preset.yaml", aFile).
arg("preset.yaml").
arg("presetForBack.json").
saveFileContent("presetForBack.json").
run()

presetSpecForBackContent := mixcrForBackCmd.getFileContent("presetForBack.json")

Builder API​

cmd​

Sets the command to be executed, e.g. /usr/bin/env or sh.

Arguments:​

  • commandName: string - the name of the command.

Example:​

exec.builder().cmd("/usr/bin/bash")

software​

Sets the software to be executed.

Arguments:​

  • software: softwareInfo - the software to execute that can be got from assets library.

Example:​

mixcrSw := assets.importSoftware("@platforma-open/milaboratories.software-mixcr:main")
cmd := exec.builder().software(mixcrSw)

arg​

Adds an argument to the command.

Arguments:​

  • arg: string - the argument to add.

Example:​

exec.builder().
cmd("aCommand").
arg("argument1").
arg("argument2")

env​

Sets an environment variable.

Arguments:​

  • name: string - the name of the environment variable.
  • value: string - the value of the environment variable.

Example:​

exec.builder.
cmd("/bin/bash").
arg("-c").
arg("echo $ANSWER_TO_THE_ULTIMATE_QUESTION").
env("ANSWER_TO_THE_ULTIMATE_QUESTION", "42")

envMap​

Sets multiple environment variables.

Arguments:​

  • envMap: map[string]string - a map of environment variables.

Example:​

exec.builder.
cmd("/bin/bash").
arg("-c").
arg("echo $FOO$BAR").
envMap({"FOO": "4", "BAR": "2"})

secret​

Set environment variable to value of given secret.

Arguments:​

  • secretName: string - name of secret to pass as environment variable.
  • envName: string - name of environment variable to set with value of secret.

Example:​

mixcrSw := assets.importSoftware("@platforma-open/milaboratories.software-mixcr:main")
mixcrForBackCmd := exec.builder().
software(mixcrSw).
secret("MI_LICENSE", "MI_LICENSE")

inHeavyQueue​

Execute command in the 'heavy' queue.

inMediumQueue​

Execute command in the 'medium' queue.

inLightQueue​

Execute command in the 'light' queue.

inUiQueue​

Execute command in the 'ui-tasks' queue.

cache​

Sets the cache time.

Arguments:​

  • time: duration - the cache time from times library.

nErrorLines​

Sets the number of error lines to be captured.

Arguments:​

  • lines: number - the number of error lines.

addFile​

Adds a file to the working directory

Arguments:​

  • fileName: string - the name of the input file.
  • file: reference - a resource id of the file or a field that points to it.

Example:​

exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("cat input.txt").
addFile("input.txt", aFile)

addFiles​

Adds multiple files to the working directory.

Arguments​

  • filesMap: map[string]reference - a map of file names to files' references.

Example:​

exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("cat input1.txt; cat input2.txt").
addFiles({
"input1.txt": aFile1,
"input2.txt": aFile2
})

writeFile​

Writes a file with a given content.

Arguments:​

  • fileName: string - the name of the content.
  • data: either bytes or a reference to a value resource - an encoded primitive tengo value (map or array) or a reference to a resource from which data we create a file.

Example:​

json := import("json")

exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("cat input.txt").
writeFile("input.txt", json.encode(42))

mkDir​

Creates a directory, it can be deeply nested. A path separator should be / even on Windows, path library will canonize it under the hood.

Arguments:​

  • dir: string - the directory to create.

Example:​

exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("cat ./deeply/nested/dir/input.txt").
mkDir("deeply/nested/dir").
writeFile("input.txt", json.encode(42))

addAsset​

Adds files from given asset into working directory.

Arguments:​

  • asset: assetInfo - asset info loaded from assets.importAsset().
  • destinationDir: string - path inside working directory for files to be extracted from archive.
  • pathsInArchive: string[] - paths inside the archive to be extracted into destinationDir. Empty array means 'unpack full archive'.

Example:​

asset := assets.importAsset("@platforma-open/milaboratories.software-small-binaries:small-asset")

// here we unpack file2.txt into a root of the working directory.
run := exec.builder().
addAsset(asset, ".", ["file2.txt"]).
cmd("/usr/bin/env").
arg("cat").
arg("file2.txt").
saveStdoutContent().
run()

saveFile​

Saves a file as a resource. One can use result.getFile function to get the resource.

Arguments:​

  • fileName: string - the name of the output file.

Example:​

result := exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("echo 42 > output.txt").
saveFile("output.txt").
run()

aFile := result.getFile("output.txt")

saveFileContent​

Saves a file as a content. One can use result.getFileContent function to get the resource's content.

Arguments:​

  • fileName: string - the name of the output value.

Example:​

result := exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("echo 42 > output.txt").
saveFileContent("output.txt").
run()

number42 := result.getFileContent("output.txt")

saveFileSet​

Saves files from the working directory using regular expressions. One can use result.getFileSet function to get the resource's content.

Arguments:​

  • name: string - a name to refer this file set in the outputs
  • regex: string - regex pattern. One can use https://regex101.com/ to test its regular expressions (Golang flavor should be used).

Example:​

result := exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("echo 42 > output.txt").
saveFileSet("allFilesStartedWithLetterO", "^o.*").
run()

files := result.getFileSet("allFilesStartedWithLetterO")

saveFileSetContent​

Saves files content from the exec working directory using regex. One can use result.getFileSetContent to get all contents of all files.

Arguments:​

  • name: string - a name to refer this file set in the outputs.
  • regex: string - regex pattern. One can use https://regex101.com/ to test its regular expressions (Golang flavor should be used).

Example:​

result := exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("echo 42 > output.txt").
saveFileSetContent("allFilesStartedWithLetterO", "^o.*").
run()

files := result.getFileSetContent("allFilesStartedWithLetterO")

processWorkdir​

Run a specified template after a command execution.

Arguments:​

  • name: string - the name of the processor. After the builder ran, results of the processor can be got by its name via execResult.getProcessorResult.
  • tpl: template - the template that will be run on all the files. See the example below for the shape of this template.
  • tplArgs: map[string]any - a map of inputs that will be passed as-is to the template. See the example below.

Example:​

//
// main.tengo, the main workflow file, somewhere in the body:
//
...
// Here the exec command will create a file called `file.txt`. After that, a template called workdir_processor with additional arguments will run.
run := exec.builder().
cmd("/usr/bin/env").
arg("bash").
arg("-c").
arg("echo 4 > file.txt").
processWorkdir("result", assets.importTemplate(":workdir_processor"), {argument: "2"}).
run()

return {
result: run.getProcessorResult("result")
}
...

//
// workdir_processor.tengo, the content of the template.
//
self := import("@platforma-sdk/workflow-tengo:workdir.proc")

// readFiles helps to read a file's data.
self.readFiles(func(inputs) {
return {
"dataOfMyFile": "file.txt"
}
})

// body will get several arguments:
// - inputs.workdir that is a workdir's resource.
// - inputs.dataOfMyFile with a content "4" that was got from self.readFiles
// - inputs.args that contains all arguments passed from exec.builder(). It will be {argument: "2"} in this case.
// - inputs.files with all files as resources.
self.body(func(inputs) {
return {
fileAsContent: inputs.dataOfMyFile + inputs.args.argument, // will be 42
file: self.saveFile("file.txt") // will save the file with 4
}
})

streamFile​

A command to stream a file by a given file name. For example, it can be used to view live logs if the process writes them somewhere in the working directory. One can use execResult.getFileStream to get file streams.

Arguments:​

  • fileName: string - the name of the file to stream.

Example:​

result := exec.builder().
cmd("/usr/bin/bash").
arg("-c").
arg("echo 4 > output.txt; sleep 5; echo 2 > output.txt").
streamFile("output.txt").
run()

return {
stream: result.getFileStream("output.txt")
}

stdoutFileName​

Set stdout file name. By default it's stdout.txt. One can use getStdoutStream, getStdoutFile and getStdoutFileContent to get stdout from the result.

Arguments:​

  • fileName: string - the name of the stdout.

stderrFileName​

Set stderr file name. By default it's stderr.txt. One can use getStderrStream, getStderrFile and getStderrFileContent to get stderr from the result.

Arguments:​

  • fileName: string - the name of the stderr.

saveStdoutContent​

Sets stdout to be captured as a value resource. One can use getStdoutFileContent to get stdout from the result.

saveStderrContent​

Sets stderr to be captured as a value resource. One can use getStderrFileContent to get stderr from the result.

printErrStreamToStdout​

Redirects stderr output to stdout.

run​

Executes the command.

Return:​

  • result: execResult - a structure that contains the execution results, see API below.

Result API​

getFile​

Retrieves a file.

Arguments:​

  • fileName: string

Return:​

  • file: field - a reference to the file resource.

Example:​

See saveFile example.

getFileContent​

Retrieves the content of a file.

Arguments:​

  • fileName: string

Return:​

  • content: field - a reference to the file content resource.

Example:​

See saveFileContent example.

getFileStream​

Retrieves a file stream.

Arguments:​

  • fileName: string

Return:​

  • stream: field - a reference to the file stream resource.

Example:​

See streamFile example.

getFileSet​

Retrieves a file set resource.

Arguments:​

  • fileSetName: string - name of a file set

Return:​

  • fileSet: field - a reference to the map resource with files

Example:​

See saveFileSet example.

getFileSetContent​

Retrieves a file set content resource.

Arguments:​

  • fileSetName: string - name of a file set

Return:​

  • fileSetContent: field - a reference to the map resource with files

Example:​

See saveFileSetContent example.

getProcessorResult​

Retrieves a processor result by the name of the processor.

Arguments:​

  • name: string - a name of the processor.

Return:​

  • result: field - a field where all the results of the processor will be.

Example:​

See processWorkdir example.

getStdoutStream​

Retrieves the stdout stream.

Return:​

  • stream: field

getStderrStream​

Retrieves the stderr stream.

Return:​

  • stream: field

getStdoutFile​

Retrieves the stdout file.

Return:​

  • file: field

getStderrFile​

Retrieves the stderr file.

Return:​

  • file: field

getStdoutFileContent​

Retrieves the content of the stdout file.

Return:​

  • content: field

getStderrFileContent​

Retrieves the content of the stderr file.

Return:​

  • content: field