-
Notifications
You must be signed in to change notification settings - Fork 40
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
The main advantage is that it supports executing interactive commands, including runme-in-runme, and pipes (|). On top of that, there is the new package internal/command. It gives a better interface to create commands, as well as unifies the idea of a program config that now is defined in a proto file.
- Loading branch information
Showing
43 changed files
with
6,730 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package main | ||
|
||
import ( | ||
"log" | ||
"os" | ||
"os/exec" | ||
) | ||
|
||
func main() { | ||
cmd := exec.Cmd{ | ||
Path: "/usr/local/bin/bash", | ||
Args: []string{"-l", "-c", "python"}, | ||
Stdin: os.Stdin, | ||
Stdout: os.Stdout, | ||
Stderr: os.Stderr, | ||
} | ||
|
||
if err := cmd.Start(); err != nil { | ||
log.Fatalf("failed to start: %v", err) | ||
} | ||
|
||
if err := cmd.Wait(); err != nil { | ||
log.Fatalf("failed to wait: %v", err) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
syntax = "proto3"; | ||
|
||
package runme.runner.v2alpha1; | ||
|
||
option go_package = "github.com/stateful/runme/internal/gen/proto/go/runme/runner/v1;runnerv1"; | ||
|
||
enum CommandMode { | ||
COMMAND_MODE_UNSPECIFIED = 0; | ||
COMMAND_MODE_INLINE = 1; | ||
COMMAND_MODE_FILE = 2; | ||
} | ||
|
||
// ProgramConfig is a configuration for a program to execute. | ||
// From this configuration, any program can be built. | ||
message ProgramConfig { | ||
// program_name is a name of the program to execute. | ||
// If it's not a path (relative or absolute), the runner | ||
// will try to resolve the name. | ||
// For example: "sh", "/bin/bash". | ||
string program_name = 1; | ||
|
||
// arguments is a list of arguments passed to the program. | ||
repeated string arguments = 2; | ||
|
||
// directory to execute the program in. | ||
string directory = 3; | ||
|
||
// env is a list of additional environment variables | ||
// that will be injected to the executed program. | ||
repeated string env = 4; | ||
|
||
oneof source { | ||
// commands are commands to be executed by the program. | ||
// The commands are joined and executed as a script. | ||
CommandList commands = 5; | ||
|
||
// script is code to be executed by the program. | ||
// Individual lines are joined with the new line character. | ||
string script = 6; | ||
} | ||
|
||
// interactive, if true, uses a pseudo-tty to execute the program. | ||
bool interactive = 7; | ||
|
||
// TODO(adamb): understand motivation for this. In theory, source | ||
// should tell whether to execute it inline or as a file. | ||
CommandMode mode = 8; | ||
|
||
message CommandList { | ||
// commands are commands to be executed by the program. | ||
// The commands are joined and executed as a script. | ||
// For example: ["echo 'Hello, World'", "ls -l /etc"]. | ||
repeated string items = 1; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
syntax = "proto3"; | ||
|
||
package runme.runner.v2alpha1; | ||
|
||
import "google/protobuf/wrappers.proto"; | ||
import "runme/runner/v2alpha1/config.proto"; | ||
|
||
option go_package = "github.com/stateful/runme/internal/gen/proto/go/runme/runner/v1;runnerv1"; | ||
|
||
message Project { | ||
// root is a root directory of the project. | ||
// The semantic is the same as for the "--project" | ||
// flag in "runme". | ||
string root = 1; | ||
|
||
// env_load_order is list of environment files | ||
// to try and load env from. | ||
repeated string env_load_order = 2; | ||
} | ||
|
||
message Session { | ||
string id = 1; | ||
|
||
// env keeps track of session environment variables. | ||
// They can be modified by executing programs which | ||
// alter them through "export" and "unset" commands. | ||
repeated string env = 2; | ||
|
||
// metadata is a map of client specific metadata. | ||
map<string, string> metadata = 3; | ||
} | ||
|
||
message CreateSessionRequest { | ||
// metadata is a map of client specific metadata. | ||
map<string, string> metadata = 1; | ||
|
||
// env field provides an initial set of environment variables | ||
// for a newly created session. | ||
repeated string env = 2; | ||
|
||
// project from which to load environment variables. | ||
// They will be appended to the list from the env field. | ||
// The env field has a higher priority. | ||
optional Project project = 3; | ||
} | ||
|
||
message CreateSessionResponse { | ||
Session session = 1; | ||
} | ||
|
||
message GetSessionRequest { | ||
string id = 1; | ||
} | ||
|
||
message GetSessionResponse { | ||
Session session = 1; | ||
} | ||
|
||
message ListSessionsRequest {} | ||
|
||
message ListSessionsResponse { | ||
repeated Session sessions = 1; | ||
} | ||
|
||
message DeleteSessionRequest { | ||
string id = 1; | ||
} | ||
|
||
message DeleteSessionResponse {} | ||
|
||
enum ExecuteStop { | ||
EXECUTE_STOP_UNSPECIFIED = 0; | ||
EXECUTE_STOP_INTERRUPT = 1; | ||
EXECUTE_STOP_KILL = 2; | ||
} | ||
|
||
// SessionStrategy determines a session selection in | ||
// an initial execute request. | ||
enum SessionStrategy { | ||
// Uses the session_id field to determine the session. | ||
// If none is present, a new session is created. | ||
SESSION_STRATEGY_UNSPECIFIED = 0; | ||
// Uses the most recent session on the server. | ||
// If there is none, a new one is created. | ||
SESSION_STRATEGY_MOST_RECENT = 1; | ||
} | ||
|
||
message Winsize { | ||
uint32 rows = 1; | ||
uint32 cols = 2; | ||
uint32 x = 3; | ||
uint32 y = 4; | ||
} | ||
|
||
message ExecuteRequest { | ||
runme.runner.v2alpha1.ProgramConfig config = 1; | ||
|
||
// input_data is a byte array that will be send as input | ||
// to the program. | ||
bytes input_data = 8; | ||
|
||
// stop requests the running process to be stopped. | ||
// It is allowed only in the consecutive calls. | ||
ExecuteStop stop = 9; | ||
|
||
// sets pty winsize | ||
// has no effect in non-interactive mode | ||
optional Winsize winsize = 10; | ||
|
||
// background, if true, will send process' PID as a first response. | ||
bool background = 11; | ||
|
||
// session_id indicates in which Session the program should execute. | ||
// Executing in a Session might provide additional context like | ||
// environment variables. | ||
string session_id = 20; | ||
|
||
// session_strategy is a strategy for selecting the session. | ||
SessionStrategy session_strategy = 21; | ||
|
||
// project used to load environment variables from .env files. | ||
optional Project project = 22; | ||
|
||
// store_last_output, if true, will store the stdout of | ||
// the last ran block in the environment variable `__`. | ||
bool store_last_output = 23; | ||
|
||
// language_id indicates a language to exeucute scripts/commands. | ||
string language_id = 25; | ||
|
||
// file_extension is associated with the script. | ||
string file_extension = 26; | ||
} | ||
|
||
message ProcessPID { | ||
int64 pid = 1; | ||
} | ||
|
||
message ExecuteResponse { | ||
// exit_code is sent only in the final message. | ||
google.protobuf.UInt32Value exit_code = 1; | ||
|
||
// stdout_data contains bytes from stdout since the last response. | ||
bytes stdout_data = 2; | ||
|
||
// stderr_data contains bytes from stderr since the last response. | ||
bytes stderr_data = 3; | ||
|
||
// pid contains the process' PID. | ||
// This is only sent once in an initial response | ||
// for background processes. | ||
ProcessPID pid = 4; | ||
} | ||
|
||
service RunnerService { | ||
rpc CreateSession(CreateSessionRequest) returns (CreateSessionResponse) {} | ||
rpc GetSession(GetSessionRequest) returns (GetSessionResponse) {} | ||
rpc ListSessions(ListSessionsRequest) returns (ListSessionsResponse) {} | ||
rpc DeleteSession(DeleteSessionRequest) returns (DeleteSessionResponse) {} | ||
|
||
// Execute executes a program. Examine "ExecuteRequest" to explore | ||
// configuration options. | ||
// | ||
// It's a bidirectional stream RPC method. It expects the first | ||
// "ExecuteRequest" to contain details of a program to execute. | ||
// Subsequent "ExecuteRequest" should only contain "input_data" as | ||
// other fields will be ignored. | ||
rpc Execute(stream ExecuteRequest) returns (stream ExecuteResponse) {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.