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..0a5ae5ace6 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,7 @@ 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) + client := rpc.Dial(ftlv1connect.NewVerbServiceClient, endpoint.String(), log.Error) retry := backoff.Backoff{} heartbeatCtx, cancel := context.WithTimeout(ctx, s.config.RunnerTimeout) defer cancel() @@ -1231,8 +1222,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 +1239,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 +1603,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..f6e6518d41 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" @@ -465,16 +465,15 @@ type Request struct { } type Runner struct { - ID int64 - Key model.RunnerKey - Created time.Time - LastSeen time.Time - ReservationTimeout optional.Option[time.Time] - State RunnerState - Endpoint string - ModuleName optional.Option[string] - DeploymentID optional.Option[int64] - Labels json.RawMessage + ID int64 + Key model.RunnerKey + Created time.Time + LastSeen time.Time + State RunnerState + Endpoint string + ModuleName optional.Option[string] + DeploymentID int64 + Labels json.RawMessage } type Timeline struct { 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..f6e6518d41 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" @@ -465,16 +465,15 @@ type Request struct { } type Runner struct { - ID int64 - Key model.RunnerKey - Created time.Time - LastSeen time.Time - ReservationTimeout optional.Option[time.Time] - State RunnerState - Endpoint string - ModuleName optional.Option[string] - DeploymentID optional.Option[int64] - Labels json.RawMessage + ID int64 + Key model.RunnerKey + Created time.Time + LastSeen time.Time + State RunnerState + Endpoint string + ModuleName optional.Option[string] + DeploymentID int64 + Labels json.RawMessage } type Timeline struct { diff --git a/backend/controller/dal/internal/sql/querier.go b/backend/controller/dal/internal/sql/querier.go index 8b5c82b3e2..b8b39d5f1e 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 @@ -115,11 +108,7 @@ type Querier interface { UpsertController(ctx context.Context, key model.ControllerKey, endpoint string) (int64, error) UpsertModule(ctx context.Context, language string, name string) (int64, error) // Upsert a runner and return the deployment ID that it is assigned to, if any. - // If the deployment key is null, then deployment_rel.id will be null, - // 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..52b581e2ba 100644 --- a/backend/controller/dal/internal/sql/queries.sql +++ b/backend/controller/dal/internal/sql/queries.sql @@ -71,17 +71,9 @@ WHERE a.id = @id; -- name: UpsertRunner :one -- Upsert a runner and return the deployment ID that it is assigned to, if any. WITH deployment_rel AS ( --- If the deployment key is null, then deployment_rel.id will be null, --- 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,15 +85,13 @@ 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; -- name: KillStaleRunners :one WITH matches AS ( UPDATE runners - SET state = 'dead', - deployment_id = NULL + SET state = 'dead' WHERE state <> 'dead' AND last_seen < (NOW() AT TIME ZONE 'utc') - sqlc.arg('timeout')::INTERVAL RETURNING 1) SELECT COUNT(*) @@ -110,8 +100,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 +113,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 +153,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 +167,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 +179,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 +206,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..b8e1fb1ee2 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) { @@ -1542,7 +1424,7 @@ func (q *Queries) GetRunnerState(ctx context.Context, key model.RunnerKey) (Runn } const getRunnersForDeployment = `-- name: GetRunnersForDeployment :many -SELECT r.id, r.key, created, last_seen, reservation_timeout, state, endpoint, module_name, deployment_id, r.labels, d.id, created_at, module_id, d.key, schema, d.labels, min_replicas +SELECT r.id, r.key, created, last_seen, state, endpoint, module_name, deployment_id, r.labels, d.id, created_at, module_id, d.key, schema, d.labels, min_replicas FROM runners r INNER JOIN deployments d on r.deployment_id = d.id WHERE state = 'assigned' @@ -1550,23 +1432,22 @@ WHERE state = 'assigned' ` type GetRunnersForDeploymentRow struct { - ID int64 - Key model.RunnerKey - Created time.Time - LastSeen time.Time - ReservationTimeout optional.Option[time.Time] - State RunnerState - Endpoint string - ModuleName optional.Option[string] - DeploymentID optional.Option[int64] - Labels json.RawMessage - ID_2 int64 - CreatedAt time.Time - ModuleID int64 - Key_2 model.DeploymentKey - Schema *schema.Module - Labels_2 json.RawMessage - MinReplicas int32 + ID int64 + Key model.RunnerKey + Created time.Time + LastSeen time.Time + State RunnerState + Endpoint string + ModuleName optional.Option[string] + DeploymentID int64 + Labels json.RawMessage + ID_2 int64 + CreatedAt time.Time + ModuleID int64 + Key_2 model.DeploymentKey + Schema *schema.Module + Labels_2 json.RawMessage + MinReplicas int32 } func (q *Queries) GetRunnersForDeployment(ctx context.Context, key model.DeploymentKey) ([]GetRunnersForDeploymentRow, error) { @@ -1583,7 +1464,6 @@ func (q *Queries) GetRunnersForDeployment(ctx context.Context, key model.Deploym &i.Key, &i.Created, &i.LastSeen, - &i.ReservationTimeout, &i.State, &i.Endpoint, &i.ModuleName, @@ -2170,8 +2050,7 @@ func (q *Queries) KillStaleControllers(ctx context.Context, timeout sqltypes.Dur const killStaleRunners = `-- name: KillStaleRunners :one WITH matches AS ( UPDATE runners - SET state = 'dead', - deployment_id = NULL + SET state = 'dead' WHERE state <> 'dead' AND last_seen < (NOW() AT TIME ZONE 'utc') - $1::INTERVAL RETURNING 1) SELECT COUNT(*) @@ -2288,43 +2167,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 +2388,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 +2402,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,15 +2411,11 @@ 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. -// If the deployment key is null, then deployment_rel.id will be null, -// 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 +2423,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..f6e6518d41 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" @@ -465,16 +465,15 @@ type Request struct { } type Runner struct { - ID int64 - Key model.RunnerKey - Created time.Time - LastSeen time.Time - ReservationTimeout optional.Option[time.Time] - State RunnerState - Endpoint string - ModuleName optional.Option[string] - DeploymentID optional.Option[int64] - Labels json.RawMessage + ID int64 + Key model.RunnerKey + Created time.Time + LastSeen time.Time + State RunnerState + Endpoint string + ModuleName optional.Option[string] + DeploymentID int64 + Labels json.RawMessage } type Timeline struct { 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..1d4e6dfb57 --- /dev/null +++ b/backend/controller/scaling/k8sscaling/deployment_provisioner.go @@ -0,0 +1,367 @@ +/* +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" + "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) { + 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 + } + deploymentClient := r.Client.AppsV1().Deployments(r.Namespace) + 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") + + thisDeployment, err := deploymentClient.Get(ctx, thisDeploymentName, v1.GetOptions{}) + if err != nil { + return fmt.Errorf("failed to get deployment %s: %w", thisDeploymentName, err) + } + deployment.Name = name + deployment.OwnerReferences = []v1.OwnerReference{{APIVersion: "apps/v1", Kind: "deployment", Name: thisDeploymentName, UID: thisDeployment.UID}} + deployment.Spec.Template.Spec.Containers[0].Image = fmt.Sprintf("%s:%s", runnerImage, ourVersion) + deployment.Spec.Selector = &v1.LabelSelector{MatchLabels: map[string]string{"app": name}} + if deployment.Spec.Template.ObjectMeta.Labels == nil { + deployment.Spec.Template.ObjectMeta.Labels = map[string]string{} + } + deployment.Spec.Template.ObjectMeta.Labels["app"] = name + 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 + + _, 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..4cbe41bdcb --- /dev/null +++ b/backend/controller/scaling/k8sscaling/k8s_scaling.go @@ -0,0 +1,84 @@ +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 { + return fmt.Errorf("failed to get kubeconfig: %w", err) + } + } + // creates the clientset + clientset, err := kubernetes.NewForConfig(config) + + if err != nil { + return fmt.Errorf("failed to create clientset: %w", err) + } + + 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" + namespace, err := os.ReadFile(namespaceFile) + if err != nil && !os.IsNotExist(err) { + return "", fmt.Errorf("failed to read namespace file: %w", err) + } else if err == nil { + 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..a7ea5fa830 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..4d2a4dcef9 100644 --- a/backend/controller/scaling/scaling.go +++ b/backend/controller/scaling/scaling.go @@ -2,10 +2,57 @@ package scaling import ( "context" + "errors" + "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) + } else if !errors.Is(err, leases.ErrConflict) { + logger := log.FromContext(ctx) + logger.Errorf(err, "Failed to acquire lease") + } + 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..e199e9ded6 --- /dev/null +++ b/backend/controller/sql/schema/20240903043046_enforce_runner_deployment.sql @@ -0,0 +1,9 @@ +-- 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'; +DROP TRIGGER runners_set_reservation_timeout ON runners; +DROP FUNCTION runners_set_reservation_timeout; +ALTER TABLE runners DROP COLUMN "reservation_timeout"; +-- 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..c3ca8704b6 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,8 +125,8 @@ 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), + rpc.HealthCheck(svc.healthCheck), ) } @@ -181,7 +185,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 +207,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 +222,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 +250,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 +259,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 +305,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.Close() + 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) Close() 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")) + return 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)) - } - 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 +343,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 +375,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 +382,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 @@ -494,3 +485,11 @@ func (s *Service) getDeploymentLogger(ctx context.Context, deploymentKey model.D sink := newDeploymentLogsSink(s.deploymentLogQueue) return log.FromContext(ctx).AddSink(sink).Attrs(attrs) } + +func (s *Service) healthCheck(writer http.ResponseWriter, request *http.Request) { + if s.state.Load() == ftlv1.RunnerState_RUNNER_ASSIGNED { + writer.WriteHeader(http.StatusOK) + return + } + writer.WriteHeader(http.StatusServiceUnavailable) +} 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..f6e6518d41 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" @@ -465,16 +465,15 @@ type Request struct { } type Runner struct { - ID int64 - Key model.RunnerKey - Created time.Time - LastSeen time.Time - ReservationTimeout optional.Option[time.Time] - State RunnerState - Endpoint string - ModuleName optional.Option[string] - DeploymentID optional.Option[int64] - Labels json.RawMessage + ID int64 + Key model.RunnerKey + Created time.Time + LastSeen time.Time + State RunnerState + Endpoint string + ModuleName optional.Option[string] + DeploymentID int64 + Labels json.RawMessage } type Timeline struct { 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/internal/rpc/server.go b/internal/rpc/server.go index a61a290240..2f72d71bcb 100644 --- a/internal/rpc/server.go +++ b/internal/rpc/server.go @@ -24,6 +24,7 @@ const ShutdownGracePeriod = time.Second * 5 type serverOptions struct { mux *http.ServeMux reflectionPaths []string + healthCheck http.HandlerFunc } type Option func(*serverOptions) @@ -49,6 +50,12 @@ func PProf() Option { } } +func HealthCheck(check http.HandlerFunc) Option { + return func(options *serverOptions) { + options.healthCheck = check + } +} + // RawGRPC is a convenience function for registering a GRPC server with default options without Pingable. func RawGRPC[Iface, Impl any](constructor RawGRPCServerConstructor[Iface], impl Impl, options ...connect.HandlerOption) Option { return func(o *serverOptions) { @@ -75,16 +82,17 @@ type Server struct { func NewServer(ctx context.Context, listen *url.URL, options ...Option) (*Server, error) { opts := &serverOptions{ mux: http.NewServeMux(), + healthCheck: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + }), } - opts.mux.Handle("/healthz", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - })) - for _, option := range options { option(opts) } + opts.mux.Handle("/healthz", opts.healthCheck) + // Register reflection services. reflector := grpcreflect.NewStaticReflector(opts.reflectionPaths...) opts.mux.Handle(grpcreflect.NewHandlerV1(reflector)) 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"