orchard worker run: introduce "--synthetic" and "--workers" hidden flags (#390)

* orchard worker run: introduce "--synthetic" and "--workers" hidden flags

* Use slices.Clone() instead of directly assigning slices

* Use errgroup's context instead of command's context
This commit is contained in:
Nikolay Edigaryev
2026-01-28 16:50:25 +01:00
committed by GitHub
parent 7775515a73
commit a234ec8995
8 changed files with 106 additions and 31 deletions
+4 -9
View File
@@ -11,6 +11,7 @@ import (
"os"
"path"
"path/filepath"
"slices"
"github.com/cirruslabs/orchard/internal/config"
"github.com/cirruslabs/orchard/internal/controller"
@@ -142,21 +143,15 @@ func runDev(cmd *cobra.Command, args []string) error {
return devController.Run(ctx)
})
workerName, err := worker.DefaultName()
if err != nil {
return err
}
for i := range workers {
group.Go(func() error {
workerNameLocal := workerName
workerOptsLocal := slices.Clone(additionalWorkerOpts)
if workers > 1 {
workerNameLocal = fmt.Sprintf("%s-%d", workerName, i)
workerOptsLocal = append(workerOptsLocal, worker.WithNameSuffix(fmt.Sprintf("-%d", i+1)))
}
devWorker, err := CreateDevWorker(devClient, resources,
append(additionalWorkerOpts, worker.WithName(workerNameLocal)), logger)
devWorker, err := CreateDevWorker(devClient, resources, workerOptsLocal, logger)
if err != nil {
return err
}
+57 -9
View File
@@ -11,12 +11,14 @@ import (
"net/http"
_ "net/http/pprof"
"os"
"slices"
"strings"
"github.com/cirruslabs/chacha/pkg/localnetworkhelper"
"github.com/cirruslabs/chacha/pkg/privdrop"
"github.com/cirruslabs/orchard/internal/bootstraptoken"
"github.com/cirruslabs/orchard/internal/dialer"
"github.com/cirruslabs/orchard/internal/echoserver"
"github.com/cirruslabs/orchard/internal/netconstants"
"github.com/cirruslabs/orchard/internal/worker"
"github.com/cirruslabs/orchard/pkg/client"
@@ -24,6 +26,7 @@ import (
"github.com/spf13/cobra"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"golang.org/x/sync/errgroup"
"gopkg.in/natefinch/lumberjack.v2"
)
@@ -46,6 +49,10 @@ var username string
var addressPprof string
var debug bool
// Hidden flags
var synthetic bool
var workers int
func newRunCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "run CONTROLLER_URL",
@@ -82,6 +89,14 @@ func newRunCommand() *cobra.Command {
"start pprof HTTP server on localhost:6060 for diagnostic purposes (e.g. \"localhost:6060\")")
cmd.Flags().BoolVar(&debug, "debug", false, "enable debug logging")
// Hidden flags
cmd.Flags().BoolVar(&synthetic, "synthetic", false,
"do not instantiate real Tart VM, use synthetic in-memory VMs suitable for load testing")
cmd.Flags().MarkHidden("synthetic")
cmd.Flags().IntVar(&workers, "workers", 1, "number of workers to start")
cmd.Flags().MarkHidden("workers")
return cmd
}
@@ -175,16 +190,49 @@ func runWorker(cmd *cobra.Command, args []string) (err error) {
}()
}
workerInstance, err := worker.New(
controllerClient,
workerOpts...,
)
if err != nil {
return err
}
defer workerInstance.Close()
group, ctx := errgroup.WithContext(cmd.Context())
return workerInstance.Run(cmd.Context())
if synthetic {
// Use TCP echo server to partially emulate VM's TCP/IP stack,
// this way we get port-forwarding working when running in
// synthetic mode
echoServer, err := echoserver.New()
if err != nil {
return err
}
group.Go(func() error {
return echoServer.Run(ctx)
})
dialer := dialer.DialFunc(func(ctx context.Context, network, addr string) (net.Conn, error) {
dialer := net.Dialer{}
return dialer.DialContext(ctx, "tcp", echoServer.Addr())
})
workerOpts = append(workerOpts, worker.WithSynthetic(), worker.WithDialer(dialer))
}
for i := range workers {
group.Go(func() error {
workerOptsLocal := slices.Clone(workerOpts)
if workers > 1 {
workerOptsLocal = append(workerOptsLocal, worker.WithNameSuffix(fmt.Sprintf("-%d", i+1)))
}
workerInstance, err := worker.New(controllerClient, workerOptsLocal...)
if err != nil {
return err
}
defer workerInstance.Close()
return workerInstance.Run(ctx)
})
}
return group.Wait()
}
func readBootstrapToken() (string, error) {