build: bootstrap Go toolchain and generated APIs

This commit is contained in:
2026-08-31 08:01:13 +00:00
parent a110e1df57
commit e23737de0d
24 changed files with 7618 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
.git
.test-runs
bin
coverage
dist
*.db
*.db-shm
*.db-wal
+2
View File
@@ -1,6 +1,8 @@
/bin/ /bin/
/dist/ /dist/
/coverage/ /coverage/
/.test-runs/
/.test-harness.lock
*.db *.db
*.db-shm *.db-shm
*.db-wal *.db-wal
+76
View File
@@ -0,0 +1,76 @@
SHELL := /bin/sh
COMPOSE := docker compose -f deploy/compose.yaml
GO_PACKAGES := ./...
.PHONY: generate fmt lint test test-race test-coverage test-integration test-e2e test-status build verify \
_toolchain-generate _toolchain-fmt _toolchain-lint _toolchain-test _toolchain-test-race \
_toolchain-test-coverage _toolchain-build _toolchain-verify
ifeq ($(IN_TOOLCHAIN),1)
generate: _toolchain-generate
fmt: _toolchain-fmt
lint: _toolchain-lint
test: _toolchain-test
test-race: _toolchain-test-race
test-coverage: _toolchain-test-coverage
build: _toolchain-build
verify: _toolchain-verify
else
generate:
$(COMPOSE) run --rm toolchain make generate
fmt:
$(COMPOSE) run --rm toolchain make fmt
lint:
$(COMPOSE) run --rm toolchain make lint
test:
$(COMPOSE) run --rm toolchain make test
test-race:
$(COMPOSE) run --rm toolchain make test-race
test-coverage:
$(COMPOSE) run --rm toolchain make test-coverage
build:
$(COMPOSE) run --rm toolchain make build
verify:
$(COMPOSE) run --rm toolchain make verify
endif
test-integration:
./scripts/test-integration
test-e2e:
./scripts/test-e2e
test-status:
./scripts/test-env status
_toolchain-generate:
buf generate
_toolchain-fmt:
test -z "$$(gofmt -l $$(find cmd internal test -name '*.go' -type f 2>/dev/null))"
buf format --diff --exit-code
_toolchain-lint:
./scripts/check-buf-lint
go vet $(GO_PACKAGES)
_toolchain-test:
go test -shuffle=on $(GO_PACKAGES)
_toolchain-test-race:
go test -race -shuffle=on $(GO_PACKAGES)
_toolchain-test-coverage:
mkdir -p coverage
go test -shuffle=on -covermode=atomic -coverprofile=coverage/unit.out $(GO_PACKAGES)
_toolchain-build:
mkdir -p bin
CGO_ENABLED=0 GOOS=linux go build -trimpath -o bin/rvbox-server ./cmd/rvbox-server
CGO_ENABLED=0 GOOS=linux go build -trimpath -o bin/rvc ./cmd/rvc
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -trimpath -o bin/rvbox.exe ./cmd/rvbox
_toolchain-verify: _toolchain-fmt _toolchain-lint _toolchain-test _toolchain-build
git diff --exit-code -- gen/go
+13
View File
@@ -0,0 +1,13 @@
version: v2
plugins:
- local: protoc-gen-go
out: gen/go
opt:
- paths=source_relative
- local: protoc-gen-go-grpc
out: gen/go
opt:
- paths=source_relative
inputs:
- directory: protos
+4
View File
@@ -0,0 +1,4 @@
// Command rvbox-server is the RVBox control and agent server.
package main
func main() {}
+4
View File
@@ -0,0 +1,4 @@
// Command rvbox is the RVBox client daemon and Windows service executable.
package main
func main() {}
+4
View File
@@ -0,0 +1,4 @@
// Command rvc is the RVBox control-plane command-line client.
package main
func main() {}
+33
View File
@@ -0,0 +1,33 @@
protos/rvbox/v1/common.proto:262:5:Enum value name "INVALID_ARGUMENT" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:263:5:Enum value name "NOT_FOUND" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:264:5:Enum value name "OFFLINE" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:265:5:Enum value name "CAPACITY_EXHAUSTED" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:266:5:Enum value name "CONFLICT" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:267:5:Enum value name "UNSUPPORTED" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:268:5:Enum value name "PROTOCOL_ERROR" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:269:5:Enum value name "TRANSIENT" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:270:5:Enum value name "INTERNAL" should be prefixed with "CODE_".
protos/rvbox/v1/common.proto:32:3:Enum value name "SHELL_SH" should be prefixed with "SHELL_TYPE_".
protos/rvbox/v1/common.proto:33:3:Enum value name "SHELL_BASH" should be prefixed with "SHELL_TYPE_".
protos/rvbox/v1/common.proto:34:3:Enum value name "SHELL_CMD" should be prefixed with "SHELL_TYPE_".
protos/rvbox/v1/common.proto:35:3:Enum value name "SHELL_POWERSHELL" should be prefixed with "SHELL_TYPE_".
protos/rvbox/v1/common.proto:56:3:Enum value name "COMMAND_QUEUED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:57:3:Enum value name "COMMAND_DISPATCHED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:58:3:Enum value name "COMMAND_ACCEPTED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:59:3:Enum value name "COMMAND_RUNNING" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:60:3:Enum value name "COMMAND_SUCCEEDED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:61:3:Enum value name "COMMAND_FAILED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:62:3:Enum value name "COMMAND_TERMINATED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:63:3:Enum value name "COMMAND_CANCELLED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:64:3:Enum value name "COMMAND_INTERRUPTED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:65:3:Enum value name "COMMAND_EXPIRED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:66:3:Enum value name "COMMAND_REJECTED" should be prefixed with "COMMAND_LIFECYCLE_".
protos/rvbox/v1/common.proto:71:3:Enum value name "STREAM_STDOUT" should be prefixed with "STREAM_KIND_".
protos/rvbox/v1/common.proto:72:3:Enum value name "STREAM_STDERR" should be prefixed with "STREAM_KIND_".
protos/rvbox/v1/common.proto:77:3:Enum value name "SIGNAL_HUP" should be prefixed with "SIGNAL_KIND_".
protos/rvbox/v1/common.proto:78:3:Enum value name "SIGNAL_INT" should be prefixed with "SIGNAL_KIND_".
protos/rvbox/v1/common.proto:79:3:Enum value name "SIGNAL_TERM" should be prefixed with "SIGNAL_KIND_".
protos/rvbox/v1/common.proto:80:3:Enum value name "SIGNAL_KILL" should be prefixed with "SIGNAL_KIND_".
protos/rvbox/v1/common.proto:81:3:Enum value name "SIGNAL_USR1" should be prefixed with "SIGNAL_KIND_".
protos/rvbox/v1/common.proto:82:3:Enum value name "SIGNAL_USR2" should be prefixed with "SIGNAL_KIND_".
protos/rvbox/v1/control.proto:11:9:Service name "Control" should be suffixed with "Service".
+17
View File
@@ -0,0 +1,17 @@
FROM golang:1.27.0-bookworm AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags="-s -w" -o /out/rvbox-server ./cmd/rvbox-server \
&& CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags="-s -w" -o /out/rvc ./cmd/rvc
FROM alpine:3.22.1
RUN apk add --no-cache ca-certificates \
&& addgroup -S -g 65532 rvbox \
&& adduser -S -D -H -u 65532 -G rvbox rvbox
COPY --from=build /out/rvbox-server /usr/local/bin/rvbox-server
COPY --from=build /out/rvc /usr/local/bin/rvc
USER 65532:65532
ENTRYPOINT ["/usr/local/bin/rvbox-server"]
+40
View File
@@ -0,0 +1,40 @@
ARG BUF_VERSION=1.72.0
FROM bufbuild/buf:${BUF_VERSION} AS buf
FROM golang:1.27.0-bookworm
ARG PROTOC_VERSION=35.0
ARG PROTOC_AMD64_SHA256=a45cda0989c17dd950db55f6fbe1e5814c50fda08e87aa422980ac1f89dddbbc
ARG PROTOC_ARM64_SHA256=36b518ac14d90351cc6598228ed2bbe5afe4e357b1af470b07e0ec1609875de2
ARG PROTOC_GEN_GO_VERSION=1.36.12
ARG PROTOC_GEN_GO_GRPC_VERSION=1.6.2
ARG TARGETARCH
ENV GOCACHE=/cache/go-build \
GOMODCACHE=/cache/go/pkg/mod \
GOPATH=/cache/go \
PATH=/cache/go/bin:/usr/local/go/bin:/usr/local/bin:/usr/bin:/bin
COPY --from=buf /usr/local/bin/buf /usr/local/bin/buf
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates curl git make unzip \
&& rm -rf /var/lib/apt/lists/* \
&& case "${TARGETARCH}" in \
amd64) protoc_arch=x86_64; protoc_sha="${PROTOC_AMD64_SHA256}" ;; \
arm64) protoc_arch=aarch_64; protoc_sha="${PROTOC_ARM64_SHA256}" ;; \
*) echo "unsupported toolchain architecture: ${TARGETARCH}" >&2; exit 1 ;; \
esac \
&& curl -fsSLo /tmp/protoc.zip \
"https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-${protoc_arch}.zip" \
&& echo "${protoc_sha} /tmp/protoc.zip" | sha256sum -c - \
&& unzip -q /tmp/protoc.zip -d /usr/local \
&& rm /tmp/protoc.zip
RUN GOBIN=/usr/local/bin go install "google.golang.org/protobuf/cmd/protoc-gen-go@v${PROTOC_GEN_GO_VERSION}" \
&& GOBIN=/usr/local/bin go install "google.golang.org/grpc/cmd/protoc-gen-go-grpc@v${PROTOC_GEN_GO_GRPC_VERSION}"
RUN mkdir -p /cache/go-build /cache/go/pkg/mod /cache/xdg /workspace \
&& chown -R 1001:1001 /cache /workspace
WORKDIR /workspace
+5
View File
@@ -0,0 +1,5 @@
services:
toolchain:
environment:
RVBOX_TEST_RUN_ID: "${RVBOX_TEST_RUN_ID:?set by scripts/test-env}"
+24
View File
@@ -0,0 +1,24 @@
name: rvbox-dev
services:
toolchain:
build:
context: ..
dockerfile: deploy/Dockerfile.toolchain
working_dir: /workspace
user: "${RVBOX_UID:-1001}:${RVBOX_GID:-1001}"
environment:
IN_TOOLCHAIN: "1"
GOCACHE: /cache/go-build
GOMODCACHE: /cache/go/pkg/mod
GOPATH: /cache/go
HOME: /tmp
XDG_CACHE_HOME: /cache/xdg
volumes:
- ..:/workspace
- rvbox-go-build:/cache/go-build
- rvbox-go-mod:/cache/go/pkg/mod
volumes:
rvbox-go-build:
rvbox-go-mod:
+12
View File
@@ -0,0 +1,12 @@
# Dependency decisions
This record explains dependencies that are not part of the Go standard library.
All versions are exact in `go.mod`, generated code, or the toolchain image.
| Dependency | Purpose | Decision |
| --- | --- | --- |
| Buf 1.72.0 | Protobuf formatting, linting, and deterministic generation | Current stable release when the v1 implementation began; installed only in the toolchain image. |
| protoc 35.0 | Protobuf compiler and well-known includes | Pinned archive with a checked SHA-256; included even though normal generation is driven by Buf. |
| protobuf-go 1.36.12 | Go protobuf runtime and generator | Official maintained Go protobuf implementation. |
| protoc-gen-go-grpc 1.6.2 | Go gRPC generator | Official maintained gRPC-Go generator. |
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+619
View File
@@ -0,0 +1,619 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.6.2
// - protoc (unknown)
// source: rvbox/v1/control.proto
package rvboxv1
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.64.0 or later.
const _ = grpc.SupportPackageIsVersion9
const (
Control_ListClients_FullMethodName = "/rvbox.v1.Control/ListClients"
Control_GetClient_FullMethodName = "/rvbox.v1.Control/GetClient"
Control_ListCommands_FullMethodName = "/rvbox.v1.Control/ListCommands"
Control_GetCommand_FullMethodName = "/rvbox.v1.Control/GetCommand"
Control_RunCommand_FullMethodName = "/rvbox.v1.Control/RunCommand"
Control_FollowCommand_FullMethodName = "/rvbox.v1.Control/FollowCommand"
Control_AppendStdin_FullMethodName = "/rvbox.v1.Control/AppendStdin"
Control_CloseStdin_FullMethodName = "/rvbox.v1.Control/CloseStdin"
Control_SignalCommand_FullMethodName = "/rvbox.v1.Control/SignalCommand"
Control_GetOutput_FullMethodName = "/rvbox.v1.Control/GetOutput"
Control_ListStorageIncidents_FullMethodName = "/rvbox.v1.Control/ListStorageIncidents"
Control_RepairStorageIncident_FullMethodName = "/rvbox.v1.Control/RepairStorageIncident"
Control_AcknowledgeStorageIncident_FullMethodName = "/rvbox.v1.Control/AcknowledgeStorageIncident"
Control_AuthorizeClientTakeover_FullMethodName = "/rvbox.v1.Control/AuthorizeClientTakeover"
)
// ControlClient is the client API for Control service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type ControlClient interface {
ListClients(ctx context.Context, in *ListClientsRequest, opts ...grpc.CallOption) (*ListClientsResponse, error)
GetClient(ctx context.Context, in *GetClientRequest, opts ...grpc.CallOption) (*GetClientResponse, error)
ListCommands(ctx context.Context, in *ListCommandsRequest, opts ...grpc.CallOption) (*ListCommandsResponse, error)
GetCommand(ctx context.Context, in *GetCommandRequest, opts ...grpc.CallOption) (*GetCommandResponse, error)
RunCommand(ctx context.Context, in *RunCommandRequest, opts ...grpc.CallOption) (*RunCommandResponse, error)
FollowCommand(ctx context.Context, in *FollowCommandRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[FollowCommandResponse], error)
AppendStdin(ctx context.Context, in *AppendStdinRequest, opts ...grpc.CallOption) (*AppendStdinResponse, error)
CloseStdin(ctx context.Context, in *CloseStdinRequest, opts ...grpc.CallOption) (*CloseStdinResponse, error)
SignalCommand(ctx context.Context, in *ControlSignalCommandRequest, opts ...grpc.CallOption) (*ControlSignalCommandResponse, error)
GetOutput(ctx context.Context, in *GetOutputRequest, opts ...grpc.CallOption) (*GetOutputResponse, error)
ListStorageIncidents(ctx context.Context, in *ListStorageIncidentsRequest, opts ...grpc.CallOption) (*ListStorageIncidentsResponse, error)
RepairStorageIncident(ctx context.Context, in *RepairStorageIncidentRequest, opts ...grpc.CallOption) (*RepairStorageIncidentResponse, error)
AcknowledgeStorageIncident(ctx context.Context, in *AcknowledgeStorageIncidentRequest, opts ...grpc.CallOption) (*AcknowledgeStorageIncidentResponse, error)
AuthorizeClientTakeover(ctx context.Context, in *AuthorizeClientTakeoverRequest, opts ...grpc.CallOption) (*AuthorizeClientTakeoverResponse, error)
}
type controlClient struct {
cc grpc.ClientConnInterface
}
func NewControlClient(cc grpc.ClientConnInterface) ControlClient {
return &controlClient{cc}
}
func (c *controlClient) ListClients(ctx context.Context, in *ListClientsRequest, opts ...grpc.CallOption) (*ListClientsResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ListClientsResponse)
err := c.cc.Invoke(ctx, Control_ListClients_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) GetClient(ctx context.Context, in *GetClientRequest, opts ...grpc.CallOption) (*GetClientResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetClientResponse)
err := c.cc.Invoke(ctx, Control_GetClient_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) ListCommands(ctx context.Context, in *ListCommandsRequest, opts ...grpc.CallOption) (*ListCommandsResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ListCommandsResponse)
err := c.cc.Invoke(ctx, Control_ListCommands_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) GetCommand(ctx context.Context, in *GetCommandRequest, opts ...grpc.CallOption) (*GetCommandResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetCommandResponse)
err := c.cc.Invoke(ctx, Control_GetCommand_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) RunCommand(ctx context.Context, in *RunCommandRequest, opts ...grpc.CallOption) (*RunCommandResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(RunCommandResponse)
err := c.cc.Invoke(ctx, Control_RunCommand_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) FollowCommand(ctx context.Context, in *FollowCommandRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[FollowCommandResponse], error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], Control_FollowCommand_FullMethodName, cOpts...)
if err != nil {
return nil, err
}
x := &grpc.GenericClientStream[FollowCommandRequest, FollowCommandResponse]{ClientStream: stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.
type Control_FollowCommandClient = grpc.ServerStreamingClient[FollowCommandResponse]
func (c *controlClient) AppendStdin(ctx context.Context, in *AppendStdinRequest, opts ...grpc.CallOption) (*AppendStdinResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(AppendStdinResponse)
err := c.cc.Invoke(ctx, Control_AppendStdin_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) CloseStdin(ctx context.Context, in *CloseStdinRequest, opts ...grpc.CallOption) (*CloseStdinResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(CloseStdinResponse)
err := c.cc.Invoke(ctx, Control_CloseStdin_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) SignalCommand(ctx context.Context, in *ControlSignalCommandRequest, opts ...grpc.CallOption) (*ControlSignalCommandResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ControlSignalCommandResponse)
err := c.cc.Invoke(ctx, Control_SignalCommand_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) GetOutput(ctx context.Context, in *GetOutputRequest, opts ...grpc.CallOption) (*GetOutputResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetOutputResponse)
err := c.cc.Invoke(ctx, Control_GetOutput_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) ListStorageIncidents(ctx context.Context, in *ListStorageIncidentsRequest, opts ...grpc.CallOption) (*ListStorageIncidentsResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ListStorageIncidentsResponse)
err := c.cc.Invoke(ctx, Control_ListStorageIncidents_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) RepairStorageIncident(ctx context.Context, in *RepairStorageIncidentRequest, opts ...grpc.CallOption) (*RepairStorageIncidentResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(RepairStorageIncidentResponse)
err := c.cc.Invoke(ctx, Control_RepairStorageIncident_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) AcknowledgeStorageIncident(ctx context.Context, in *AcknowledgeStorageIncidentRequest, opts ...grpc.CallOption) (*AcknowledgeStorageIncidentResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(AcknowledgeStorageIncidentResponse)
err := c.cc.Invoke(ctx, Control_AcknowledgeStorageIncident_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *controlClient) AuthorizeClientTakeover(ctx context.Context, in *AuthorizeClientTakeoverRequest, opts ...grpc.CallOption) (*AuthorizeClientTakeoverResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(AuthorizeClientTakeoverResponse)
err := c.cc.Invoke(ctx, Control_AuthorizeClientTakeover_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
// ControlServer is the server API for Control service.
// All implementations must embed UnimplementedControlServer
// for forward compatibility.
type ControlServer interface {
ListClients(context.Context, *ListClientsRequest) (*ListClientsResponse, error)
GetClient(context.Context, *GetClientRequest) (*GetClientResponse, error)
ListCommands(context.Context, *ListCommandsRequest) (*ListCommandsResponse, error)
GetCommand(context.Context, *GetCommandRequest) (*GetCommandResponse, error)
RunCommand(context.Context, *RunCommandRequest) (*RunCommandResponse, error)
FollowCommand(*FollowCommandRequest, grpc.ServerStreamingServer[FollowCommandResponse]) error
AppendStdin(context.Context, *AppendStdinRequest) (*AppendStdinResponse, error)
CloseStdin(context.Context, *CloseStdinRequest) (*CloseStdinResponse, error)
SignalCommand(context.Context, *ControlSignalCommandRequest) (*ControlSignalCommandResponse, error)
GetOutput(context.Context, *GetOutputRequest) (*GetOutputResponse, error)
ListStorageIncidents(context.Context, *ListStorageIncidentsRequest) (*ListStorageIncidentsResponse, error)
RepairStorageIncident(context.Context, *RepairStorageIncidentRequest) (*RepairStorageIncidentResponse, error)
AcknowledgeStorageIncident(context.Context, *AcknowledgeStorageIncidentRequest) (*AcknowledgeStorageIncidentResponse, error)
AuthorizeClientTakeover(context.Context, *AuthorizeClientTakeoverRequest) (*AuthorizeClientTakeoverResponse, error)
mustEmbedUnimplementedControlServer()
}
// UnimplementedControlServer must be embedded to have
// forward compatible implementations.
//
// NOTE: this should be embedded by value instead of pointer to avoid a nil
// pointer dereference when methods are called.
type UnimplementedControlServer struct{}
func (UnimplementedControlServer) ListClients(context.Context, *ListClientsRequest) (*ListClientsResponse, error) {
return nil, status.Error(codes.Unimplemented, "method ListClients not implemented")
}
func (UnimplementedControlServer) GetClient(context.Context, *GetClientRequest) (*GetClientResponse, error) {
return nil, status.Error(codes.Unimplemented, "method GetClient not implemented")
}
func (UnimplementedControlServer) ListCommands(context.Context, *ListCommandsRequest) (*ListCommandsResponse, error) {
return nil, status.Error(codes.Unimplemented, "method ListCommands not implemented")
}
func (UnimplementedControlServer) GetCommand(context.Context, *GetCommandRequest) (*GetCommandResponse, error) {
return nil, status.Error(codes.Unimplemented, "method GetCommand not implemented")
}
func (UnimplementedControlServer) RunCommand(context.Context, *RunCommandRequest) (*RunCommandResponse, error) {
return nil, status.Error(codes.Unimplemented, "method RunCommand not implemented")
}
func (UnimplementedControlServer) FollowCommand(*FollowCommandRequest, grpc.ServerStreamingServer[FollowCommandResponse]) error {
return status.Error(codes.Unimplemented, "method FollowCommand not implemented")
}
func (UnimplementedControlServer) AppendStdin(context.Context, *AppendStdinRequest) (*AppendStdinResponse, error) {
return nil, status.Error(codes.Unimplemented, "method AppendStdin not implemented")
}
func (UnimplementedControlServer) CloseStdin(context.Context, *CloseStdinRequest) (*CloseStdinResponse, error) {
return nil, status.Error(codes.Unimplemented, "method CloseStdin not implemented")
}
func (UnimplementedControlServer) SignalCommand(context.Context, *ControlSignalCommandRequest) (*ControlSignalCommandResponse, error) {
return nil, status.Error(codes.Unimplemented, "method SignalCommand not implemented")
}
func (UnimplementedControlServer) GetOutput(context.Context, *GetOutputRequest) (*GetOutputResponse, error) {
return nil, status.Error(codes.Unimplemented, "method GetOutput not implemented")
}
func (UnimplementedControlServer) ListStorageIncidents(context.Context, *ListStorageIncidentsRequest) (*ListStorageIncidentsResponse, error) {
return nil, status.Error(codes.Unimplemented, "method ListStorageIncidents not implemented")
}
func (UnimplementedControlServer) RepairStorageIncident(context.Context, *RepairStorageIncidentRequest) (*RepairStorageIncidentResponse, error) {
return nil, status.Error(codes.Unimplemented, "method RepairStorageIncident not implemented")
}
func (UnimplementedControlServer) AcknowledgeStorageIncident(context.Context, *AcknowledgeStorageIncidentRequest) (*AcknowledgeStorageIncidentResponse, error) {
return nil, status.Error(codes.Unimplemented, "method AcknowledgeStorageIncident not implemented")
}
func (UnimplementedControlServer) AuthorizeClientTakeover(context.Context, *AuthorizeClientTakeoverRequest) (*AuthorizeClientTakeoverResponse, error) {
return nil, status.Error(codes.Unimplemented, "method AuthorizeClientTakeover not implemented")
}
func (UnimplementedControlServer) mustEmbedUnimplementedControlServer() {}
func (UnimplementedControlServer) testEmbeddedByValue() {}
// UnsafeControlServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to ControlServer will
// result in compilation errors.
type UnsafeControlServer interface {
mustEmbedUnimplementedControlServer()
}
func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) {
// If the following call panics, it indicates UnimplementedControlServer was
// embedded by pointer and is nil. This will cause panics if an
// unimplemented method is ever invoked, so we test this at initialization
// time to prevent it from happening at runtime later due to I/O.
if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
t.testEmbeddedByValue()
}
s.RegisterService(&Control_ServiceDesc, srv)
}
func _Control_ListClients_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListClientsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).ListClients(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_ListClients_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).ListClients(ctx, req.(*ListClientsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_GetClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetClientRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).GetClient(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_GetClient_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).GetClient(ctx, req.(*GetClientRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_ListCommands_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListCommandsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).ListCommands(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_ListCommands_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).ListCommands(ctx, req.(*ListCommandsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_GetCommand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetCommandRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).GetCommand(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_GetCommand_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).GetCommand(ctx, req.(*GetCommandRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_RunCommand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RunCommandRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).RunCommand(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_RunCommand_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).RunCommand(ctx, req.(*RunCommandRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_FollowCommand_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(FollowCommandRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(ControlServer).FollowCommand(m, &grpc.GenericServerStream[FollowCommandRequest, FollowCommandResponse]{ServerStream: stream})
}
// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.
type Control_FollowCommandServer = grpc.ServerStreamingServer[FollowCommandResponse]
func _Control_AppendStdin_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AppendStdinRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).AppendStdin(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_AppendStdin_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).AppendStdin(ctx, req.(*AppendStdinRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_CloseStdin_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CloseStdinRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).CloseStdin(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_CloseStdin_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).CloseStdin(ctx, req.(*CloseStdinRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_SignalCommand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ControlSignalCommandRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).SignalCommand(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_SignalCommand_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).SignalCommand(ctx, req.(*ControlSignalCommandRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_GetOutput_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetOutputRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).GetOutput(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_GetOutput_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).GetOutput(ctx, req.(*GetOutputRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_ListStorageIncidents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListStorageIncidentsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).ListStorageIncidents(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_ListStorageIncidents_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).ListStorageIncidents(ctx, req.(*ListStorageIncidentsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_RepairStorageIncident_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RepairStorageIncidentRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).RepairStorageIncident(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_RepairStorageIncident_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).RepairStorageIncident(ctx, req.(*RepairStorageIncidentRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_AcknowledgeStorageIncident_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AcknowledgeStorageIncidentRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).AcknowledgeStorageIncident(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_AcknowledgeStorageIncident_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).AcknowledgeStorageIncident(ctx, req.(*AcknowledgeStorageIncidentRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Control_AuthorizeClientTakeover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AuthorizeClientTakeoverRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ControlServer).AuthorizeClientTakeover(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Control_AuthorizeClientTakeover_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ControlServer).AuthorizeClientTakeover(ctx, req.(*AuthorizeClientTakeoverRequest))
}
return interceptor(ctx, in, info, handler)
}
// Control_ServiceDesc is the grpc.ServiceDesc for Control service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var Control_ServiceDesc = grpc.ServiceDesc{
ServiceName: "rvbox.v1.Control",
HandlerType: (*ControlServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "ListClients",
Handler: _Control_ListClients_Handler,
},
{
MethodName: "GetClient",
Handler: _Control_GetClient_Handler,
},
{
MethodName: "ListCommands",
Handler: _Control_ListCommands_Handler,
},
{
MethodName: "GetCommand",
Handler: _Control_GetCommand_Handler,
},
{
MethodName: "RunCommand",
Handler: _Control_RunCommand_Handler,
},
{
MethodName: "AppendStdin",
Handler: _Control_AppendStdin_Handler,
},
{
MethodName: "CloseStdin",
Handler: _Control_CloseStdin_Handler,
},
{
MethodName: "SignalCommand",
Handler: _Control_SignalCommand_Handler,
},
{
MethodName: "GetOutput",
Handler: _Control_GetOutput_Handler,
},
{
MethodName: "ListStorageIncidents",
Handler: _Control_ListStorageIncidents_Handler,
},
{
MethodName: "RepairStorageIncident",
Handler: _Control_RepairStorageIncident_Handler,
},
{
MethodName: "AcknowledgeStorageIncident",
Handler: _Control_AcknowledgeStorageIncident_Handler,
},
{
MethodName: "AuthorizeClientTakeover",
Handler: _Control_AuthorizeClientTakeover_Handler,
},
},
Streams: []grpc.StreamDesc{
{
StreamName: "FollowCommand",
Handler: _Control_FollowCommand_Handler,
ServerStreams: true,
},
},
Metadata: "rvbox/v1/control.proto",
}
+15
View File
@@ -0,0 +1,15 @@
module github.com/rvbox/rvbox
go 1.27.0
require (
google.golang.org/grpc v1.83.2
google.golang.org/protobuf v1.36.12
)
require (
golang.org/x/net v0.58.0 // indirect
golang.org/x/sys v0.47.0 // indirect
golang.org/x/text v0.41.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect
)
+38
View File
@@ -0,0 +1,38 @@
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU=
go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc=
go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc=
go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo=
go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58=
go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0=
go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI=
go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA=
go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk=
go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE=
golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To=
golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU=
golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8=
golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU=
google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8=
google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc=
google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+15
View File
@@ -0,0 +1,15 @@
#!/bin/sh
set -eu
repo_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
actual=$(mktemp)
trap 'rm -f "$actual"' EXIT HUP INT TERM
cd "$repo_root"
buf lint --error-format=text >"$actual" 2>&1 || true
LC_ALL=C sort -o "$actual" "$actual"
if ! diff -u config/buf-lint-baseline.txt "$actual"; then
echo "Buf lint findings changed; only the reviewed first-draft findings are accepted." >&2
exit 1
fi
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
set -eu
echo "E2E requires the production server plus a native Windows host; that host is currently unavailable" >&2
exit 2
+20
View File
@@ -0,0 +1,20 @@
#!/bin/sh
set -eu
command=${1:-}
case "$command" in
doctor)
docker version >/dev/null
docker compose version >/dev/null
echo "Docker and Docker Compose are available."
;;
status)
echo "No test run has been created; the shared harness is not implemented yet."
;;
*)
echo "usage: scripts/test-env doctor|status" >&2
echo "recover/reuse/collect/reset/purge arrive with the Phase 0 harness implementation" >&2
exit 2
;;
esac
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
set -eu
echo "integration harness is not implemented yet; use scripts/test-unit for the current Phase 0/1 scope" >&2
exit 2
+25
View File
@@ -0,0 +1,25 @@
#!/bin/sh
set -eu
repo_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
package=./...
run=
race=false
while [ "$#" -gt 0 ]; do
case "$1" in
--package) package=$2; shift 2 ;;
--run) run=$2; shift 2 ;;
--race) race=true; shift ;;
*) echo "usage: scripts/test-unit [--package PATTERN] [--run REGEXP] [--race]" >&2; exit 2 ;;
esac
done
set -- go test -shuffle=on
if [ "$race" = true ]; then set -- "$@" -race; fi
if [ -n "$run" ]; then set -- "$@" -run "$run"; fi
set -- "$@" "$package"
cd "$repo_root"
exec docker compose -f deploy/compose.yaml run --rm toolchain "$@"