From 78f5fdf5a76d6e11c54b9732bc26db460b20d05b Mon Sep 17 00:00:00 2001 From: Stuart Douglas Date: Sun, 25 Aug 2024 07:08:45 +1000 Subject: [PATCH] feat: kube deployment per module This changes the way runners are provisioned, and how runners are allocated. Runners are now spawned knowing exactly which kube deployment they are for, and will always immedatly download and run that deployment. For kubernetes environments replicas are controlled by creating a kube deployment for each FTL deployment, and adjusting the number of replicas. For local scaling we create the runners directly for deployments as required. This also introduces an initial kubernetes test. fixes: #2449 #2276 --- .gitignore | 1 + Dockerfile.box | 4 - Dockerfile.runner | 6 +- Justfile | 9 +- .../console/testdata/go/console/go.sum | 4 +- backend/controller/controller.go | 241 +-- .../cronjobs/dal/internal/sql/models.go | 4 +- .../cronjobs/testdata/go/cron/go.sum | 4 +- backend/controller/dal/dal.go | 142 +- backend/controller/dal/dal_test.go | 118 +- backend/controller/dal/internal/sql/models.go | 4 +- .../controller/dal/internal/sql/querier.go | 9 +- .../controller/dal/internal/sql/queries.sql | 77 +- .../dal/internal/sql/queries.sql.go | 188 +- backend/controller/dal/notify.go | 1 + backend/controller/dal/testdata/go/fsm/go.sum | 4 +- .../controller/dal/testdata/go/fsmnext/go.sum | 4 +- .../dal/testdata/go/fsmretry/go.sum | 4 +- .../ingress/testdata/go/httpingress/go.sum | 4 +- .../leases/dal/internal/sql/models.go | 4 +- .../leases/testdata/go/leases/go.sum | 4 +- .../pubsub/testdata/go/publisher/go.sum | 4 +- .../controller/pubsub/testdata/go/slow/go.sum | 4 +- .../pubsub/testdata/go/subscriber/go.sum | 4 +- backend/controller/scaling/k8s_scaling.go | 20 - .../k8sscaling/deployment_provisioner.go | 364 ++++ .../scaling/k8sscaling/k8s_scaling.go | 85 + .../kube_scaling_integration_test.go | 22 + .../k8sscaling/testdata/go/echo/echo.go | 14 + .../k8sscaling/testdata/go/echo/ftl.toml | 2 + .../k8sscaling/testdata/go/echo/go.mod | 5 + .../k8sscaling/testdata/go/echo/go.sum | 0 .../controller/scaling/localscaling/devel.go | 33 - .../scaling/localscaling/local_scaling.go | 171 +- .../scaling/localscaling/release.go | 40 - backend/controller/scaling/scaling.go | 49 +- ...240903043046_enforce_runner_deployment.sql | 6 + .../sql/testdata/go/database/go.sum | 4 +- backend/protos/xyz/block/ftl/v1/ftl.pb.go | 1531 +++++++---------- backend/protos/xyz/block/ftl/v1/ftl.proto | 47 +- .../block/ftl/v1/ftlv1connect/ftl.connect.go | 156 -- backend/protos/xyz/block/ftl/v1/mixins.go | 14 +- backend/runner/runner.go | 110 +- cmd/ftl-controller/main.go | 8 +- deployment/Dockerfile.controller.test | 18 + deployment/Dockerfile.runner.test | 17 + deployment/Justfile | 65 +- deployment/base/db-create/kustomization.yml | 1 + deployment/base/db-migrate/db-migrate.yml | 2 +- deployment/base/db-migrate/kustomization.yml | 19 +- .../ftl-controller/deployment-config.yaml | 48 + .../base/ftl-controller/ftl-controller.yml | 2 + .../base/ftl-controller/kustomization.yml | 4 + deployment/base/ftl-controller/role.yaml | 19 + .../base/ftl-controller/role_binding.yaml | 14 + .../base/ftl-controller/service_account.yaml | 7 + deployment/base/ftl-runner/ftl-runner.yml | 45 - deployment/base/ftl-runner/kustomization.yml | 4 - deployment/base/kustomization.yml | 2 - deployment/overlays/dev/kustomization.yml | 2 +- examples/go/echo/go.sum | 4 +- examples/kotlin/echo/ftl.toml | 2 +- examples/kotlin/time/ftl.toml | 2 +- frontend/cli/cmd_box_run.go | 2 +- frontend/cli/cmd_serve.go | 2 +- frontend/cli/testdata/go/echo/go.sum | 4 +- frontend/cli/testdata/go/time/go.sum | 4 +- frontend/console/e2e/module.spec.ts | 2 +- .../src/components/StatusIndicator.tsx | 4 +- .../features/infrastructure/RunnersList.tsx | 6 +- .../protos/xyz/block/ftl/v1/ftl_connect.ts | 60 +- .../src/protos/xyz/block/ftl/v1/ftl_pb.ts | 217 +-- go-runtime/compile/testdata/go/echo/go.sum | 4 +- .../testdata/go/notexportedverb/go.sum | 4 +- go-runtime/compile/testdata/go/one/go.sum | 4 +- go-runtime/compile/testdata/go/two/go.sum | 4 +- .../compile/testdata/go/undefinedverb/go.sum | 4 +- .../encoding/testdata/go/omitempty/go.sum | 4 +- .../ftl/ftltest/testdata/go/outer/go.sum | 4 +- .../ftl/ftltest/testdata/go/pubsub/go.sum | 4 +- .../ftl/ftltest/testdata/go/subscriber/go.sum | 4 +- .../ftl/ftltest/testdata/go/verbtypes/go.sum | 4 +- .../ftl/ftltest/testdata/go/wrapped/go.sum | 4 +- .../testdata/go/runtimereflection/go.sum | 4 +- go-runtime/ftl/testdata/go/echo/go.sum | 4 +- go-runtime/ftl/testdata/go/mapper/go.sum | 4 +- .../ftl/testdata/go/typeregistry/go.sum | 4 +- go-runtime/internal/testdata/go/mapper/go.sum | 4 +- go-runtime/schema/testdata/failing/go.sum | 4 +- go-runtime/schema/testdata/fsm/go.sum | 4 +- go-runtime/schema/testdata/one/go.sum | 4 +- go-runtime/schema/testdata/parent/go.sum | 4 +- go-runtime/schema/testdata/pubsub/go.sum | 4 +- go-runtime/schema/testdata/subscriber/go.sum | 4 +- go-runtime/schema/testdata/two/go.sum | 4 +- go-runtime/schema/testdata/validation/go.sum | 4 +- go.mod | 35 +- go.sum | 90 +- internal/buildengine/testdata/alpha/go.sum | 4 +- internal/buildengine/testdata/another/go.sum | 4 +- internal/buildengine/testdata/other/go.sum | 4 +- .../configuration/dal/internal/sql/models.go | 4 +- .../encryption/testdata/go/encryption/go.sum | 4 +- internal/exec/exec.go | 2 +- internal/integration/actions.go | 8 +- internal/integration/harness.go | 49 +- .../projectconfig/testdata/go/echo/go.sum | 4 +- .../testdata/go/findconfig/go.sum | 4 +- .../testdata/go/validateconfig/go.sum | 4 +- internal/rpc/rpc.go | 6 + .../main/java/xyz/block/ftl/VerbClient.java | 2 - jvm-runtime/testdata/go/gomodule/go.sum | 4 +- sqlc.yaml | 3 +- 113 files changed, 1867 insertions(+), 2567 deletions(-) delete mode 100644 backend/controller/scaling/k8s_scaling.go create mode 100644 backend/controller/scaling/k8sscaling/deployment_provisioner.go create mode 100644 backend/controller/scaling/k8sscaling/k8s_scaling.go create mode 100644 backend/controller/scaling/k8sscaling/kube_scaling_integration_test.go create mode 100644 backend/controller/scaling/k8sscaling/testdata/go/echo/echo.go create mode 100644 backend/controller/scaling/k8sscaling/testdata/go/echo/ftl.toml create mode 100644 backend/controller/scaling/k8sscaling/testdata/go/echo/go.mod create mode 100644 backend/controller/scaling/k8sscaling/testdata/go/echo/go.sum delete mode 100644 backend/controller/scaling/localscaling/devel.go delete mode 100644 backend/controller/scaling/localscaling/release.go create mode 100644 backend/controller/sql/schema/20240903043046_enforce_runner_deployment.sql create mode 100644 deployment/Dockerfile.controller.test create mode 100644 deployment/Dockerfile.runner.test create mode 100644 deployment/base/ftl-controller/deployment-config.yaml create mode 100644 deployment/base/ftl-controller/role.yaml create mode 100644 deployment/base/ftl-controller/role_binding.yaml create mode 100644 deployment/base/ftl-controller/service_account.yaml delete mode 100644 deployment/base/ftl-runner/ftl-runner.yml delete mode 100644 deployment/base/ftl-runner/kustomization.yml diff --git a/.gitignore b/.gitignore index 698da151e8..13a6c3e5ac 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ junit*.xml /readme-tests /docs/public .ftl.lock +docker-build/ \ No newline at end of file diff --git a/Dockerfile.box b/Dockerfile.box index d925726f35..8b7962fc5e 100644 --- a/Dockerfile.box +++ b/Dockerfile.box @@ -21,9 +21,6 @@ RUN go mod download -x COPY . /src/ -# Build runner template -RUN just build-kt-runtime - # Build runner RUN just errtrace # Reset timestamps so that the build state is reset @@ -37,7 +34,6 @@ WORKDIR /root/ ENV PATH="/root/jre/bin:$PATH" COPY --from=builder /hermit/pkg/openjre-18.0.2.1_1/ ./jre/ -COPY --from=builder /src/build/template template COPY --from=builder /src/build/release/ftl . RUN mkdir deployments # Where the module artifacts are stored diff --git a/Dockerfile.runner b/Dockerfile.runner index 67de5ccb3e..c257e8e838 100644 --- a/Dockerfile.runner +++ b/Dockerfile.runner @@ -22,9 +22,6 @@ RUN go mod download -x COPY . /src/ -# Build runner template -RUN just build-kt-runtime - # Build runner RUN just errtrace # Reset timestamps so that the build state is reset @@ -41,7 +38,6 @@ WORKDIR /root/ ENV PATH="/root/jre/bin:$PATH" COPY --from=builder /hermit/pkg/openjre-18.0.2.1_1/ ./jre/ -COPY --from=builder /src/build/template template COPY --from=builder /src/build/release/ftl-runner . COPY --from=builder /src/build/release/ftl . RUN mkdir deployments @@ -52,4 +48,4 @@ ENV FTL_ENDPOINT="http://host.docker.internal:8892" ENV FTL_RUNNER_BIND="http://0.0.0.0:8893" ENV FTL_RUNNER_ADVERTISE="http://127.0.0.1:8893" -CMD ["/root/ftl-runner", "--language=kotlin", "--language=go", "--template-dir=template", "--deployment-dir=deployments"] +CMD ["/root/ftl-runner", "--template-dir=template", "--deployment-dir=deployments"] diff --git a/Justfile b/Justfile index d583d41d7f..0b048364f2 100644 --- a/Justfile +++ b/Justfile @@ -4,7 +4,6 @@ set shell := ["bash", "-c"] WATCHEXEC_ARGS := "-d 1s -e proto -e go -e sql -f sqlc.yaml" RELEASE := "build/release" VERSION := `git describe --tags --always | sed -e 's/^v//'` -RUNNER_TEMPLATE_ZIP := "backend/controller/scaling/localscaling/template.zip" TIMESTAMP := `date +%s` SCHEMA_OUT := "backend/protos/xyz/block/ftl/v1/schema/schema.proto" ZIP_DIRS := "go-runtime/compile/build-template go-runtime/compile/external-module-template go-runtime/compile/main-work-template internal/projectinit/scaffolding go-runtime/scaffolding jvm-runtime/java/scaffolding jvm-runtime/kotlin/scaffolding" @@ -79,7 +78,7 @@ build-sqlc: @mk backend/controller/sql/{db.go,models.go,querier.go,queries.sql.go} backend/controller/cronjobs/sql/{db.go,models.go,querier.go,queries.sql.go} internal/configuration/sql/{db.go,models.go,querier.go,queries.sql.go} : backend/controller/sql/queries.sql backend/controller/sql/async_queries.sql backend/controller/cronjobs/sql/queries.sql internal/configuration/sql/queries.sql backend/controller/sql/schema sqlc.yaml -- "just init-db && sqlc generate" # Build the ZIP files that are embedded in the FTL release binaries -build-zips: build-kt-runtime +build-zips: @for dir in {{ZIP_DIRS}}; do (cd $dir && mk ../$(basename ${dir}).zip : . -- "rm -f $(basename ${dir}.zip) && zip -q --symlinks -r ../$(basename ${dir}).zip ."); done # Rebuild frontend @@ -105,12 +104,6 @@ publish-extension: package-extension build-intellij-plugin: @cd frontend/intellij && gradle buildPlugin -# Kotlin runtime is temporarily disabled; these instructions create a dummy zip in place of the kotlin runtime jar for -# the runner. -build-kt-runtime: - @mkdir -p build/template/ftl && touch build/template/ftl/temp.txt - @cd build/template && zip -q --symlinks -r ../../{{RUNNER_TEMPLATE_ZIP}} . - # Format console code. format-frontend: cd {{CONSOLE_ROOT}} && pnpm run lint:fix diff --git a/backend/controller/console/testdata/go/console/go.sum b/backend/controller/console/testdata/go/console/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/backend/controller/console/testdata/go/console/go.sum +++ b/backend/controller/console/testdata/go/console/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/controller.go b/backend/controller/controller.go index f1bc5007d7..900d364820 100644 --- a/backend/controller/controller.go +++ b/backend/controller/controller.go @@ -21,7 +21,6 @@ import ( "connectrpc.com/connect" "github.com/alecthomas/atomic" - "github.com/alecthomas/concurrency" "github.com/alecthomas/kong" "github.com/alecthomas/types/either" "github.com/alecthomas/types/optional" @@ -45,7 +44,6 @@ import ( "github.com/TBD54566975/ftl/backend/controller/observability" "github.com/TBD54566975/ftl/backend/controller/pubsub" "github.com/TBD54566975/ftl/backend/controller/scaling" - "github.com/TBD54566975/ftl/backend/controller/scaling/localscaling" "github.com/TBD54566975/ftl/backend/controller/scheduledtask" "github.com/TBD54566975/ftl/backend/libdal" ftlv1 "github.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1" @@ -114,7 +112,7 @@ func (c *Config) SetDefaults() { } // Start the Controller. Blocks until the context is cancelled. -func Start(ctx context.Context, config Config, runnerScaling scaling.RunnerScaling, conn *sql.DB) error { +func Start(ctx context.Context, config Config, runnerScaling scaling.RunnerScaling, conn *sql.DB, devel bool) error { config.SetDefaults() logger := log.FromContext(ctx) @@ -135,7 +133,7 @@ func Start(ctx context.Context, config Config, runnerScaling scaling.RunnerScali logger.Infof("Web console available at: %s", config.Bind) } - svc, err := New(ctx, conn, config, runnerScaling) + svc, err := New(ctx, conn, config, devel) if err != nil { return err } @@ -175,6 +173,9 @@ func Start(ctx context.Context, config Config, runnerScaling scaling.RunnerScali rpc.PProf(), ) }) + g.Go(func() error { + return runnerScaling(ctx, *config.Bind, svc.leasesdal) + }) return g.Wait() } @@ -183,8 +184,7 @@ var _ ftlv1connect.ControllerServiceHandler = (*Service)(nil) var _ ftlv1connect.VerbServiceHandler = (*Service)(nil) type clients struct { - verb ftlv1connect.VerbServiceClient - runner ftlv1connect.RunnerServiceClient + verb ftlv1connect.VerbServiceClient } // ControllerListListener is regularly notified of the current list of controllers @@ -211,15 +211,14 @@ type Service struct { // Complete schema synchronised from the database. schema atomic.Value[*schema.Schema] - routes atomic.Value[map[string][]dal.Route] - config Config - runnerScaling scaling.RunnerScaling + routes atomic.Value[map[string][]dal.Route] + config Config increaseReplicaFailures map[string]int asyncCallsLock sync.Mutex } -func New(ctx context.Context, conn *sql.DB, config Config, runnerScaling scaling.RunnerScaling) (*Service, error) { +func New(ctx context.Context, conn *sql.DB, config Config, devel bool) (*Service, error) { key := config.Key if config.Key.IsZero() { key = model.NewControllerKey(config.Bind.Hostname(), config.Bind.Port()) @@ -227,7 +226,6 @@ func New(ctx context.Context, conn *sql.DB, config Config, runnerScaling scaling config.SetDefaults() // Override some defaults during development mode. - _, devel := runnerScaling.(*localscaling.LocalScaling) if devel { config.RunnerTimeout = time.Second * 5 config.ControllerTimeout = time.Second * 5 @@ -248,7 +246,6 @@ func New(ctx context.Context, conn *sql.DB, config Config, runnerScaling scaling deploymentLogsSink: newDeploymentLogsSink(ctx, db), clients: ttlcache.New(ttlcache.WithTTL[string, clients](time.Minute)), config: config, - runnerScaling: runnerScaling, increaseReplicaFailures: map[string]int{}, } svc.routes.Store(map[string][]dal.Route{}) @@ -299,9 +296,6 @@ func New(ctx context.Context, conn *sql.DB, config Config, runnerScaling scaling svc.tasks.Singleton(maybeDevelTask(svc.reapStaleControllers, time.Second*2, time.Second*20, time.Second*20)) svc.tasks.Singleton(maybeDevelTask(svc.reapStaleRunners, time.Second*2, time.Second, time.Second*10)) svc.tasks.Singleton(maybeDevelTask(svc.reapCallEvents, time.Minute*5, time.Minute, time.Minute*30)) - svc.tasks.Singleton(maybeDevelTask(svc.releaseExpiredReservations, time.Second*2, time.Second, time.Second*20)) - svc.tasks.Singleton(maybeDevelTask(svc.reconcileDeployments, time.Second*2, time.Second, time.Second*5)) - svc.tasks.Singleton(maybeDevelTask(svc.reconcileRunners, time.Second*2, time.Second, time.Second*5)) svc.tasks.Singleton(maybeDevelTask(svc.reapAsyncCalls, time.Second*5, time.Second, time.Second*5)) return svc, nil } @@ -385,12 +379,9 @@ func (s *Service) Status(ctx context.Context, req *connect.Request[ftlv1.StatusR }) replicas := map[string]int32{} protoRunners, err := slices.MapErr(status.Runners, func(r dal.Runner) (*ftlv1.StatusResponse_Runner, error) { - var deployment *string - if d, ok := r.Deployment.Get(); ok { - asString := d.String() - deployment = &asString - replicas[asString]++ - } + asString := r.Deployment.String() + deployment := &asString + replicas[asString]++ labels, err := structpb.NewStruct(r.Labels) if err != nil { return nil, fmt.Errorf("could not marshal attributes for runner %s: %w", r.Key, err) @@ -584,7 +575,7 @@ func (s *Service) RegisterRunner(ctx context.Context, stream *connect.ClientStre initialised = true } - maybeDeployment, err := msg.DeploymentAsOptional() + maybeDeployment, err := model.ParseDeploymentKey(msg.Deployment) if err != nil { return nil, connect.NewError(connect.CodeInvalidArgument, err) } @@ -627,7 +618,8 @@ func (s *Service) RegisterRunner(ctx context.Context, stream *connect.ClientStre // Check if we can contact the runner. func (s *Service) pingRunner(ctx context.Context, endpoint *url.URL) error { - client := rpc.Dial(ftlv1connect.NewRunnerServiceClient, endpoint.String(), log.Error) + // TODO: do we really need to ping the runner first thing? We should revisit this later + client := rpc.Dial(ftlv1connect.NewVerbServiceClient, endpoint.String(), log.Error) retry := backoff.Backoff{} heartbeatCtx, cancel := context.WithTimeout(ctx, s.config.RunnerTimeout) defer cancel() @@ -1231,8 +1223,7 @@ func (s *Service) clientsForRunner(key model.RunnerKey, endpoint string) clients return clientItem.Value() } client := clients{ - runner: rpc.Dial(ftlv1connect.NewRunnerServiceClient, endpoint, log.Error), - verb: rpc.Dial(ftlv1connect.NewVerbServiceClient, endpoint, log.Error), + verb: rpc.Dial(ftlv1connect.NewVerbServiceClient, endpoint, log.Error), } s.clients.Set(key.String(), client, time.Minute) return client @@ -1249,144 +1240,6 @@ func (s *Service) reapStaleRunners(ctx context.Context) (time.Duration, error) { return s.config.RunnerTimeout, nil } -// Release any expired runner deployment reservations. -func (s *Service) releaseExpiredReservations(ctx context.Context) (time.Duration, error) { - logger := log.FromContext(ctx) - count, err := s.dal.ExpireRunnerClaims(ctx) - if err != nil { - return 0, fmt.Errorf("failed to expire runner reservations: %w", err) - } else if count > 0 { - logger.Warnf("Expired %d runner reservations", count) - } - return s.config.DeploymentReservationTimeout, nil -} - -// Attempt to bring the converge the active number of replicas for each -// deployment with the desired number. -func (s *Service) reconcileDeployments(ctx context.Context) (time.Duration, error) { - reconciliation, err := s.dal.GetDeploymentsNeedingReconciliation(ctx) - if err != nil { - return 0, fmt.Errorf("failed to get deployments needing reconciliation: %w", err) - } - oldFailures := make(map[string]int) - for k, v := range s.increaseReplicaFailures { - oldFailures[k] = v - } - - var lock sync.Mutex - wg, ctx := concurrency.New(ctx, concurrency.WithConcurrencyLimit(4)) - for _, reconcile := range reconciliation { - deploymentLogger := s.getDeploymentLogger(ctx, reconcile.Deployment) - deploymentLogger.Debugf("Reconciling %s", reconcile.Deployment) - deployment := model.Deployment{ - Module: reconcile.Module, - Language: reconcile.Language, - Key: reconcile.Deployment, - } - - delete(oldFailures, reconcile.Deployment.String()) - - require := reconcile.RequiredReplicas - reconcile.AssignedReplicas - if require > 0 { - deploymentLogger.Debugf("Need %d more runners for %s", require, reconcile.Deployment) - wg.Go(func(ctx context.Context) error { - observability.Deployment.ReconciliationStart(ctx, reconcile.Module, reconcile.Deployment.String()) - defer observability.Deployment.ReconciliationComplete(ctx, reconcile.Module, reconcile.Deployment.String()) - - if err := s.deploy(ctx, deployment); err != nil { - lock.Lock() - failureCount := s.increaseReplicaFailures[deployment.Key.String()] + 1 - s.increaseReplicaFailures[deployment.Key.String()] = failureCount - lock.Unlock() - - if failureCount >= 5 { - deploymentLogger.Errorf(err, "Failed to increase deployment replicas") - } else { - deploymentLogger.Debugf("Failed to increase deployment replicas (%d): %s", failureCount, err) - } - observability.Deployment.ReconciliationFailure(ctx, reconcile.Module, reconcile.Deployment.String()) - } else { - lock.Lock() - delete(s.increaseReplicaFailures, deployment.Key.String()) - lock.Unlock() - - deploymentLogger.Debugf("Reconciled %s to %d/%d replicas", reconcile.Deployment, reconcile.AssignedReplicas+1, reconcile.RequiredReplicas) - if reconcile.AssignedReplicas+1 == reconcile.RequiredReplicas { - deploymentLogger.Infof("Deployed %s", reconcile.Deployment) - } - observability.Deployment.ReplicasUpdated(ctx, reconcile.Module, reconcile.Deployment.String(), require) - } - return nil - }) - } else if require < 0 { - observability.Deployment.ReconciliationStart(ctx, reconcile.Module, reconcile.Deployment.String()) - defer observability.Deployment.ReconciliationComplete(ctx, reconcile.Module, reconcile.Deployment.String()) - - deploymentLogger.Debugf("Need %d less runners for %s", -require, reconcile.Deployment) - wg.Go(func(ctx context.Context) error { - ok, err := s.terminateRandomRunner(ctx, deployment.Key) - if err != nil { - deploymentLogger.Warnf("Failed to terminate runner: %s", err) - observability.Deployment.ReconciliationFailure(ctx, reconcile.Module, reconcile.Deployment.String()) - } else if ok { - deploymentLogger.Debugf("Reconciled %s to %d/%d replicas", reconcile.Deployment, reconcile.AssignedReplicas-1, reconcile.RequiredReplicas) - if reconcile.AssignedReplicas-1 == reconcile.RequiredReplicas { - deploymentLogger.Infof("Stopped %s", reconcile.Deployment) - } - observability.Deployment.ReplicasUpdated(ctx, reconcile.Module, reconcile.Deployment.String(), require) - } else { - deploymentLogger.Warnf("Failed to terminate runner: no runners found") - observability.Deployment.ReconciliationFailure(ctx, reconcile.Module, reconcile.Deployment.String()) - } - return nil - }) - } - } - - // Clean up old failures, which can happen if a deployment was removed before successfully reconciling. - if len(oldFailures) > 0 { - lock.Lock() - for k := range oldFailures { - delete(s.increaseReplicaFailures, k) - } - lock.Unlock() - } - - if err := wg.Wait(); err != nil { - return 0, fmt.Errorf("failed to reconcile deployments: %w", err) - } - return time.Second, nil -} - -// Attempt to bring the number of active runners in line with the number of active deployments. -func (s *Service) reconcileRunners(ctx context.Context) (time.Duration, error) { - activeDeployments, err := s.dal.GetActiveDeployments(ctx) - if err != nil { - return 0, fmt.Errorf("failed to get deployments needing reconciliation: %w", err) - } - - totalRunners := s.config.IdleRunners - for _, deployment := range activeDeployments { - totalRunners += deployment.MinReplicas - } - - // It's possible that idles runners will get terminated here, but they will get recreated in the next - // reconciliation cycle. - idleRunners, err := s.dal.GetIdleRunners(ctx, 16, model.Labels{}) - if err != nil { - return 0, err - } - - idleRunnerKeys := slices.Map(idleRunners, func(r dal.Runner) model.RunnerKey { return r.Key }) - - err = s.runnerScaling.SetReplicas(ctx, totalRunners, idleRunnerKeys) - if err != nil { - return 0, err - } - - return time.Second, nil -} - // AsyncCallWasAdded is an optional notification that an async call was added by this controller // // It allows us to speed up execution of scheduled async calls rather than waiting for the next poll time. @@ -1751,68 +1604,6 @@ func (s *Service) expireStaleLeases(ctx context.Context) (time.Duration, error) return time.Second * 1, nil } -func (s *Service) terminateRandomRunner(ctx context.Context, key model.DeploymentKey) (bool, error) { - runners, err := s.dal.GetRunnersForDeployment(ctx, key) - if err != nil { - return false, fmt.Errorf("failed to get runner for %s: %w", key, err) - } - if len(runners) == 0 { - return false, nil - } - runner := runners[rand.Intn(len(runners))] //nolint:gosec - client := s.clientsForRunner(runner.Key, runner.Endpoint) - resp, err := client.runner.Terminate(ctx, connect.NewRequest(&ftlv1.TerminateRequest{DeploymentKey: key.String()})) - if err != nil { - return false, err - } - err = s.dal.UpsertRunner(ctx, dal.Runner{ - Key: runner.Key, - Endpoint: runner.Endpoint, - State: dal.RunnerStateFromProto(resp.Msg.State), - Labels: runner.Labels, - }) - return true, err -} - -func (s *Service) deploy(ctx context.Context, reconcile model.Deployment) error { - client, err := s.reserveRunner(ctx, reconcile) - if err != nil { - return fmt.Errorf("failed to reserve runner for %s: %w", reconcile.Key, err) - } - - _, err = client.runner.Deploy(ctx, connect.NewRequest(&ftlv1.DeployRequest{DeploymentKey: reconcile.Key.String()})) - if err != nil { - return fmt.Errorf("failed to request deploy %s: %w", reconcile.Key, err) - } - - return nil -} - -func (s *Service) reserveRunner(ctx context.Context, reconcile model.Deployment) (client clients, err error) { - // A timeout context applied to the transaction and the Runner.Reserve() Call. - reservationCtx, cancel := context.WithTimeout(ctx, s.config.DeploymentReservationTimeout) - defer cancel() - claim, err := s.dal.ReserveRunnerForDeployment(reservationCtx, reconcile.Key, s.config.DeploymentReservationTimeout, model.Labels{ - "languages": []string{reconcile.Language}, - }) - if err != nil { - return clients{}, fmt.Errorf("failed to claim runners for %s: %w", reconcile.Key, err) - } - - err = dal.WithReservation(reservationCtx, claim, func() error { - runner := claim.Runner() - client = s.clientsForRunner(runner.Key, runner.Endpoint) - _, err = client.runner.Reserve(reservationCtx, connect.NewRequest(&ftlv1.ReserveRequest{DeploymentKey: reconcile.Key.String()})) - if err != nil { - return fmt.Errorf("failed request to reserve a runner for %s at %s: %w", reconcile.Key, claim.Runner().Endpoint, err) - } - - return nil - }) - - return -} - // Periodically remove stale (ie. have not heartbeat recently) controllers from the database. func (s *Service) reapStaleControllers(ctx context.Context) (time.Duration, error) { logger := log.FromContext(ctx) diff --git a/backend/controller/cronjobs/dal/internal/sql/models.go b/backend/controller/cronjobs/dal/internal/sql/models.go index 49d53f0d84..e4c480759b 100644 --- a/backend/controller/cronjobs/dal/internal/sql/models.go +++ b/backend/controller/cronjobs/dal/internal/sql/models.go @@ -239,7 +239,7 @@ func (ns NullOrigin) Value() (driver.Value, error) { type RunnerState string const ( - RunnerStateIdle RunnerState = "idle" + RunnerStateNew RunnerState = "new" RunnerStateReserved RunnerState = "reserved" RunnerStateAssigned RunnerState = "assigned" RunnerStateDead RunnerState = "dead" @@ -473,7 +473,7 @@ type Runner struct { State RunnerState Endpoint string ModuleName optional.Option[string] - DeploymentID optional.Option[int64] + DeploymentID int64 Labels json.RawMessage } diff --git a/backend/controller/cronjobs/testdata/go/cron/go.sum b/backend/controller/cronjobs/testdata/go/cron/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/backend/controller/cronjobs/testdata/go/cron/go.sum +++ b/backend/controller/cronjobs/testdata/go/cron/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/dal/dal.go b/backend/controller/dal/dal.go index 7313c690ae..943de4d4ea 100644 --- a/backend/controller/dal/dal.go +++ b/backend/controller/dal/dal.go @@ -73,14 +73,7 @@ func DeploymentArtefactFromProto(in *ftlv1.DeploymentArtefact) (DeploymentArtefa } func runnerFromDB(row dalsql.GetRunnerRow) Runner { - var deployment optional.Option[model.DeploymentKey] - if name, ok := row.DeploymentKey.Get(); ok { - parsed, err := model.ParseDeploymentKey(name) - if err != nil { - return Runner{} - } - deployment = optional.Some(parsed) - } + attrs := model.Labels{} if err := json.Unmarshal(row.Labels, &attrs); err != nil { return Runner{} @@ -90,7 +83,7 @@ func runnerFromDB(row dalsql.GetRunnerRow) Runner { Key: row.RunnerKey, Endpoint: row.Endpoint, State: RunnerState(row.State), - Deployment: deployment, + Deployment: row.DeploymentKey, Labels: attrs, } } @@ -101,9 +94,8 @@ type Runner struct { State RunnerState ReservationTimeout optional.Option[time.Duration] Module optional.Option[string] - // Assigned deployment key, if any. - Deployment optional.Option[model.DeploymentKey] - Labels model.Labels + Deployment model.DeploymentKey + Labels model.Labels } func (r Runner) notification() {} @@ -121,7 +113,7 @@ type RunnerState string // Runner states. const ( - RunnerStateIdle = RunnerState(dalsql.RunnerStateIdle) + RunnerStateNew = RunnerState(dalsql.RunnerStateNew) RunnerStateReserved = RunnerState(dalsql.RunnerStateReserved) RunnerStateAssigned = RunnerState(dalsql.RunnerStateAssigned) RunnerStateDead = RunnerState(dalsql.RunnerStateDead) @@ -302,14 +294,6 @@ func (d *DAL) GetStatus(ctx context.Context) (Status, error) { return Status{}, err } domainRunners, err := slices.MapErr(runners, func(in dalsql.GetActiveRunnersRow) (Runner, error) { - var deployment optional.Option[model.DeploymentKey] - if keyStr, ok := in.DeploymentKey.Get(); ok { - key, err := model.ParseDeploymentKey(keyStr) - if err != nil { - return Runner{}, fmt.Errorf("invalid deployment key %q: %w", keyStr, err) - } - deployment = optional.Some(key) - } attrs := model.Labels{} if err := json.Unmarshal(in.Labels, &attrs); err != nil { return Runner{}, fmt.Errorf("invalid attributes JSON for runner %s: %w", in.RunnerKey, err) @@ -319,7 +303,7 @@ func (d *DAL) GetStatus(ctx context.Context) (Status, error) { Key: in.RunnerKey, Endpoint: in.Endpoint, State: RunnerState(in.State), - Deployment: deployment, + Deployment: in.DeploymentKey, Labels: attrs, }, nil }) @@ -366,7 +350,7 @@ func (d *DAL) GetRunnersForDeployment(ctx context.Context, deployment model.Depl Key: row.Key, Endpoint: row.Endpoint, State: RunnerState(row.State), - Deployment: optional.Some(deployment), + Deployment: deployment, Labels: attrs, }) } @@ -549,7 +533,7 @@ func (d *DAL) UpsertRunner(ctx context.Context, runner Runner) error { if err != nil { return libdal.TranslatePGError(err) } - if runner.Deployment.Ok() && !deploymentID.Ok() { + if deploymentID < 0 { return fmt.Errorf("deployment %s not found", runner.Deployment) } return nil @@ -579,53 +563,6 @@ func (d *DAL) DeregisterRunner(ctx context.Context, key model.RunnerKey) error { return nil } -// ReserveRunnerForDeployment reserves a runner for the given deployment. -// -// It returns a Reservation that must be committed or rolled back. -func (d *DAL) ReserveRunnerForDeployment(ctx context.Context, deployment model.DeploymentKey, reservationTimeout time.Duration, labels model.Labels) (Reservation, error) { - jsonLabels, err := json.Marshal(labels) - if err != nil { - return nil, fmt.Errorf("failed to JSON encode labels: %w", err) - } - ctx, cancel := context.WithTimeout(ctx, reservationTimeout) - tx, err := d.Begin(ctx) - if err != nil { - cancel() - return nil, libdal.TranslatePGError(err) - } - runner, err := tx.db.ReserveRunner(ctx, time.Now().Add(reservationTimeout), deployment, jsonLabels) - if err != nil { - if rerr := tx.Rollback(context.Background()); rerr != nil { - err = errors.Join(err, libdal.TranslatePGError(rerr)) - } - cancel() - if libdal.IsNotFound(err) { - return nil, fmt.Errorf("no idle runners found matching labels %s: %w", jsonLabels, libdal.ErrNotFound) - } - return nil, libdal.TranslatePGError(err) - } - runnerLabels := model.Labels{} - if err := json.Unmarshal(runner.Labels, &runnerLabels); err != nil { - if rerr := tx.Rollback(context.Background()); rerr != nil { - err = errors.Join(err, libdal.TranslatePGError(rerr)) - } - cancel() - return nil, fmt.Errorf("failed to JSON decode labels for runner %d: %w", runner.ID, err) - } - - return &postgresClaim{ - cancel: cancel, - tx: tx, - runner: Runner{ - Key: runner.Key, - Endpoint: runner.Endpoint, - State: RunnerState(runner.State), - Deployment: optional.Some(deployment), - Labels: runnerLabels, - }, - }, nil -} - var _ Reservation = (*postgresClaim)(nil) type postgresClaim struct { @@ -794,27 +731,6 @@ func (d *DAL) deploymentWillDeactivate(ctx context.Context, key model.Deployment return d.removeSubscriptionsAndSubscribers(ctx, key) } -// GetDeploymentsNeedingReconciliation returns deployments that have a -// mismatch between the number of assigned and required replicas. -func (d *DAL) GetDeploymentsNeedingReconciliation(ctx context.Context) ([]Reconciliation, error) { - counts, err := d.db.GetDeploymentsNeedingReconciliation(ctx) - if err != nil { - if libdal.IsNotFound(err) { - return nil, nil - } - return nil, libdal.TranslatePGError(err) - } - return slices.Map(counts, func(t dalsql.GetDeploymentsNeedingReconciliationRow) Reconciliation { - return Reconciliation{ - Deployment: t.DeploymentKey, - Module: t.ModuleName, - Language: t.Language, - AssignedReplicas: int(t.AssignedRunnersCount), - RequiredReplicas: int(t.RequiredRunnersCount), - } - }), nil -} - // GetActiveDeployments returns all active deployments. func (d *DAL) GetActiveDeployments(ctx context.Context) ([]Deployment, error) { rows, err := d.db.GetActiveDeployments(ctx) @@ -928,43 +844,6 @@ func (d *DAL) GetProcessList(ctx context.Context) ([]Process, error) { }) } -// GetIdleRunners returns up to limit idle runners matching the given labels. -// -// "labels" is a single level map of key-value pairs. Values may be scalar or -// lists of scalars. If a value is a list, it will match the labels if -// all the values in the list match. -// -// e.g. {"languages": ["kotlin"], "arch": "arm64"}' will match a runner with the labels -// '{"languages": ["go", "kotlin"], "os": "linux", "arch": "amd64", "pid": 1234}' -// -// If no runners are available, it will return an empty slice. -func (d *DAL) GetIdleRunners(ctx context.Context, limit int, labels model.Labels) ([]Runner, error) { - jsonb, err := json.Marshal(labels) - if err != nil { - return nil, fmt.Errorf("could not marshal labels: %w", err) - } - runners, err := d.db.GetIdleRunners(ctx, jsonb, int64(limit)) - if libdal.IsNotFound(err) { - return nil, nil - } else if err != nil { - return nil, libdal.TranslatePGError(err) - } - return slices.MapErr(runners, func(row dalsql.Runner) (Runner, error) { //nolint:wrapcheck - rowLabels := model.Labels{} - err := json.Unmarshal(row.Labels, &rowLabels) - if err != nil { - return Runner{}, fmt.Errorf("could not unmarshal labels: %w", err) - } - - return Runner{ - Key: row.Key, - Endpoint: row.Endpoint, - State: RunnerState(row.State), - Labels: labels, - }, nil - }) -} - // GetRoutingTable returns the endpoints for all runners for the given modules, // or all routes if modules is empty. // @@ -1008,11 +887,6 @@ func (d *DAL) GetRunner(ctx context.Context, runnerKey model.RunnerKey) (Runner, return runnerFromDB(row), nil } -func (d *DAL) ExpireRunnerClaims(ctx context.Context) (int64, error) { - count, err := d.db.ExpireRunnerReservations(ctx) - return count, libdal.TranslatePGError(err) -} - func (d *DAL) InsertLogEvent(ctx context.Context, log *LogEvent) error { var requestKey optional.Option[string] if name, ok := log.RequestKey.Get(); ok { diff --git a/backend/controller/dal/dal_test.go b/backend/controller/dal/dal_test.go index a70b1d9638..a8b648e3c2 100644 --- a/backend/controller/dal/dal_test.go +++ b/backend/controller/dal/dal_test.go @@ -105,115 +105,51 @@ func TestDAL(t *testing.T) { t.Run("RegisterRunner", func(t *testing.T) { err = dal.UpsertRunner(ctx, Runner{ - Key: runnerID, - Labels: labels, - Endpoint: "http://localhost:8080", - State: RunnerStateIdle, + Key: runnerID, + Labels: labels, + Endpoint: "http://localhost:8080", + State: RunnerStateNew, + Deployment: deploymentKey, }) assert.NoError(t, err) }) t.Run("RegisterRunnerFailsOnDuplicate", func(t *testing.T) { err = dal.UpsertRunner(ctx, Runner{ - Key: model.NewRunnerKey("localhost", "8080"), - Labels: labels, - Endpoint: "http://localhost:8080", - State: RunnerStateIdle, + Key: model.NewRunnerKey("localhost", "8080"), + Labels: labels, + Endpoint: "http://localhost:8080", + State: RunnerStateNew, + Deployment: deploymentKey, }) assert.Error(t, err) assert.IsError(t, err, libdal.ErrConflict) }) - t.Run("GetIdleRunnersForLanguage", func(t *testing.T) { - expectedRunner := Runner{ - Key: runnerID, - Labels: labels, - Endpoint: "http://localhost:8080", - State: RunnerStateIdle, - } - runners, err := dal.GetIdleRunners(ctx, 10, labels) - assert.NoError(t, err) - assert.Equal(t, []Runner{expectedRunner}, runners) - }) - expectedRunner := Runner{ Key: runnerID, Labels: labels, Endpoint: "http://localhost:8080", State: RunnerStateReserved, - Deployment: optional.Some(deploymentKey), + Deployment: deploymentKey, } - t.Run("GetDeploymentsNeedingReconciliation", func(t *testing.T) { - reconcile, err := dal.GetDeploymentsNeedingReconciliation(ctx) - assert.NoError(t, err) - assert.Equal(t, []Reconciliation{}, reconcile) - }) - t.Run("SetDeploymentReplicas", func(t *testing.T) { err := dal.SetDeploymentReplicas(ctx, deploymentKey, 1) assert.NoError(t, err) }) - t.Run("GetDeploymentsNeedingReconciliation", func(t *testing.T) { - reconcile, err := dal.GetDeploymentsNeedingReconciliation(ctx) - assert.NoError(t, err) - assert.Equal(t, []Reconciliation{{ - Deployment: deploymentKey, - Module: deployment.Module, - Language: deployment.Language, - AssignedReplicas: 0, - RequiredReplicas: 1, - }}, reconcile) - }) - - t.Run("ReserveRunnerForInvalidDeployment", func(t *testing.T) { - _, err := dal.ReserveRunnerForDeployment(ctx, model.NewDeploymentKey("invalid"), time.Second, labels) - assert.Error(t, err) - assert.IsError(t, err, libdal.ErrNotFound) - assert.EqualError(t, err, "deployment: not found") - }) - - t.Run("ReserveRunnerForDeployment", func(t *testing.T) { - claim, err := dal.ReserveRunnerForDeployment(ctx, deploymentKey, time.Millisecond*100, labels) - assert.NoError(t, err) - err = claim.Commit(context.Background()) - assert.NoError(t, err) - assert.Equal(t, expectedRunner, claim.Runner()) - }) - - t.Run("ExpireRunnerClaims", func(t *testing.T) { - time.Sleep(time.Millisecond * 500) - count, err := dal.ExpireRunnerClaims(ctx) - assert.NoError(t, err) - assert.Equal(t, 1, count) - runners, err := dal.GetIdleRunners(ctx, 10, labels) - assert.NoError(t, err) - assert.Equal(t, 1, len(runners)) - }) - - t.Run("ReserveRunnerForDeploymentFailsOnInvalidDeployment", func(t *testing.T) { - _, err = dal.ReserveRunnerForDeployment(ctx, model.NewDeploymentKey("test"), time.Second, labels) - assert.IsError(t, err, libdal.ErrNotFound) - }) - t.Run("UpdateRunnerAssigned", func(t *testing.T) { err := dal.UpsertRunner(ctx, Runner{ Key: runnerID, Labels: labels, Endpoint: "http://localhost:8080", State: RunnerStateAssigned, - Deployment: optional.Some(deploymentKey), + Deployment: deploymentKey, }) assert.NoError(t, err) }) - t.Run("GetDeploymentsNeedingReconciliation", func(t *testing.T) { - reconcile, err := dal.GetDeploymentsNeedingReconciliation(ctx) - assert.NoError(t, err) - assert.Equal(t, []Reconciliation{}, reconcile) - }) - t.Run("GetRunnersForDeployment", func(t *testing.T) { runners, err := dal.GetRunnersForDeployment(ctx, deploymentKey) assert.NoError(t, err) @@ -222,7 +158,7 @@ func TestDAL(t *testing.T) { Labels: labels, Endpoint: "http://localhost:8080", State: RunnerStateAssigned, - Deployment: optional.Some(deploymentKey), + Deployment: deploymentKey, }}, runners) }) @@ -318,32 +254,14 @@ func TestDAL(t *testing.T) { Labels: labels, Endpoint: "http://localhost:8080", State: RunnerStateAssigned, - Deployment: optional.Some(model.NewDeploymentKey("test")), + Deployment: model.NewDeploymentKey("test"), }) assert.Error(t, err) - assert.IsError(t, err, libdal.ErrNotFound) - }) - - t.Run("ReleaseRunnerReservation", func(t *testing.T) { - err = dal.UpsertRunner(ctx, Runner{ - Key: runnerID, - Labels: labels, - Endpoint: "http://localhost:8080", - State: RunnerStateIdle, - }) - assert.NoError(t, err) - }) - - t.Run("ReserveRunnerForDeploymentAfterRelease", func(t *testing.T) { - claim, err := dal.ReserveRunnerForDeployment(ctx, deploymentKey, time.Second, labels) - assert.NoError(t, err) - err = claim.Commit(context.Background()) - assert.NoError(t, err) - assert.Equal(t, expectedRunner, claim.Runner()) + assert.IsError(t, err, libdal.ErrConstraint) }) t.Run("GetRoutingTable", func(t *testing.T) { - _, err := dal.GetRoutingTable(ctx, []string{deployment.Module}) + _, err := dal.GetRoutingTable(ctx, []string{"non-existent"}) assert.IsError(t, err, libdal.ErrNotFound) }) @@ -425,8 +343,8 @@ func artefactContent(t testing.TB, artefacts []*model.Artefact) [][]byte { } func TestRunnerStateFromProto(t *testing.T) { - state := ftlv1.RunnerState_RUNNER_IDLE - assert.Equal(t, RunnerStateIdle, RunnerStateFromProto(state)) + state := ftlv1.RunnerState_RUNNER_NEW + assert.Equal(t, RunnerStateNew, RunnerStateFromProto(state)) } func normaliseEvents(events []TimelineEvent) []TimelineEvent { diff --git a/backend/controller/dal/internal/sql/models.go b/backend/controller/dal/internal/sql/models.go index 49d53f0d84..e4c480759b 100644 --- a/backend/controller/dal/internal/sql/models.go +++ b/backend/controller/dal/internal/sql/models.go @@ -239,7 +239,7 @@ func (ns NullOrigin) Value() (driver.Value, error) { type RunnerState string const ( - RunnerStateIdle RunnerState = "idle" + RunnerStateNew RunnerState = "new" RunnerStateReserved RunnerState = "reserved" RunnerStateAssigned RunnerState = "assigned" RunnerStateDead RunnerState = "dead" @@ -473,7 +473,7 @@ type Runner struct { State RunnerState Endpoint string ModuleName optional.Option[string] - DeploymentID optional.Option[int64] + DeploymentID int64 Labels json.RawMessage } diff --git a/backend/controller/dal/internal/sql/querier.go b/backend/controller/dal/internal/sql/querier.go index 8b5c82b3e2..705a67a75a 100644 --- a/backend/controller/dal/internal/sql/querier.go +++ b/backend/controller/dal/internal/sql/querier.go @@ -6,7 +6,6 @@ package sql import ( "context" - "encoding/json" "time" "github.com/TBD54566975/ftl/backend/controller/sql/sqltypes" @@ -36,7 +35,6 @@ type Querier interface { DeleteSubscribers(ctx context.Context, deployment model.DeploymentKey) ([]model.SubscriberKey, error) DeleteSubscriptions(ctx context.Context, deployment model.DeploymentKey) ([]model.SubscriptionKey, error) DeregisterRunner(ctx context.Context, key model.RunnerKey) (int64, error) - ExpireRunnerReservations(ctx context.Context) (int64, error) FailAsyncCall(ctx context.Context, error string, iD int64) (bool, error) FailAsyncCallWithRetry(ctx context.Context, arg FailAsyncCallWithRetryParams) (bool, error) FailFSMInstance(ctx context.Context, fsm schema.RefKey, key string) (bool, error) @@ -55,14 +53,11 @@ type Querier interface { // Get all artefacts matching the given digests. GetDeploymentArtefacts(ctx context.Context, deploymentID int64) ([]GetDeploymentArtefactsRow, error) GetDeploymentsByID(ctx context.Context, ids []int64) ([]Deployment, error) - // Get deployments that have a mismatch between the number of assigned and required replicas. - GetDeploymentsNeedingReconciliation(ctx context.Context) ([]GetDeploymentsNeedingReconciliationRow, error) // Get all deployments that have artefacts matching the given digests. GetDeploymentsWithArtefacts(ctx context.Context, digests [][]byte, schema []byte, count int64) ([]GetDeploymentsWithArtefactsRow, error) GetDeploymentsWithMinReplicas(ctx context.Context) ([]GetDeploymentsWithMinReplicasRow, error) GetExistingDeploymentForModule(ctx context.Context, name string) (GetExistingDeploymentForModuleRow, error) GetFSMInstance(ctx context.Context, fsm schema.RefKey, key string) (FsmInstance, error) - GetIdleRunners(ctx context.Context, labels json.RawMessage, limit int64) ([]Runner, error) // Get the runner endpoints corresponding to the given ingress route. GetIngressRoutes(ctx context.Context, method string) ([]GetIngressRoutesRow, error) GetModulesByID(ctx context.Context, ids []int64) ([]Module, error) @@ -99,8 +94,6 @@ type Querier interface { LoadAsyncCall(ctx context.Context, id int64) (AsyncCall, error) PopNextFSMEvent(ctx context.Context, fsm schema.RefKey, instanceKey string) (FsmNextEvent, error) PublishEventForTopic(ctx context.Context, arg PublishEventForTopicParams) error - // Find an idle runner and reserve it for the given deployment. - ReserveRunner(ctx context.Context, reservationTimeout time.Time, deploymentKey model.DeploymentKey, labels json.RawMessage) (Runner, error) SetDeploymentDesiredReplicas(ctx context.Context, key model.DeploymentKey, minReplicas int32) error SetNextFSMEvent(ctx context.Context, arg SetNextFSMEventParams) (int64, error) SetSubscriptionCursor(ctx context.Context, column1 model.SubscriptionKey, column2 model.TopicEventKey) error @@ -119,7 +112,7 @@ type Querier interface { // otherwise we try to retrieve the deployments.id using the key. If // there is no corresponding deployment, then the deployment ID is -1 // and the parent statement will fail due to a foreign key constraint. - UpsertRunner(ctx context.Context, arg UpsertRunnerParams) (optional.Option[int64], error) + UpsertRunner(ctx context.Context, arg UpsertRunnerParams) (int64, error) UpsertSubscription(ctx context.Context, arg UpsertSubscriptionParams) (UpsertSubscriptionRow, error) UpsertTopic(ctx context.Context, arg UpsertTopicParams) error } diff --git a/backend/controller/dal/internal/sql/queries.sql b/backend/controller/dal/internal/sql/queries.sql index 261c586b69..28cbb70278 100644 --- a/backend/controller/dal/internal/sql/queries.sql +++ b/backend/controller/dal/internal/sql/queries.sql @@ -75,13 +75,9 @@ WITH deployment_rel AS ( -- otherwise we try to retrieve the deployments.id using the key. If -- there is no corresponding deployment, then the deployment ID is -1 -- and the parent statement will fail due to a foreign key constraint. - SELECT CASE - WHEN sqlc.narg('deployment_key')::deployment_key IS NULL - THEN NULL - ELSE COALESCE((SELECT id - FROM deployments d - WHERE d.key = sqlc.narg('deployment_key')::deployment_key - LIMIT 1), -1) END AS id) + SELECT id FROM deployments d + WHERE d.key = sqlc.arg('deployment_key')::deployment_key + LIMIT 1) INSERT INTO runners (key, endpoint, state, labels, deployment_id, last_seen) VALUES ($1, @@ -93,7 +89,6 @@ VALUES ($1, ON CONFLICT (key) DO UPDATE SET endpoint = $2, state = $3, labels = $4, - deployment_id = (SELECT id FROM deployment_rel), last_seen = NOW() AT TIME ZONE 'utc' RETURNING deployment_id; @@ -110,8 +105,7 @@ FROM matches; -- name: DeregisterRunner :one WITH matches AS ( UPDATE runners - SET state = 'dead', - deployment_id = NULL + SET state = 'dead' WHERE key = sqlc.arg('key')::runner_key RETURNING 1) SELECT COUNT(*) @@ -124,11 +118,9 @@ SELECT DISTINCT ON (r.key) r.key AS runner_key r.labels, r.last_seen, r.module_name, - COALESCE(CASE - WHEN r.deployment_id IS NOT NULL - THEN d.key END, NULL) AS deployment_key + d.key AS deployment_key FROM runners r - LEFT JOIN deployments d on d.id = r.deployment_id + INNER JOIN deployments d on d.id = r.deployment_id WHERE r.state <> 'dead' ORDER BY r.key; @@ -166,13 +158,6 @@ FROM deployments d WHERE d.min_replicas > 0 ORDER BY d.key; --- name: GetIdleRunners :many -SELECT * -FROM runners -WHERE labels @> sqlc.arg('labels')::jsonb - AND state = 'idle' -LIMIT sqlc.arg('limit'); - -- name: SetDeploymentDesiredReplicas :exec UPDATE deployments SET min_replicas = $2 @@ -187,38 +172,6 @@ WHERE m.name = $1 AND min_replicas > 0 LIMIT 1; --- name: GetDeploymentsNeedingReconciliation :many --- Get deployments that have a mismatch between the number of assigned and required replicas. -SELECT d.key AS deployment_key, - m.name AS module_name, - m.language AS language, - COUNT(r.id) AS assigned_runners_count, - d.min_replicas::BIGINT AS required_runners_count -FROM deployments d - LEFT JOIN runners r ON d.id = r.deployment_id AND r.state <> 'dead' - JOIN modules m ON d.module_id = m.id -GROUP BY d.key, d.min_replicas, m.name, m.language -HAVING COUNT(r.id) <> d.min_replicas; - - --- name: ReserveRunner :one --- Find an idle runner and reserve it for the given deployment. -UPDATE runners -SET state = 'reserved', - reservation_timeout = sqlc.arg('reservation_timeout')::timestamptz, - -- If a deployment is not found, then the deployment ID is -1 - -- and the update will fail due to a FK constraint. - deployment_id = COALESCE((SELECT id - FROM deployments d - WHERE d.key = sqlc.arg('deployment_key')::deployment_key - LIMIT 1), -1) -WHERE id = (SELECT id - FROM runners r - WHERE r.state = 'idle' - AND r.labels @> sqlc.arg('labels')::jsonb - LIMIT 1 FOR UPDATE SKIP LOCKED) -RETURNING runners.*; - -- name: GetRunnerState :one SELECT state FROM runners @@ -231,11 +184,9 @@ SELECT DISTINCT ON (r.key) r.key AS runner_key r.labels, r.last_seen, r.module_name, - COALESCE(CASE - WHEN r.deployment_id IS NOT NULL - THEN d.key END, NULL) AS deployment_key + d.key AS deployment_key FROM runners r - LEFT JOIN deployments d on d.id = r.deployment_id OR r.deployment_id IS NULL + INNER JOIN deployments d on d.id = r.deployment_id WHERE r.key = sqlc.arg('key')::runner_key; -- name: GetRoutingTable :many @@ -260,18 +211,6 @@ FROM runners r WHERE state = 'assigned' AND d.key = sqlc.arg('key')::deployment_key; --- name: ExpireRunnerReservations :one -WITH rows AS ( - UPDATE runners - SET state = 'idle', - deployment_id = NULL, - reservation_timeout = NULL - WHERE state = 'reserved' - AND reservation_timeout < (NOW() AT TIME ZONE 'utc') - RETURNING 1) -SELECT COUNT(*) -FROM rows; - -- name: InsertTimelineLogEvent :exec INSERT INTO timeline ( deployment_id, diff --git a/backend/controller/dal/internal/sql/queries.sql.go b/backend/controller/dal/internal/sql/queries.sql.go index 2492088bb1..b007274202 100644 --- a/backend/controller/dal/internal/sql/queries.sql.go +++ b/backend/controller/dal/internal/sql/queries.sql.go @@ -353,8 +353,7 @@ func (q *Queries) DeleteSubscriptions(ctx context.Context, deployment model.Depl const deregisterRunner = `-- name: DeregisterRunner :one WITH matches AS ( UPDATE runners - SET state = 'dead', - deployment_id = NULL + SET state = 'dead' WHERE key = $1::runner_key RETURNING 1) SELECT COUNT(*) @@ -368,26 +367,6 @@ func (q *Queries) DeregisterRunner(ctx context.Context, key model.RunnerKey) (in return count, err } -const expireRunnerReservations = `-- name: ExpireRunnerReservations :one -WITH rows AS ( - UPDATE runners - SET state = 'idle', - deployment_id = NULL, - reservation_timeout = NULL - WHERE state = 'reserved' - AND reservation_timeout < (NOW() AT TIME ZONE 'utc') - RETURNING 1) -SELECT COUNT(*) -FROM rows -` - -func (q *Queries) ExpireRunnerReservations(ctx context.Context) (int64, error) { - row := q.db.QueryRowContext(ctx, expireRunnerReservations) - var count int64 - err := row.Scan(&count) - return count, err -} - const failAsyncCall = `-- name: FailAsyncCall :one UPDATE async_calls SET @@ -676,11 +655,9 @@ SELECT DISTINCT ON (r.key) r.key AS runner_key r.labels, r.last_seen, r.module_name, - COALESCE(CASE - WHEN r.deployment_id IS NOT NULL - THEN d.key END, NULL) AS deployment_key + d.key AS deployment_key FROM runners r - LEFT JOIN deployments d on d.id = r.deployment_id + INNER JOIN deployments d on d.id = r.deployment_id WHERE r.state <> 'dead' ORDER BY r.key ` @@ -692,7 +669,7 @@ type GetActiveRunnersRow struct { Labels json.RawMessage LastSeen time.Time ModuleName optional.Option[string] - DeploymentKey optional.Option[string] + DeploymentKey model.DeploymentKey } func (q *Queries) GetActiveRunners(ctx context.Context) ([]GetActiveRunnersRow, error) { @@ -928,57 +905,6 @@ func (q *Queries) GetDeploymentsByID(ctx context.Context, ids []int64) ([]Deploy return items, nil } -const getDeploymentsNeedingReconciliation = `-- name: GetDeploymentsNeedingReconciliation :many -SELECT d.key AS deployment_key, - m.name AS module_name, - m.language AS language, - COUNT(r.id) AS assigned_runners_count, - d.min_replicas::BIGINT AS required_runners_count -FROM deployments d - LEFT JOIN runners r ON d.id = r.deployment_id AND r.state <> 'dead' - JOIN modules m ON d.module_id = m.id -GROUP BY d.key, d.min_replicas, m.name, m.language -HAVING COUNT(r.id) <> d.min_replicas -` - -type GetDeploymentsNeedingReconciliationRow struct { - DeploymentKey model.DeploymentKey - ModuleName string - Language string - AssignedRunnersCount int64 - RequiredRunnersCount int64 -} - -// Get deployments that have a mismatch between the number of assigned and required replicas. -func (q *Queries) GetDeploymentsNeedingReconciliation(ctx context.Context) ([]GetDeploymentsNeedingReconciliationRow, error) { - rows, err := q.db.QueryContext(ctx, getDeploymentsNeedingReconciliation) - if err != nil { - return nil, err - } - defer rows.Close() - var items []GetDeploymentsNeedingReconciliationRow - for rows.Next() { - var i GetDeploymentsNeedingReconciliationRow - if err := rows.Scan( - &i.DeploymentKey, - &i.ModuleName, - &i.Language, - &i.AssignedRunnersCount, - &i.RequiredRunnersCount, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const getDeploymentsWithArtefacts = `-- name: GetDeploymentsWithArtefacts :many SELECT d.id, d.created_at, d.key as deployment_key, d.schema, m.name AS module_name FROM deployments d @@ -1141,48 +1067,6 @@ func (q *Queries) GetFSMInstance(ctx context.Context, fsm schema.RefKey, key str return i, err } -const getIdleRunners = `-- name: GetIdleRunners :many -SELECT id, key, created, last_seen, reservation_timeout, state, endpoint, module_name, deployment_id, labels -FROM runners -WHERE labels @> $1::jsonb - AND state = 'idle' -LIMIT $2 -` - -func (q *Queries) GetIdleRunners(ctx context.Context, labels json.RawMessage, limit int64) ([]Runner, error) { - rows, err := q.db.QueryContext(ctx, getIdleRunners, labels, limit) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Runner - for rows.Next() { - var i Runner - if err := rows.Scan( - &i.ID, - &i.Key, - &i.Created, - &i.LastSeen, - &i.ReservationTimeout, - &i.State, - &i.Endpoint, - &i.ModuleName, - &i.DeploymentID, - &i.Labels, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const getIngressRoutes = `-- name: GetIngressRoutes :many SELECT r.key AS runner_key, d.key AS deployment_key, endpoint, ir.path, ir.module, ir.verb FROM ingress_routes ir @@ -1495,11 +1379,9 @@ SELECT DISTINCT ON (r.key) r.key AS runner_key r.labels, r.last_seen, r.module_name, - COALESCE(CASE - WHEN r.deployment_id IS NOT NULL - THEN d.key END, NULL) AS deployment_key + d.key AS deployment_key FROM runners r - LEFT JOIN deployments d on d.id = r.deployment_id OR r.deployment_id IS NULL + INNER JOIN deployments d on d.id = r.deployment_id WHERE r.key = $1::runner_key ` @@ -1510,7 +1392,7 @@ type GetRunnerRow struct { Labels json.RawMessage LastSeen time.Time ModuleName optional.Option[string] - DeploymentKey optional.Option[string] + DeploymentKey model.DeploymentKey } func (q *Queries) GetRunner(ctx context.Context, key model.RunnerKey) (GetRunnerRow, error) { @@ -1558,7 +1440,7 @@ type GetRunnersForDeploymentRow struct { State RunnerState Endpoint string ModuleName optional.Option[string] - DeploymentID optional.Option[int64] + DeploymentID int64 Labels json.RawMessage ID_2 int64 CreatedAt time.Time @@ -2288,43 +2170,6 @@ func (q *Queries) PublishEventForTopic(ctx context.Context, arg PublishEventForT return err } -const reserveRunner = `-- name: ReserveRunner :one -UPDATE runners -SET state = 'reserved', - reservation_timeout = $1::timestamptz, - -- If a deployment is not found, then the deployment ID is -1 - -- and the update will fail due to a FK constraint. - deployment_id = COALESCE((SELECT id - FROM deployments d - WHERE d.key = $2::deployment_key - LIMIT 1), -1) -WHERE id = (SELECT id - FROM runners r - WHERE r.state = 'idle' - AND r.labels @> $3::jsonb - LIMIT 1 FOR UPDATE SKIP LOCKED) -RETURNING runners.id, runners.key, runners.created, runners.last_seen, runners.reservation_timeout, runners.state, runners.endpoint, runners.module_name, runners.deployment_id, runners.labels -` - -// Find an idle runner and reserve it for the given deployment. -func (q *Queries) ReserveRunner(ctx context.Context, reservationTimeout time.Time, deploymentKey model.DeploymentKey, labels json.RawMessage) (Runner, error) { - row := q.db.QueryRowContext(ctx, reserveRunner, reservationTimeout, deploymentKey, labels) - var i Runner - err := row.Scan( - &i.ID, - &i.Key, - &i.Created, - &i.LastSeen, - &i.ReservationTimeout, - &i.State, - &i.Endpoint, - &i.ModuleName, - &i.DeploymentID, - &i.Labels, - ) - return i, err -} - const setDeploymentDesiredReplicas = `-- name: SetDeploymentDesiredReplicas :exec UPDATE deployments SET min_replicas = $2 @@ -2546,13 +2391,9 @@ func (q *Queries) UpsertModule(ctx context.Context, language string, name string const upsertRunner = `-- name: UpsertRunner :one WITH deployment_rel AS ( - SELECT CASE - WHEN $5::deployment_key IS NULL - THEN NULL - ELSE COALESCE((SELECT id - FROM deployments d - WHERE d.key = $5::deployment_key - LIMIT 1), -1) END AS id) + SELECT id FROM deployments d + WHERE d.key = $5::deployment_key + LIMIT 1) INSERT INTO runners (key, endpoint, state, labels, deployment_id, last_seen) VALUES ($1, @@ -2564,7 +2405,6 @@ VALUES ($1, ON CONFLICT (key) DO UPDATE SET endpoint = $2, state = $3, labels = $4, - deployment_id = (SELECT id FROM deployment_rel), last_seen = NOW() AT TIME ZONE 'utc' RETURNING deployment_id ` @@ -2574,7 +2414,7 @@ type UpsertRunnerParams struct { Endpoint string State RunnerState Labels json.RawMessage - DeploymentKey optional.Option[model.DeploymentKey] + DeploymentKey model.DeploymentKey } // Upsert a runner and return the deployment ID that it is assigned to, if any. @@ -2582,7 +2422,7 @@ type UpsertRunnerParams struct { // otherwise we try to retrieve the deployments.id using the key. If // there is no corresponding deployment, then the deployment ID is -1 // and the parent statement will fail due to a foreign key constraint. -func (q *Queries) UpsertRunner(ctx context.Context, arg UpsertRunnerParams) (optional.Option[int64], error) { +func (q *Queries) UpsertRunner(ctx context.Context, arg UpsertRunnerParams) (int64, error) { row := q.db.QueryRowContext(ctx, upsertRunner, arg.Key, arg.Endpoint, @@ -2590,7 +2430,7 @@ func (q *Queries) UpsertRunner(ctx context.Context, arg UpsertRunnerParams) (opt arg.Labels, arg.DeploymentKey, ) - var deployment_id optional.Option[int64] + var deployment_id int64 err := row.Scan(&deployment_id) return deployment_id, err } diff --git a/backend/controller/dal/notify.go b/backend/controller/dal/notify.go index 1582a1a596..d016de0063 100644 --- a/backend/controller/dal/notify.go +++ b/backend/controller/dal/notify.go @@ -55,6 +55,7 @@ func deploymentStateFromDeployment(deployment Deployment) (deploymentState, erro return deploymentState{ schemaHash: hasher.Sum(nil), minReplicas: deployment.MinReplicas, + Key: deployment.Key, }, nil } diff --git a/backend/controller/dal/testdata/go/fsm/go.sum b/backend/controller/dal/testdata/go/fsm/go.sum index b2cb03e702..99873f9eff 100644 --- a/backend/controller/dal/testdata/go/fsm/go.sum +++ b/backend/controller/dal/testdata/go/fsm/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/dal/testdata/go/fsmnext/go.sum b/backend/controller/dal/testdata/go/fsmnext/go.sum index b2cb03e702..99873f9eff 100644 --- a/backend/controller/dal/testdata/go/fsmnext/go.sum +++ b/backend/controller/dal/testdata/go/fsmnext/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/dal/testdata/go/fsmretry/go.sum b/backend/controller/dal/testdata/go/fsmretry/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/backend/controller/dal/testdata/go/fsmretry/go.sum +++ b/backend/controller/dal/testdata/go/fsmretry/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/ingress/testdata/go/httpingress/go.sum b/backend/controller/ingress/testdata/go/httpingress/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/backend/controller/ingress/testdata/go/httpingress/go.sum +++ b/backend/controller/ingress/testdata/go/httpingress/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/leases/dal/internal/sql/models.go b/backend/controller/leases/dal/internal/sql/models.go index 49d53f0d84..e4c480759b 100644 --- a/backend/controller/leases/dal/internal/sql/models.go +++ b/backend/controller/leases/dal/internal/sql/models.go @@ -239,7 +239,7 @@ func (ns NullOrigin) Value() (driver.Value, error) { type RunnerState string const ( - RunnerStateIdle RunnerState = "idle" + RunnerStateNew RunnerState = "new" RunnerStateReserved RunnerState = "reserved" RunnerStateAssigned RunnerState = "assigned" RunnerStateDead RunnerState = "dead" @@ -473,7 +473,7 @@ type Runner struct { State RunnerState Endpoint string ModuleName optional.Option[string] - DeploymentID optional.Option[int64] + DeploymentID int64 Labels json.RawMessage } diff --git a/backend/controller/leases/testdata/go/leases/go.sum b/backend/controller/leases/testdata/go/leases/go.sum index b2cb03e702..99873f9eff 100644 --- a/backend/controller/leases/testdata/go/leases/go.sum +++ b/backend/controller/leases/testdata/go/leases/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/pubsub/testdata/go/publisher/go.sum b/backend/controller/pubsub/testdata/go/publisher/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/backend/controller/pubsub/testdata/go/publisher/go.sum +++ b/backend/controller/pubsub/testdata/go/publisher/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/pubsub/testdata/go/slow/go.sum b/backend/controller/pubsub/testdata/go/slow/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/backend/controller/pubsub/testdata/go/slow/go.sum +++ b/backend/controller/pubsub/testdata/go/slow/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/pubsub/testdata/go/subscriber/go.sum b/backend/controller/pubsub/testdata/go/subscriber/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/backend/controller/pubsub/testdata/go/subscriber/go.sum +++ b/backend/controller/pubsub/testdata/go/subscriber/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/controller/scaling/k8s_scaling.go b/backend/controller/scaling/k8s_scaling.go deleted file mode 100644 index 193b555ffa..0000000000 --- a/backend/controller/scaling/k8s_scaling.go +++ /dev/null @@ -1,20 +0,0 @@ -package scaling - -import ( - "context" - - "github.com/TBD54566975/ftl/internal/model" -) - -var _ RunnerScaling = (*K8sScaling)(nil) - -type K8sScaling struct { -} - -func NewK8sScaling() *K8sScaling { - return &K8sScaling{} -} - -func (k *K8sScaling) SetReplicas(ctx context.Context, replicas int, idleRunners []model.RunnerKey) error { - return nil -} diff --git a/backend/controller/scaling/k8sscaling/deployment_provisioner.go b/backend/controller/scaling/k8sscaling/deployment_provisioner.go new file mode 100644 index 0000000000..e1a9cef7e8 --- /dev/null +++ b/backend/controller/scaling/k8sscaling/deployment_provisioner.go @@ -0,0 +1,364 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package k8sscaling + +import ( + "context" + "fmt" + "os" + "strings" + "time" + + kubeapps "k8s.io/api/apps/v1" + kubecore "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/kubernetes" + + ftlv1 "github.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1" + schemapb "github.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1/schema" + "github.com/TBD54566975/ftl/internal/log" +) + +const thisDeploymentName = "ftl-controller" +const deploymentLabel = "ftl-deployment" +const configMapName = "ftl-controller-deployment-config" +const deploymentTemplate = "deploymentTemplate" + +// DeploymentProvisioner reconciles a Foo object +type DeploymentProvisioner struct { + Client *kubernetes.Clientset + MyDeploymentName string + Namespace string + // Map of modules to known deployments + // This needs to be re-done when we have proper rolling deployments + KnownModules map[string]string + FTLEndpoint string +} + +func (r *DeploymentProvisioner) updateDeployment(ctx context.Context, name string, mod func(deployment *kubeapps.Deployment)) error { + deploymentClient := r.Client.AppsV1().Deployments(r.Namespace) + for range 10 { + + get, err := deploymentClient.Get(ctx, name, v1.GetOptions{}) + if err != nil { + return fmt.Errorf("failed to get deployment %s: %w", name, err) + } + mod(get) + _, err = deploymentClient.Update(ctx, get, v1.UpdateOptions{}) + if err != nil { + if errors.IsConflict(err) { + time.Sleep(time.Second) + continue + } + return fmt.Errorf("failed to update deployment %s: %w", name, err) + } + return nil + } + return fmt.Errorf("failed to update deployment %s, 10 clonflicts in a row", name) +} + +func (r *DeploymentProvisioner) HandleSchemaChange(ctx context.Context, msg *ftlv1.PullSchemaResponse) error { + logger := log.FromContext(ctx).Scope("DeploymentProvisioner") + ctx = log.ContextWithLogger(ctx, logger) + defer func() { + if r := recover(); r != nil { + var err error + if rerr, ok := r.(error); ok { + err = rerr + } else { + err = fmt.Errorf("%v", r) + } + logger.Errorf(err, "panic creating kube deployment") + } + }() + err := r.handleSchemaChange(ctx, msg) + if err != nil { + logger.Errorf(err, "failed to handle schema change") + } + logger.Infof("handled schema change for %s", msg.ModuleName) + return err +} +func (r *DeploymentProvisioner) handleSchemaChange(ctx context.Context, msg *ftlv1.PullSchemaResponse) error { + if !msg.More { + defer r.deleteMissingDeployments(ctx) + } + if msg.DeploymentKey == "" { + // Builtins don't have deployments + return nil + } + logger := log.FromContext(ctx) + logger.Infof("handling schema change for %s", msg.DeploymentKey) + deploymentClient := r.Client.AppsV1().Deployments(r.Namespace) + deployment, err := deploymentClient.Get(ctx, msg.DeploymentKey, v1.GetOptions{}) + deploymentExists := true + if err != nil { + if errors.IsNotFound(err) { + deploymentExists = false + } else { + return fmt.Errorf("failed to get deployment %s: %w", msg.DeploymentKey, err) + } + } + + switch msg.ChangeType { + case ftlv1.DeploymentChangeType_DEPLOYMENT_ADDED, ftlv1.DeploymentChangeType_DEPLOYMENT_CHANGED: + + // Note that a change is now currently usually and add and a delete + // As it should really be called a module changed, not a deployment changed + // This will need to be fixed as part of the support for rolling deployments + r.KnownModules[msg.ModuleName] = msg.DeploymentKey + if deploymentExists { + logger.Infof("updating deployment %s", msg.DeploymentKey) + return r.handleExistingDeployment(ctx, deployment, msg.Schema) + } else { + return r.handleNewDeployment(ctx, msg.Schema, msg.DeploymentKey) + } + case ftlv1.DeploymentChangeType_DEPLOYMENT_REMOVED: + delete(r.KnownModules, msg.ModuleName) + if deploymentExists { + logger.Infof("deleting deployment %s", msg.ModuleName) + err := deploymentClient.Delete(ctx, msg.ModuleName, v1.DeleteOptions{}) + if err != nil { + return fmt.Errorf("failed to delete deployment %s: %w", msg.ModuleName, err) + } + } + } + return nil +} + +func (r *DeploymentProvisioner) thisContainerImage(ctx context.Context) (string, error) { + // This is only used for testing to enable local development outside of a cluster + // Which is why it is not a proper kong flag + testContainerImage := os.Getenv("FTL_TEST_CONTAINER_IMAGE") + if testContainerImage != "" { + return testContainerImage, nil + } + deploymentClient := r.Client.AppsV1().Deployments(r.Namespace) + thisDeployment, err := deploymentClient.Get(ctx, thisDeploymentName, v1.GetOptions{}) + if err != nil { + return "", fmt.Errorf("failed to get deployment %s: %w", thisDeploymentName, err) + } + return thisDeployment.Spec.Template.Spec.Containers[0].Image, nil + +} + +func (r *DeploymentProvisioner) handleNewDeployment(ctx context.Context, dep *schemapb.Module, name string) error { + if dep.Runtime == nil { + return nil + } + logger := log.FromContext(ctx) + logger.Infof("creating new kube deployment %s", name) + thisImage, err := r.thisContainerImage(ctx) + if err != nil { + return fmt.Errorf("failed to get configMap %s: %w", configMapName, err) + } + cm, err := r.Client.CoreV1().ConfigMaps(r.Namespace).Get(ctx, configMapName, v1.GetOptions{}) + if err != nil { + return fmt.Errorf("failed to get configMap %s: %w", configMapName, err) + } + data := cm.Data[deploymentTemplate] + deployment, err := decodeBytesToTDeployment([]byte(data)) + if err != nil { + return fmt.Errorf("failed to decode deployment from configMap %s: %w", configMapName, err) + } + ourVersion, err := extractTag(thisImage) + if err != nil { + return err + } + ourImage, err := extractBase(thisImage) + if err != nil { + return err + } + runnerImage := strings.ReplaceAll(ourImage, "controller", "runner") + + deployment.Name = name + deployment.Spec.Template.Spec.Containers[0].Image = fmt.Sprintf("%s:%s", runnerImage, ourVersion) + changes, err := r.syncDeployment(ctx, thisImage, deployment, dep) + if err != nil { + return err + } + for _, change := range changes { + change(deployment) + } + if deployment.Labels == nil { + deployment.Labels = map[string]string{} + } + deployment.Labels[deploymentLabel] = name + + deploymentClient := r.Client.AppsV1().Deployments(r.Namespace) + _, err = deploymentClient.Create(ctx, deployment, v1.CreateOptions{}) + if err != nil { + return fmt.Errorf("failed to create deployment %s: %w", deployment.Name, err) + } + logger.Infof("created kube deployment %s", name) + return nil + +} +func decodeBytesToTDeployment(bytes []byte) (*kubeapps.Deployment, error) { + deployment := kubeapps.Deployment{} + decodingScheme := runtime.NewScheme() + decoderCodecFactory := serializer.NewCodecFactory(decodingScheme) + decoder := decoderCodecFactory.UniversalDecoder() + err := runtime.DecodeInto(decoder, bytes, &deployment) + if err != nil { + return nil, fmt.Errorf("failed to decode deployment: %w", err) + } + return &deployment, nil +} + +func (r *DeploymentProvisioner) handleExistingDeployment(ctx context.Context, deployment *kubeapps.Deployment, ftlDeployment *schemapb.Module) error { + + thisContainerImage, err := r.thisContainerImage(ctx) + if err != nil { + return err + } + changes, err := r.syncDeployment(ctx, thisContainerImage, deployment, ftlDeployment) + if err != nil { + return err + } + + // If we have queued changes we apply them here. Changes can fail and need to be retried + // Which is why they are supplied as a list of functions + if len(changes) > 0 { + err = r.updateDeployment(ctx, deployment.Name, func(deployment *kubeapps.Deployment) { + for _, change := range changes { + change(deployment) + } + }) + if err != nil { + return err + } + } + return nil +} + +func (r *DeploymentProvisioner) syncDeployment(ctx context.Context, thisImage string, deployment *kubeapps.Deployment, ftlDeployment *schemapb.Module) ([]func(*kubeapps.Deployment), error) { + logger := log.FromContext(ctx) + changes := []func(*kubeapps.Deployment){} + ourVersion, err := extractTag(thisImage) + if err != nil { + return nil, err + } + deploymentVersion, err := extractTag(deployment.Spec.Template.Spec.Containers[0].Image) + if err != nil { + return nil, err + } + if ourVersion != deploymentVersion { + // This means there has been an FTL upgrade + // We are assuming the runner and provisioner run the same version + // If they are different it means the provisioner has been upgraded and we need + // to upgrade the deployments + + base, err := extractBase(deployment.Spec.Template.Spec.Containers[0].Image) + if err != nil { + logger.Errorf(err, "could not determine base image for FTL deployment") + } else { + changes = append(changes, func(deployment *kubeapps.Deployment) { + deployment.Spec.Template.Spec.Containers[0].Image = base + ":" + ourVersion + }) + if err != nil { + return nil, err + } + } + } + + // For now we just make sure the number of replicas match + if deployment.Spec.Replicas == nil || *deployment.Spec.Replicas != ftlDeployment.Runtime.MinReplicas { + changes = append(changes, func(deployment *kubeapps.Deployment) { + deployment.Spec.Replicas = &ftlDeployment.Runtime.MinReplicas + }) + } + changes = r.updateEnvVar(deployment, "FTL_DEPLOYMENT", deployment.Name, changes) + changes = r.updateEnvVar(deployment, "FTL_ENDPOINT", r.FTLEndpoint, changes) + return changes, nil +} + +func (r *DeploymentProvisioner) updateEnvVar(deployment *kubeapps.Deployment, envVerName string, envVarValue string, changes []func(*kubeapps.Deployment)) []func(*kubeapps.Deployment) { + found := false + for pos, env := range deployment.Spec.Template.Spec.Containers[0].Env { + if env.Name == envVerName { + found = true + if env.Value != envVarValue { + changes = append(changes, func(deployment *kubeapps.Deployment) { + deployment.Spec.Template.Spec.Containers[0].Env[pos] = kubecore.EnvVar{ + Name: envVerName, + Value: envVarValue, + } + }) + } + break + } + } + if !found { + changes = append(changes, func(deployment *kubeapps.Deployment) { + deployment.Spec.Template.Spec.Containers[0].Env = append(deployment.Spec.Template.Spec.Containers[0].Env, kubecore.EnvVar{ + Name: envVerName, + Value: envVarValue, + }) + }) + } + return changes +} + +func (r *DeploymentProvisioner) deleteMissingDeployments(ctx context.Context) { + logger := log.FromContext(ctx) + deploymentClient := r.Client.AppsV1().Deployments(r.Namespace) + + list, err := deploymentClient.List(ctx, v1.ListOptions{LabelSelector: deploymentLabel}) + if err != nil { + logger.Errorf(err, "failed to list deployments") + return + } + knownDeployments := map[string]bool{} + for _, deployment := range r.KnownModules { + knownDeployments[deployment] = true + } + + for _, deployment := range list.Items { + if !knownDeployments[deployment.Name] { + logger.Infof("deleting deployment %s", deployment.Name) + err := deploymentClient.Delete(ctx, deployment.Name, v1.DeleteOptions{}) + if err != nil { + logger.Errorf(err, "failed to delete deployment %s", deployment.Name) + } + + } + } +} + +func extractTag(image string) (string, error) { + idx := strings.LastIndex(image, ":") + if idx == -1 { + return "", fmt.Errorf("no tag found in image %s", image) + } + ret := image[idx+1:] + at := strings.LastIndex(ret, "@") + if at != -1 { + ret = image[:at] + } + return ret, nil +} + +func extractBase(image string) (string, error) { + idx := strings.LastIndex(image, ":") + if idx == -1 { + return "", fmt.Errorf("no tag found in image %s", image) + } + return image[:idx], nil +} diff --git a/backend/controller/scaling/k8sscaling/k8s_scaling.go b/backend/controller/scaling/k8sscaling/k8s_scaling.go new file mode 100644 index 0000000000..f6d628eb59 --- /dev/null +++ b/backend/controller/scaling/k8sscaling/k8s_scaling.go @@ -0,0 +1,85 @@ +package k8sscaling + +import ( + "context" + "fmt" + "net/url" + "os" + + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + + "github.com/TBD54566975/ftl/backend/controller/leases" + "github.com/TBD54566975/ftl/backend/controller/scaling" + "github.com/TBD54566975/ftl/internal/log" +) + +var _ = (scaling.RunnerScaling)(NewK8sScaling) + +func NewK8sScaling(ctx context.Context, controller url.URL, leaser leases.Leaser) error { + + logger := log.FromContext(ctx).Scope("K8sScaling") + ctx = log.ContextWithLogger(ctx, logger) + // creates the in-cluster config + config, err := rest.InClusterConfig() + + if err != nil { + // if we're not in a cluster, use the kubeconfig + config, err = clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile) + if err != nil { + panic(err.Error()) + } + } + // creates the clientset + clientset, err := kubernetes.NewForConfig(config) + + if err != nil { + panic(err.Error()) + } + + namespace, err := getCurrentNamespace() + if err != nil { + // Nothing we can do here, if we don't have a namespace we have no runners + return fmt.Errorf("failed to get current namespace: %w", err) + } + logger.Infof("using namespace %s", namespace) + deploymentReconciler := &DeploymentProvisioner{ + Client: clientset, + Namespace: namespace, + KnownModules: map[string]string{}, + FTLEndpoint: controller.String(), + } + scaling.BeginGrpcScaling(ctx, controller, leaser, deploymentReconciler.HandleSchemaChange) + return nil +} + +func getCurrentNamespace() (string, error) { + namespaceFile := "/var/run/secrets/kubernetes.io/serviceaccount/namespace" + if _, err := os.Stat(namespaceFile); err == nil { + namespace, err := os.ReadFile(namespaceFile) + if err != nil { + return "", fmt.Errorf("failed to read namespace file: %w", err) + } + return string(namespace), nil + } + + // If not running in a cluster, get the namespace from the kubeconfig + configAccess := clientcmd.NewDefaultPathOptions() + config, err := configAccess.GetStartingConfig() + if err != nil { + return "", fmt.Errorf("failed to get kubeconfig: %w", err) + } + + currentContext := config.CurrentContext + if currentContext == "" { + return "", fmt.Errorf("no current context found in kubeconfig") + } + + context, exists := config.Contexts[currentContext] + if !exists { + return "", fmt.Errorf("context %s not found in kubeconfig", currentContext) + } + + return context.Namespace, nil +} diff --git a/backend/controller/scaling/k8sscaling/kube_scaling_integration_test.go b/backend/controller/scaling/k8sscaling/kube_scaling_integration_test.go new file mode 100644 index 0000000000..45a70eb110 --- /dev/null +++ b/backend/controller/scaling/k8sscaling/kube_scaling_integration_test.go @@ -0,0 +1,22 @@ +//go:build integration + +package k8sscaling_test + +import ( + "testing" + + "github.com/alecthomas/assert/v2" + + in "github.com/TBD54566975/ftl/internal/integration" +) + +func TestKubeScaling(t *testing.T) { + in.Run(t, + in.WithKubernetes(), + in.CopyModule("echo"), + in.Deploy("echo"), + in.Call("echo", "echo", "Bob", func(t testing.TB, response string) { + assert.Equal(t, "Hello, Bob!!!", response) + }), + ) +} diff --git a/backend/controller/scaling/k8sscaling/testdata/go/echo/echo.go b/backend/controller/scaling/k8sscaling/testdata/go/echo/echo.go new file mode 100644 index 0000000000..6ce84c47b6 --- /dev/null +++ b/backend/controller/scaling/k8sscaling/testdata/go/echo/echo.go @@ -0,0 +1,14 @@ +// This is the echo module. +package echo + +import ( + "context" + "fmt" +) + +// Echo returns a greeting with the current time. +// +//ftl:verb export +func Echo(ctx context.Context, req string) (string, error) { + return fmt.Sprintf("Hello, %s!!!", req), nil +} diff --git a/backend/controller/scaling/k8sscaling/testdata/go/echo/ftl.toml b/backend/controller/scaling/k8sscaling/testdata/go/echo/ftl.toml new file mode 100644 index 0000000000..72ce292aa2 --- /dev/null +++ b/backend/controller/scaling/k8sscaling/testdata/go/echo/ftl.toml @@ -0,0 +1,2 @@ +module = "echo" +language = "go" diff --git a/backend/controller/scaling/k8sscaling/testdata/go/echo/go.mod b/backend/controller/scaling/k8sscaling/testdata/go/echo/go.mod new file mode 100644 index 0000000000..6d37259a91 --- /dev/null +++ b/backend/controller/scaling/k8sscaling/testdata/go/echo/go.mod @@ -0,0 +1,5 @@ +module ftl/echo + +go 1.23.0 + +replace github.com/TBD54566975/ftl => ./../../../../../../.. diff --git a/backend/controller/scaling/k8sscaling/testdata/go/echo/go.sum b/backend/controller/scaling/k8sscaling/testdata/go/echo/go.sum new file mode 100644 index 0000000000..e69de29bb2 diff --git a/backend/controller/scaling/localscaling/devel.go b/backend/controller/scaling/localscaling/devel.go deleted file mode 100644 index 7439a3e732..0000000000 --- a/backend/controller/scaling/localscaling/devel.go +++ /dev/null @@ -1,33 +0,0 @@ -//go:build !release - -package localscaling - -import ( - "context" - "path/filepath" - "sync" - - "github.com/TBD54566975/ftl/internal" - "github.com/TBD54566975/ftl/internal/exec" - "github.com/TBD54566975/ftl/internal/log" -) - -var templateDirOnce sync.Once - -func templateDir(ctx context.Context) string { - gitRoot, ok := internal.GitRoot("").Get() - if !ok { - // If GitRoot encounters an error, it will fail to find the correct dir. - // This line preserves the original behavior to prevent a regression, but - // it is still not the desired outcome. More thinking needed. - gitRoot = "" - } - templateDirOnce.Do(func() { - // TODO: Figure out how to make maven build offline - err := exec.Command(ctx, log.Debug, gitRoot, "just", "build-kt-runtime").RunBuffered(ctx) - if err != nil { - panic(err) - } - }) - return filepath.Join(gitRoot, "build/template") -} diff --git a/backend/controller/scaling/localscaling/local_scaling.go b/backend/controller/scaling/localscaling/local_scaling.go index 99eaf1bb7d..563f627414 100644 --- a/backend/controller/scaling/localscaling/local_scaling.go +++ b/backend/controller/scaling/localscaling/local_scaling.go @@ -12,19 +12,20 @@ import ( "github.com/alecthomas/kong" + "github.com/TBD54566975/ftl/backend/controller/leases" "github.com/TBD54566975/ftl/backend/controller/scaling" + ftlv1 "github.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1" "github.com/TBD54566975/ftl/backend/runner" "github.com/TBD54566975/ftl/internal/bind" "github.com/TBD54566975/ftl/internal/log" "github.com/TBD54566975/ftl/internal/model" ) -var _ scaling.RunnerScaling = (*LocalScaling)(nil) - -type LocalScaling struct { +type localScaling struct { lock sync.Mutex cacheDir string - runners map[string]context.CancelFunc + // Module -> Deployments -> Runners -> Cancel Func + runners map[string]map[string]*deploymentInfo portAllocator *bind.BindAllocator controllerAddresses []*url.URL @@ -32,101 +33,127 @@ type LocalScaling struct { prevRunnerSuffix int } -func NewLocalScaling(portAllocator *bind.BindAllocator, controllerAddresses []*url.URL) (*LocalScaling, error) { +type deploymentInfo struct { + runners map[string]context.CancelFunc + replicas int32 + key string +} + +func NewLocalScaling(portAllocator *bind.BindAllocator, controllerAddresses []*url.URL) (scaling.RunnerScaling, error) { + cacheDir, err := os.UserCacheDir() if err != nil { return nil, err } - return &LocalScaling{ + local := localScaling{ lock: sync.Mutex{}, cacheDir: cacheDir, - runners: map[string]context.CancelFunc{}, + runners: map[string]map[string]*deploymentInfo{}, portAllocator: portAllocator, controllerAddresses: controllerAddresses, prevRunnerSuffix: -1, + } + + return func(ctx context.Context, endpoint url.URL, leaser leases.Leaser) error { + scaling.BeginGrpcScaling(ctx, endpoint, leaser, local.handleSchemaChange) + return nil }, nil } -func (l *LocalScaling) SetReplicas(ctx context.Context, replicas int, idleRunners []model.RunnerKey) error { +func (l *localScaling) handleSchemaChange(ctx context.Context, msg *ftlv1.PullSchemaResponse) error { + if msg.DeploymentKey == "" { + // Builtins don't have deployments + return nil + } l.lock.Lock() defer l.lock.Unlock() + logger := log.FromContext(ctx).Scope("localScaling") + ctx = log.ContextWithLogger(ctx, logger) + logger.Infof("handling schema change for %s", msg.DeploymentKey) + moduleDeployments := l.runners[msg.ModuleName] + if moduleDeployments == nil { + moduleDeployments = map[string]*deploymentInfo{} + l.runners[msg.ModuleName] = moduleDeployments + } + deploymentRunners := moduleDeployments[msg.DeploymentKey] + if deploymentRunners == nil { + deploymentRunners = &deploymentInfo{runners: map[string]context.CancelFunc{}, key: msg.DeploymentKey} + moduleDeployments[msg.DeploymentKey] = deploymentRunners + } - logger := log.FromContext(ctx) - - replicasToAdd := replicas - len(l.runners) - - if replicasToAdd <= 0 { - replicasToRemove := -replicasToAdd - - for range replicasToRemove { - if len(idleRunners) == 0 { - return nil - } - runnerToRemove := idleRunners[len(idleRunners)-1] - idleRunners = idleRunners[:len(idleRunners)-1] + switch msg.ChangeType { + case ftlv1.DeploymentChangeType_DEPLOYMENT_ADDED, ftlv1.DeploymentChangeType_DEPLOYMENT_CHANGED: + deploymentRunners.replicas = msg.Schema.Runtime.MinReplicas + case ftlv1.DeploymentChangeType_DEPLOYMENT_REMOVED: + deploymentRunners.replicas = 0 + delete(moduleDeployments, msg.DeploymentKey) + } + return l.reconcileRunners(ctx, deploymentRunners) +} - err := l.remove(ctx, runnerToRemove) - if err != nil { +func (l *localScaling) reconcileRunners(ctx context.Context, deploymentRunners *deploymentInfo) error { + // Must be called under lock + logger := log.FromContext(ctx) + existing := int32(len(deploymentRunners.runners)) + if existing < deploymentRunners.replicas { + for i := existing; i < deploymentRunners.replicas; i++ { + if err := l.startRunner(ctx, deploymentRunners.key, deploymentRunners); err != nil { + logger.Errorf(err, "Failed to start runner") return err } } - - return nil - } - - logger.Debugf("Adding %d replicas", replicasToAdd) - for range replicasToAdd { - controllerEndpoint := l.controllerAddresses[len(l.runners)%len(l.controllerAddresses)] - - bind := l.portAllocator.Next() - keySuffix := l.prevRunnerSuffix + 1 - l.prevRunnerSuffix = keySuffix - - config := runner.Config{ - Bind: bind, - ControllerEndpoint: controllerEndpoint, - TemplateDir: templateDir(ctx), - Key: model.NewLocalRunnerKey(keySuffix), - } - - simpleName := fmt.Sprintf("runner%d", keySuffix) - if err := kong.ApplyDefaults(&config, kong.Vars{ - "deploymentdir": filepath.Join(l.cacheDir, "ftl-runner", simpleName, "deployments"), - "language": "go,kotlin,rust,java", - }); err != nil { - return err + } else if existing > deploymentRunners.replicas { + for _, cancelFunc := range deploymentRunners.runners { + cancelFunc() + existing-- } - config.HeartbeatPeriod = time.Second - config.HeartbeatJitter = time.Millisecond * 100 - - runnerCtx := log.ContextWithLogger(ctx, logger.Scope(simpleName)) - - runnerCtx, cancel := context.WithCancel(runnerCtx) - l.runners[config.Key.String()] = cancel - - go func() { - logger.Debugf("Starting runner: %s", config.Key) - err := runner.Start(runnerCtx, config) - if err != nil && !errors.Is(err, context.Canceled) { - logger.Errorf(err, "Runner failed: %s", err) - } - }() } - return nil } -func (l *LocalScaling) remove(ctx context.Context, runner model.RunnerKey) error { - log := log.FromContext(ctx) - log.Debugf("Removing runner: %s", runner) +func (l *localScaling) startRunner(ctx context.Context, deploymentKey string, info *deploymentInfo) error { + controllerEndpoint := l.controllerAddresses[len(l.runners)%len(l.controllerAddresses)] + + bind := l.portAllocator.Next() + keySuffix := l.prevRunnerSuffix + 1 + l.prevRunnerSuffix = keySuffix + + config := runner.Config{ + Bind: bind, + ControllerEndpoint: controllerEndpoint, + Key: model.NewLocalRunnerKey(keySuffix), + Deployment: deploymentKey, + } - cancel, ok := l.runners[runner.String()] - if !ok { - return fmt.Errorf("runner %s not found", runner) + simpleName := fmt.Sprintf("runner%d", keySuffix) + if err := kong.ApplyDefaults(&config, kong.Vars{ + "deploymentdir": filepath.Join(l.cacheDir, "ftl-runner", simpleName, "deployments"), + "language": "go,kotlin,rust,java", + }); err != nil { + return fmt.Errorf("failed to apply defaults: %w", err) } + config.HeartbeatPeriod = time.Second + config.HeartbeatJitter = time.Millisecond * 100 + + logger := log.FromContext(ctx) + runnerCtx := log.ContextWithLogger(ctx, logger.Scope(simpleName)) - cancel() - delete(l.runners, runner.String()) + runnerCtx, cancel := context.WithCancel(runnerCtx) + info.runners[config.Key.String()] = cancel + go func() { + logger.Debugf("Starting runner: %s", config.Key) + err := runner.Start(runnerCtx, config) + if err != nil && !errors.Is(err, context.Canceled) { + logger.Errorf(err, "Runner failed: %s", err) + } + l.lock.Lock() + defer l.lock.Unlock() + delete(info.runners, config.Key.String()) + err = l.reconcileRunners(ctx, info) + if err != nil { + logger.Errorf(err, "Failed to reconcile runners") + } + }() return nil } diff --git a/backend/controller/scaling/localscaling/release.go b/backend/controller/scaling/localscaling/release.go deleted file mode 100644 index eeaae87836..0000000000 --- a/backend/controller/scaling/localscaling/release.go +++ /dev/null @@ -1,40 +0,0 @@ -//go:build release - -package localscaling - -import ( - "archive/zip" - "bytes" - "context" - _ "embed" - "os" - "path/filepath" - "sync" - - "github.com/TBD54566975/ftl/internal" -) - -//go:embed template.zip -var archive []byte - -var templateDirOnce sync.Once - -func templateDir(ctx context.Context) string { - cacheDir, err := os.UserCacheDir() - if err != nil { - panic(err) - } - cacheDir = filepath.Join(cacheDir, "ftl-runner-template") - templateDirOnce.Do(func() { - _ = os.RemoveAll(cacheDir) - zr, err := zip.NewReader(bytes.NewReader(archive), int64(len(archive))) - if err != nil { - panic(err) - } - err = internal.UnzipDir(zr, cacheDir) - if err != nil { - panic(err) - } - }) - return cacheDir -} diff --git a/backend/controller/scaling/scaling.go b/backend/controller/scaling/scaling.go index e622895f36..943dc2a778 100644 --- a/backend/controller/scaling/scaling.go +++ b/backend/controller/scaling/scaling.go @@ -2,10 +2,53 @@ package scaling import ( "context" + "net/url" + "time" - "github.com/TBD54566975/ftl/internal/model" + "github.com/alecthomas/types/optional" + "github.com/jpillora/backoff" + + "github.com/TBD54566975/ftl/backend/controller/leases" + ftlv1 "github.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1" + "github.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1/ftlv1connect" + "github.com/TBD54566975/ftl/internal/log" + "github.com/TBD54566975/ftl/internal/rpc" ) -type RunnerScaling interface { - SetReplicas(ctx context.Context, replicas int, idleRunners []model.RunnerKey) error +type RunnerScaling func(ctx context.Context, endpoint url.URL, leaser leases.Leaser) error + +func BeginGrpcScaling(ctx context.Context, url url.URL, leaser leases.Leaser, handler func(ctx context.Context, msg *ftlv1.PullSchemaResponse) error) { + leaseTimeout := time.Second * 20 + for { + // Grab a lease to take control of runner scaling + lease, leaseContext, err := leaser.AcquireLease(ctx, leases.SystemKey("ftl-scaling", "runner-creation"), leaseTimeout, optional.None[any]()) + if err == nil { + defer func(lease leases.Lease) { + err := lease.Release() + if err != nil { + logger := log.FromContext(ctx) + logger.Errorf(err, "Failed to release lease") + } + }(lease) + // If we get it then we take over runner scaling + runGrpcScaling(leaseContext, url, handler) + } + select { + case <-ctx.Done(): + return + case <-time.After(leaseTimeout): + } + } +} + +func runGrpcScaling(ctx context.Context, url url.URL, handler func(ctx context.Context, msg *ftlv1.PullSchemaResponse) error) { + client := rpc.Dial(ftlv1connect.NewControllerServiceClient, url.String(), log.Error) + ctx = rpc.ContextWithClient(ctx, client) + + logger := log.FromContext(ctx) + logger.Debugf("Starting Runner Scaling") + logger.Debugf("Using FTL endpoint: %s", url.String()) + + rpc.RetryStreamingServerStream(ctx, backoff.Backoff{Max: time.Second}, &ftlv1.PullSchemaRequest{}, client.PullSchema, handler, rpc.AlwaysRetry()) + logger.Debugf("Stopped Runner Scaling") } diff --git a/backend/controller/sql/schema/20240903043046_enforce_runner_deployment.sql b/backend/controller/sql/schema/20240903043046_enforce_runner_deployment.sql new file mode 100644 index 0000000000..0da2aed1ff --- /dev/null +++ b/backend/controller/sql/schema/20240903043046_enforce_runner_deployment.sql @@ -0,0 +1,6 @@ +-- migrate:up +DELETE FROM runners WHERE deployment_id IS NULL; +ALTER TABLE runners ALTER COLUMN deployment_id SET NOT NULL; +ALTER TYPE runner_state RENAME VALUE 'idle' TO 'new'; +-- migrate:down + diff --git a/backend/controller/sql/testdata/go/database/go.sum b/backend/controller/sql/testdata/go/database/go.sum index b2cb03e702..99873f9eff 100644 --- a/backend/controller/sql/testdata/go/database/go.sum +++ b/backend/controller/sql/testdata/go/database/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/backend/protos/xyz/block/ftl/v1/ftl.pb.go b/backend/protos/xyz/block/ftl/v1/ftl.pb.go index 4e340e5454..f056b405d0 100644 --- a/backend/protos/xyz/block/ftl/v1/ftl.pb.go +++ b/backend/protos/xyz/block/ftl/v1/ftl.pb.go @@ -77,28 +77,24 @@ type RunnerState int32 const ( // The Runner is waiting for a deployment. - RunnerState_RUNNER_IDLE RunnerState = 0 - // The Runner and Controller have agreed that the Runner is reserved. - RunnerState_RUNNER_RESERVED RunnerState = 1 + RunnerState_RUNNER_NEW RunnerState = 0 // The Runner is assigned to a deployment. - RunnerState_RUNNER_ASSIGNED RunnerState = 2 + RunnerState_RUNNER_ASSIGNED RunnerState = 1 // The Runner is dead. - RunnerState_RUNNER_DEAD RunnerState = 3 + RunnerState_RUNNER_DEAD RunnerState = 2 ) // Enum value maps for RunnerState. var ( RunnerState_name = map[int32]string{ - 0: "RUNNER_IDLE", - 1: "RUNNER_RESERVED", - 2: "RUNNER_ASSIGNED", - 3: "RUNNER_DEAD", + 0: "RUNNER_NEW", + 1: "RUNNER_ASSIGNED", + 2: "RUNNER_DEAD", } RunnerState_value = map[string]int32{ - "RUNNER_IDLE": 0, - "RUNNER_RESERVED": 1, - "RUNNER_ASSIGNED": 2, - "RUNNER_DEAD": 3, + "RUNNER_NEW": 0, + "RUNNER_ASSIGNED": 1, + "RUNNER_DEAD": 2, } ) @@ -1796,11 +1792,9 @@ type RegisterRunnerRequest struct { Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` Endpoint string `protobuf:"bytes,2,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - Deployment *string `protobuf:"bytes,3,opt,name=deployment,proto3,oneof" json:"deployment,omitempty"` + Deployment string `protobuf:"bytes,3,opt,name=deployment,proto3" json:"deployment,omitempty"` State RunnerState `protobuf:"varint,4,opt,name=state,proto3,enum=xyz.block.ftl.v1.RunnerState" json:"state,omitempty"` Labels *structpb.Struct `protobuf:"bytes,5,opt,name=labels,proto3" json:"labels,omitempty"` - // If present, the reason the Runner is transitioning from ASSIGNED to IDLE. - Error *string `protobuf:"bytes,7,opt,name=error,proto3,oneof" json:"error,omitempty"` } func (x *RegisterRunnerRequest) Reset() { @@ -1850,8 +1844,8 @@ func (x *RegisterRunnerRequest) GetEndpoint() string { } func (x *RegisterRunnerRequest) GetDeployment() string { - if x != nil && x.Deployment != nil { - return *x.Deployment + if x != nil { + return x.Deployment } return "" } @@ -1860,7 +1854,7 @@ func (x *RegisterRunnerRequest) GetState() RunnerState { if x != nil { return x.State } - return RunnerState_RUNNER_IDLE + return RunnerState_RUNNER_NEW } func (x *RegisterRunnerRequest) GetLabels() *structpb.Struct { @@ -1870,13 +1864,6 @@ func (x *RegisterRunnerRequest) GetLabels() *structpb.Struct { return nil } -func (x *RegisterRunnerRequest) GetError() string { - if x != nil && x.Error != nil { - return *x.Error - } - return "" -} - type RegisterRunnerResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2521,223 +2508,6 @@ func (*ResetSubscriptionResponse) Descriptor() ([]byte, []int) { return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{41} } -type DeployRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DeploymentKey string `protobuf:"bytes,1,opt,name=deployment_key,json=deploymentKey,proto3" json:"deployment_key,omitempty"` -} - -func (x *DeployRequest) Reset() { - *x = DeployRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeployRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeployRequest) ProtoMessage() {} - -func (x *DeployRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeployRequest.ProtoReflect.Descriptor instead. -func (*DeployRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{42} -} - -func (x *DeployRequest) GetDeploymentKey() string { - if x != nil { - return x.DeploymentKey - } - return "" -} - -type DeployResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *DeployResponse) Reset() { - *x = DeployResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeployResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeployResponse) ProtoMessage() {} - -func (x *DeployResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeployResponse.ProtoReflect.Descriptor instead. -func (*DeployResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{43} -} - -type TerminateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DeploymentKey string `protobuf:"bytes,1,opt,name=deployment_key,json=deploymentKey,proto3" json:"deployment_key,omitempty"` -} - -func (x *TerminateRequest) Reset() { - *x = TerminateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TerminateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TerminateRequest) ProtoMessage() {} - -func (x *TerminateRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TerminateRequest.ProtoReflect.Descriptor instead. -func (*TerminateRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{44} -} - -func (x *TerminateRequest) GetDeploymentKey() string { - if x != nil { - return x.DeploymentKey - } - return "" -} - -type ReserveRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DeploymentKey string `protobuf:"bytes,1,opt,name=deployment_key,json=deploymentKey,proto3" json:"deployment_key,omitempty"` -} - -func (x *ReserveRequest) Reset() { - *x = ReserveRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReserveRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReserveRequest) ProtoMessage() {} - -func (x *ReserveRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReserveRequest.ProtoReflect.Descriptor instead. -func (*ReserveRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{45} -} - -func (x *ReserveRequest) GetDeploymentKey() string { - if x != nil { - return x.DeploymentKey - } - return "" -} - -type ReserveResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *ReserveResponse) Reset() { - *x = ReserveResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReserveResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReserveResponse) ProtoMessage() {} - -func (x *ReserveResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReserveResponse.ProtoReflect.Descriptor instead. -func (*ReserveResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{46} -} - type ConfigRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2750,7 +2520,7 @@ type ConfigRef struct { func (x *ConfigRef) Reset() { *x = ConfigRef{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[47] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2763,7 +2533,7 @@ func (x *ConfigRef) String() string { func (*ConfigRef) ProtoMessage() {} func (x *ConfigRef) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[47] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2776,7 +2546,7 @@ func (x *ConfigRef) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigRef.ProtoReflect.Descriptor instead. func (*ConfigRef) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{47} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{42} } func (x *ConfigRef) GetModule() string { @@ -2806,7 +2576,7 @@ type ListConfigRequest struct { func (x *ListConfigRequest) Reset() { *x = ListConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[48] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2819,7 +2589,7 @@ func (x *ListConfigRequest) String() string { func (*ListConfigRequest) ProtoMessage() {} func (x *ListConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[48] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2832,7 +2602,7 @@ func (x *ListConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListConfigRequest.ProtoReflect.Descriptor instead. func (*ListConfigRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{48} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{43} } func (x *ListConfigRequest) GetModule() string { @@ -2867,7 +2637,7 @@ type ListConfigResponse struct { func (x *ListConfigResponse) Reset() { *x = ListConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[49] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2880,7 +2650,7 @@ func (x *ListConfigResponse) String() string { func (*ListConfigResponse) ProtoMessage() {} func (x *ListConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[49] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2893,7 +2663,7 @@ func (x *ListConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListConfigResponse.ProtoReflect.Descriptor instead. func (*ListConfigResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{49} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{44} } func (x *ListConfigResponse) GetConfigs() []*ListConfigResponse_Config { @@ -2914,7 +2684,7 @@ type GetConfigRequest struct { func (x *GetConfigRequest) Reset() { *x = GetConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[50] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2927,7 +2697,7 @@ func (x *GetConfigRequest) String() string { func (*GetConfigRequest) ProtoMessage() {} func (x *GetConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[50] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2940,7 +2710,7 @@ func (x *GetConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConfigRequest.ProtoReflect.Descriptor instead. func (*GetConfigRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{50} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{45} } func (x *GetConfigRequest) GetRef() *ConfigRef { @@ -2961,7 +2731,7 @@ type GetConfigResponse struct { func (x *GetConfigResponse) Reset() { *x = GetConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[51] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2974,7 +2744,7 @@ func (x *GetConfigResponse) String() string { func (*GetConfigResponse) ProtoMessage() {} func (x *GetConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[51] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2987,7 +2757,7 @@ func (x *GetConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConfigResponse.ProtoReflect.Descriptor instead. func (*GetConfigResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{51} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{46} } func (x *GetConfigResponse) GetValue() []byte { @@ -3010,7 +2780,7 @@ type SetConfigRequest struct { func (x *SetConfigRequest) Reset() { *x = SetConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[52] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3023,7 +2793,7 @@ func (x *SetConfigRequest) String() string { func (*SetConfigRequest) ProtoMessage() {} func (x *SetConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[52] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3036,7 +2806,7 @@ func (x *SetConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetConfigRequest.ProtoReflect.Descriptor instead. func (*SetConfigRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{52} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{47} } func (x *SetConfigRequest) GetProvider() ConfigProvider { @@ -3069,7 +2839,7 @@ type SetConfigResponse struct { func (x *SetConfigResponse) Reset() { *x = SetConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[53] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3082,7 +2852,7 @@ func (x *SetConfigResponse) String() string { func (*SetConfigResponse) ProtoMessage() {} func (x *SetConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[53] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3095,7 +2865,7 @@ func (x *SetConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetConfigResponse.ProtoReflect.Descriptor instead. func (*SetConfigResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{53} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{48} } type UnsetConfigRequest struct { @@ -3110,7 +2880,7 @@ type UnsetConfigRequest struct { func (x *UnsetConfigRequest) Reset() { *x = UnsetConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[54] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3123,7 +2893,7 @@ func (x *UnsetConfigRequest) String() string { func (*UnsetConfigRequest) ProtoMessage() {} func (x *UnsetConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[54] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3136,7 +2906,7 @@ func (x *UnsetConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnsetConfigRequest.ProtoReflect.Descriptor instead. func (*UnsetConfigRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{54} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{49} } func (x *UnsetConfigRequest) GetProvider() ConfigProvider { @@ -3162,7 +2932,7 @@ type UnsetConfigResponse struct { func (x *UnsetConfigResponse) Reset() { *x = UnsetConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[55] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3175,7 +2945,7 @@ func (x *UnsetConfigResponse) String() string { func (*UnsetConfigResponse) ProtoMessage() {} func (x *UnsetConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[55] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3188,7 +2958,7 @@ func (x *UnsetConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnsetConfigResponse.ProtoReflect.Descriptor instead. func (*UnsetConfigResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{55} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{50} } type ListSecretsRequest struct { @@ -3204,7 +2974,7 @@ type ListSecretsRequest struct { func (x *ListSecretsRequest) Reset() { *x = ListSecretsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[56] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3217,7 +2987,7 @@ func (x *ListSecretsRequest) String() string { func (*ListSecretsRequest) ProtoMessage() {} func (x *ListSecretsRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[56] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3230,7 +3000,7 @@ func (x *ListSecretsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSecretsRequest.ProtoReflect.Descriptor instead. func (*ListSecretsRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{56} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{51} } func (x *ListSecretsRequest) GetModule() string { @@ -3265,7 +3035,7 @@ type ListSecretsResponse struct { func (x *ListSecretsResponse) Reset() { *x = ListSecretsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[57] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3278,7 +3048,7 @@ func (x *ListSecretsResponse) String() string { func (*ListSecretsResponse) ProtoMessage() {} func (x *ListSecretsResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[57] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3291,7 +3061,7 @@ func (x *ListSecretsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSecretsResponse.ProtoReflect.Descriptor instead. func (*ListSecretsResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{57} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{52} } func (x *ListSecretsResponse) GetSecrets() []*ListSecretsResponse_Secret { @@ -3312,7 +3082,7 @@ type GetSecretRequest struct { func (x *GetSecretRequest) Reset() { *x = GetSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[58] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3325,7 +3095,7 @@ func (x *GetSecretRequest) String() string { func (*GetSecretRequest) ProtoMessage() {} func (x *GetSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[58] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3338,7 +3108,7 @@ func (x *GetSecretRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSecretRequest.ProtoReflect.Descriptor instead. func (*GetSecretRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{58} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{53} } func (x *GetSecretRequest) GetRef() *ConfigRef { @@ -3359,7 +3129,7 @@ type GetSecretResponse struct { func (x *GetSecretResponse) Reset() { *x = GetSecretResponse{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[59] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3372,7 +3142,7 @@ func (x *GetSecretResponse) String() string { func (*GetSecretResponse) ProtoMessage() {} func (x *GetSecretResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[59] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3385,7 +3155,7 @@ func (x *GetSecretResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSecretResponse.ProtoReflect.Descriptor instead. func (*GetSecretResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{59} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{54} } func (x *GetSecretResponse) GetValue() []byte { @@ -3408,7 +3178,7 @@ type SetSecretRequest struct { func (x *SetSecretRequest) Reset() { *x = SetSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[60] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3421,7 +3191,7 @@ func (x *SetSecretRequest) String() string { func (*SetSecretRequest) ProtoMessage() {} func (x *SetSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[60] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3434,7 +3204,7 @@ func (x *SetSecretRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetSecretRequest.ProtoReflect.Descriptor instead. func (*SetSecretRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{60} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{55} } func (x *SetSecretRequest) GetProvider() SecretProvider { @@ -3467,7 +3237,7 @@ type SetSecretResponse struct { func (x *SetSecretResponse) Reset() { *x = SetSecretResponse{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[61] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3480,7 +3250,7 @@ func (x *SetSecretResponse) String() string { func (*SetSecretResponse) ProtoMessage() {} func (x *SetSecretResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[61] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3493,7 +3263,7 @@ func (x *SetSecretResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetSecretResponse.ProtoReflect.Descriptor instead. func (*SetSecretResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{61} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{56} } type UnsetSecretRequest struct { @@ -3508,7 +3278,7 @@ type UnsetSecretRequest struct { func (x *UnsetSecretRequest) Reset() { *x = UnsetSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[62] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3521,7 +3291,7 @@ func (x *UnsetSecretRequest) String() string { func (*UnsetSecretRequest) ProtoMessage() {} func (x *UnsetSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[62] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3534,7 +3304,7 @@ func (x *UnsetSecretRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnsetSecretRequest.ProtoReflect.Descriptor instead. func (*UnsetSecretRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{62} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{57} } func (x *UnsetSecretRequest) GetProvider() SecretProvider { @@ -3560,7 +3330,7 @@ type UnsetSecretResponse struct { func (x *UnsetSecretResponse) Reset() { *x = UnsetSecretResponse{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[63] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3573,7 +3343,7 @@ func (x *UnsetSecretResponse) String() string { func (*UnsetSecretResponse) ProtoMessage() {} func (x *UnsetSecretResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[63] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3586,7 +3356,7 @@ func (x *UnsetSecretResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnsetSecretResponse.ProtoReflect.Descriptor instead. func (*UnsetSecretResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{63} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{58} } type ModuleContextResponse_Ref struct { @@ -3601,7 +3371,7 @@ type ModuleContextResponse_Ref struct { func (x *ModuleContextResponse_Ref) Reset() { *x = ModuleContextResponse_Ref{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[64] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3614,7 +3384,7 @@ func (x *ModuleContextResponse_Ref) String() string { func (*ModuleContextResponse_Ref) ProtoMessage() {} func (x *ModuleContextResponse_Ref) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[64] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3657,7 +3427,7 @@ type ModuleContextResponse_DSN struct { func (x *ModuleContextResponse_DSN) Reset() { *x = ModuleContextResponse_DSN{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[65] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3670,7 +3440,7 @@ func (x *ModuleContextResponse_DSN) String() string { func (*ModuleContextResponse_DSN) ProtoMessage() {} func (x *ModuleContextResponse_DSN) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[65] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3719,7 +3489,7 @@ type Metadata_Pair struct { func (x *Metadata_Pair) Reset() { *x = Metadata_Pair{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[68] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3732,7 +3502,7 @@ func (x *Metadata_Pair) String() string { func (*Metadata_Pair) ProtoMessage() {} func (x *Metadata_Pair) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[68] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3774,7 +3544,7 @@ type CallResponse_Error struct { func (x *CallResponse_Error) Reset() { *x = CallResponse_Error{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[69] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3787,7 +3557,7 @@ func (x *CallResponse_Error) String() string { func (*CallResponse_Error) ProtoMessage() {} func (x *CallResponse_Error) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[69] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3830,7 +3600,7 @@ type StatusResponse_Controller struct { func (x *StatusResponse_Controller) Reset() { *x = StatusResponse_Controller{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[71] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3843,7 +3613,7 @@ func (x *StatusResponse_Controller) String() string { func (*StatusResponse_Controller) ProtoMessage() {} func (x *StatusResponse_Controller) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[71] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3896,7 +3666,7 @@ type StatusResponse_Runner struct { func (x *StatusResponse_Runner) Reset() { *x = StatusResponse_Runner{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[72] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3909,7 +3679,7 @@ func (x *StatusResponse_Runner) String() string { func (*StatusResponse_Runner) ProtoMessage() {} func (x *StatusResponse_Runner) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[72] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3950,7 +3720,7 @@ func (x *StatusResponse_Runner) GetState() RunnerState { if x != nil { return x.State } - return RunnerState_RUNNER_IDLE + return RunnerState_RUNNER_NEW } func (x *StatusResponse_Runner) GetDeployment() string { @@ -3984,7 +3754,7 @@ type StatusResponse_Deployment struct { func (x *StatusResponse_Deployment) Reset() { *x = StatusResponse_Deployment{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[73] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3997,7 +3767,7 @@ func (x *StatusResponse_Deployment) String() string { func (*StatusResponse_Deployment) ProtoMessage() {} func (x *StatusResponse_Deployment) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[73] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4076,7 +3846,7 @@ type StatusResponse_IngressRoute struct { func (x *StatusResponse_IngressRoute) Reset() { *x = StatusResponse_IngressRoute{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[74] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4089,7 +3859,7 @@ func (x *StatusResponse_IngressRoute) String() string { func (*StatusResponse_IngressRoute) ProtoMessage() {} func (x *StatusResponse_IngressRoute) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[74] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4147,7 +3917,7 @@ type StatusResponse_Route struct { func (x *StatusResponse_Route) Reset() { *x = StatusResponse_Route{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[75] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4160,7 +3930,7 @@ func (x *StatusResponse_Route) String() string { func (*StatusResponse_Route) ProtoMessage() {} func (x *StatusResponse_Route) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[75] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4217,7 +3987,7 @@ type ProcessListResponse_ProcessRunner struct { func (x *ProcessListResponse_ProcessRunner) Reset() { *x = ProcessListResponse_ProcessRunner{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[76] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4230,7 +4000,7 @@ func (x *ProcessListResponse_ProcessRunner) String() string { func (*ProcessListResponse_ProcessRunner) ProtoMessage() {} func (x *ProcessListResponse_ProcessRunner) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[76] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4281,7 +4051,7 @@ type ProcessListResponse_Process struct { func (x *ProcessListResponse_Process) Reset() { *x = ProcessListResponse_Process{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[77] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4294,7 +4064,7 @@ func (x *ProcessListResponse_Process) String() string { func (*ProcessListResponse_Process) ProtoMessage() {} func (x *ProcessListResponse_Process) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[77] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4350,7 +4120,7 @@ type ListConfigResponse_Config struct { func (x *ListConfigResponse_Config) Reset() { *x = ListConfigResponse_Config{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[78] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4363,7 +4133,7 @@ func (x *ListConfigResponse_Config) String() string { func (*ListConfigResponse_Config) ProtoMessage() {} func (x *ListConfigResponse_Config) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[78] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4376,7 +4146,7 @@ func (x *ListConfigResponse_Config) ProtoReflect() protoreflect.Message { // Deprecated: Use ListConfigResponse_Config.ProtoReflect.Descriptor instead. func (*ListConfigResponse_Config) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{49, 0} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{44, 0} } func (x *ListConfigResponse_Config) GetRefPath() string { @@ -4405,7 +4175,7 @@ type ListSecretsResponse_Secret struct { func (x *ListSecretsResponse_Secret) Reset() { *x = ListSecretsResponse_Secret{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[79] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4418,7 +4188,7 @@ func (x *ListSecretsResponse_Secret) String() string { func (*ListSecretsResponse_Secret) ProtoMessage() {} func (x *ListSecretsResponse_Secret) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[79] + mi := &file_xyz_block_ftl_v1_ftl_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4431,7 +4201,7 @@ func (x *ListSecretsResponse_Secret) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSecretsResponse_Secret.ProtoReflect.Descriptor instead. func (*ListSecretsResponse_Secret) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{57, 0} + return file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP(), []int{52, 0} } func (x *ListSecretsResponse_Secret) GetRefPath() string { @@ -4668,319 +4438,301 @@ var file_xyz_block_ftl_v1_ftl_proto_rawDesc = []byte{ 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x72, 0x74, 0x65, 0x66, 0x61, 0x63, - 0x74, 0x52, 0x09, 0x61, 0x72, 0x74, 0x65, 0x66, 0x61, 0x63, 0x74, 0x73, 0x22, 0x84, 0x02, 0x0a, + 0x74, 0x52, 0x09, 0x61, 0x72, 0x74, 0x65, 0x66, 0x61, 0x63, 0x74, 0x73, 0x22, 0xcb, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x6e, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2f, - 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, - 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5f, 0x0a, - 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, - 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x16, - 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, - 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xaf, 0x03, 0x0a, 0x1b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x39, - 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5f, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, + 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x0a, + 0x14, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, + 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, + 0x17, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xaf, 0x03, 0x0a, 0x1b, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, + 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4b, + 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x5d, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1e, 0x0a, 0x1c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x1e, 0x0a, 0x1c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0xd3, 0x09, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x78, - 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, - 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x0b, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x0e, 0x69, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, - 0x0d, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3e, - 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd3, 0x09, 0x0a, 0x0e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, + 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, + 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x54, - 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0xee, 0x01, 0x0a, 0x06, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, - 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x23, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0xf7, 0x01, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, - 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, - 0x93, 0x01, 0x0a, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x04, 0x76, 0x65, 0x72, 0x62, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x65, 0x66, 0x52, 0x04, 0x76, 0x65, 0x72, 0x62, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x73, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x1e, - 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x14, 0x0a, 0x12, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0xaf, 0x03, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x78, 0x79, - 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x6e, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, + 0x12, 0x4d, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x54, 0x0a, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x0d, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x54, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0xee, 0x01, 0x0a, 0x06, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0xda, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x50, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x72, 0x75, - 0x6e, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x75, 0x6e, 0x6e, - 0x65, 0x72, 0x22, 0x5c, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, - 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, - 0x65, 0x66, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x0a, - 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, - 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x10, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, - 0x65, 0x79, 0x22, 0x37, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x11, 0x0a, 0x0f, 0x52, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, - 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x12, 0x1b, 0x0a, 0x06, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0xca, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x02, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x22, 0xa4, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x07, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x78, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x06, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0xf7, 0x01, 0x0a, + 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2f, 0x0a, 0x06, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x37, 0x0a, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x06, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x93, 0x01, 0x0a, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x30, + 0x0a, 0x04, 0x76, 0x65, 0x72, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x1a, 0x47, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x65, 0x66, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, - 0x65, 0x66, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, - 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x41, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x04, 0x76, 0x65, 0x72, 0x62, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x73, 0x0a, 0x05, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x22, 0x14, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xaf, 0x03, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4b, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x6e, 0x0a, 0x0d, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0xda, 0x01, 0x0a, + 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x50, 0x0a, 0x06, + 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x52, 0x03, 0x72, 0x65, 0x66, 0x22, 0x29, - 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x10, 0x53, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6e, 0x6e, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x5c, 0x0a, 0x18, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, + 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x66, 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0xca, 0x01, + 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x2a, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x52, 0x03, 0x72, 0x65, 0x66, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x12, 0x55, 0x6e, 0x73, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, - 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x52, 0x03, 0x72, 0x65, - 0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x15, - 0x0a, 0x13, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xcb, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x22, 0xa6, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x78, - 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x1a, 0x47, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x66, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x66, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, - 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x41, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x48, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa4, 0x01, 0x0a, 0x12, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x45, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x47, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x41, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x52, + 0x03, 0x72, 0x65, 0x66, 0x22, 0x29, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0xa7, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x66, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, + 0x01, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x66, 0x52, 0x03, 0x72, 0x65, 0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xcb, 0x01, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x2a, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x52, 0x03, 0x72, 0x65, 0x66, 0x22, - 0x29, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x10, 0x53, - 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, - 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x52, 0x03, 0x72, 0x65, - 0x66, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x12, 0x55, 0x6e, - 0x73, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x52, 0x03, 0x72, - 0x65, 0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, - 0x15, 0x0a, 0x13, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x5c, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x10, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x44, 0x44, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, - 0x45, 0x44, 0x10, 0x02, 0x2a, 0x59, 0x0a, 0x0b, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x4e, 0x45, 0x52, 0x5f, 0x49, 0x44, - 0x4c, 0x45, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x4e, 0x45, 0x52, 0x5f, 0x52, - 0x45, 0x53, 0x45, 0x52, 0x56, 0x45, 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, - 0x4e, 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0f, - 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x41, 0x44, 0x10, 0x03, 0x2a, + 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, + 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa6, 0x01, 0x0a, 0x13, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x46, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x47, 0x0a, 0x06, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x41, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, + 0x52, 0x03, 0x72, 0x65, 0x66, 0x22, 0x29, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0xa7, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x66, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, + 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x93, 0x01, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x66, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x66, 0x52, 0x03, 0x72, 0x65, 0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x5c, 0x0a, 0x14, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, + 0x4e, 0x54, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, + 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, + 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x43, 0x0a, 0x0b, 0x52, 0x75, + 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x55, 0x4e, + 0x4e, 0x45, 0x52, 0x5f, 0x4e, 0x45, 0x57, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, + 0x4e, 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x41, 0x44, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x49, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x45, @@ -5133,83 +4885,62 @@ var file_xyz_block_ftl_v1_ftl_proto_rawDesc = []byte{ 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x32, 0xd2, 0x02, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x2e, 0x78, - 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x78, 0x79, + 0x73, 0x65, 0x32, 0x9f, 0x06, 0x0a, 0x0c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, - 0x12, 0x4e, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x20, 0x2e, 0x78, 0x79, - 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x78, 0x79, 0x7a, + 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, + 0x57, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4b, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x1f, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x78, 0x79, - 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, - 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x9f, 0x06, 0x0a, 0x0c, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, - 0x12, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x03, 0x90, 0x02, 0x01, 0x12, 0x57, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, - 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x65, 0x74, - 0x12, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x12, 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x54, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x47, 0x65, 0x74, 0x12, 0x22, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x53, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, - 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x12, 0x24, 0x2e, 0x78, - 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x6e, 0x73, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x44, 0x50, 0x01, 0x5a, 0x40, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x42, 0x44, 0x35, 0x34, 0x35, - 0x36, 0x36, 0x39, 0x37, 0x35, 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x78, 0x79, 0x7a, 0x2f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x76, 0x31, 0x3b, 0x66, 0x74, 0x6c, 0x76, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, + 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x78, 0x79, + 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, 0x6e, + 0x73, 0x65, 0x74, 0x12, 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5a, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x09, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x54, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x53, 0x65, 0x74, 0x12, + 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x12, 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x44, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x42, 0x44, 0x35, 0x34, 0x35, 0x36, 0x36, 0x39, 0x37, 0x35, + 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2f, 0x78, 0x79, 0x7a, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x66, 0x74, + 0x6c, 0x2f, 0x76, 0x31, 0x3b, 0x66, 0x74, 0x6c, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -5225,7 +4956,7 @@ func file_xyz_block_ftl_v1_ftl_proto_rawDescGZIP() []byte { } var file_xyz_block_ftl_v1_ftl_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_xyz_block_ftl_v1_ftl_proto_msgTypes = make([]protoimpl.MessageInfo, 80) +var file_xyz_block_ftl_v1_ftl_proto_msgTypes = make([]protoimpl.MessageInfo, 75) var file_xyz_block_ftl_v1_ftl_proto_goTypes = []any{ (DeploymentChangeType)(0), // 0: xyz.block.ftl.v1.DeploymentChangeType (RunnerState)(0), // 1: xyz.block.ftl.v1.RunnerState @@ -5274,109 +5005,104 @@ var file_xyz_block_ftl_v1_ftl_proto_goTypes = []any{ (*ProcessListResponse)(nil), // 44: xyz.block.ftl.v1.ProcessListResponse (*ResetSubscriptionRequest)(nil), // 45: xyz.block.ftl.v1.ResetSubscriptionRequest (*ResetSubscriptionResponse)(nil), // 46: xyz.block.ftl.v1.ResetSubscriptionResponse - (*DeployRequest)(nil), // 47: xyz.block.ftl.v1.DeployRequest - (*DeployResponse)(nil), // 48: xyz.block.ftl.v1.DeployResponse - (*TerminateRequest)(nil), // 49: xyz.block.ftl.v1.TerminateRequest - (*ReserveRequest)(nil), // 50: xyz.block.ftl.v1.ReserveRequest - (*ReserveResponse)(nil), // 51: xyz.block.ftl.v1.ReserveResponse - (*ConfigRef)(nil), // 52: xyz.block.ftl.v1.ConfigRef - (*ListConfigRequest)(nil), // 53: xyz.block.ftl.v1.ListConfigRequest - (*ListConfigResponse)(nil), // 54: xyz.block.ftl.v1.ListConfigResponse - (*GetConfigRequest)(nil), // 55: xyz.block.ftl.v1.GetConfigRequest - (*GetConfigResponse)(nil), // 56: xyz.block.ftl.v1.GetConfigResponse - (*SetConfigRequest)(nil), // 57: xyz.block.ftl.v1.SetConfigRequest - (*SetConfigResponse)(nil), // 58: xyz.block.ftl.v1.SetConfigResponse - (*UnsetConfigRequest)(nil), // 59: xyz.block.ftl.v1.UnsetConfigRequest - (*UnsetConfigResponse)(nil), // 60: xyz.block.ftl.v1.UnsetConfigResponse - (*ListSecretsRequest)(nil), // 61: xyz.block.ftl.v1.ListSecretsRequest - (*ListSecretsResponse)(nil), // 62: xyz.block.ftl.v1.ListSecretsResponse - (*GetSecretRequest)(nil), // 63: xyz.block.ftl.v1.GetSecretRequest - (*GetSecretResponse)(nil), // 64: xyz.block.ftl.v1.GetSecretResponse - (*SetSecretRequest)(nil), // 65: xyz.block.ftl.v1.SetSecretRequest - (*SetSecretResponse)(nil), // 66: xyz.block.ftl.v1.SetSecretResponse - (*UnsetSecretRequest)(nil), // 67: xyz.block.ftl.v1.UnsetSecretRequest - (*UnsetSecretResponse)(nil), // 68: xyz.block.ftl.v1.UnsetSecretResponse - (*ModuleContextResponse_Ref)(nil), // 69: xyz.block.ftl.v1.ModuleContextResponse.Ref - (*ModuleContextResponse_DSN)(nil), // 70: xyz.block.ftl.v1.ModuleContextResponse.DSN - nil, // 71: xyz.block.ftl.v1.ModuleContextResponse.ConfigsEntry - nil, // 72: xyz.block.ftl.v1.ModuleContextResponse.SecretsEntry - (*Metadata_Pair)(nil), // 73: xyz.block.ftl.v1.Metadata.Pair - (*CallResponse_Error)(nil), // 74: xyz.block.ftl.v1.CallResponse.Error - nil, // 75: xyz.block.ftl.v1.StreamDeploymentLogsRequest.AttributesEntry - (*StatusResponse_Controller)(nil), // 76: xyz.block.ftl.v1.StatusResponse.Controller - (*StatusResponse_Runner)(nil), // 77: xyz.block.ftl.v1.StatusResponse.Runner - (*StatusResponse_Deployment)(nil), // 78: xyz.block.ftl.v1.StatusResponse.Deployment - (*StatusResponse_IngressRoute)(nil), // 79: xyz.block.ftl.v1.StatusResponse.IngressRoute - (*StatusResponse_Route)(nil), // 80: xyz.block.ftl.v1.StatusResponse.Route - (*ProcessListResponse_ProcessRunner)(nil), // 81: xyz.block.ftl.v1.ProcessListResponse.ProcessRunner - (*ProcessListResponse_Process)(nil), // 82: xyz.block.ftl.v1.ProcessListResponse.Process - (*ListConfigResponse_Config)(nil), // 83: xyz.block.ftl.v1.ListConfigResponse.Config - (*ListSecretsResponse_Secret)(nil), // 84: xyz.block.ftl.v1.ListSecretsResponse.Secret - (*schema.Ref)(nil), // 85: xyz.block.ftl.v1.schema.Ref - (*durationpb.Duration)(nil), // 86: google.protobuf.Duration - (*schema.Type)(nil), // 87: xyz.block.ftl.v1.schema.Type - (*schema.Schema)(nil), // 88: xyz.block.ftl.v1.schema.Schema - (*schema.Module)(nil), // 89: xyz.block.ftl.v1.schema.Module - (*structpb.Struct)(nil), // 90: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 91: google.protobuf.Timestamp + (*ConfigRef)(nil), // 47: xyz.block.ftl.v1.ConfigRef + (*ListConfigRequest)(nil), // 48: xyz.block.ftl.v1.ListConfigRequest + (*ListConfigResponse)(nil), // 49: xyz.block.ftl.v1.ListConfigResponse + (*GetConfigRequest)(nil), // 50: xyz.block.ftl.v1.GetConfigRequest + (*GetConfigResponse)(nil), // 51: xyz.block.ftl.v1.GetConfigResponse + (*SetConfigRequest)(nil), // 52: xyz.block.ftl.v1.SetConfigRequest + (*SetConfigResponse)(nil), // 53: xyz.block.ftl.v1.SetConfigResponse + (*UnsetConfigRequest)(nil), // 54: xyz.block.ftl.v1.UnsetConfigRequest + (*UnsetConfigResponse)(nil), // 55: xyz.block.ftl.v1.UnsetConfigResponse + (*ListSecretsRequest)(nil), // 56: xyz.block.ftl.v1.ListSecretsRequest + (*ListSecretsResponse)(nil), // 57: xyz.block.ftl.v1.ListSecretsResponse + (*GetSecretRequest)(nil), // 58: xyz.block.ftl.v1.GetSecretRequest + (*GetSecretResponse)(nil), // 59: xyz.block.ftl.v1.GetSecretResponse + (*SetSecretRequest)(nil), // 60: xyz.block.ftl.v1.SetSecretRequest + (*SetSecretResponse)(nil), // 61: xyz.block.ftl.v1.SetSecretResponse + (*UnsetSecretRequest)(nil), // 62: xyz.block.ftl.v1.UnsetSecretRequest + (*UnsetSecretResponse)(nil), // 63: xyz.block.ftl.v1.UnsetSecretResponse + (*ModuleContextResponse_Ref)(nil), // 64: xyz.block.ftl.v1.ModuleContextResponse.Ref + (*ModuleContextResponse_DSN)(nil), // 65: xyz.block.ftl.v1.ModuleContextResponse.DSN + nil, // 66: xyz.block.ftl.v1.ModuleContextResponse.ConfigsEntry + nil, // 67: xyz.block.ftl.v1.ModuleContextResponse.SecretsEntry + (*Metadata_Pair)(nil), // 68: xyz.block.ftl.v1.Metadata.Pair + (*CallResponse_Error)(nil), // 69: xyz.block.ftl.v1.CallResponse.Error + nil, // 70: xyz.block.ftl.v1.StreamDeploymentLogsRequest.AttributesEntry + (*StatusResponse_Controller)(nil), // 71: xyz.block.ftl.v1.StatusResponse.Controller + (*StatusResponse_Runner)(nil), // 72: xyz.block.ftl.v1.StatusResponse.Runner + (*StatusResponse_Deployment)(nil), // 73: xyz.block.ftl.v1.StatusResponse.Deployment + (*StatusResponse_IngressRoute)(nil), // 74: xyz.block.ftl.v1.StatusResponse.IngressRoute + (*StatusResponse_Route)(nil), // 75: xyz.block.ftl.v1.StatusResponse.Route + (*ProcessListResponse_ProcessRunner)(nil), // 76: xyz.block.ftl.v1.ProcessListResponse.ProcessRunner + (*ProcessListResponse_Process)(nil), // 77: xyz.block.ftl.v1.ProcessListResponse.Process + (*ListConfigResponse_Config)(nil), // 78: xyz.block.ftl.v1.ListConfigResponse.Config + (*ListSecretsResponse_Secret)(nil), // 79: xyz.block.ftl.v1.ListSecretsResponse.Secret + (*schema.Ref)(nil), // 80: xyz.block.ftl.v1.schema.Ref + (*durationpb.Duration)(nil), // 81: google.protobuf.Duration + (*schema.Type)(nil), // 82: xyz.block.ftl.v1.schema.Type + (*schema.Schema)(nil), // 83: xyz.block.ftl.v1.schema.Schema + (*schema.Module)(nil), // 84: xyz.block.ftl.v1.schema.Module + (*structpb.Struct)(nil), // 85: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 86: google.protobuf.Timestamp } var file_xyz_block_ftl_v1_ftl_proto_depIdxs = []int32{ - 71, // 0: xyz.block.ftl.v1.ModuleContextResponse.configs:type_name -> xyz.block.ftl.v1.ModuleContextResponse.ConfigsEntry - 72, // 1: xyz.block.ftl.v1.ModuleContextResponse.secrets:type_name -> xyz.block.ftl.v1.ModuleContextResponse.SecretsEntry - 70, // 2: xyz.block.ftl.v1.ModuleContextResponse.databases:type_name -> xyz.block.ftl.v1.ModuleContextResponse.DSN - 73, // 3: xyz.block.ftl.v1.Metadata.values:type_name -> xyz.block.ftl.v1.Metadata.Pair + 66, // 0: xyz.block.ftl.v1.ModuleContextResponse.configs:type_name -> xyz.block.ftl.v1.ModuleContextResponse.ConfigsEntry + 67, // 1: xyz.block.ftl.v1.ModuleContextResponse.secrets:type_name -> xyz.block.ftl.v1.ModuleContextResponse.SecretsEntry + 65, // 2: xyz.block.ftl.v1.ModuleContextResponse.databases:type_name -> xyz.block.ftl.v1.ModuleContextResponse.DSN + 68, // 3: xyz.block.ftl.v1.Metadata.values:type_name -> xyz.block.ftl.v1.Metadata.Pair 9, // 4: xyz.block.ftl.v1.CallRequest.metadata:type_name -> xyz.block.ftl.v1.Metadata - 85, // 5: xyz.block.ftl.v1.CallRequest.verb:type_name -> xyz.block.ftl.v1.schema.Ref - 74, // 6: xyz.block.ftl.v1.CallResponse.error:type_name -> xyz.block.ftl.v1.CallResponse.Error - 86, // 7: xyz.block.ftl.v1.AcquireLeaseRequest.ttl:type_name -> google.protobuf.Duration - 85, // 8: xyz.block.ftl.v1.SendFSMEventRequest.fsm:type_name -> xyz.block.ftl.v1.schema.Ref - 87, // 9: xyz.block.ftl.v1.SendFSMEventRequest.event:type_name -> xyz.block.ftl.v1.schema.Type - 85, // 10: xyz.block.ftl.v1.PublishEventRequest.topic:type_name -> xyz.block.ftl.v1.schema.Ref - 88, // 11: xyz.block.ftl.v1.GetSchemaResponse.schema:type_name -> xyz.block.ftl.v1.schema.Schema - 89, // 12: xyz.block.ftl.v1.PullSchemaResponse.schema:type_name -> xyz.block.ftl.v1.schema.Module + 80, // 5: xyz.block.ftl.v1.CallRequest.verb:type_name -> xyz.block.ftl.v1.schema.Ref + 69, // 6: xyz.block.ftl.v1.CallResponse.error:type_name -> xyz.block.ftl.v1.CallResponse.Error + 81, // 7: xyz.block.ftl.v1.AcquireLeaseRequest.ttl:type_name -> google.protobuf.Duration + 80, // 8: xyz.block.ftl.v1.SendFSMEventRequest.fsm:type_name -> xyz.block.ftl.v1.schema.Ref + 82, // 9: xyz.block.ftl.v1.SendFSMEventRequest.event:type_name -> xyz.block.ftl.v1.schema.Type + 80, // 10: xyz.block.ftl.v1.PublishEventRequest.topic:type_name -> xyz.block.ftl.v1.schema.Ref + 83, // 11: xyz.block.ftl.v1.GetSchemaResponse.schema:type_name -> xyz.block.ftl.v1.schema.Schema + 84, // 12: xyz.block.ftl.v1.PullSchemaResponse.schema:type_name -> xyz.block.ftl.v1.schema.Module 0, // 13: xyz.block.ftl.v1.PullSchemaResponse.change_type:type_name -> xyz.block.ftl.v1.DeploymentChangeType 26, // 14: xyz.block.ftl.v1.GetArtefactDiffsResponse.client_artefacts:type_name -> xyz.block.ftl.v1.DeploymentArtefact - 89, // 15: xyz.block.ftl.v1.CreateDeploymentRequest.schema:type_name -> xyz.block.ftl.v1.schema.Module + 84, // 15: xyz.block.ftl.v1.CreateDeploymentRequest.schema:type_name -> xyz.block.ftl.v1.schema.Module 26, // 16: xyz.block.ftl.v1.CreateDeploymentRequest.artefacts:type_name -> xyz.block.ftl.v1.DeploymentArtefact - 90, // 17: xyz.block.ftl.v1.CreateDeploymentRequest.labels:type_name -> google.protobuf.Struct + 85, // 17: xyz.block.ftl.v1.CreateDeploymentRequest.labels:type_name -> google.protobuf.Struct 26, // 18: xyz.block.ftl.v1.GetDeploymentArtefactsRequest.have_artefacts:type_name -> xyz.block.ftl.v1.DeploymentArtefact 26, // 19: xyz.block.ftl.v1.GetDeploymentArtefactsResponse.artefact:type_name -> xyz.block.ftl.v1.DeploymentArtefact - 89, // 20: xyz.block.ftl.v1.GetDeploymentResponse.schema:type_name -> xyz.block.ftl.v1.schema.Module + 84, // 20: xyz.block.ftl.v1.GetDeploymentResponse.schema:type_name -> xyz.block.ftl.v1.schema.Module 26, // 21: xyz.block.ftl.v1.GetDeploymentResponse.artefacts:type_name -> xyz.block.ftl.v1.DeploymentArtefact 1, // 22: xyz.block.ftl.v1.RegisterRunnerRequest.state:type_name -> xyz.block.ftl.v1.RunnerState - 90, // 23: xyz.block.ftl.v1.RegisterRunnerRequest.labels:type_name -> google.protobuf.Struct - 91, // 24: xyz.block.ftl.v1.StreamDeploymentLogsRequest.time_stamp:type_name -> google.protobuf.Timestamp - 75, // 25: xyz.block.ftl.v1.StreamDeploymentLogsRequest.attributes:type_name -> xyz.block.ftl.v1.StreamDeploymentLogsRequest.AttributesEntry - 76, // 26: xyz.block.ftl.v1.StatusResponse.controllers:type_name -> xyz.block.ftl.v1.StatusResponse.Controller - 77, // 27: xyz.block.ftl.v1.StatusResponse.runners:type_name -> xyz.block.ftl.v1.StatusResponse.Runner - 78, // 28: xyz.block.ftl.v1.StatusResponse.deployments:type_name -> xyz.block.ftl.v1.StatusResponse.Deployment - 79, // 29: xyz.block.ftl.v1.StatusResponse.ingress_routes:type_name -> xyz.block.ftl.v1.StatusResponse.IngressRoute - 80, // 30: xyz.block.ftl.v1.StatusResponse.routes:type_name -> xyz.block.ftl.v1.StatusResponse.Route - 82, // 31: xyz.block.ftl.v1.ProcessListResponse.processes:type_name -> xyz.block.ftl.v1.ProcessListResponse.Process - 85, // 32: xyz.block.ftl.v1.ResetSubscriptionRequest.subscription:type_name -> xyz.block.ftl.v1.schema.Ref + 85, // 23: xyz.block.ftl.v1.RegisterRunnerRequest.labels:type_name -> google.protobuf.Struct + 86, // 24: xyz.block.ftl.v1.StreamDeploymentLogsRequest.time_stamp:type_name -> google.protobuf.Timestamp + 70, // 25: xyz.block.ftl.v1.StreamDeploymentLogsRequest.attributes:type_name -> xyz.block.ftl.v1.StreamDeploymentLogsRequest.AttributesEntry + 71, // 26: xyz.block.ftl.v1.StatusResponse.controllers:type_name -> xyz.block.ftl.v1.StatusResponse.Controller + 72, // 27: xyz.block.ftl.v1.StatusResponse.runners:type_name -> xyz.block.ftl.v1.StatusResponse.Runner + 73, // 28: xyz.block.ftl.v1.StatusResponse.deployments:type_name -> xyz.block.ftl.v1.StatusResponse.Deployment + 74, // 29: xyz.block.ftl.v1.StatusResponse.ingress_routes:type_name -> xyz.block.ftl.v1.StatusResponse.IngressRoute + 75, // 30: xyz.block.ftl.v1.StatusResponse.routes:type_name -> xyz.block.ftl.v1.StatusResponse.Route + 77, // 31: xyz.block.ftl.v1.ProcessListResponse.processes:type_name -> xyz.block.ftl.v1.ProcessListResponse.Process + 80, // 32: xyz.block.ftl.v1.ResetSubscriptionRequest.subscription:type_name -> xyz.block.ftl.v1.schema.Ref 2, // 33: xyz.block.ftl.v1.ListConfigRequest.provider:type_name -> xyz.block.ftl.v1.ConfigProvider - 83, // 34: xyz.block.ftl.v1.ListConfigResponse.configs:type_name -> xyz.block.ftl.v1.ListConfigResponse.Config - 52, // 35: xyz.block.ftl.v1.GetConfigRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef + 78, // 34: xyz.block.ftl.v1.ListConfigResponse.configs:type_name -> xyz.block.ftl.v1.ListConfigResponse.Config + 47, // 35: xyz.block.ftl.v1.GetConfigRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef 2, // 36: xyz.block.ftl.v1.SetConfigRequest.provider:type_name -> xyz.block.ftl.v1.ConfigProvider - 52, // 37: xyz.block.ftl.v1.SetConfigRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef + 47, // 37: xyz.block.ftl.v1.SetConfigRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef 2, // 38: xyz.block.ftl.v1.UnsetConfigRequest.provider:type_name -> xyz.block.ftl.v1.ConfigProvider - 52, // 39: xyz.block.ftl.v1.UnsetConfigRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef + 47, // 39: xyz.block.ftl.v1.UnsetConfigRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef 3, // 40: xyz.block.ftl.v1.ListSecretsRequest.provider:type_name -> xyz.block.ftl.v1.SecretProvider - 84, // 41: xyz.block.ftl.v1.ListSecretsResponse.secrets:type_name -> xyz.block.ftl.v1.ListSecretsResponse.Secret - 52, // 42: xyz.block.ftl.v1.GetSecretRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef + 79, // 41: xyz.block.ftl.v1.ListSecretsResponse.secrets:type_name -> xyz.block.ftl.v1.ListSecretsResponse.Secret + 47, // 42: xyz.block.ftl.v1.GetSecretRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef 3, // 43: xyz.block.ftl.v1.SetSecretRequest.provider:type_name -> xyz.block.ftl.v1.SecretProvider - 52, // 44: xyz.block.ftl.v1.SetSecretRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef + 47, // 44: xyz.block.ftl.v1.SetSecretRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef 3, // 45: xyz.block.ftl.v1.UnsetSecretRequest.provider:type_name -> xyz.block.ftl.v1.SecretProvider - 52, // 46: xyz.block.ftl.v1.UnsetSecretRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef + 47, // 46: xyz.block.ftl.v1.UnsetSecretRequest.ref:type_name -> xyz.block.ftl.v1.ConfigRef 4, // 47: xyz.block.ftl.v1.ModuleContextResponse.DSN.type:type_name -> xyz.block.ftl.v1.ModuleContextResponse.DBType 1, // 48: xyz.block.ftl.v1.StatusResponse.Runner.state:type_name -> xyz.block.ftl.v1.RunnerState - 90, // 49: xyz.block.ftl.v1.StatusResponse.Runner.labels:type_name -> google.protobuf.Struct - 90, // 50: xyz.block.ftl.v1.StatusResponse.Deployment.labels:type_name -> google.protobuf.Struct - 89, // 51: xyz.block.ftl.v1.StatusResponse.Deployment.schema:type_name -> xyz.block.ftl.v1.schema.Module - 85, // 52: xyz.block.ftl.v1.StatusResponse.IngressRoute.verb:type_name -> xyz.block.ftl.v1.schema.Ref - 90, // 53: xyz.block.ftl.v1.ProcessListResponse.ProcessRunner.labels:type_name -> google.protobuf.Struct - 90, // 54: xyz.block.ftl.v1.ProcessListResponse.Process.labels:type_name -> google.protobuf.Struct - 81, // 55: xyz.block.ftl.v1.ProcessListResponse.Process.runner:type_name -> xyz.block.ftl.v1.ProcessListResponse.ProcessRunner + 85, // 49: xyz.block.ftl.v1.StatusResponse.Runner.labels:type_name -> google.protobuf.Struct + 85, // 50: xyz.block.ftl.v1.StatusResponse.Deployment.labels:type_name -> google.protobuf.Struct + 84, // 51: xyz.block.ftl.v1.StatusResponse.Deployment.schema:type_name -> xyz.block.ftl.v1.schema.Module + 80, // 52: xyz.block.ftl.v1.StatusResponse.IngressRoute.verb:type_name -> xyz.block.ftl.v1.schema.Ref + 85, // 53: xyz.block.ftl.v1.ProcessListResponse.ProcessRunner.labels:type_name -> google.protobuf.Struct + 85, // 54: xyz.block.ftl.v1.ProcessListResponse.Process.labels:type_name -> google.protobuf.Struct + 76, // 55: xyz.block.ftl.v1.ProcessListResponse.Process.runner:type_name -> xyz.block.ftl.v1.ProcessListResponse.ProcessRunner 5, // 56: xyz.block.ftl.v1.VerbService.Ping:input_type -> xyz.block.ftl.v1.PingRequest 10, // 57: xyz.block.ftl.v1.VerbService.Call:input_type -> xyz.block.ftl.v1.CallRequest 5, // 58: xyz.block.ftl.v1.ModuleService.Ping:input_type -> xyz.block.ftl.v1.PingRequest @@ -5400,57 +5126,49 @@ var file_xyz_block_ftl_v1_ftl_proto_depIdxs = []int32{ 18, // 76: xyz.block.ftl.v1.ControllerService.GetSchema:input_type -> xyz.block.ftl.v1.GetSchemaRequest 20, // 77: xyz.block.ftl.v1.ControllerService.PullSchema:input_type -> xyz.block.ftl.v1.PullSchemaRequest 45, // 78: xyz.block.ftl.v1.ControllerService.ResetSubscription:input_type -> xyz.block.ftl.v1.ResetSubscriptionRequest - 5, // 79: xyz.block.ftl.v1.RunnerService.Ping:input_type -> xyz.block.ftl.v1.PingRequest - 50, // 80: xyz.block.ftl.v1.RunnerService.Reserve:input_type -> xyz.block.ftl.v1.ReserveRequest - 47, // 81: xyz.block.ftl.v1.RunnerService.Deploy:input_type -> xyz.block.ftl.v1.DeployRequest - 49, // 82: xyz.block.ftl.v1.RunnerService.Terminate:input_type -> xyz.block.ftl.v1.TerminateRequest - 5, // 83: xyz.block.ftl.v1.AdminService.Ping:input_type -> xyz.block.ftl.v1.PingRequest - 53, // 84: xyz.block.ftl.v1.AdminService.ConfigList:input_type -> xyz.block.ftl.v1.ListConfigRequest - 55, // 85: xyz.block.ftl.v1.AdminService.ConfigGet:input_type -> xyz.block.ftl.v1.GetConfigRequest - 57, // 86: xyz.block.ftl.v1.AdminService.ConfigSet:input_type -> xyz.block.ftl.v1.SetConfigRequest - 59, // 87: xyz.block.ftl.v1.AdminService.ConfigUnset:input_type -> xyz.block.ftl.v1.UnsetConfigRequest - 61, // 88: xyz.block.ftl.v1.AdminService.SecretsList:input_type -> xyz.block.ftl.v1.ListSecretsRequest - 63, // 89: xyz.block.ftl.v1.AdminService.SecretGet:input_type -> xyz.block.ftl.v1.GetSecretRequest - 65, // 90: xyz.block.ftl.v1.AdminService.SecretSet:input_type -> xyz.block.ftl.v1.SetSecretRequest - 67, // 91: xyz.block.ftl.v1.AdminService.SecretUnset:input_type -> xyz.block.ftl.v1.UnsetSecretRequest - 6, // 92: xyz.block.ftl.v1.VerbService.Ping:output_type -> xyz.block.ftl.v1.PingResponse - 11, // 93: xyz.block.ftl.v1.VerbService.Call:output_type -> xyz.block.ftl.v1.CallResponse - 6, // 94: xyz.block.ftl.v1.ModuleService.Ping:output_type -> xyz.block.ftl.v1.PingResponse - 8, // 95: xyz.block.ftl.v1.ModuleService.GetModuleContext:output_type -> xyz.block.ftl.v1.ModuleContextResponse - 13, // 96: xyz.block.ftl.v1.ModuleService.AcquireLease:output_type -> xyz.block.ftl.v1.AcquireLeaseResponse - 15, // 97: xyz.block.ftl.v1.ModuleService.SendFSMEvent:output_type -> xyz.block.ftl.v1.SendFSMEventResponse - 15, // 98: xyz.block.ftl.v1.ModuleService.SetNextFSMEvent:output_type -> xyz.block.ftl.v1.SendFSMEventResponse - 17, // 99: xyz.block.ftl.v1.ModuleService.PublishEvent:output_type -> xyz.block.ftl.v1.PublishEventResponse - 6, // 100: xyz.block.ftl.v1.ControllerService.Ping:output_type -> xyz.block.ftl.v1.PingResponse - 44, // 101: xyz.block.ftl.v1.ControllerService.ProcessList:output_type -> xyz.block.ftl.v1.ProcessListResponse - 42, // 102: xyz.block.ftl.v1.ControllerService.Status:output_type -> xyz.block.ftl.v1.StatusResponse - 23, // 103: xyz.block.ftl.v1.ControllerService.GetArtefactDiffs:output_type -> xyz.block.ftl.v1.GetArtefactDiffsResponse - 25, // 104: xyz.block.ftl.v1.ControllerService.UploadArtefact:output_type -> xyz.block.ftl.v1.UploadArtefactResponse - 28, // 105: xyz.block.ftl.v1.ControllerService.CreateDeployment:output_type -> xyz.block.ftl.v1.CreateDeploymentResponse - 32, // 106: xyz.block.ftl.v1.ControllerService.GetDeployment:output_type -> xyz.block.ftl.v1.GetDeploymentResponse - 30, // 107: xyz.block.ftl.v1.ControllerService.GetDeploymentArtefacts:output_type -> xyz.block.ftl.v1.GetDeploymentArtefactsResponse - 34, // 108: xyz.block.ftl.v1.ControllerService.RegisterRunner:output_type -> xyz.block.ftl.v1.RegisterRunnerResponse - 36, // 109: xyz.block.ftl.v1.ControllerService.UpdateDeploy:output_type -> xyz.block.ftl.v1.UpdateDeployResponse - 38, // 110: xyz.block.ftl.v1.ControllerService.ReplaceDeploy:output_type -> xyz.block.ftl.v1.ReplaceDeployResponse - 40, // 111: xyz.block.ftl.v1.ControllerService.StreamDeploymentLogs:output_type -> xyz.block.ftl.v1.StreamDeploymentLogsResponse - 19, // 112: xyz.block.ftl.v1.ControllerService.GetSchema:output_type -> xyz.block.ftl.v1.GetSchemaResponse - 21, // 113: xyz.block.ftl.v1.ControllerService.PullSchema:output_type -> xyz.block.ftl.v1.PullSchemaResponse - 46, // 114: xyz.block.ftl.v1.ControllerService.ResetSubscription:output_type -> xyz.block.ftl.v1.ResetSubscriptionResponse - 6, // 115: xyz.block.ftl.v1.RunnerService.Ping:output_type -> xyz.block.ftl.v1.PingResponse - 51, // 116: xyz.block.ftl.v1.RunnerService.Reserve:output_type -> xyz.block.ftl.v1.ReserveResponse - 48, // 117: xyz.block.ftl.v1.RunnerService.Deploy:output_type -> xyz.block.ftl.v1.DeployResponse - 33, // 118: xyz.block.ftl.v1.RunnerService.Terminate:output_type -> xyz.block.ftl.v1.RegisterRunnerRequest - 6, // 119: xyz.block.ftl.v1.AdminService.Ping:output_type -> xyz.block.ftl.v1.PingResponse - 54, // 120: xyz.block.ftl.v1.AdminService.ConfigList:output_type -> xyz.block.ftl.v1.ListConfigResponse - 56, // 121: xyz.block.ftl.v1.AdminService.ConfigGet:output_type -> xyz.block.ftl.v1.GetConfigResponse - 58, // 122: xyz.block.ftl.v1.AdminService.ConfigSet:output_type -> xyz.block.ftl.v1.SetConfigResponse - 60, // 123: xyz.block.ftl.v1.AdminService.ConfigUnset:output_type -> xyz.block.ftl.v1.UnsetConfigResponse - 62, // 124: xyz.block.ftl.v1.AdminService.SecretsList:output_type -> xyz.block.ftl.v1.ListSecretsResponse - 64, // 125: xyz.block.ftl.v1.AdminService.SecretGet:output_type -> xyz.block.ftl.v1.GetSecretResponse - 66, // 126: xyz.block.ftl.v1.AdminService.SecretSet:output_type -> xyz.block.ftl.v1.SetSecretResponse - 68, // 127: xyz.block.ftl.v1.AdminService.SecretUnset:output_type -> xyz.block.ftl.v1.UnsetSecretResponse - 92, // [92:128] is the sub-list for method output_type - 56, // [56:92] is the sub-list for method input_type + 5, // 79: xyz.block.ftl.v1.AdminService.Ping:input_type -> xyz.block.ftl.v1.PingRequest + 48, // 80: xyz.block.ftl.v1.AdminService.ConfigList:input_type -> xyz.block.ftl.v1.ListConfigRequest + 50, // 81: xyz.block.ftl.v1.AdminService.ConfigGet:input_type -> xyz.block.ftl.v1.GetConfigRequest + 52, // 82: xyz.block.ftl.v1.AdminService.ConfigSet:input_type -> xyz.block.ftl.v1.SetConfigRequest + 54, // 83: xyz.block.ftl.v1.AdminService.ConfigUnset:input_type -> xyz.block.ftl.v1.UnsetConfigRequest + 56, // 84: xyz.block.ftl.v1.AdminService.SecretsList:input_type -> xyz.block.ftl.v1.ListSecretsRequest + 58, // 85: xyz.block.ftl.v1.AdminService.SecretGet:input_type -> xyz.block.ftl.v1.GetSecretRequest + 60, // 86: xyz.block.ftl.v1.AdminService.SecretSet:input_type -> xyz.block.ftl.v1.SetSecretRequest + 62, // 87: xyz.block.ftl.v1.AdminService.SecretUnset:input_type -> xyz.block.ftl.v1.UnsetSecretRequest + 6, // 88: xyz.block.ftl.v1.VerbService.Ping:output_type -> xyz.block.ftl.v1.PingResponse + 11, // 89: xyz.block.ftl.v1.VerbService.Call:output_type -> xyz.block.ftl.v1.CallResponse + 6, // 90: xyz.block.ftl.v1.ModuleService.Ping:output_type -> xyz.block.ftl.v1.PingResponse + 8, // 91: xyz.block.ftl.v1.ModuleService.GetModuleContext:output_type -> xyz.block.ftl.v1.ModuleContextResponse + 13, // 92: xyz.block.ftl.v1.ModuleService.AcquireLease:output_type -> xyz.block.ftl.v1.AcquireLeaseResponse + 15, // 93: xyz.block.ftl.v1.ModuleService.SendFSMEvent:output_type -> xyz.block.ftl.v1.SendFSMEventResponse + 15, // 94: xyz.block.ftl.v1.ModuleService.SetNextFSMEvent:output_type -> xyz.block.ftl.v1.SendFSMEventResponse + 17, // 95: xyz.block.ftl.v1.ModuleService.PublishEvent:output_type -> xyz.block.ftl.v1.PublishEventResponse + 6, // 96: xyz.block.ftl.v1.ControllerService.Ping:output_type -> xyz.block.ftl.v1.PingResponse + 44, // 97: xyz.block.ftl.v1.ControllerService.ProcessList:output_type -> xyz.block.ftl.v1.ProcessListResponse + 42, // 98: xyz.block.ftl.v1.ControllerService.Status:output_type -> xyz.block.ftl.v1.StatusResponse + 23, // 99: xyz.block.ftl.v1.ControllerService.GetArtefactDiffs:output_type -> xyz.block.ftl.v1.GetArtefactDiffsResponse + 25, // 100: xyz.block.ftl.v1.ControllerService.UploadArtefact:output_type -> xyz.block.ftl.v1.UploadArtefactResponse + 28, // 101: xyz.block.ftl.v1.ControllerService.CreateDeployment:output_type -> xyz.block.ftl.v1.CreateDeploymentResponse + 32, // 102: xyz.block.ftl.v1.ControllerService.GetDeployment:output_type -> xyz.block.ftl.v1.GetDeploymentResponse + 30, // 103: xyz.block.ftl.v1.ControllerService.GetDeploymentArtefacts:output_type -> xyz.block.ftl.v1.GetDeploymentArtefactsResponse + 34, // 104: xyz.block.ftl.v1.ControllerService.RegisterRunner:output_type -> xyz.block.ftl.v1.RegisterRunnerResponse + 36, // 105: xyz.block.ftl.v1.ControllerService.UpdateDeploy:output_type -> xyz.block.ftl.v1.UpdateDeployResponse + 38, // 106: xyz.block.ftl.v1.ControllerService.ReplaceDeploy:output_type -> xyz.block.ftl.v1.ReplaceDeployResponse + 40, // 107: xyz.block.ftl.v1.ControllerService.StreamDeploymentLogs:output_type -> xyz.block.ftl.v1.StreamDeploymentLogsResponse + 19, // 108: xyz.block.ftl.v1.ControllerService.GetSchema:output_type -> xyz.block.ftl.v1.GetSchemaResponse + 21, // 109: xyz.block.ftl.v1.ControllerService.PullSchema:output_type -> xyz.block.ftl.v1.PullSchemaResponse + 46, // 110: xyz.block.ftl.v1.ControllerService.ResetSubscription:output_type -> xyz.block.ftl.v1.ResetSubscriptionResponse + 6, // 111: xyz.block.ftl.v1.AdminService.Ping:output_type -> xyz.block.ftl.v1.PingResponse + 49, // 112: xyz.block.ftl.v1.AdminService.ConfigList:output_type -> xyz.block.ftl.v1.ListConfigResponse + 51, // 113: xyz.block.ftl.v1.AdminService.ConfigGet:output_type -> xyz.block.ftl.v1.GetConfigResponse + 53, // 114: xyz.block.ftl.v1.AdminService.ConfigSet:output_type -> xyz.block.ftl.v1.SetConfigResponse + 55, // 115: xyz.block.ftl.v1.AdminService.ConfigUnset:output_type -> xyz.block.ftl.v1.UnsetConfigResponse + 57, // 116: xyz.block.ftl.v1.AdminService.SecretsList:output_type -> xyz.block.ftl.v1.ListSecretsResponse + 59, // 117: xyz.block.ftl.v1.AdminService.SecretGet:output_type -> xyz.block.ftl.v1.GetSecretResponse + 61, // 118: xyz.block.ftl.v1.AdminService.SecretSet:output_type -> xyz.block.ftl.v1.SetSecretResponse + 63, // 119: xyz.block.ftl.v1.AdminService.SecretUnset:output_type -> xyz.block.ftl.v1.UnsetSecretResponse + 88, // [88:120] is the sub-list for method output_type + 56, // [56:88] is the sub-list for method input_type 56, // [56:56] is the sub-list for extension type_name 56, // [56:56] is the sub-list for extension extendee 0, // [0:56] is the sub-list for field type_name @@ -5967,66 +5685,6 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { } } file_xyz_block_ftl_v1_ftl_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*DeployRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*DeployResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*TerminateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*ReserveRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*ReserveResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[47].Exporter = func(v any, i int) any { switch v := v.(*ConfigRef); i { case 0: return &v.state @@ -6038,7 +5696,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[48].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[43].Exporter = func(v any, i int) any { switch v := v.(*ListConfigRequest); i { case 0: return &v.state @@ -6050,7 +5708,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[49].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[44].Exporter = func(v any, i int) any { switch v := v.(*ListConfigResponse); i { case 0: return &v.state @@ -6062,7 +5720,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[50].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[45].Exporter = func(v any, i int) any { switch v := v.(*GetConfigRequest); i { case 0: return &v.state @@ -6074,7 +5732,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[51].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[46].Exporter = func(v any, i int) any { switch v := v.(*GetConfigResponse); i { case 0: return &v.state @@ -6086,7 +5744,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[52].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[47].Exporter = func(v any, i int) any { switch v := v.(*SetConfigRequest); i { case 0: return &v.state @@ -6098,7 +5756,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[53].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[48].Exporter = func(v any, i int) any { switch v := v.(*SetConfigResponse); i { case 0: return &v.state @@ -6110,7 +5768,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[54].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[49].Exporter = func(v any, i int) any { switch v := v.(*UnsetConfigRequest); i { case 0: return &v.state @@ -6122,7 +5780,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[55].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[50].Exporter = func(v any, i int) any { switch v := v.(*UnsetConfigResponse); i { case 0: return &v.state @@ -6134,7 +5792,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[56].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[51].Exporter = func(v any, i int) any { switch v := v.(*ListSecretsRequest); i { case 0: return &v.state @@ -6146,7 +5804,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[57].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[52].Exporter = func(v any, i int) any { switch v := v.(*ListSecretsResponse); i { case 0: return &v.state @@ -6158,7 +5816,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[58].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[53].Exporter = func(v any, i int) any { switch v := v.(*GetSecretRequest); i { case 0: return &v.state @@ -6170,7 +5828,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[59].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[54].Exporter = func(v any, i int) any { switch v := v.(*GetSecretResponse); i { case 0: return &v.state @@ -6182,7 +5840,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[60].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[55].Exporter = func(v any, i int) any { switch v := v.(*SetSecretRequest); i { case 0: return &v.state @@ -6194,7 +5852,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[61].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[56].Exporter = func(v any, i int) any { switch v := v.(*SetSecretResponse); i { case 0: return &v.state @@ -6206,7 +5864,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[62].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[57].Exporter = func(v any, i int) any { switch v := v.(*UnsetSecretRequest); i { case 0: return &v.state @@ -6218,7 +5876,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[63].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[58].Exporter = func(v any, i int) any { switch v := v.(*UnsetSecretResponse); i { case 0: return &v.state @@ -6230,7 +5888,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[64].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[59].Exporter = func(v any, i int) any { switch v := v.(*ModuleContextResponse_Ref); i { case 0: return &v.state @@ -6242,7 +5900,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[65].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[60].Exporter = func(v any, i int) any { switch v := v.(*ModuleContextResponse_DSN); i { case 0: return &v.state @@ -6254,7 +5912,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[68].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[63].Exporter = func(v any, i int) any { switch v := v.(*Metadata_Pair); i { case 0: return &v.state @@ -6266,7 +5924,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[69].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[64].Exporter = func(v any, i int) any { switch v := v.(*CallResponse_Error); i { case 0: return &v.state @@ -6278,7 +5936,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[71].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[66].Exporter = func(v any, i int) any { switch v := v.(*StatusResponse_Controller); i { case 0: return &v.state @@ -6290,7 +5948,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[72].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[67].Exporter = func(v any, i int) any { switch v := v.(*StatusResponse_Runner); i { case 0: return &v.state @@ -6302,7 +5960,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[73].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[68].Exporter = func(v any, i int) any { switch v := v.(*StatusResponse_Deployment); i { case 0: return &v.state @@ -6314,7 +5972,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[74].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[69].Exporter = func(v any, i int) any { switch v := v.(*StatusResponse_IngressRoute); i { case 0: return &v.state @@ -6326,7 +5984,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[75].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[70].Exporter = func(v any, i int) any { switch v := v.(*StatusResponse_Route); i { case 0: return &v.state @@ -6338,7 +5996,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[76].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[71].Exporter = func(v any, i int) any { switch v := v.(*ProcessListResponse_ProcessRunner); i { case 0: return &v.state @@ -6350,7 +6008,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[77].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[72].Exporter = func(v any, i int) any { switch v := v.(*ProcessListResponse_Process); i { case 0: return &v.state @@ -6362,7 +6020,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[78].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[73].Exporter = func(v any, i int) any { switch v := v.(*ListConfigResponse_Config); i { case 0: return &v.state @@ -6374,7 +6032,7 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { return nil } } - file_xyz_block_ftl_v1_ftl_proto_msgTypes[79].Exporter = func(v any, i int) any { + file_xyz_block_ftl_v1_ftl_proto_msgTypes[74].Exporter = func(v any, i int) any { switch v := v.(*ListSecretsResponse_Secret); i { case 0: return &v.state @@ -6395,30 +6053,29 @@ func file_xyz_block_ftl_v1_ftl_proto_init() { file_xyz_block_ftl_v1_ftl_proto_msgTypes[16].OneofWrappers = []any{} file_xyz_block_ftl_v1_ftl_proto_msgTypes[22].OneofWrappers = []any{} file_xyz_block_ftl_v1_ftl_proto_msgTypes[23].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[28].OneofWrappers = []any{} file_xyz_block_ftl_v1_ftl_proto_msgTypes[34].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[42].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[43].OneofWrappers = []any{} file_xyz_block_ftl_v1_ftl_proto_msgTypes[47].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[48].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[52].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[54].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[56].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[60].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[62].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[49].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[51].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[55].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[57].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[59].OneofWrappers = []any{} file_xyz_block_ftl_v1_ftl_proto_msgTypes[64].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[69].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[67].OneofWrappers = []any{} file_xyz_block_ftl_v1_ftl_proto_msgTypes[72].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[77].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[78].OneofWrappers = []any{} - file_xyz_block_ftl_v1_ftl_proto_msgTypes[79].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[73].OneofWrappers = []any{} + file_xyz_block_ftl_v1_ftl_proto_msgTypes[74].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_xyz_block_ftl_v1_ftl_proto_rawDesc, NumEnums: 5, - NumMessages: 80, + NumMessages: 75, NumExtensions: 0, - NumServices: 5, + NumServices: 4, }, GoTypes: file_xyz_block_ftl_v1_ftl_proto_goTypes, DependencyIndexes: file_xyz_block_ftl_v1_ftl_proto_depIdxs, diff --git a/backend/protos/xyz/block/ftl/v1/ftl.proto b/backend/protos/xyz/block/ftl/v1/ftl.proto index dd6269b8b6..ba16f0ac1a 100644 --- a/backend/protos/xyz/block/ftl/v1/ftl.proto +++ b/backend/protos/xyz/block/ftl/v1/ftl.proto @@ -209,24 +209,19 @@ message GetDeploymentResponse { enum RunnerState { // The Runner is waiting for a deployment. - RUNNER_IDLE = 0; - // The Runner and Controller have agreed that the Runner is reserved. - RUNNER_RESERVED = 1; + RUNNER_NEW = 0; // The Runner is assigned to a deployment. - RUNNER_ASSIGNED = 2; + RUNNER_ASSIGNED = 1; // The Runner is dead. - RUNNER_DEAD = 3; + RUNNER_DEAD = 2; } message RegisterRunnerRequest { string key = 1; string endpoint = 2; - optional string deployment = 3; + string deployment = 3; RunnerState state = 4; google.protobuf.Struct labels = 5; - - // If present, the reason the Runner is transitioning from ASSIGNED to IDLE. - optional string error = 7; } message RegisterRunnerResponse {} @@ -382,40 +377,6 @@ service ControllerService { rpc ResetSubscription(ResetSubscriptionRequest) returns (ResetSubscriptionResponse); } -message DeployRequest { - string deployment_key = 1; -} -message DeployResponse {} - -message TerminateRequest { - string deployment_key = 1; -} - -message ReserveRequest { - string deployment_key = 1; -} -message ReserveResponse {} - -// RunnerService is the service that executes Deployments. -// -// The Controller will scale the Runner horizontally as required. The Runner will -// register itself automatically with the ControllerService, which will then -// assign modules to it. -service RunnerService { - rpc Ping(PingRequest) returns (PingResponse) { - option idempotency_level = NO_SIDE_EFFECTS; - } - - // Reserve synchronously reserves a Runner for a deployment but does nothing else. - rpc Reserve(ReserveRequest) returns (ReserveResponse); - - // Initiate a deployment on this Runner. - rpc Deploy(DeployRequest) returns (DeployResponse); - - // Terminate the deployment on this Runner. - rpc Terminate(TerminateRequest) returns (RegisterRunnerRequest); -} - message ConfigRef { optional string module = 1; string name = 2; diff --git a/backend/protos/xyz/block/ftl/v1/ftlv1connect/ftl.connect.go b/backend/protos/xyz/block/ftl/v1/ftlv1connect/ftl.connect.go index 8e0ab56e5d..bfcddfac5b 100644 --- a/backend/protos/xyz/block/ftl/v1/ftlv1connect/ftl.connect.go +++ b/backend/protos/xyz/block/ftl/v1/ftlv1connect/ftl.connect.go @@ -27,8 +27,6 @@ const ( ModuleServiceName = "xyz.block.ftl.v1.ModuleService" // ControllerServiceName is the fully-qualified name of the ControllerService service. ControllerServiceName = "xyz.block.ftl.v1.ControllerService" - // RunnerServiceName is the fully-qualified name of the RunnerService service. - RunnerServiceName = "xyz.block.ftl.v1.RunnerService" // AdminServiceName is the fully-qualified name of the AdminService service. AdminServiceName = "xyz.block.ftl.v1.AdminService" ) @@ -106,14 +104,6 @@ const ( // ControllerServiceResetSubscriptionProcedure is the fully-qualified name of the // ControllerService's ResetSubscription RPC. ControllerServiceResetSubscriptionProcedure = "/xyz.block.ftl.v1.ControllerService/ResetSubscription" - // RunnerServicePingProcedure is the fully-qualified name of the RunnerService's Ping RPC. - RunnerServicePingProcedure = "/xyz.block.ftl.v1.RunnerService/Ping" - // RunnerServiceReserveProcedure is the fully-qualified name of the RunnerService's Reserve RPC. - RunnerServiceReserveProcedure = "/xyz.block.ftl.v1.RunnerService/Reserve" - // RunnerServiceDeployProcedure is the fully-qualified name of the RunnerService's Deploy RPC. - RunnerServiceDeployProcedure = "/xyz.block.ftl.v1.RunnerService/Deploy" - // RunnerServiceTerminateProcedure is the fully-qualified name of the RunnerService's Terminate RPC. - RunnerServiceTerminateProcedure = "/xyz.block.ftl.v1.RunnerService/Terminate" // AdminServicePingProcedure is the fully-qualified name of the AdminService's Ping RPC. AdminServicePingProcedure = "/xyz.block.ftl.v1.AdminService/Ping" // AdminServiceConfigListProcedure is the fully-qualified name of the AdminService's ConfigList RPC. @@ -893,152 +883,6 @@ func (UnimplementedControllerServiceHandler) ResetSubscription(context.Context, return nil, connect.NewError(connect.CodeUnimplemented, errors.New("xyz.block.ftl.v1.ControllerService.ResetSubscription is not implemented")) } -// RunnerServiceClient is a client for the xyz.block.ftl.v1.RunnerService service. -type RunnerServiceClient interface { - Ping(context.Context, *connect.Request[v1.PingRequest]) (*connect.Response[v1.PingResponse], error) - // Reserve synchronously reserves a Runner for a deployment but does nothing else. - Reserve(context.Context, *connect.Request[v1.ReserveRequest]) (*connect.Response[v1.ReserveResponse], error) - // Initiate a deployment on this Runner. - Deploy(context.Context, *connect.Request[v1.DeployRequest]) (*connect.Response[v1.DeployResponse], error) - // Terminate the deployment on this Runner. - Terminate(context.Context, *connect.Request[v1.TerminateRequest]) (*connect.Response[v1.RegisterRunnerRequest], error) -} - -// NewRunnerServiceClient constructs a client for the xyz.block.ftl.v1.RunnerService service. By -// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, -// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the -// connect.WithGRPC() or connect.WithGRPCWeb() options. -// -// The URL supplied here should be the base URL for the Connect or gRPC server (for example, -// http://api.acme.com or https://acme.com/grpc). -func NewRunnerServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) RunnerServiceClient { - baseURL = strings.TrimRight(baseURL, "/") - return &runnerServiceClient{ - ping: connect.NewClient[v1.PingRequest, v1.PingResponse]( - httpClient, - baseURL+RunnerServicePingProcedure, - connect.WithIdempotency(connect.IdempotencyNoSideEffects), - connect.WithClientOptions(opts...), - ), - reserve: connect.NewClient[v1.ReserveRequest, v1.ReserveResponse]( - httpClient, - baseURL+RunnerServiceReserveProcedure, - opts..., - ), - deploy: connect.NewClient[v1.DeployRequest, v1.DeployResponse]( - httpClient, - baseURL+RunnerServiceDeployProcedure, - opts..., - ), - terminate: connect.NewClient[v1.TerminateRequest, v1.RegisterRunnerRequest]( - httpClient, - baseURL+RunnerServiceTerminateProcedure, - opts..., - ), - } -} - -// runnerServiceClient implements RunnerServiceClient. -type runnerServiceClient struct { - ping *connect.Client[v1.PingRequest, v1.PingResponse] - reserve *connect.Client[v1.ReserveRequest, v1.ReserveResponse] - deploy *connect.Client[v1.DeployRequest, v1.DeployResponse] - terminate *connect.Client[v1.TerminateRequest, v1.RegisterRunnerRequest] -} - -// Ping calls xyz.block.ftl.v1.RunnerService.Ping. -func (c *runnerServiceClient) Ping(ctx context.Context, req *connect.Request[v1.PingRequest]) (*connect.Response[v1.PingResponse], error) { - return c.ping.CallUnary(ctx, req) -} - -// Reserve calls xyz.block.ftl.v1.RunnerService.Reserve. -func (c *runnerServiceClient) Reserve(ctx context.Context, req *connect.Request[v1.ReserveRequest]) (*connect.Response[v1.ReserveResponse], error) { - return c.reserve.CallUnary(ctx, req) -} - -// Deploy calls xyz.block.ftl.v1.RunnerService.Deploy. -func (c *runnerServiceClient) Deploy(ctx context.Context, req *connect.Request[v1.DeployRequest]) (*connect.Response[v1.DeployResponse], error) { - return c.deploy.CallUnary(ctx, req) -} - -// Terminate calls xyz.block.ftl.v1.RunnerService.Terminate. -func (c *runnerServiceClient) Terminate(ctx context.Context, req *connect.Request[v1.TerminateRequest]) (*connect.Response[v1.RegisterRunnerRequest], error) { - return c.terminate.CallUnary(ctx, req) -} - -// RunnerServiceHandler is an implementation of the xyz.block.ftl.v1.RunnerService service. -type RunnerServiceHandler interface { - Ping(context.Context, *connect.Request[v1.PingRequest]) (*connect.Response[v1.PingResponse], error) - // Reserve synchronously reserves a Runner for a deployment but does nothing else. - Reserve(context.Context, *connect.Request[v1.ReserveRequest]) (*connect.Response[v1.ReserveResponse], error) - // Initiate a deployment on this Runner. - Deploy(context.Context, *connect.Request[v1.DeployRequest]) (*connect.Response[v1.DeployResponse], error) - // Terminate the deployment on this Runner. - Terminate(context.Context, *connect.Request[v1.TerminateRequest]) (*connect.Response[v1.RegisterRunnerRequest], error) -} - -// NewRunnerServiceHandler builds an HTTP handler from the service implementation. It returns the -// path on which to mount the handler and the handler itself. -// -// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf -// and JSON codecs. They also support gzip compression. -func NewRunnerServiceHandler(svc RunnerServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { - runnerServicePingHandler := connect.NewUnaryHandler( - RunnerServicePingProcedure, - svc.Ping, - connect.WithIdempotency(connect.IdempotencyNoSideEffects), - connect.WithHandlerOptions(opts...), - ) - runnerServiceReserveHandler := connect.NewUnaryHandler( - RunnerServiceReserveProcedure, - svc.Reserve, - opts..., - ) - runnerServiceDeployHandler := connect.NewUnaryHandler( - RunnerServiceDeployProcedure, - svc.Deploy, - opts..., - ) - runnerServiceTerminateHandler := connect.NewUnaryHandler( - RunnerServiceTerminateProcedure, - svc.Terminate, - opts..., - ) - return "/xyz.block.ftl.v1.RunnerService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch r.URL.Path { - case RunnerServicePingProcedure: - runnerServicePingHandler.ServeHTTP(w, r) - case RunnerServiceReserveProcedure: - runnerServiceReserveHandler.ServeHTTP(w, r) - case RunnerServiceDeployProcedure: - runnerServiceDeployHandler.ServeHTTP(w, r) - case RunnerServiceTerminateProcedure: - runnerServiceTerminateHandler.ServeHTTP(w, r) - default: - http.NotFound(w, r) - } - }) -} - -// UnimplementedRunnerServiceHandler returns CodeUnimplemented from all methods. -type UnimplementedRunnerServiceHandler struct{} - -func (UnimplementedRunnerServiceHandler) Ping(context.Context, *connect.Request[v1.PingRequest]) (*connect.Response[v1.PingResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("xyz.block.ftl.v1.RunnerService.Ping is not implemented")) -} - -func (UnimplementedRunnerServiceHandler) Reserve(context.Context, *connect.Request[v1.ReserveRequest]) (*connect.Response[v1.ReserveResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("xyz.block.ftl.v1.RunnerService.Reserve is not implemented")) -} - -func (UnimplementedRunnerServiceHandler) Deploy(context.Context, *connect.Request[v1.DeployRequest]) (*connect.Response[v1.DeployResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("xyz.block.ftl.v1.RunnerService.Deploy is not implemented")) -} - -func (UnimplementedRunnerServiceHandler) Terminate(context.Context, *connect.Request[v1.TerminateRequest]) (*connect.Response[v1.RegisterRunnerRequest], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("xyz.block.ftl.v1.RunnerService.Terminate is not implemented")) -} - // AdminServiceClient is a client for the xyz.block.ftl.v1.AdminService service. type AdminServiceClient interface { Ping(context.Context, *connect.Request[v1.PingRequest]) (*connect.Response[v1.PingResponse], error) diff --git a/backend/protos/xyz/block/ftl/v1/mixins.go b/backend/protos/xyz/block/ftl/v1/mixins.go index 4937bff064..0f66c09295 100644 --- a/backend/protos/xyz/block/ftl/v1/mixins.go +++ b/backend/protos/xyz/block/ftl/v1/mixins.go @@ -1,12 +1,11 @@ package ftlv1 import ( - "fmt" "strings" "github.com/alecthomas/types/optional" - model "github.com/TBD54566975/ftl/internal/model" + "github.com/TBD54566975/ftl/internal/model" ) func ArtefactToProto(artefact *model.Artefact) *DeploymentArtefact { @@ -59,14 +58,3 @@ func (m *Metadata) Delete(key string) { } m.Values = out } - -func (r *RegisterRunnerRequest) DeploymentAsOptional() (optional.Option[model.DeploymentKey], error) { - if r.Deployment == nil { - return optional.None[model.DeploymentKey](), nil - } - key, err := model.ParseDeploymentKey(*r.Deployment) - if err != nil { - return optional.None[model.DeploymentKey](), fmt.Errorf("invalid deployment key: %w", err) - } - return optional.Some(key), nil -} diff --git a/backend/runner/runner.go b/backend/runner/runner.go index e5195946cd..9c75d65b1f 100644 --- a/backend/runner/runner.go +++ b/backend/runner/runner.go @@ -53,12 +53,15 @@ type Config struct { HeartbeatPeriod time.Duration `help:"Minimum period between heartbeats." default:"3s"` HeartbeatJitter time.Duration `help:"Jitter to add to heartbeat period." default:"2s"` RunnerStartDelay time.Duration `help:"Time in seconds for a runner to wait before contacting the controller. This can be needed in istio environments to work around initialization races." env:"FTL_RUNNER_START_DELAY" default:"0s"` + Deployment string `help:"The deployment this runner is for." env:"FTL_DEPLOYMENT"` } func Start(ctx context.Context, config Config) error { if config.Advertise.String() == "" { config.Advertise = config.Bind } + ctx, doneFunc := context.WithCancel(ctx) + defer doneFunc() hostname, err := os.Hostname() if err != nil { observability.Runner.StartupFailed(ctx) @@ -106,8 +109,9 @@ func Start(ctx context.Context, config Config) error { forceUpdate: make(chan struct{}, 16), labels: labels, deploymentLogQueue: make(chan log.Entry, 10000), + cancelFunc: doneFunc, } - svc.state.Store(ftlv1.RunnerState_RUNNER_IDLE) + svc.state.Store(ftlv1.RunnerState_RUNNER_NEW) go func() { // In some environments we may want a delay before registering the runner @@ -121,7 +125,6 @@ func Start(ctx context.Context, config Config) error { return rpc.Serve(ctx, config.Bind, rpc.GRPC(ftlv1connect.NewVerbServiceHandler, svc), - rpc.GRPC(ftlv1connect.NewRunnerServiceHandler, svc), rpc.HTTP("/", svc), ) } @@ -181,7 +184,6 @@ func manageDeploymentDirectory(logger *log.Logger, config Config) error { return nil } -var _ ftlv1connect.RunnerServiceHandler = (*Service)(nil) var _ ftlv1connect.VerbServiceHandler = (*Service)(nil) type deployment struct { @@ -204,6 +206,7 @@ type Service struct { registrationFailure atomic.Value[optional.Option[error]] labels *structpb.Struct deploymentLogQueue chan log.Entry + cancelFunc func() } func (s *Service) Call(ctx context.Context, req *connect.Request[ftlv1.CallRequest]) (*connect.Response[ftlv1.CallResponse], error) { @@ -218,27 +221,22 @@ func (s *Service) Call(ctx context.Context, req *connect.Request[ftlv1.CallReque return connect.NewResponse(response.Msg), nil } -func (s *Service) Reserve(ctx context.Context, c *connect.Request[ftlv1.ReserveRequest]) (*connect.Response[ftlv1.ReserveResponse], error) { - if !s.state.CompareAndSwap(ftlv1.RunnerState_RUNNER_IDLE, ftlv1.RunnerState_RUNNER_RESERVED) { - return nil, fmt.Errorf("can only reserve from IDLE state, not %s", s.state.Load()) - } - return connect.NewResponse(&ftlv1.ReserveResponse{}), nil -} - func (s *Service) Ping(ctx context.Context, req *connect.Request[ftlv1.PingRequest]) (*connect.Response[ftlv1.PingResponse], error) { return connect.NewResponse(&ftlv1.PingResponse{}), nil } -func (s *Service) Deploy(ctx context.Context, req *connect.Request[ftlv1.DeployRequest]) (response *connect.Response[ftlv1.DeployResponse], err error) { +func (s *Service) deploy(ctx context.Context) error { + logger := log.FromContext(ctx) if err, ok := s.registrationFailure.Load().Get(); ok { observability.Deployment.Failure(ctx, optional.None[string]()) - return nil, connect.NewError(connect.CodeUnavailable, fmt.Errorf("failed to register runner: %w", err)) + return connect.NewError(connect.CodeUnavailable, fmt.Errorf("failed to register runner: %w", err)) } - key, err := model.ParseDeploymentKey(req.Msg.DeploymentKey) + key, err := model.ParseDeploymentKey(s.config.Deployment) if err != nil { observability.Deployment.Failure(ctx, optional.None[string]()) - return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("invalid deployment key: %w", err)) + s.cancelFunc() + return connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("invalid deployment key: %w", err)) } observability.Deployment.Started(ctx, key.String()) @@ -251,7 +249,7 @@ func (s *Service) Deploy(ctx context.Context, req *connect.Request[ftlv1.DeployR defer s.lock.Unlock() if s.deployment.Load().Ok() { observability.Deployment.Failure(ctx, optional.Some(key.String())) - return nil, connect.NewError(connect.CodeResourceExhausted, errors.New("already deployed")) + return errors.New("already deployed") } // Set the state of the Runner, and update the Controller. @@ -260,42 +258,34 @@ func (s *Service) Deploy(ctx context.Context, req *connect.Request[ftlv1.DeployR s.forceUpdate <- struct{}{} } - setState(ftlv1.RunnerState_RUNNER_RESERVED) - defer func() { - if err != nil { - setState(ftlv1.RunnerState_RUNNER_IDLE) - s.deployment.Store(optional.None[*deployment]()) - } - }() - - gdResp, err := s.controllerClient.GetDeployment(ctx, connect.NewRequest(&ftlv1.GetDeploymentRequest{DeploymentKey: req.Msg.DeploymentKey})) + gdResp, err := s.controllerClient.GetDeployment(ctx, connect.NewRequest(&ftlv1.GetDeploymentRequest{DeploymentKey: s.config.Deployment})) if err != nil { observability.Deployment.Failure(ctx, optional.Some(key.String())) - return nil, err + return fmt.Errorf("failed to get deployment: %w", err) } module, err := schema.ModuleFromProto(gdResp.Msg.Schema) if err != nil { observability.Deployment.Failure(ctx, optional.Some(key.String())) - return nil, fmt.Errorf("invalid module: %w", err) + return fmt.Errorf("invalid module: %w", err) } deploymentDir := filepath.Join(s.config.DeploymentDir, module.Name, key.String()) if s.config.TemplateDir != "" { err = copy.Copy(s.config.TemplateDir, deploymentDir) if err != nil { observability.Deployment.Failure(ctx, optional.Some(key.String())) - return nil, fmt.Errorf("failed to copy template directory: %w", err) + return fmt.Errorf("failed to copy template directory: %w", err) } } else { err = os.MkdirAll(deploymentDir, 0700) if err != nil { observability.Deployment.Failure(ctx, optional.Some(key.String())) - return nil, fmt.Errorf("failed to create deployment directory: %w", err) + return fmt.Errorf("failed to create deployment directory: %w", err) } } err = download.Artefacts(ctx, s.controllerClient, key, deploymentDir) if err != nil { observability.Deployment.Failure(ctx, optional.Some(key.String())) - return nil, fmt.Errorf("failed to download artefacts: %w", err) + return fmt.Errorf("failed to download artefacts: %w", err) } verbCtx := log.ContextWithLogger(ctx, deploymentLogger.Attrs(map[string]string{"module": module.Name})) @@ -314,36 +304,36 @@ func (s *Service) Deploy(ctx context.Context, req *connect.Request[ftlv1.DeployR ) if err != nil { observability.Deployment.Failure(ctx, optional.Some(key.String())) - return nil, fmt.Errorf("failed to spawn plugin: %w", err) + return fmt.Errorf("failed to spawn plugin: %w", err) } dep := s.makeDeployment(cmdCtx, key, deployment) s.deployment.Store(optional.Some(dep)) + logger.Debugf("Deployed %s", key) setState(ftlv1.RunnerState_RUNNER_ASSIGNED) + context.AfterFunc(ctx, func() { + err := s.Terminate() + if err != nil { + logger := log.FromContext(ctx) + logger.Errorf(err, "failed to terminate deployment") + } + }) - return connect.NewResponse(&ftlv1.DeployResponse{}), nil + return nil } -func (s *Service) Terminate(ctx context.Context, c *connect.Request[ftlv1.TerminateRequest]) (*connect.Response[ftlv1.RegisterRunnerRequest], error) { +func (s *Service) Terminate() error { s.lock.Lock() defer s.lock.Unlock() depl, ok := s.deployment.Load().Get() if !ok { - return nil, connect.NewError(connect.CodeNotFound, errors.New("no deployment")) - } - deploymentKey, err := model.ParseDeploymentKey(c.Msg.DeploymentKey) - if err != nil { - return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("invalid deployment key: %w", err)) + return connect.NewError(connect.CodeNotFound, errors.New("no deployment")) } - if !depl.key.Equal(deploymentKey) { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("deployment key mismatch")) - } - // Soft kill. - err = depl.plugin.Cmd.Kill(syscall.SIGTERM) + err := depl.plugin.Cmd.Kill(syscall.SIGTERM) if err != nil { - return nil, fmt.Errorf("failed to kill plugin: %w", err) + return fmt.Errorf("failed to kill plugin: %w", err) } // Hard kill after 10 seconds. select { @@ -352,17 +342,12 @@ func (s *Service) Terminate(ctx context.Context, c *connect.Request[ftlv1.Termin err := depl.plugin.Cmd.Kill(syscall.SIGKILL) if err != nil { // Should we os.Exit(1) here? - return nil, fmt.Errorf("failed to kill plugin: %w", err) + return fmt.Errorf("failed to kill plugin: %w", err) } } s.deployment.Store(optional.None[*deployment]()) - s.state.Store(ftlv1.RunnerState_RUNNER_IDLE) - return connect.NewResponse(&ftlv1.RegisterRunnerRequest{ - Key: s.key.String(), - Endpoint: s.config.Advertise.String(), - State: ftlv1.RunnerState_RUNNER_IDLE, - Labels: s.labels, - }), nil + return nil + } func (s *Service) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -389,7 +374,6 @@ func (s *Service) registrationLoop(ctx context.Context, send func(request *ftlv1 // Figure out the appropriate state. state := s.state.Load() - var errPtr *string var deploymentKey *string depl, ok := s.deployment.Load().Get() if ok { @@ -397,34 +381,40 @@ func (s *Service) registrationLoop(ctx context.Context, send func(request *ftlv1 deploymentKey = &dkey select { case <-depl.ctx.Done(): - state = ftlv1.RunnerState_RUNNER_IDLE + state = ftlv1.RunnerState_RUNNER_DEAD err := context.Cause(depl.ctx) - errStr := err.Error() - errPtr = &errStr s.getDeploymentLogger(ctx, depl.key).Errorf(err, "Deployment terminated") s.deployment.Store(optional.None[*deployment]()) - + s.cancelFunc() default: state = ftlv1.RunnerState_RUNNER_ASSIGNED } s.state.Store(state) } - logger.Tracef("Registering with Controller as %s", state) + logger.Infof("Registering with Controller as %s for deployment %s", state, s.config.Deployment) err := send(&ftlv1.RegisterRunnerRequest{ Key: s.key.String(), Endpoint: s.config.Advertise.String(), Labels: s.labels, - Deployment: deploymentKey, + Deployment: s.config.Deployment, State: state, - Error: errPtr, }) if err != nil { s.registrationFailure.Store(optional.Some(err)) observability.Runner.RegistrationFailure(ctx, optional.Ptr(deploymentKey), state) return fmt.Errorf("failed to register with Controller: %w", err) } - s.registrationFailure.Store(optional.None[error]()) + if state == ftlv1.RunnerState_RUNNER_NEW { + err = s.deploy(ctx) + if err != nil { + // Deployment failed, we will retry on the next heartbeat + // We rely on Deploy to cancel the context if the error is terminal + logger.Errorf(err, "Failed to deploy") + } else { + s.registrationFailure.Store(optional.None[error]()) + } + } // Wait for the next heartbeat. delay := s.config.HeartbeatPeriod + time.Duration(rand.Intn(int(s.config.HeartbeatJitter))) //nolint:gosec diff --git a/cmd/ftl-controller/main.go b/cmd/ftl-controller/main.go index c44a92dddc..215413d2a1 100644 --- a/cmd/ftl-controller/main.go +++ b/cmd/ftl-controller/main.go @@ -14,7 +14,7 @@ import ( "github.com/TBD54566975/ftl" "github.com/TBD54566975/ftl/backend/controller" leasesdal "github.com/TBD54566975/ftl/backend/controller/leases/dal" - "github.com/TBD54566975/ftl/backend/controller/scaling" + "github.com/TBD54566975/ftl/backend/controller/scaling/k8sscaling" _ "github.com/TBD54566975/ftl/internal/automaxprocs" // Set GOMAXPROCS to match Linux container CPU quota. cf "github.com/TBD54566975/ftl/internal/configuration" cfdal "github.com/TBD54566975/ftl/internal/configuration/dal" @@ -45,10 +45,6 @@ func main() { ) cli.ControllerConfig.SetDefaults() - if cli.ControllerConfig.KMSURI == nil { - kctx.Fatalf("KMSURI is required") - } - ctx := log.ContextWithLogger(context.Background(), log.Configure(os.Stderr, cli.LogConfig)) err = observability.Init(ctx, false, "", "ftl-controller", ftl.Version, cli.ObservabilityConfig) kctx.FatalIfErrorf(err, "failed to initialize observability") @@ -78,6 +74,6 @@ func main() { kctx.FatalIfErrorf(err) ctx = manager.ContextWithSecrets(ctx, sm) - err = controller.Start(ctx, cli.ControllerConfig, scaling.NewK8sScaling(), conn) + err = controller.Start(ctx, cli.ControllerConfig, k8sscaling.NewK8sScaling, conn, false) kctx.FatalIfErrorf(err) } diff --git a/deployment/Dockerfile.controller.test b/deployment/Dockerfile.controller.test new file mode 100644 index 0000000000..e08cb422ca --- /dev/null +++ b/deployment/Dockerfile.controller.test @@ -0,0 +1,18 @@ +FROM ubuntu:24.04 + +WORKDIR /root/ + +COPY docker-build/ftl-controller . +COPY docker-build/ftl-initdb . +COPY docker-build/ftl . +RUN mkdir deployments + +EXPOSE 8891 +EXPOSE 8892 + +ENV FTL_CONTROLLER_BIND="http://0.0.0.0:8892" +ENV FTL_CONTROLLER_ADVERTISE="http://127.0.0.1:8892" +ENV FTL_CONTROLLER_CONSOLE_URL="*" +ENV FTL_CONTROLLER_DSN="postgres://host.docker.internal/ftl?sslmode=disable&user=postgres&password=secret" + +CMD ["/root/ftl-controller"] diff --git a/deployment/Dockerfile.runner.test b/deployment/Dockerfile.runner.test new file mode 100644 index 0000000000..da3371863a --- /dev/null +++ b/deployment/Dockerfile.runner.test @@ -0,0 +1,17 @@ +FROM ubuntu:24.04 + +WORKDIR /root/ + +#this image does not have a JRE, only test golang on kube + +COPY docker-build/ftl-runner . +COPY docker-build/ftl . +RUN mkdir deployments + +EXPOSE 8894 + +ENV FTL_ENDPOINT="http://host.docker.internal:8892" +ENV FTL_RUNNER_BIND="http://0.0.0.0:8893" +ENV FTL_RUNNER_ADVERTISE="http://127.0.0.1:8893" + +CMD ["/root/ftl-runner", "--deployment-dir=deployments"] diff --git a/deployment/Justfile b/deployment/Justfile index 0ce16e52e6..3e198a28d6 100755 --- a/deployment/Justfile +++ b/deployment/Justfile @@ -17,23 +17,39 @@ start: setup full-deploy rm: teardown -full-deploy: - just build-controller - just build-runner +full-deploy: build-controller build-runner setup-cluster + #!/bin/bash + kubectl rollout restart deployment ftl-controller || true # if this exists already restart it to get the latest image + just apply || sleep 5 # wait for CRDs to be created, the initial apply will usually fail just apply - kubectl wait --for=condition=available deployment/ftl-controller --timeout=5m - kubectl wait --for=condition=available deployment/ftl-runner --timeout=5m - kubectl wait --for=condition=ready pod/ftl-pg-cluster-1-0 --timeout=5m +wait-for-kube: + #!/bin/bash + while [ -z "$(kubectl get pod ftl-pg-cluster-1-0)" ]; do sleep 1; done + kubectl wait --for=condition=ready pod/ftl-pg-cluster-1-0 --timeout=5m + kubectl wait --for=condition=available deployment/ftl-controller --timeout=5m + sleep 1 ftl status + setup-registry: + #!/bin/bash + if [ -z "$(k3d registry list | grep {{registry_short}})" ]; then k3d registry create {{registry_short}} --port 5000 + fi -setup-cluster: - k3d cluster create ftl --api-port 6550 -p "8892:80@loadbalancer" --agents 2 \ +setup-cluster: setup-registry + #!/bin/bash + if [ -z "$(k3d cluster list | grep ftl)" ]; then + k3d cluster create ftl --api-port 6550 -p "8892:80@loadbalancer" --agents 2 \ --registry-use {{registry_full}} \ - --registry-config '{{mirrors}}' + --registry-config '{{mirrors}}' && \ # Start installing the DB for performance reasons + kubectl apply -k base/db-create || sleep 5 && \ # wait for CRDs to be created, the initial apply will usually fail + kubectl apply -k base/db-create & # background the process, so we can do other things and speed up the test + fi + kubectl config set-context --current --namespace=default + + setup: setup-registry setup-cluster @@ -75,13 +91,20 @@ psql: ftl-status: just exec deployment/ftl-controller ./ftl status -build-controller: - cd .. && docker build --platform linux/amd64 -t ftl-controller:latest -f Dockerfile.controller . +build-executables: + # we build locally then copy into the docker files + # it is way faster than building in the docker files + mkdir -p "docker-build" + cd ../ && GOARCH=amd64 GOOS=linux CGO_ENABLED=0 just build ftl-controller ftl-runner ftl-initdb ftl + cp ../build/release/* ./docker-build/ + +build-controller: build-executables setup-registry setup-cluster + docker build --platform linux/amd64 -t ftl-controller:latest -f Dockerfile.controller.test . docker tag ftl-controller:latest {{registry_local}}/ftl-controller:latest docker push {{registry_local}}/ftl-controller:latest -build-runner: - cd .. && docker build --platform linux/amd64 -t ftl-runner:latest -f Dockerfile.runner . +build-runner: build-executables setup-registry setup-cluster + docker build --platform linux/amd64 -t ftl-runner:latest -f Dockerfile.runner.test . docker tag ftl-runner:latest {{registry_local}}/ftl-runner:latest docker push {{registry_local}}/ftl-runner:latest @@ -108,3 +131,19 @@ ftl *args: export POD=$(kubectl get pods -l app=ftl-controller --no-headers | tail -1 | awk '{print $1}') kubectl exec -it ${POD} -- bash -c "FTL_ENDPOINT=http://ftl-controller:8892 /root/ftl {{args}}" +update-schema: + #!/usr/bin/env bash + cat <base/db-migrate/kustomization.yml + #generated by 'just update-schema' command, DO NOT EDIT + apiVersion: kustomize.config.k8s.io/v1beta1 + kind: Kustomization + resources: + - db-migrate.yml + configMapGenerator: + - name: ftl-db-migrate-config + files: + EOF + for file in $(ls base/db-migrate/schema/*.sql); do + echo " - ./schema/$(basename $file)" >> base/db-migrate/kustomization.yml + done + diff --git a/deployment/base/db-create/kustomization.yml b/deployment/base/db-create/kustomization.yml index 4a8d4b04a8..85b1e81fae 100644 --- a/deployment/base/db-create/kustomization.yml +++ b/deployment/base/db-create/kustomization.yml @@ -1,4 +1,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: + - https://raw.githubusercontent.com/reactive-tech/kubegres/v1.18/kubegres.yaml - pg-cluster.yaml diff --git a/deployment/base/db-migrate/db-migrate.yml b/deployment/base/db-migrate/db-migrate.yml index 2746e61bcc..1b18490a17 100644 --- a/deployment/base/db-migrate/db-migrate.yml +++ b/deployment/base/db-migrate/db-migrate.yml @@ -24,4 +24,4 @@ spec: name: ftl-db-migrate-config parallelism: 1 backoffLimit: 1000 - ttlSecondsAfterFinished: 300 \ No newline at end of file + ttlSecondsAfterFinished: 1 \ No newline at end of file diff --git a/deployment/base/db-migrate/kustomization.yml b/deployment/base/db-migrate/kustomization.yml index 7f0d8eebe0..598204e91a 100644 --- a/deployment/base/db-migrate/kustomization.yml +++ b/deployment/base/db-migrate/kustomization.yml @@ -1,3 +1,4 @@ +#generated by 'just update-schema' command, DO NOT EDIT apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: @@ -5,5 +6,19 @@ resources: configMapGenerator: - name: ftl-db-migrate-config files: - - schema/20231103205514_init.sql - - schema/20240704103403_create_module_secrets.sql \ No newline at end of file + - ./schema/20231103205514_init.sql + - ./schema/20240704103403_create_module_secrets.sql + - ./schema/20240725212023_create_fsm_instance_updated_at.sql + - ./schema/20240729002557_catch_async_calls.sql + - ./schema/20240731230343_create_topic_events_caller.sql + - ./schema/20240801160101_edit-db-secrets-and-configuration.sql + - ./schema/20240807174508_pubsub_otel_context.sql + - ./schema/20240812011321_derive_encryption.sql + - ./schema/20240813062546_create_fsm_next_events.sql + - ./schema/20240814060154_rename_events_to_timeline.sql + - ./schema/20240815003340_typesafe_encrypted_columns.sql + - ./schema/20240815053106_update-indexes.sql + - ./schema/20240815164808_async_calls_cron_job_key.sql + - ./schema/20240820011612_encryption_verification.sql + - ./schema/20240902030242_remove_notify.sql + - ./schema/20240903043046_enforce_runner_deployment.sql diff --git a/deployment/base/ftl-controller/deployment-config.yaml b/deployment/base/ftl-controller/deployment-config.yaml new file mode 100644 index 0000000000..ad77df02bd --- /dev/null +++ b/deployment/base/ftl-controller/deployment-config.yaml @@ -0,0 +1,48 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: ftl-controller-deployment-config +data: + deploymentTemplate: |- + apiVersion: apps/v1 + kind: Deployment + metadata: + labels: + app: ftl-runner + spec: + selector: + matchLabels: + app: ftl-runner + template: + metadata: + labels: + app: ftl-runner + spec: + containers: + - name: app + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: LOG_LEVEL + value: "debug" + - name: FTL_ENDPOINT + value: "http://ftl-controller:8892" + - name: FTL_RUNNER_BIND + value: "http://$(MY_POD_IP):8893" + - name: FTL_RUNNER_ADVERTISE + value: "http://$(MY_POD_IP):8893" + - name: FTL_LANGUAGE + value: "go,kotlin,java" + ports: + - containerPort: 8893 + readinessProbe: + httpGet: + path: /healthz + port: 8893 + initialDelaySeconds: 1 + periodSeconds: 2 + timeoutSeconds: 2 + successThreshold: 1 + failureThreshold: 15 diff --git a/deployment/base/ftl-controller/ftl-controller.yml b/deployment/base/ftl-controller/ftl-controller.yml index 396b82f5a6..187db09d5f 100644 --- a/deployment/base/ftl-controller/ftl-controller.yml +++ b/deployment/base/ftl-controller/ftl-controller.yml @@ -14,9 +14,11 @@ spec: labels: app: ftl-controller spec: + serviceAccountName: ftl-controller containers: - name: app image: ftl0/ftl-controller + imagePullPolicy: Always env: - name: MY_POD_IP valueFrom: diff --git a/deployment/base/ftl-controller/kustomization.yml b/deployment/base/ftl-controller/kustomization.yml index a27896251c..8c1a58899b 100644 --- a/deployment/base/ftl-controller/kustomization.yml +++ b/deployment/base/ftl-controller/kustomization.yml @@ -2,3 +2,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ftl-controller.yml +- role.yaml +- role_binding.yaml +- service_account.yaml +- deployment-config.yaml diff --git a/deployment/base/ftl-controller/role.yaml b/deployment/base/ftl-controller/role.yaml new file mode 100644 index 0000000000..cbdf032f13 --- /dev/null +++ b/deployment/base/ftl-controller/role.yaml @@ -0,0 +1,19 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/name: ftl-controller + app.kubernetes.io/managed-by: kustomize + name: ftl-controller +rules: + - apiGroups: [ "apps" ] + resources: [ "deployments" ] + verbs: [ "get", "list", "watch", "delete", "create", "update", "patch" ] + - apiGroups: [ "" ] + resources: [ "pods" ] + verbs: [ "get", "list", "watch" ] + - apiGroups: [ "" ] + resources: [ "configmaps" ] + resourceNames: + - ftl-controller-deployment-config + verbs: [ "get"] diff --git a/deployment/base/ftl-controller/role_binding.yaml b/deployment/base/ftl-controller/role_binding.yaml new file mode 100644 index 0000000000..cf1a4ce57d --- /dev/null +++ b/deployment/base/ftl-controller/role_binding.yaml @@ -0,0 +1,14 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/name: ftl-controller + app.kubernetes.io/managed-by: kustomize + name: ftl-controller-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: ftl-controller +subjects: +- kind: ServiceAccount + name: ftl-controller diff --git a/deployment/base/ftl-controller/service_account.yaml b/deployment/base/ftl-controller/service_account.yaml new file mode 100644 index 0000000000..71a61f3f8d --- /dev/null +++ b/deployment/base/ftl-controller/service_account.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: ftl-controller + app.kubernetes.io/managed-by: kustomize + name: ftl-controller diff --git a/deployment/base/ftl-runner/ftl-runner.yml b/deployment/base/ftl-runner/ftl-runner.yml deleted file mode 100644 index 71063b0b22..0000000000 --- a/deployment/base/ftl-runner/ftl-runner.yml +++ /dev/null @@ -1,45 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: ftl-runner - labels: - app: ftl-runner -spec: - replicas: 10 - selector: - matchLabels: - app: ftl-runner - template: - metadata: - labels: - app: ftl-runner - spec: - containers: - - name: app - image: ftl0/ftl-runner - env: - - name: MY_POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: LOG_LEVEL - value: "debug" - - name: FTL_ENDPOINT - value: "http://ftl-controller:8892" - - name: FTL_RUNNER_BIND - value: "http://$(MY_POD_IP):8893" - - name: FTL_RUNNER_ADVERTISE - value: "http://$(MY_POD_IP):8893" - - name: FTL_LANGUAGE - value: "go,kotlin,java" - ports: - - containerPort: 8893 - readinessProbe: - httpGet: - path: /healthz - port: 8893 - initialDelaySeconds: 1 - periodSeconds: 2 - timeoutSeconds: 2 - successThreshold: 1 - failureThreshold: 15 diff --git a/deployment/base/ftl-runner/kustomization.yml b/deployment/base/ftl-runner/kustomization.yml deleted file mode 100644 index 3e7c99590f..0000000000 --- a/deployment/base/ftl-runner/kustomization.yml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -resources: -- ftl-runner.yml diff --git a/deployment/base/kustomization.yml b/deployment/base/kustomization.yml index 7bf9934dd7..20e12bb9e7 100644 --- a/deployment/base/kustomization.yml +++ b/deployment/base/kustomization.yml @@ -1,11 +1,9 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: -- https://raw.githubusercontent.com/reactive-tech/kubegres/v1.18/kubegres.yaml - db-create - db-migrate - ftl-controller -- ftl-runner - localstack images: - name: ftl0/ftl-controller diff --git a/deployment/overlays/dev/kustomization.yml b/deployment/overlays/dev/kustomization.yml index 93ca71fa45..798373b94e 100644 --- a/deployment/overlays/dev/kustomization.yml +++ b/deployment/overlays/dev/kustomization.yml @@ -10,4 +10,4 @@ images: newTag: latest - name: ftl0/ftl-runner newName: ftl:5000/ftl-runner - newTag: latest + newTag: latest \ No newline at end of file diff --git a/examples/go/echo/go.sum b/examples/go/echo/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/examples/go/echo/go.sum +++ b/examples/go/echo/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/examples/kotlin/echo/ftl.toml b/examples/kotlin/echo/ftl.toml index de92e831e1..700b9d8833 100644 --- a/examples/kotlin/echo/ftl.toml +++ b/examples/kotlin/echo/ftl.toml @@ -1,2 +1,2 @@ module = "echo" -language = "java" +language = "kotlin" diff --git a/examples/kotlin/time/ftl.toml b/examples/kotlin/time/ftl.toml index e89ed11377..48033f28f8 100644 --- a/examples/kotlin/time/ftl.toml +++ b/examples/kotlin/time/ftl.toml @@ -1,2 +1,2 @@ module = "time" -language = "java" +language = "kotlin" diff --git a/frontend/cli/cmd_box_run.go b/frontend/cli/cmd_box_run.go index 756d8fdcbd..c20b58eac1 100644 --- a/frontend/cli/cmd_box_run.go +++ b/frontend/cli/cmd_box_run.go @@ -65,7 +65,7 @@ func (b *boxRunCmd) Run(ctx context.Context, projConfig projectconfig.Config) er wg := errgroup.Group{} wg.Go(func() error { - return controller.Start(ctx, config, runnerScaling, conn) + return controller.Start(ctx, config, runnerScaling, conn, false) }) // Wait for the controller to come up. diff --git a/frontend/cli/cmd_serve.go b/frontend/cli/cmd_serve.go index 3125899f29..79ff94ab8c 100644 --- a/frontend/cli/cmd_serve.go +++ b/frontend/cli/cmd_serve.go @@ -155,7 +155,7 @@ func (s *serveCmd) run(ctx context.Context, projConfig projectconfig.Config, ini } wg.Go(func() error { - if err := controller.Start(controllerCtx, config, runnerScaling, conn); err != nil { + if err := controller.Start(controllerCtx, config, runnerScaling, conn, true); err != nil { logger.Errorf(err, "controller%d failed: %v", i, err) return fmt.Errorf("controller%d failed: %w", i, err) } diff --git a/frontend/cli/testdata/go/echo/go.sum b/frontend/cli/testdata/go/echo/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/frontend/cli/testdata/go/echo/go.sum +++ b/frontend/cli/testdata/go/echo/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/frontend/cli/testdata/go/time/go.sum b/frontend/cli/testdata/go/time/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/frontend/cli/testdata/go/time/go.sum +++ b/frontend/cli/testdata/go/time/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/frontend/console/e2e/module.spec.ts b/frontend/console/e2e/module.spec.ts index 16a71ddad9..9646ca33fc 100644 --- a/frontend/console/e2e/module.spec.ts +++ b/frontend/console/e2e/module.spec.ts @@ -11,5 +11,5 @@ ftlTest('shows verbs for deployment', async ({ page }) => { await expect(page).toHaveURL(/\/modules\/echo/) await expect(page.getByText('Deployment', { exact: true })).toBeVisible() - await expect(page.getByText('Deployed dpl-echo')).toBeVisible() + await expect(page.getByText('Created Deployment dpl-echo')).toBeVisible() }) diff --git a/frontend/console/src/components/StatusIndicator.tsx b/frontend/console/src/components/StatusIndicator.tsx index 7d7325a685..b5c4c56f75 100644 --- a/frontend/console/src/components/StatusIndicator.tsx +++ b/frontend/console/src/components/StatusIndicator.tsx @@ -2,13 +2,13 @@ import type React from 'react' import { classNames } from '../utils' type StatusIndicatorProps = { - state: 'success' | 'error' | 'idle' + state: 'success' | 'error' | 'new' text?: string } export const StatusIndicator: React.FC = ({ state, text }) => { const backgrounds = { - idle: 'text-gray-500 bg-gray-500/20 dark:bg-gray-100/10', + new: 'text-gray-500 bg-gray-500/20 dark:bg-gray-100/10', success: 'text-green-500 bg-emerald-500/20 dark:text-green-400 dark:bg-green-400/10 ', error: 'text-rose-500 bg-rose-500/20 dark:text-rose-400 dark:bg-rose-400/10', } diff --git a/frontend/console/src/features/infrastructure/RunnersList.tsx b/frontend/console/src/features/infrastructure/RunnersList.tsx index 6a3860e289..49507e1cfb 100644 --- a/frontend/console/src/features/infrastructure/RunnersList.tsx +++ b/frontend/console/src/features/infrastructure/RunnersList.tsx @@ -39,11 +39,9 @@ const status = (state: RunnerState) => { switch (state) { case RunnerState.RUNNER_ASSIGNED: return - case RunnerState.RUNNER_RESERVED: - return case RunnerState.RUNNER_DEAD: return - case RunnerState.RUNNER_IDLE: - return + case RunnerState.RUNNER_NEW: + return } } diff --git a/frontend/console/src/protos/xyz/block/ftl/v1/ftl_connect.ts b/frontend/console/src/protos/xyz/block/ftl/v1/ftl_connect.ts index 40c6c46475..dd2235c2c9 100644 --- a/frontend/console/src/protos/xyz/block/ftl/v1/ftl_connect.ts +++ b/frontend/console/src/protos/xyz/block/ftl/v1/ftl_connect.ts @@ -3,7 +3,7 @@ /* eslint-disable */ // @ts-nocheck -import { AcquireLeaseRequest, AcquireLeaseResponse, CallRequest, CallResponse, CreateDeploymentRequest, CreateDeploymentResponse, DeployRequest, DeployResponse, GetArtefactDiffsRequest, GetArtefactDiffsResponse, GetConfigRequest, GetConfigResponse, GetDeploymentArtefactsRequest, GetDeploymentArtefactsResponse, GetDeploymentRequest, GetDeploymentResponse, GetSchemaRequest, GetSchemaResponse, GetSecretRequest, GetSecretResponse, ListConfigRequest, ListConfigResponse, ListSecretsRequest, ListSecretsResponse, ModuleContextRequest, ModuleContextResponse, PingRequest, PingResponse, ProcessListRequest, ProcessListResponse, PublishEventRequest, PublishEventResponse, PullSchemaRequest, PullSchemaResponse, RegisterRunnerRequest, RegisterRunnerResponse, ReplaceDeployRequest, ReplaceDeployResponse, ReserveRequest, ReserveResponse, ResetSubscriptionRequest, ResetSubscriptionResponse, SendFSMEventRequest, SendFSMEventResponse, SetConfigRequest, SetConfigResponse, SetSecretRequest, SetSecretResponse, StatusRequest, StatusResponse, StreamDeploymentLogsRequest, StreamDeploymentLogsResponse, TerminateRequest, UnsetConfigRequest, UnsetConfigResponse, UnsetSecretRequest, UnsetSecretResponse, UpdateDeployRequest, UpdateDeployResponse, UploadArtefactRequest, UploadArtefactResponse } from "./ftl_pb.js"; +import { AcquireLeaseRequest, AcquireLeaseResponse, CallRequest, CallResponse, CreateDeploymentRequest, CreateDeploymentResponse, GetArtefactDiffsRequest, GetArtefactDiffsResponse, GetConfigRequest, GetConfigResponse, GetDeploymentArtefactsRequest, GetDeploymentArtefactsResponse, GetDeploymentRequest, GetDeploymentResponse, GetSchemaRequest, GetSchemaResponse, GetSecretRequest, GetSecretResponse, ListConfigRequest, ListConfigResponse, ListSecretsRequest, ListSecretsResponse, ModuleContextRequest, ModuleContextResponse, PingRequest, PingResponse, ProcessListRequest, ProcessListResponse, PublishEventRequest, PublishEventResponse, PullSchemaRequest, PullSchemaResponse, RegisterRunnerRequest, RegisterRunnerResponse, ReplaceDeployRequest, ReplaceDeployResponse, ResetSubscriptionRequest, ResetSubscriptionResponse, SendFSMEventRequest, SendFSMEventResponse, SetConfigRequest, SetConfigResponse, SetSecretRequest, SetSecretResponse, StatusRequest, StatusResponse, StreamDeploymentLogsRequest, StreamDeploymentLogsResponse, UnsetConfigRequest, UnsetConfigResponse, UnsetSecretRequest, UnsetSecretResponse, UpdateDeployRequest, UpdateDeployResponse, UploadArtefactRequest, UploadArtefactResponse } from "./ftl_pb.js"; import { MethodIdempotency, MethodKind } from "@bufbuild/protobuf"; /** @@ -305,64 +305,6 @@ export const ControllerService = { } } as const; -/** - * RunnerService is the service that executes Deployments. - * - * The Controller will scale the Runner horizontally as required. The Runner will - * register itself automatically with the ControllerService, which will then - * assign modules to it. - * - * @generated from service xyz.block.ftl.v1.RunnerService - */ -export const RunnerService = { - typeName: "xyz.block.ftl.v1.RunnerService", - methods: { - /** - * @generated from rpc xyz.block.ftl.v1.RunnerService.Ping - */ - ping: { - name: "Ping", - I: PingRequest, - O: PingResponse, - kind: MethodKind.Unary, - idempotency: MethodIdempotency.NoSideEffects, - }, - /** - * Reserve synchronously reserves a Runner for a deployment but does nothing else. - * - * @generated from rpc xyz.block.ftl.v1.RunnerService.Reserve - */ - reserve: { - name: "Reserve", - I: ReserveRequest, - O: ReserveResponse, - kind: MethodKind.Unary, - }, - /** - * Initiate a deployment on this Runner. - * - * @generated from rpc xyz.block.ftl.v1.RunnerService.Deploy - */ - deploy: { - name: "Deploy", - I: DeployRequest, - O: DeployResponse, - kind: MethodKind.Unary, - }, - /** - * Terminate the deployment on this Runner. - * - * @generated from rpc xyz.block.ftl.v1.RunnerService.Terminate - */ - terminate: { - name: "Terminate", - I: TerminateRequest, - O: RegisterRunnerRequest, - kind: MethodKind.Unary, - }, - } -} as const; - /** * AdminService is the service that provides and updates admin data. For example, * it is used to encapsulate configuration and secrets. diff --git a/frontend/console/src/protos/xyz/block/ftl/v1/ftl_pb.ts b/frontend/console/src/protos/xyz/block/ftl/v1/ftl_pb.ts index e557d0ba68..200bb9960c 100644 --- a/frontend/console/src/protos/xyz/block/ftl/v1/ftl_pb.ts +++ b/frontend/console/src/protos/xyz/block/ftl/v1/ftl_pb.ts @@ -40,37 +40,29 @@ export enum RunnerState { /** * The Runner is waiting for a deployment. * - * @generated from enum value: RUNNER_IDLE = 0; + * @generated from enum value: RUNNER_NEW = 0; */ - RUNNER_IDLE = 0, - - /** - * The Runner and Controller have agreed that the Runner is reserved. - * - * @generated from enum value: RUNNER_RESERVED = 1; - */ - RUNNER_RESERVED = 1, + RUNNER_NEW = 0, /** * The Runner is assigned to a deployment. * - * @generated from enum value: RUNNER_ASSIGNED = 2; + * @generated from enum value: RUNNER_ASSIGNED = 1; */ - RUNNER_ASSIGNED = 2, + RUNNER_ASSIGNED = 1, /** * The Runner is dead. * - * @generated from enum value: RUNNER_DEAD = 3; + * @generated from enum value: RUNNER_DEAD = 2; */ - RUNNER_DEAD = 3, + RUNNER_DEAD = 2, } // Retrieve enum metadata with: proto3.getEnumType(RunnerState) proto3.util.setEnumType(RunnerState, "xyz.block.ftl.v1.RunnerState", [ - { no: 0, name: "RUNNER_IDLE" }, - { no: 1, name: "RUNNER_RESERVED" }, - { no: 2, name: "RUNNER_ASSIGNED" }, - { no: 3, name: "RUNNER_DEAD" }, + { no: 0, name: "RUNNER_NEW" }, + { no: 1, name: "RUNNER_ASSIGNED" }, + { no: 2, name: "RUNNER_DEAD" }, ]); /** @@ -1541,27 +1533,20 @@ export class RegisterRunnerRequest extends Message { endpoint = ""; /** - * @generated from field: optional string deployment = 3; + * @generated from field: string deployment = 3; */ - deployment?: string; + deployment = ""; /** * @generated from field: xyz.block.ftl.v1.RunnerState state = 4; */ - state = RunnerState.RUNNER_IDLE; + state = RunnerState.RUNNER_NEW; /** * @generated from field: google.protobuf.Struct labels = 5; */ labels?: Struct; - /** - * If present, the reason the Runner is transitioning from ASSIGNED to IDLE. - * - * @generated from field: optional string error = 7; - */ - error?: string; - constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -1572,10 +1557,9 @@ export class RegisterRunnerRequest extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "endpoint", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "deployment", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 3, name: "deployment", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 4, name: "state", kind: "enum", T: proto3.getEnumType(RunnerState) }, { no: 5, name: "labels", kind: "message", T: Struct }, - { no: 7, name: "error", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): RegisterRunnerRequest { @@ -2041,7 +2025,7 @@ export class StatusResponse_Runner extends Message { /** * @generated from field: xyz.block.ftl.v1.RunnerState state = 4; */ - state = RunnerState.RUNNER_IDLE; + state = RunnerState.RUNNER_NEW; /** * @generated from field: optional string deployment = 5; @@ -2509,179 +2493,6 @@ export class ResetSubscriptionResponse extends Message { - /** - * @generated from field: string deployment_key = 1; - */ - deploymentKey = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "xyz.block.ftl.v1.DeployRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "deployment_key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeployRequest { - return new DeployRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeployRequest { - return new DeployRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeployRequest { - return new DeployRequest().fromJsonString(jsonString, options); - } - - static equals(a: DeployRequest | PlainMessage | undefined, b: DeployRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(DeployRequest, a, b); - } -} - -/** - * @generated from message xyz.block.ftl.v1.DeployResponse - */ -export class DeployResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "xyz.block.ftl.v1.DeployResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeployResponse { - return new DeployResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeployResponse { - return new DeployResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeployResponse { - return new DeployResponse().fromJsonString(jsonString, options); - } - - static equals(a: DeployResponse | PlainMessage | undefined, b: DeployResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(DeployResponse, a, b); - } -} - -/** - * @generated from message xyz.block.ftl.v1.TerminateRequest - */ -export class TerminateRequest extends Message { - /** - * @generated from field: string deployment_key = 1; - */ - deploymentKey = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "xyz.block.ftl.v1.TerminateRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "deployment_key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): TerminateRequest { - return new TerminateRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): TerminateRequest { - return new TerminateRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): TerminateRequest { - return new TerminateRequest().fromJsonString(jsonString, options); - } - - static equals(a: TerminateRequest | PlainMessage | undefined, b: TerminateRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(TerminateRequest, a, b); - } -} - -/** - * @generated from message xyz.block.ftl.v1.ReserveRequest - */ -export class ReserveRequest extends Message { - /** - * @generated from field: string deployment_key = 1; - */ - deploymentKey = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "xyz.block.ftl.v1.ReserveRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "deployment_key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ReserveRequest { - return new ReserveRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ReserveRequest { - return new ReserveRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ReserveRequest { - return new ReserveRequest().fromJsonString(jsonString, options); - } - - static equals(a: ReserveRequest | PlainMessage | undefined, b: ReserveRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ReserveRequest, a, b); - } -} - -/** - * @generated from message xyz.block.ftl.v1.ReserveResponse - */ -export class ReserveResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "xyz.block.ftl.v1.ReserveResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ReserveResponse { - return new ReserveResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ReserveResponse { - return new ReserveResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ReserveResponse { - return new ReserveResponse().fromJsonString(jsonString, options); - } - - static equals(a: ReserveResponse | PlainMessage | undefined, b: ReserveResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ReserveResponse, a, b); - } -} - /** * @generated from message xyz.block.ftl.v1.ConfigRef */ diff --git a/go-runtime/compile/testdata/go/echo/go.sum b/go-runtime/compile/testdata/go/echo/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/compile/testdata/go/echo/go.sum +++ b/go-runtime/compile/testdata/go/echo/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/compile/testdata/go/notexportedverb/go.sum b/go-runtime/compile/testdata/go/notexportedverb/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/compile/testdata/go/notexportedverb/go.sum +++ b/go-runtime/compile/testdata/go/notexportedverb/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/compile/testdata/go/one/go.sum b/go-runtime/compile/testdata/go/one/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/compile/testdata/go/one/go.sum +++ b/go-runtime/compile/testdata/go/one/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/compile/testdata/go/two/go.sum b/go-runtime/compile/testdata/go/two/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/compile/testdata/go/two/go.sum +++ b/go-runtime/compile/testdata/go/two/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/compile/testdata/go/undefinedverb/go.sum b/go-runtime/compile/testdata/go/undefinedverb/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/compile/testdata/go/undefinedverb/go.sum +++ b/go-runtime/compile/testdata/go/undefinedverb/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/encoding/testdata/go/omitempty/go.sum b/go-runtime/encoding/testdata/go/omitempty/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/encoding/testdata/go/omitempty/go.sum +++ b/go-runtime/encoding/testdata/go/omitempty/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/ftltest/testdata/go/outer/go.sum b/go-runtime/ftl/ftltest/testdata/go/outer/go.sum index 58257ebf2b..d955d394f1 100644 --- a/go-runtime/ftl/ftltest/testdata/go/outer/go.sum +++ b/go-runtime/ftl/ftltest/testdata/go/outer/go.sum @@ -26,8 +26,8 @@ github.com/bool64/shared v0.1.5 h1:fp3eUhBsrSjNCQPcSdQqZxxh9bBwrYiZ+zOKFkM0/2E= github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6MHJlPs= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/ftltest/testdata/go/pubsub/go.sum b/go-runtime/ftl/ftltest/testdata/go/pubsub/go.sum index b2cb03e702..99873f9eff 100644 --- a/go-runtime/ftl/ftltest/testdata/go/pubsub/go.sum +++ b/go-runtime/ftl/ftltest/testdata/go/pubsub/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/ftltest/testdata/go/subscriber/go.sum b/go-runtime/ftl/ftltest/testdata/go/subscriber/go.sum index b2cb03e702..99873f9eff 100644 --- a/go-runtime/ftl/ftltest/testdata/go/subscriber/go.sum +++ b/go-runtime/ftl/ftltest/testdata/go/subscriber/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/ftltest/testdata/go/verbtypes/go.sum b/go-runtime/ftl/ftltest/testdata/go/verbtypes/go.sum index b2cb03e702..99873f9eff 100644 --- a/go-runtime/ftl/ftltest/testdata/go/verbtypes/go.sum +++ b/go-runtime/ftl/ftltest/testdata/go/verbtypes/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/ftltest/testdata/go/wrapped/go.sum b/go-runtime/ftl/ftltest/testdata/go/wrapped/go.sum index b2cb03e702..99873f9eff 100644 --- a/go-runtime/ftl/ftltest/testdata/go/wrapped/go.sum +++ b/go-runtime/ftl/ftltest/testdata/go/wrapped/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/reflection/testdata/go/runtimereflection/go.sum b/go-runtime/ftl/reflection/testdata/go/runtimereflection/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/ftl/reflection/testdata/go/runtimereflection/go.sum +++ b/go-runtime/ftl/reflection/testdata/go/runtimereflection/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/testdata/go/echo/go.sum b/go-runtime/ftl/testdata/go/echo/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/ftl/testdata/go/echo/go.sum +++ b/go-runtime/ftl/testdata/go/echo/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/testdata/go/mapper/go.sum b/go-runtime/ftl/testdata/go/mapper/go.sum index b2cb03e702..99873f9eff 100644 --- a/go-runtime/ftl/testdata/go/mapper/go.sum +++ b/go-runtime/ftl/testdata/go/mapper/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/ftl/testdata/go/typeregistry/go.sum b/go-runtime/ftl/testdata/go/typeregistry/go.sum index b2cb03e702..99873f9eff 100644 --- a/go-runtime/ftl/testdata/go/typeregistry/go.sum +++ b/go-runtime/ftl/testdata/go/typeregistry/go.sum @@ -69,8 +69,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/internal/testdata/go/mapper/go.sum b/go-runtime/internal/testdata/go/mapper/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/internal/testdata/go/mapper/go.sum +++ b/go-runtime/internal/testdata/go/mapper/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/schema/testdata/failing/go.sum b/go-runtime/schema/testdata/failing/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/schema/testdata/failing/go.sum +++ b/go-runtime/schema/testdata/failing/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/schema/testdata/fsm/go.sum b/go-runtime/schema/testdata/fsm/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/schema/testdata/fsm/go.sum +++ b/go-runtime/schema/testdata/fsm/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/schema/testdata/one/go.sum b/go-runtime/schema/testdata/one/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/schema/testdata/one/go.sum +++ b/go-runtime/schema/testdata/one/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/schema/testdata/parent/go.sum b/go-runtime/schema/testdata/parent/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/schema/testdata/parent/go.sum +++ b/go-runtime/schema/testdata/parent/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/schema/testdata/pubsub/go.sum b/go-runtime/schema/testdata/pubsub/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/schema/testdata/pubsub/go.sum +++ b/go-runtime/schema/testdata/pubsub/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/schema/testdata/subscriber/go.sum b/go-runtime/schema/testdata/subscriber/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/schema/testdata/subscriber/go.sum +++ b/go-runtime/schema/testdata/subscriber/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/schema/testdata/two/go.sum b/go-runtime/schema/testdata/two/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/schema/testdata/two/go.sum +++ b/go-runtime/schema/testdata/two/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go-runtime/schema/testdata/validation/go.sum b/go-runtime/schema/testdata/validation/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/go-runtime/schema/testdata/validation/go.sum +++ b/go-runtime/schema/testdata/validation/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/go.mod b/go.mod index 5d63256a46..122643cbd9 100644 --- a/go.mod +++ b/go.mod @@ -70,6 +70,9 @@ require ( golang.org/x/term v0.24.0 google.golang.org/protobuf v1.34.2 gotest.tools/v3 v3.5.1 + k8s.io/api v0.31.0 + k8s.io/apimachinery v0.31.0 + k8s.io/client-go v0.31.0 modernc.org/sqlite v1.33.0 ) @@ -85,20 +88,37 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/iancoleman/strcase v0.3.0 // indirect + github.com/imdario/mergo v0.3.13 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/muesli/termenv v0.15.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/onsi/gomega v1.33.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect @@ -108,12 +128,25 @@ require ( github.com/sasha-s/go-deadlock v0.3.5 // indirect github.com/segmentio/ksuid v1.0.4 // indirect github.com/sourcegraph/jsonrpc2 v0.2.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.2 // indirect + github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect + golang.org/x/oauth2 v0.22.0 // indirect + golang.org/x/time v0.6.0 // indirect golang.org/x/tools v0.24.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) require ( @@ -128,7 +161,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd // indirect + github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hexops/gotextdiff v1.0.3 github.com/jackc/pgpassfile v1.0.0 // indirect diff --git a/go.sum b/go.sum index e4700fbde2..c2ef487d7e 100644 --- a/go.sum +++ b/go.sum @@ -91,9 +91,11 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= @@ -112,25 +114,46 @@ github.com/dop251/goja v0.0.0-20240816181238-8130cadc5774 h1:5S7RAWahWxsxBd5/epa github.com/dop251/goja v0.0.0-20240816181238-8130cadc5774/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/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/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= -github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= 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= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -148,6 +171,8 @@ github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJ github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 h1:Dj0L5fhJ9F82ZJyVOmBx6msDp/kfd1t9GRfny/mfJA0= github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= @@ -164,18 +189,31 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= @@ -186,14 +224,25 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -210,8 +259,9 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkoukk/tiktoken-go v0.1.6 h1:JF0TlJzhTbrI30wCvFuiw6FzP2+/bR+FIxUdgEAcUsw= github.com/pkoukk/tiktoken-go v0.1.6/go.mod h1:9NiV+i9mJKGj1rYOT+njbv+ZwA/zJxYdewGl6qVatpg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= @@ -224,6 +274,8 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robertkrimen/otto v0.2.1 h1:FVP0PJ0AHIjC+N4pKCG9yCDz6LHNPCwi/GKID5pGGF0= github.com/robertkrimen/otto v0.2.1/go.mod h1:UPwtJ1Xu7JrLcZjNWN8orJaM5n5YEtqL//farB5FlRY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= @@ -238,13 +290,20 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sourcegraph/jsonrpc2 v0.2.0 h1:KjN/dC4fP6aN9030MZCJs9WQbTOjWHhrtKVpzzSrr/U= github.com/sourcegraph/jsonrpc2 v0.2.0/go.mod h1:ZafdZgk/axhT1cvZAPOhw+95nz2I/Ra5qMlU4gTRwIo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/sqlc-dev/pqtype v0.3.0 h1:b09TewZ3cSnO5+M1Kqq05y0+OjqIptxELaSayg7bmqk= github.com/sqlc-dev/pqtype v0.3.0/go.mod h1:oyUjp5981ctiL9UYvj1bVvCKi8OXkCa0u645hce7CAs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/swaggest/assertjson v1.9.0 h1:dKu0BfJkIxv/xe//mkCrK5yZbs79jL7OVf9Ija7o2xQ= @@ -267,6 +326,8 @@ github.com/tliron/kutil v0.3.26 h1:G+dicQLvzm3zdOMrrQFLBfHJXtk57fEu2kf1IFNyJxw= github.com/tliron/kutil v0.3.26/go.mod h1:1/HRVAb+fnRIRnzmhu0FPP+ZJKobrpwHStDVMuaXDzY= github.com/tmc/langchaingo v0.1.12 h1:yXwSu54f3b1IKw0jJ5/DWu+qFVH1NBblwC0xddBzGJE= github.com/tmc/langchaingo v0.1.12/go.mod h1:cd62xD6h+ouk8k/QQFhOsjRYBSA1JJ5UVKXSIgm7Ni4= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= @@ -320,6 +381,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= +golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -358,16 +421,33 @@ google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjr google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo= +k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE= +k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc= +k8s.io/apimachinery v0.31.0/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8= +k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= @@ -382,5 +462,9 @@ modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/buildengine/testdata/alpha/go.sum b/internal/buildengine/testdata/alpha/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/internal/buildengine/testdata/alpha/go.sum +++ b/internal/buildengine/testdata/alpha/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/internal/buildengine/testdata/another/go.sum b/internal/buildengine/testdata/another/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/internal/buildengine/testdata/another/go.sum +++ b/internal/buildengine/testdata/another/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/internal/buildengine/testdata/other/go.sum b/internal/buildengine/testdata/other/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/internal/buildengine/testdata/other/go.sum +++ b/internal/buildengine/testdata/other/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/internal/configuration/dal/internal/sql/models.go b/internal/configuration/dal/internal/sql/models.go index 49d53f0d84..e4c480759b 100644 --- a/internal/configuration/dal/internal/sql/models.go +++ b/internal/configuration/dal/internal/sql/models.go @@ -239,7 +239,7 @@ func (ns NullOrigin) Value() (driver.Value, error) { type RunnerState string const ( - RunnerStateIdle RunnerState = "idle" + RunnerStateNew RunnerState = "new" RunnerStateReserved RunnerState = "reserved" RunnerStateAssigned RunnerState = "assigned" RunnerStateDead RunnerState = "dead" @@ -473,7 +473,7 @@ type Runner struct { State RunnerState Endpoint string ModuleName optional.Option[string] - DeploymentID optional.Option[int64] + DeploymentID int64 Labels json.RawMessage } diff --git a/internal/encryption/testdata/go/encryption/go.sum b/internal/encryption/testdata/go/encryption/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/internal/encryption/testdata/go/encryption/go.sum +++ b/internal/encryption/testdata/go/encryption/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/internal/exec/exec.go b/internal/exec/exec.go index 5e0788dfde..b912518686 100644 --- a/internal/exec/exec.go +++ b/internal/exec/exec.go @@ -42,6 +42,7 @@ func CommandWithEnv(ctx context.Context, level log.Level, dir string, env []stri } logger.Tracef("exec: cd %s && %s %s", shellquote.Join(dir), exe, shellquote.Join(args...)) cmd := exec.CommandContext(ctx, exe, args...) + cmd.Env = os.Environ() cmd.Env = append(cmd.Env, env...) cmd.SysProcAttr = &syscall.SysProcAttr{ Pgid: pgid, @@ -51,7 +52,6 @@ func CommandWithEnv(ctx context.Context, level log.Level, dir string, env []stri output := logger.WriterAt(level) cmd.Stdout = output cmd.Stderr = output - cmd.Env = os.Environ() return &Cmd{cmd, level} } diff --git a/internal/integration/actions.go b/internal/integration/actions.go index 73f67b9d68..ba7cfb402f 100644 --- a/internal/integration/actions.go +++ b/internal/integration/actions.go @@ -220,7 +220,13 @@ func ExpectError(action Action, expectedErrorMsg ...string) Action { // Deploy a module from the working directory and wait for it to become available. func Deploy(module string) Action { return Chain( - Exec("ftl", "deploy", module), + func(t testing.TB, ic TestContext) { + if ic.kube { + Exec("ftl", "deploy", "--build-env", "GOOS=linux", "--build-env", "GOARCH=amd64", "--build-env", "CGO_ENABLED=0", module)(t, ic) + } else { + Exec("ftl", "deploy", module)(t, ic) + } + }, Wait(module), ) } diff --git a/internal/integration/harness.go b/internal/integration/harness.go index af379d8348..396e4da1a6 100644 --- a/internal/integration/harness.go +++ b/internal/integration/harness.go @@ -9,6 +9,7 @@ import ( "fmt" "os" "path/filepath" + "runtime" "slices" "sync" "syscall" @@ -59,6 +60,16 @@ func WithLanguages(languages ...string) Option { } } +// WithKubernetes is a Run* option that specifies tests should be run on a kube cluster +// +// This is only compatible with go tests +func WithKubernetes() Option { + return func(o *options) { + o.kube = true + o.startController = false + } +} + // WithTestDataDir sets the directory from which to look for test data. // // Defaults to "testdata/" if not provided. @@ -111,6 +122,7 @@ type options struct { startController bool requireJava bool envars map[string]string + kube bool } // Run an integration test. @@ -159,10 +171,29 @@ func run(t *testing.T, actionsOrOptions ...ActionOrOption) { ctx := log.ContextWithLogger(context.Background(), logger) binDir := filepath.Join(rootDir, "build", "release") + if opts.kube && len(opts.languages) != 1 && opts.languages[0] != "go" { + t.Fatal("Kubernetes tests are only supported for golang") + } + buildOnce.Do(func() { - Infof("Building ftl") - err = ftlexec.Command(ctx, log.Debug, rootDir, "just", "build", "ftl").RunBuffered(ctx) - assert.NoError(t, err) + if opts.kube { + // This command will build a linux/amd64 version of FTL and deploy it to the kube cluster + Infof("Building FTL and deploying to kube") + err = ftlexec.Command(ctx, log.Debug, filepath.Join(rootDir, "deployment"), "just", "full-deploy").RunBuffered(ctx) + assert.NoError(t, err) + if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { + // If we are already on linux/amd64 we don't need to rebuild, otherwise we now need a native one to interact with the kube cluster + Infof("Building FTL for native OS") + err = ftlexec.Command(ctx, log.Debug, rootDir, "just", "build", "ftl").RunBuffered(ctx) + assert.NoError(t, err) + } + err = ftlexec.Command(ctx, log.Debug, filepath.Join(rootDir, "deployment"), "just", "wait-for-kube").RunBuffered(ctx) + assert.NoError(t, err) + } else { + Infof("Building ftl") + err = ftlexec.Command(ctx, log.Debug, rootDir, "just", "build", "ftl").RunBuffered(ctx) + assert.NoError(t, err) + } if opts.requireJava || slices.Contains(opts.languages, "java") { err = ftlexec.Command(ctx, log.Debug, rootDir, "just", "build-java", "-DskipTests", "-B").RunBuffered(ctx) assert.NoError(t, err) @@ -179,12 +210,13 @@ func run(t *testing.T, actionsOrOptions ...ActionOrOption) { var controller ftlv1connect.ControllerServiceClient var console pbconsoleconnect.ConsoleServiceClient if opts.startController { - controller = rpc.Dial(ftlv1connect.NewControllerServiceClient, "http://localhost:8892", log.Debug) - console = rpc.Dial(pbconsoleconnect.NewConsoleServiceClient, "http://localhost:8892", log.Debug) - Infof("Starting ftl cluster") ctx = startProcess(ctx, t, filepath.Join(binDir, "ftl"), "serve", "--recreate") } + if opts.startController || opts.kube { + controller = rpc.Dial(ftlv1connect.NewControllerServiceClient, "http://localhost:8892", log.Debug) + console = rpc.Dial(pbconsoleconnect.NewConsoleServiceClient, "http://localhost:8892", log.Debug) + } testData := filepath.Join(cwd, "testdata", language) if opts.testDataDir != "" { @@ -200,9 +232,10 @@ func run(t *testing.T, actionsOrOptions ...ActionOrOption) { Verbs: verbs, realT: t, language: language, + kube: opts.kube, } - if opts.startController { + if opts.startController || opts.kube { ic.Controller = controller ic.Console = console @@ -264,6 +297,8 @@ type TestContext struct { binDir string // The Language under test language string + // If the test is running on kubernetes + kube bool Controller ftlv1connect.ControllerServiceClient Console pbconsoleconnect.ConsoleServiceClient diff --git a/internal/projectconfig/testdata/go/echo/go.sum b/internal/projectconfig/testdata/go/echo/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/internal/projectconfig/testdata/go/echo/go.sum +++ b/internal/projectconfig/testdata/go/echo/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/internal/projectconfig/testdata/go/findconfig/go.sum b/internal/projectconfig/testdata/go/findconfig/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/internal/projectconfig/testdata/go/findconfig/go.sum +++ b/internal/projectconfig/testdata/go/findconfig/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/internal/projectconfig/testdata/go/validateconfig/go.sum b/internal/projectconfig/testdata/go/validateconfig/go.sum index 6c55d6fff5..fb002709d3 100644 --- a/internal/projectconfig/testdata/go/validateconfig/go.sum +++ b/internal/projectconfig/testdata/go/validateconfig/go.sum @@ -29,8 +29,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= diff --git a/internal/rpc/rpc.go b/internal/rpc/rpc.go index 49a9a5f47a..a50a75ce6b 100644 --- a/internal/rpc/rpc.go +++ b/internal/rpc/rpc.go @@ -245,6 +245,12 @@ func RetryStreamingServerStream[Req, Resp any]( for { stream, err := rpc(ctx, connect.NewRequest(req)) if err == nil { + defer func(stream *connect.ServerStreamForClient[Resp]) { + err := stream.Close() + if err != nil { + logger.Debugf("Failed to close stream: %s", err) + } + }(stream) for { if stream.Receive() { resp := stream.Msg() diff --git a/jvm-runtime/ftl-runtime/common/runtime/src/main/java/xyz/block/ftl/VerbClient.java b/jvm-runtime/ftl-runtime/common/runtime/src/main/java/xyz/block/ftl/VerbClient.java index b179357c89..7637e5713c 100644 --- a/jvm-runtime/ftl-runtime/common/runtime/src/main/java/xyz/block/ftl/VerbClient.java +++ b/jvm-runtime/ftl-runtime/common/runtime/src/main/java/xyz/block/ftl/VerbClient.java @@ -5,8 +5,6 @@ * * The sink source and empty interfaces allow for different call signatures. * - * TODO: should these be top level - * * @param

The verb parameter type * @param The verb return type */ diff --git a/jvm-runtime/testdata/go/gomodule/go.sum b/jvm-runtime/testdata/go/gomodule/go.sum index c593a97331..ba8b7fa09c 100644 --- a/jvm-runtime/testdata/go/gomodule/go.sum +++ b/jvm-runtime/testdata/go/gomodule/go.sum @@ -30,8 +30,8 @@ github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6M github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= diff --git a/sqlc.yaml b/sqlc.yaml index 7cb6e3664a..6df758c70c 100644 --- a/sqlc.yaml +++ b/sqlc.yaml @@ -117,7 +117,8 @@ sql: - db_type: "topic_event_key" nullable: true go_type: - type: "optional.Option[model.TopicEventKey]" + import: github.com/alecthomas/types/optional + type: "Option[model.TopicEventKey]" - db_type: "text" go_type: "string" - db_type: "text"