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 fromtimeslibrary.
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 fromassets.importAsset().destinationDir:string- path inside working directory for files to be extracted from archive.pathsInArchive:string[]- paths inside the archive to be extracted intodestinationDir. 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 outputsregex:string- regex pattern. One can use https://regex101.com/ to test its regular expressions (Golangflavor 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 (Golangflavor 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 viaexecResult.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 thestdout.
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 thestderr.
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:
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:
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